프로그래밍 방식으로 디스크 파티션


10

기존 파티션이있는 디스크에 파일 시스템으로 새 파티션을 만드는 bash 스크립트를 만들려고합니다.

분할 방식으로 프로그래밍 방식으로 파티션을 만드는 것이 쉬운 것처럼 보이지만 새 파티션을 시작하고 중지하는 위치를 알아야하며 여기에서 문제가 발생합니다.

특정 위치 / 크기의 파티션이있는 디스크에 의존하고 싶지 않습니다. 즉, 마지막 기존 파티션 바로 다음부터 시작하여 새 파티션을 만들고 싶습니다. 그런 다음 고정 크기의 파티션을 만들거나 남은 공간을 채우고 싶습니다.

Bash에는 신뢰할만한 결정 방법이 있습니까?

a) 마지막 파티션의 끝 위치,
b) 마지막 파티션 뒤에 남은 파티션되지 않은 공간?


1
네가 할 수 있어도 난 못해 오타가 여기서 할 수있는 피해를 상상해보십시오.
Joseph R.

더 나은하지 않습니다. 일부 배포판의 설치 프로그램에는 재 파티 셔 너가 있으며 실제로 배포판을 작성하는 것은 간단한 일이 아닙니다. 너무 많은 코너 케이스, 너무 많은 것들을 엉망으로 만들 수 있습니다. 하지마 그렇다면 제안 된 구성을 생성하여 운영자가 승인해야합니다.
peterph

나는 이것이 위험하다는 데 동의합니다. 그러나 이것은 디스크의 모든 파티션을 지워서 시작하는 스크립트이므로 나중에 파티션을 엉망으로 만드는 것은 큰 문제가 아닙니다. 유일한 위험은 사용자가 잘못된 디스크를 지정하는 것인데, 이는 모든 파티션 도구와 마찬가지로 쉽습니다.
Alex

답변:


4

parted여유 공간을 인쇄 할 수 있습니다. 예 (고의로 복잡한 것을 선택했습니다) :

# parted /dev/sda unit s print free
[...]
Number  Start      End        Size       Type      File system  Flags
        63s        2047s      1985s                Free Space
 1      2048s      4196351s   4194304s   primary   fat32        lba
        4196352s   4198399s   2048s                Free Space
 2      4198400s   6295551s   2097152s   primary   ext2         boot
        6295552s   6297599s   2048s                Free Space
 3      6297600s   27269119s  20971520s  primary   ext2
        27269120s  27271167s  2048s                Free Space
 4      27271168s  31115263s  3844096s   extended               lba
 5      27273216s  29192191s  1918976s   logical   ext2
 6      29194240s  31115263s  1921024s   logical   ext2
        31115264s  31116287s  1024s                Free Space

보시다시피, 생성 할 수있는 파티션의 위치와 크기, 즉 가장 마지막 줄이 바로 표시 Free Space됩니다. 31115264에서 시작하여 31116287에서 끝나는 파티션을 만들 수 있습니다.

함정이 없다면 확장 파티션이 충분히 크지 않은 것입니다!

그러나 그러한 합병증을 겪지 않는 경우 이미 GPT를 사용하고있을 수 있습니다.

숫자를 쉽게 잡을 수 있어야합니다.

function make_partition
{
    parted -s "$1" unit s mkpart primary "$2" "$3"
}

make_partition /dev/sda `parted /dev/sda unit s print free | grep 'Free Space' | tail -n 1`

또는 비슷한 것. (자연스럽게 여기에서 더 많은 위생 검사를 원할 것입니다.)

@ swisscheese는 다른 답변에서 좋은 의견을 parted제시했지만 구문 분석 친화적 인 출력을 제공 했는지 몰랐습니다 . 대신 사용하도록 선택할 수 있습니다. 가장 큰 자유를 잡는 예 :

# parted -m /dev/sda unit s print free | grep 'free;' | sort -t : -k 4n -k 2n | tail -n 1
1:27269120s:27271167s:2048s:free;

그것이 귀하의 상황에 해당되는지 여부 (제 예에서는 파티션을 만들 수 없었지만 이미 가득 찼습니다)는 스스로 알아 내야합니다. :)


감사! 참고로 make_partition 함수를 사용했지만 약간 다른 인수로 make_partition $ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex

-1

쉽고, 옵션 mkparted이 있으며, 마지막 파티션 --list을 사용 awk 하고 --list검색 한 다음 mkpart part-type [fs-type] start end,

그러나 당신의 대답 :

처음에는 모든 파티션을 가져와야합니다.

mystartgroup=`parted --list |awk {'print $2'}`
myendgroup=`parted --list |awk {'print $3'}`

노트:

  1. 로 변환해야 GB합니다 MG.
  2. 각각의 마지막 값을 사용해야합니다 variable
  3. 최종 스크립트에서 사용해야 -s합니다 parted command.

시간이 있으면 시간이 없어 죄송합니다.


안녕하세요, 실제로 제안한 명령 순서를 실행 했습니까? 나는 그들이 당신이 원하는 것을한다고 생각하지 않습니다 .. :(
swisscheese

나는 업데이 트했습니다, 다시 읽어주십시오.
PersianGulf

옵션 2도 변경되었습니다.
PersianGulf

2
안녕, 내가 의미하는 것은 'parted --list | awk'{print $ 2} '는 맹목적으로 멍청이입니다! 원하는 것을 얻지 못합니다. "parse-friendly"출력을 제공하는 -m 옵션을 parted로 사용해야합니다.
swisscheese

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