나는 "무작위" 문자 목록을 파이프하는 쉘 스크립트를 상속 받았습니다 fdisk
. 그것이 하는 일은 다음과 같이 디스크를 분할하는 것뿐입니다.
빈 디스크, 파티션 테이블 등을 설정합니다. 첫 번째 파티션 크기 A를 만듭니다. 첫 번째 파티션 크기 Y 바로 뒤에 두 번째 파티션을 만듭니다. 두 번째 파티션 바로 뒤에 X 크기의 세 번째 파티션을 만듭니다. "재미"를 더하기 위해 A, Y, X가 계산되며 사용 가능한 새 디스크의 크기에 따라 변경될 수 있습니다.
Fdisk는 기존 위치를 기반으로 시작 위치를 묻는 메시지를 표시하며 간단히 "Enter"를 누르면 "코드"가 승인됩니다.
parted --script...
이 코드는 매우 불투명하므로 " "에 대한 호출로 바꾸고 싶지만 fdisk
parted에서 "마지막 파티션 바로 다음에 시작"이라고 말할 수 있는 방법이 없습니다. 계속해서 시작 위치를 직접 계산해야 할 것 같습니다.
나 맞아? 그렇다면 누구든지 이에 대한 합리적인 해결책을 가지고 있습니까?
답변1
잘못된 스크립트가 수행하는 모든 작업의 정확한 복사본을 작성할 필요는 없습니다. 재작성은 논리와 코드를 수정할 수 있는 기회입니다. 먼저 원본 코드의 기능을 해독한 다음 이를 일반적인 코드로 바꾸세요.
귀하의 직접적인 질문에 대한 대답은 "아니요. 시작과 끝을 스스로 제공해야 합니다"입니다. 다행히도 이것은 별로 어렵지 않습니다.
parted
이 명령 은 및 인수를 mkpart
사용합니다 (기본 단위는 메가바이트). 파티션을 생성할 때 이를 지정하기만 하면 됩니다. 예를 들어 디스크 이미지 파일을 사용하는 경우:start
end
$ cat partition.sh
#!/bin/sh
truncate -s 1G disk.img # create a 1G disk image file
parted -s disk.img mklabel msdos # create the partition table
# make some partitions
parted -s disk.img mkpart primary 1 100
parted -s disk.img mkpart primary 101 200
parted -s disk.img mkpart primary 201 800
parted -s disk.img mkpart primary 801 1000
parted -s disk.img print
아니면 parted
한 번만 실행해 보세요.
#!bin/sh
truncate -s 1G disk.img # create a 1G disk image file
parted -s disk.img mklabel msdos \
mkpart primary 1 100 \
mkpart primary 101 200 \
mkpart primary 201 800 \
mkpart primary 801 1000 \
print
$ ./partition.sh
Model: (file)
Disk /home/cas/stack-exchange/2018-01-03/pauldsmith/disk.img: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 99.6MB 98.6MB primary
2 101MB 200MB 99.6MB primary
3 201MB 800MB 599MB primary
4 801MB 1000MB 199MB primary
어려운 부분은 파티션의 정확한 시작 및 끝 값을 계산하여 섹터 크기에 맞게 정렬하는 것입니다. 첫 번째 파티션은 간단합니다. 1MB는 512바이트 및 4K 섹터로 정렬됩니다. 1MB의 정확한 배수로 시작하는 모든 파티션도 올바르게 정렬됩니다(위 예에서 생성된 모든 파티션은 올바르게 정렬됩니다).
모든 파티션의 시작 및 끝 값에 대해 쉘 변수를 사용할 수 있습니다. 이를 통해 쉘 산술을 사용하여 계산할 수 있습니다(그러나 쉘 산술은 정수에만 적용된다는 점을 기억하십시오. 부동 소수점 또는 백분율 계산을 수행해야 하는 경우 bc
또는 ).dc
parted
그런데 의 명령을 사용하여 정렬을 확인할 수 있습니다 align-check
. 예를 들어
$ parted disk.img align-check optimal 1
WARNING: You are not superuser. Watch out for permissions.
1 aligned
align-check
스크립트 모드 옵션과 함께 사용 하면 출력이 생성되지 않습니다. 반대로 잘못 정렬되면 상태 1로 종료됩니다. 그렇지 않으면 스크립트의 나머지 부분이 계속됩니다.parted
-s
parted
if/then 기능이 없으므로 정렬 확인과 파티션 생성을 자동화하려면 위 스크립트의 첫 번째 버전을 사용하여 check-align
각 스크립트 사이에 명령을 삽입 mkpart
하고 적절한 종료 코드를 만들 수 있습니다. 응답은 다음과 같습니다. 0이 아닙니다.
답변2
parted
다음을 사용하여 끝 섹터를 인쇄 할 수 있습니다 .
$ parted /dev/sda 'unit s print'
Number Start End Size File system Name Flags
1 2048s 1048575s 1046528s fat32 primary boot, esp
2 1048576s 2095103s 1046528s ext4 primary raid
그런 다음 다음 파티션은 이전 파티션 뒤에서 +1 섹터를 시작합니다. ( 2095103s
이전 파티션의 크기가 올바른 단위로 제공된다고 가정).
(parted) mkpart primary 2095104s 100%
백분율을 사용하여 직접 계산할 수도 있습니다 parted
.