Автоматически развернуть последний раздел, чтобы использовать все нераспределенное пространство, используя parted в пакетном режиме

20

Короче говоря, мне нужно выполнить все это автоматически при загрузке (встроенная система).

Наши инженеры перенесут изображения на производственные устройства. Эти изображения будут содержать небольшую таблицу разделов. При загрузке мне нужно автоматически развернуть последний раздел (# 3), чтобы использовать все доступное пространство на диске.

Вот что я получаю, когда смотрю на свободное место на моем диске.

> parted /dev/sda print free
Model: Lexar JumpDrive (scsi)
Disk /dev/sda: 32.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  25.3MB  24.2MB  fat16        primary  legacy_boot
        25.3MB  26.2MB  922kB   Free Space
 2      26.2MB  475MB   449MB   ext4         primary
 3      475MB   1549MB  1074MB  ext4         primary
        1549MB  32.0GB  30.5GB  Free Space

Мне нужно расширить раздел 3 на N (30,5 ГБ) число байтов

Как мне выполнить этот шаг автоматически, без подсказки? Это должно работать с динамическим размером пространства, доступного после 3-го раздела.

Пол Кнопф
источник
Не ждите, чтобы получить готовый сценарий, без попытки! Так можете ли вы показать нам, что вы пробовали до сих пор? Другое дело, что размер раздела, который вы изменяете, не должен быть смонтирован во время операции ....
Лучано Андресс Мартини
Я попробовал resizepartкоманду, и она работает, но требует точного размера. Мне нужно, чтобы оно было динамичным.
Пол Кнопф
resize2fsможет быть то, что я ищу. linux.die.net/man/8/resize2fs
Пол Нопф

Ответы:

21

В текущих версиях parted, resizepartдолжны работать для раздела ( partedпонимает 100%или вещи , как -1s, последние потребности также --прекратить разбор параметров на CmdLine). Для того, чтобы определить точное значение , которое вы можете использовать unit s, print free. resize2fsприходит позже для файловой системы.


В старых версиях partedбыла resizeкоманда, которая за один раз изменяла размеры как раздела, так и файловой системы, она даже работала vfat.

В модификации Kobo ereader я использовал это, чтобы максимально изменить размер 3-го раздела внутренней памяти: (он слепо предполагает, что 4-го раздела, таблицы msdos и прочего не существует)

start=$(cat /sys/block/mmcblk0/mmcblk0p3/start)
end=$(($start+$(cat /sys/block/mmcblk0/mmcblk0p3/size)))
newend=$(($(cat /sys/block/mmcblk0/size)-8))

if [ "$newend" -gt "$end" ]
then
    parted -s /dev/mmcblk0 unit s resize 3 $start $newend
fi

Таким образом, вы также можете получить значения, /sys/block/.../если ядро ​​его поддерживает. Но partedудалили resizeкоманду, так что вам нужно сделать два шага сейчас, resizepartчтобы увеличить раздел, и любой инструмент, предоставляемый вашей файловой системой, чтобы увеличить его, например, resize2fsдля ext*.

frostschutz
источник
Это именно то, что я искал. Спасибо за вашу помощь!
Пол Кнопф
Дополнительный вопрос, что с 8 байтами в конце?
Пол Кнопф
Избегайте изменения размера одним сектором ... вам придется изменить это значение на -40 или что-то еще (резервный заголовок GPT в конце диска).
frostschutz
Не partedподдерживает автоматическое расширение из командной строки? Потому что он поддерживает это в интерактивном режиме. Если запустить в интерактивном режиме, он спросит, хотите ли вы исправить таблицу разделов GPT, чтобы соответствовать размеру диска (тип fix), и затем вы можете запустить resizepart 3 -1. Я пытался выяснить, как заставить это сделать это из командной строки.
Харви
Не так быстро: команда resize была удалена в parted 3.0. Попробуйте sfdisk или gparted.
GregD
16

Будучи не в состоянии правильно выполнить скрипт parted (он запросил подтверждение, потому что раздел был смонтирован и вопреки другим ответам, которые я нашел, не понял -1sили 100%), я просто нашел инструмент growpart, который делает именно это.

Использовать просто: growpart /dev/sda 3(а затем resize2fs /dev/sda3или другую подходящую команду для используемого типа файловой системы).

В Debian и Ubuntu он упакован как cloud-guest-utils .

Иво Смитс
источник
1
Это самый удобный способ, который я мог бы найти для этого прямо сейчас. Это сработало чудесно.
SebiF
Это было для меня решением - parted не понравился ext4 в качестве файловой системы, и, похоже, не было никакого способа избежать попыток
Antti
не работает на Ubuntu 18.04
DreamFlasher,
@ DreamFlasher Я не могу сказать, почему это не сработало для вас. Насколько я вижу, вы можете просто установить пакет cloud-guest-utils, и поскольку это единственная функция, предоставляемая growpart, она должна работать, если нет ошибки, она используется неправильно или что-то из-под контроля не работает. Обратите внимание, что последний аргумент (в примере 3) - это размер раздела, который необходимо изменить, считая от 1, и что сразу после раздела должно быть достаточно места, чтобы можно было изменить его размер таким образом.
Иво Смитс
7

Правильный способ сделать это - использовать тот факт, что parted имеет понятие процентов. Так

parted /dev/sda resize 3 100%
Джонатан Баззард
источник
1
устарел, не работает с Ubuntu 18.04 и выше
DreamFlasher
Немного изменилась команда resize с разделенной версией 3, теперь вам нужно использовать команду resizepart, а затем отдельно изменить размер базовой файловой системы или PV, если это то, что вы используете. Для ext4 это команда resize2fs или для XFS это xfs_growfs. И то, и другое обычно выполняется при монтировании файловой системы, а аргумент является точкой монтирования в обоих случаях.
Джонатан Баззард
0

В Ubuntu 18.04 я могу изменить размер, чтобы заполнить нераспределенное пространство в скрипте следующим образом:

sudo parted -s /dev/sdb "resizepart 2 -1" quit
sudo mount -av
sudo umount /dev/sdb2
sudo mount /dev/sdb2 /mnt
sudo resize2fs /dev/sdb2

Возможно, нет необходимости монтировать перед изменением размера. Я сделал это, чтобы подавить запрос от resize2fs для пользовательского ввода.

Нолан Зинн
источник