bash 스크립트를 사용하여 파티션을 만들고 포맷하는 방법은 무엇입니까?


62

bash 스크립트를 사용하여 파티션을 만들고 포맷하는 방법이 있습니까?

fdisk로 할 수 있다고 생각하지만 bash 스크립트에서 fdisk 쉘로 명령을 공급 한 다음 fdisk 쉘을 종료하는 방법을 모르겠습니다.

파티션을 만들고 bash 내에서 ntfs로 포맷하고 싶습니다.

답변:


70

이전 제안과 마찬가지로 fidsk로 명령을 파이프하는 것과 마찬가지로이 접근 방식은 후속 관리자에게 세부 정보를 남기는 데 유용합니다. sed 비트는 fdisk가 입력을 받기 전에 모든 주석을 제거합니다.

# to create the partitions programatically (rather than manually)
# we're going to simulate the manual input to fdisk
# The sed script strips off all the comments so that we can 
# document what we're doing in-line with the actual commands
# Note that a blank line (commented as "defualt" will send a empty
# line terminated with a newline to take the fdisk default.
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk ${TGTDEV}
  o # clear the in memory partition table
  n # new partition
  p # primary partition
  1 # partition number 1
    # default - start at beginning of disk 
  +100M # 100 MB boot parttion
  n # new partition
  p # primary partition
  2 # partion number 2
    # default, start immediately after preceding partition
    # default, extend partition to end of disk
  a # make a partition bootable
  1 # bootable partition is partition 1 -- /dev/sda1
  p # print the in-memory partition table
  w # write the partition table
  q # and we're done
EOF

3
완전히 동의 해. 다른 사람이 읽을 수 있도록 작업을 문서화하십시오.
Eric Duncan

1
각 줄마다 선행 탭이 있어야합니다.
Stu

2
@Stu가 언급 한 것처럼 각 명령 문자 줄에 탭이 필요하다는 큰 경고 를 하시겠습니까 ? copy-and-paste는 탭을 무시하고 공백으로 대체하기 때문에 잠시 디버깅해야했기 때문에 정규 표현식이 명령 줄과 일치하지 않습니다.
ceremcem

9
탭에 대한 경고 대신 탭뿐만 아니라 선행 공백을 삭제하고 fdisk 명령 뒤에 탭을 기대하지 않도록 sed를 수정했습니다. 잘라내어 붙여 넣어야합니다. @ceremcem-좋은 피드백과 디버그 시간을 일으켜 죄송합니다.
user2070305

3
sfdisk보다 자동화 친화적입니다fdisk
spuder

64

sfdisk

sfdisk 스크립트 버전입니다 fdisk

util-linux마찬가지로의 일부fdisk 이므로 가용성이 동일해야합니다.

전체 디스크를 차지하는 단일 파티션이있는 파티션 테이블은 다음을 사용하여 만들 수 있습니다.

echo 'type=83' | sudo sfdisk /dev/sdX

보다 복잡한 파티션 테이블이 아래에 설명되어 있습니다.

예제 스크립트를 생성하려면 디스크 중 하나를 설정하십시오.

sudo sfdisk -d /dev/sda > sda.sfdisk

Lenovo T430 Windows 7 / Ubuntu 이중 부팅의 샘플 출력 :

label: dos
label-id: 0x7ddcbf7d
device: /dev/sda
unit: sectors

/dev/sda1 : start=        2048, size=     3072000, type=7, bootable
/dev/sda2 : start=     3074048, size=   195430105, type=7
/dev/sda3 : start=   948099072, size=    28672000, type=7
/dev/sda4 : start=   198504446, size=   749594626, type=5
/dev/sda5 : start=   198504448, size=   618891264, type=83
/dev/sda6 : start=   940277760, size=     7821312, type=82
/dev/sda7 : start=   817397760, size=    61437952, type=83
/dev/sda8 : start=   878837760, size=    61437500, type=83

스크립트가 파일에 저장되면 다음을 사용하여 적용 할 수 있습니다 sdX.

