parted가 이전 파티션 이후 자동으로 다음 파티션을 시작하도록 하시겠습니까?

parted가 이전 파티션 이후 자동으로 다음 파티션을 시작하도록 하시겠습니까?

나는 "무작위" 문자 목록을 파이프하는 쉘 스크립트를 상속 받았습니다 fdisk. 그것이 하는 일은 다음과 같이 디스크를 분할하는 것뿐입니다.

빈 디스크, 파티션 테이블 등을 설정합니다. 첫 번째 파티션 크기 A를 만듭니다. 첫 번째 파티션 크기 Y 바로 뒤에 두 번째 파티션을 만듭니다. 두 번째 파티션 바로 뒤에 X 크기의 세 번째 파티션을 만듭니다. "재미"를 더하기 위해 A, Y, X가 계산되며 사용 가능한 새 디스크의 크기에 따라 변경될 수 있습니다.

Fdisk는 기존 위치를 기반으로 시작 위치를 묻는 메시지를 표시하며 간단히 "Enter"를 누르면 "코드"가 승인됩니다.

parted --script...이 코드는 매우 불투명하므로 " "에 대한 호출로 바꾸고 싶지만 fdiskparted에서 "마지막 파티션 바로 다음에 시작"이라고 말할 수 있는 방법이 없습니다. 계속해서 시작 위치를 직접 계산해야 할 것 같습니다.

나 맞아? 그렇다면 누구든지 이에 대한 합리적인 해결책을 가지고 있습니까?

답변1

잘못된 스크립트가 수행하는 모든 작업의 ​​정확한 복사본을 작성할 필요는 없습니다. 재작성은 논리와 코드를 수정할 수 있는 기회입니다. 먼저 원본 코드의 기능을 해독한 다음 이를 일반적인 코드로 바꾸세요.

귀하의 직접적인 질문에 대한 대답은 "아니요. 시작과 끝을 스스로 제공해야 합니다"입니다. 다행히도 이것은 별로 어렵지 않습니다.

parted이 명령 은 및 인수를 mkpart사용합니다 (기본 단위는 메가바이트). 파티션을 생성할 때 이를 지정하기만 하면 됩니다. 예를 들어 디스크 이미지 파일을 사용하는 경우:startend

$ 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

partedif/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.

관련 정보