Программно разделить диск

10

Я пытаюсь создать скрипт bash, который создаст новый раздел с файловой системой на диске с существующими разделами.

Похоже, что создавать разделы легко с помощью parted, но вам нужно знать, где начинать и останавливать новый раздел, и именно здесь у меня возникают проблемы.

Я не хочу полагаться на диск, имеющий разделы в определенной позиции / размере. То есть я хочу создать новый раздел, начинающийся сразу после последнего существующего. Я хочу иметь возможность создать раздел либо фиксированного размера, либо заполнить оставшееся пространство.

В Bash есть ли надежный способ определения

а) конечная позиция последнего раздела и
б) оставшееся неразделенное пространство после последнего раздела?

Alex
источник
1
Даже если ты сможешь это сделать, я бы не стал. Представьте себе, какой ущерб опечатка может нанести здесь ...
Джозеф Р.
Лучше не надо. Установщики некоторых дистрибутивов имеют перераспределителей, и написать их не так-то просто. Слишком много угловых дел, слишком много вещей, которые вы можете испортить. Не делай этого. Если вы это сделаете, дайте ему создать предложенную конфигурацию, которая должна быть утверждена оператором.
Петер
Я согласен, что это опасно. Однако это сценарий, который будет начинаться со стирания всех разделов на диске, поэтому испортить разделы не составит большого труда. Единственный риск состоит в том, что пользователь указывает неправильный диск, что так же просто, как и любой инструмент для создания разделов.
Алекс

Ответы:

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;

Применимо ли это к вашей ситуации (в моем примере вы тоже не могли создать там раздел, он уже полностью заполнен) - это то, что вы должны выяснить сами. :)

frostschutz
источник
Спасибо! Для справки я использовал вашу функцию 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
Я обновил, пожалуйста, перечитайте.
Персидский залив
Вариант 2 тоже был изменен.
Персидский залив
2
Привет, то, что я имел в виду, было так: 'parted --list | awk' {print $ 2} '- это просто слепая связь с awk! Он не получает то, что вы хотите. Вы должны использовать опцию -m для parted, которая предлагает «дружественный для синтаксического анализа» вывод.
швейцарский
1
Больше нечего сказать, удачи.
швейцарский