sudo sfdisk /dev/sdX < sda.sfdisk

들어 sfdisk입력, 당신은 단지 장치 이름을 생략하고, 유형의 라인을 사용할 수 있습니다 :

start=        2048, size=     3072000, type=7, bootable

존재하는 경우 무시되고 장치 이름은 명령 행 인수에서 가져옵니다.

몇 가지 설명 :

  • 헤더 라인 : 모두 옵션 :
  • 파티션 라인 :

    • start: 파티션이 시작되는 디스크 내부의 오프셋.

      start 매우 좋은 기본값을 가지고 있으며 종종 생략 될 수 있습니다.

      • 첫 번째 줄에 start2048, 즉 1Mb (2048 + 512)가 있으며 이는 디스크 호환성을위한 정상적인 기본값입니다.
      • start할당되지 않은 첫 번째 위치로 추가 기본값
    • size: man sfdisk말한다 : The default value of size indicates "as much as possible". 따라서 단일 파티션으로 디스크를 채우려면 다음을 사용하십시오./dev/sda : start=2048, type=83

    • type: 각 파티션 항목 의 부트 섹터에 저장된 매직 바이트 . 가능한 값 : https://en.wikipedia.org/wiki/Partition_type 이 예에서 우리는 다음을 관찰합니다.
      • 7( sda1, 23) : Windows가 지원하는 파일 시스템. 사전 설치된 Windows 항목 및 Lenovo 복구 파티션 sudo blkid라벨은 라벨을 식별하는 데 도움이됩니다.
      • 5( sda4) : 다른 논리 파티션을 포함하는 확장 기본 파티션 (MBR을 사용하여 4 개의 기본 파티션 만 가질 수 있기 때문에)
      • 83( sda5,, 78) : Linux가 지원하는 파티션. 나를 위해 home우분투 버전이 다른 하나의 뿌리와 두 개의 뿌리
      • 82( sd6) : 스왑

fdisk또한 대화식 세션 중에 sfdisk스크립트 I를 "소스 화" 하여 명령을 사용하여 스크립트를 읽을 fdisk수 있으므로 파티션을 작성하기 전에 추가로 사용자 정의 할 수 있습니다.

우분투 16.04, sfdisk2.27.1 에서 테스트되었습니다 .

파티션없이 이미지 파일을 포맷하고 채 웁니다 sudo

이것은 sfdisk하드 디스크를 폭파하지 않고 사용하는 방법을 배우는 좋은 방법입니다 . https : //.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root 권한 / 52850819 # 52850819


4
세상에 이것은 놀랍습니다. 전에 fdisk를 사용했지만 우연히 이미 파티션이있는 위치에 착륙하면 일반적으로 필요하지 않은 사용자의 확인을 원할 것입니다. sfdisk는 훌륭합니다, 감사합니다!
TaborKelly

3
이것은 허용 대답해야한다
뾰족 뒤쥐

55

fdiskstdin 에서 읽으 므로 적절한 명령을 제공하면됩니다. 예를 들어, 다음은 파티션 테이블이있는 경우이를 지우고 단일 파티션이있는 파티션 테이블을 새로 만듭니다. 전체 디스크 :

(
echo o # Create a new empty DOS partition table
echo n # Add a new partition
echo p # Primary partition
echo 1 # Partition number
echo   # First sector (Accept default: 1)
echo   # Last sector (Accept default: varies)
echo w # Write changes
) | sudo fdisk

입력 한 내용을 기록하여 재현 할 수 있도록 원하는 작업을 수행하는 것이 좋습니다.


4
허용되는 답변보다 echo 명령을 사용하면 조금 더 장황하지만 마술과 난독 화는 훨씬 덜합니다.
Henry Heikkinen

1
필자는 개인적으로 시스템 전체에서 일관되게 작동하는 것을 사용하는 습관을들이 는 printf대신 사용을 제안합니다 echo.
hugesupersuperman

37

