bash 스크립트를 사용하여 파티션을 만들고 포맷하는 방법이 있습니까?
fdisk로 할 수 있다고 생각하지만 bash 스크립트에서 fdisk 쉘로 명령을 공급 한 다음 fdisk 쉘을 종료하는 방법을 모르겠습니다.
파티션을 만들고 bash 내에서 ntfs로 포맷하고 싶습니다.
bash 스크립트를 사용하여 파티션을 만들고 포맷하는 방법이 있습니까?
fdisk로 할 수 있다고 생각하지만 bash 스크립트에서 fdisk 쉘로 명령을 공급 한 다음 fdisk 쉘을 종료하는 방법을 모르겠습니다.
파티션을 만들고 bash 내에서 ntfs로 포맷하고 싶습니다.
답변:
이전 제안과 마찬가지로 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
sfdisk
보다 자동화 친화적입니다fdisk
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
존재하는 경우 무시되고 장치 이름은 명령 행 인수에서 가져옵니다.
몇 가지 설명 :
label
: 파티션 테이블의 유형. dos
(MBR) 은 오래되고 널리 지원되는 gpt
새로운 것입니다.unit
: 만 sector
지원됩니다. 1 섹터는 일반적으로 512 바이트와 같습니다. 로 찾기 cat /sys/block/sda/queue/hw_sector_size
참조 : https://unix.stackexchange.com/questions/2668/finding-the-sector-size-of-a-partitiondevice
: 유익한 정보 만파티션 라인 :
start
: 파티션이 시작되는 디스크 내부의 오프셋.
start
매우 좋은 기본값을 가지고 있으며 종종 생략 될 수 있습니다.
start
2048, 즉 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
, 2
및 3
) : Windows가 지원하는 파일 시스템. 사전 설치된 Windows 항목 및 Lenovo 복구 파티션 sudo blkid
라벨은 라벨을 식별하는 데 도움이됩니다.5
( sda4
) : 다른 논리 파티션을 포함하는 확장 기본 파티션 (MBR을 사용하여 4 개의 기본 파티션 만 가질 수 있기 때문에)83
( sda5
,, 7
및 8
) : Linux가 지원하는 파티션. 나를 위해 home
우분투 버전이 다른 하나의 뿌리와 두 개의 뿌리82
( sd6
) : 스왑fdisk
또한 대화식 세션 중에 sfdisk
스크립트 I
를 "소스 화" 하여 명령을 사용하여 스크립트를 읽을 fdisk
수 있으므로 파티션을 작성하기 전에 추가로 사용자 정의 할 수 있습니다.
우분투 16.04, sfdisk
2.27.1 에서 테스트되었습니다 .
파티션없이 이미지 파일을 포맷하고 채 웁니다 sudo
이것은 sfdisk
하드 디스크를 폭파하지 않고 사용하는 방법을 배우는 좋은 방법입니다 . https : //.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root 권한 / 52850819 # 52850819
fdisk
stdin 에서 읽으 므로 적절한 명령을 제공하면됩니다. 예를 들어, 다음은 파티션 테이블이있는 경우이를 지우고 단일 파티션이있는 파티션 테이블을 새로 만듭니다. 전체 디스크 :
(
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
입력 한 내용을 기록하여 재현 할 수 있도록 원하는 작업을 수행하는 것이 좋습니다.
printf
대신 사용을 제안합니다 echo
.
몇 개의 명령만으로 여러 에코 대신 intros \ n을 사용하면됩니다.
echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda
\n
필요 w
합니까?
echo
개행 문자로 줄을 자동으로 종료 하기 때문에 ( -n
옵션을 사용 하지 않는 한 )
스크립트를 작성할 수 있습니다 fdisk
.
(echo n; echo p; echo 1; echo 1; echo 200; echo w) | fdisk /dev/sdc
200MB 파티션을 만듭니다. /dev/sdc
fdisk 로의 파이프 명령은 다른 사람들이 설명한 것처럼 잘 작동하지만이 방법은 조금 더 우아하고 읽기 쉽습니다.
fdisk /dev/sdc <<EOF
n
p
1
w
EOF
(임시) 파일에서 파이핑도 작동합니다.
fdisk /dev/sdc < /tmp/fdisk.cmds
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda
이 스크립트는 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