몇 개의 명령만으로 여러 에코 대신 intros \ n을 사용하면됩니다.

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda

이것은 다른 것보다 간결하지만 불행히도 bash에서만 작동하는 것 같습니다.
bk138

ash / busybox 와도 작동합니다.
kikeenrique

2
다음에 또 다른 것이 \n필요 w합니까?
Qian Chen

6
이 작동하지만 끔찍하다 :-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

2
@ElgsQianChen : 아니오, echo개행 문자로 줄을 자동으로 종료 하기 때문에 ( -n옵션을 사용 하지 않는 한 )
Udo G

5

스크립트를 작성할 수 있습니다 fdisk.

(echo n; echo p; echo 1; echo 1; echo 200; echo w) | fdisk /dev/sdc

200MB 파티션을 만듭니다. /dev/sdc


우아한 답변!
Gangadhar Jannu

5

fdisk 로의 파이프 명령은 다른 사람들이 설명한 것처럼 잘 작동하지만이 방법은 조금 더 우아하고 읽기 쉽습니다.

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

(임시) 파일에서 파이핑도 작동합니다.

fdisk /dev/sdc < /tmp/fdisk.cmds

이 사람은 내 투표를 얻습니다. 깨끗하고 실행중인 주석으로 오염되지 않습니다.
David Betz

5

새 디스크 레이블 유형 gpt를 작성하십시오.

sudo /sbin/parted /dev/xvdf mklabel gpt --script

디스크를 분할하십시오.

sudo /sbin/parted /dev/xvdf mkpart primary 0% 100% --script


감사합니다. 이것은 "space opera.docx"를 fdisk로 파이핑하는 것을 포함하지 않는 유일한 해결책입니다.
Benibr

1
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda

2
새로운 사용자가 흔히 저지르는 실수는 실제로 문제를 해결하는 방법에 대한 세부 정보없이 답변하는 것입니다. 답변은 자세하고 필요에 따라 참조를 포함해야합니다. 답변이 유효한 이유에 대한 세부 사항을 포함하도록 답변을 편집하는 데 몇 분이 소요됩니다. 도움이 필요하면 어떻게 대답해야합니까?를 읽으십시오 . . 또한 승인 된 답변이있는 매우 오래된 질문에 대한 답변을 게시했습니다. 잘못된 점은 없지만 OP로부터 응답을받지 못할 수 있습니다.
CharlieRB


0

이 스크립트는 fdisk 를 사용하여 다른 사람의 답변에 따라 partiton을 만듭니다.

스크립트에서 다음을 변경하십시오.

NUM_PARTITIONS = 5

PARTITION_SIZE = "+ 10G"

사용 예는 스크립트 뒤에 제공됩니다.

#!/bin/bash
if [ $# -eq 0 ]
then
  echo "input the device"
  exit
fi

NUM_PARTITIONS=5
PARTITION_SIZE="+10G"    

SED_STRING="o"
TAIL="p
w
q
"

NEW_LINE="
"
LETTER_n="n"
EXTENDED_PART_NUM=4
TGTDEV=$1

SED_STRING="$SED_STRING$NEW_LINE"
for i in $(seq $NUM_PARTITIONS)
do
  if [ $i -lt $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
  if [ $i -eq $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$NEW_LINE$NEW_LINE"
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
  if [ $i -gt $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
done
SED_STRING="$SED_STRING$TAIL"

sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk ${TGTDEV}
  $SED_STRING
EOF

로 실행 :

sudo sh mk_partition.sh / dev / sdxxx


-2
#!/bin/sh
hdd="/dev/hda /dev/hdb /dev/hdc"
for i in $hdd;do
echo "n
p
1


w
"|fdisk $i;mkfs.ext3 "$i1";done 

이 스크립트를 사용할 수 있습니다. 정의 된 곳에 자신의 파티션을 정의하십시오 hdd. 1와 사이에 2 개의 공백이 있습니다 w. 기본값을 가져 오기 위해 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.