[make-initrd] Расширение раздела с корнем

Антон Мидюков antohami at basealt.ru
Sun Nov 24 16:00:28 MSK 2024


24.11.2024 15:51, Alexey Gladkov пишет:
> On Sun, Nov 24, 2024 at 01:34:46PM +0300, Антон Мидюков wrote:
>> 23.11.2024 20:59, Alexey Gladkov пишет:
>>> On Sat, Nov 23, 2024 at 05:18:28PM +0300, Антон Мидюков wrote:
>>>> 16.11.2024 16:28, Alexey Gladkov пишет:
>>>>> On Sat, Nov 16, 2024 at 12:23:09PM +0700, Egor Shestakov wrote:
>>>>>> Всем привет!
>>>>>>
>>>>>> Есть ли у initrd возможность штатными средствами расширить раздел 
>>>>>> с корнем на всё свободное место? Это необходимо после установки образа
>>>>>> системы на sd-карточку. Фича kickstart вроде умеет создавать разделы, но
>>>>>> как с ним работать не понятно, и можно ли её использовать на уже
>>>>>> установленной системе?
>>>>>
>>>>> Это можно сделать через kickstart. У команды partition есть опция --grow [1].
>>>>> Вот тут [2] есть пример использования. Чтобы расширить существующий раздел
>>>>> нужно использовать опцию --resize.
>>>>>
>>>>> [1] https://github.com/osboot/make-initrd/wiki/feature-kickstart#part-or-partition
>>>>> [2] https://github.com/osboot/make-initrd/blob/master/testing/test-root-efi-partition.cfg
>>>>>
>>>>
>>>> Я попробовал. Столкнулся с проблемами.
>>>>
>>>> 1. Какой-то не такой readlink используется в initrd, который не знает опцию -e.
>>>> Обошёл так:
>>>> diff --git a/make-initrd/features/kickstart/data/bin/kickstart-sh-storage b/make-initrd/features/kickstart/data/bin/kickstart-sh-storage
>>>> index 2cd7b12c..de9b9c1a 100644
>>>> --- a/make-initrd/features/kickstart/data/bin/kickstart-sh-storage
>>>> +++ b/make-initrd/features/kickstart/data/bin/kickstart-sh-storage
>>>> @@ -820,7 +825,7 @@ part()
>>>>  		local partnum
>>>>  		read -r partnum < "/sys/class/block/$partdev/partition"
>>>>  
>>>> -		dev="$(readlink -ev "/sys/class/block/$partdev")"
>>>> +		dev="$(readlink -v "/sys/class/block/$partdev")"
>>>>  		dev="${dev%/*}"
>>>>  		dev="${dev##*/}"
>>>
>>> Да, я с этим уже сталкивался. У меня даже есть враппер для этого:
>>>
>>> https://github.com/osboot/make-initrd/blob/master/runtime/data/bin/readlink-e
>>>
>>> В busybox readlink немного не совместимый с coreutils.
>>>
>>
>> То есть нужно заменить 'readlink -ev' на 'readlink-e -v'? Прислать патч?
> 
> Враппер сам добавляет -v. Просто сделать:
> 
> dev="$(readlink-e "/sys/class/block/$partdev")"
> 

Спасибо.

>>  
>>>>
>>>> 2. Есть потребность считать корневым разделом тот, что скрывается за
>>>> переменной ROOT, чтобы не нужно было привязываться к конкретному UUID
>>>> или LABEL и соответственно в случае их изменения пересобирать initrd.
>>>> Поэтому сделал такой патчик:
>>>>
>>>> diff --git a/make-initrd/features/kickstart/data/bin/kickstart-sh-storage b/make-initrd/features/kickstart/data/bin/kickstart-sh-storage
>>>> index 2cd7b12c..de9b9c1a 100644
>>>> --- a/make-initrd/features/kickstart/data/bin/kickstart-sh-storage
>>>> +++ b/make-initrd/features/kickstart/data/bin/kickstart-sh-storage
>>>> @@ -12,6 +12,11 @@ ks_devname()
>>>>  {
>>>>  	local devname=''
>>>>  	case "$1" in
>>>> +		root)
>>>> +			[ -n "$ROOT" ] || fatal "root is not specified"
>>>> +			ks_devname "$ROOT"
>>>> +			return
>>>> +			;;
>>>>  		LABEL=*)
>>>>  			devname="$(blkid -o device -L "${1#LABEL=}")"
>>>>  			;;
>>>
>>> Ок. Можно такой алиас сделать.
>>>
>>
>> Замечаний к коду нет? Тогда пришлю патч?
> 
> У меня сомнения связанные с названием. В ks_devname проверяет LABEL=*,
> UUID=*, /dev/* а остальное считается поддиректорией в /sys.
> 
> Без патча алиас `root` попадаёт в последнюю категорию. Скорее всего (я
> практически уверен) не может быть такого имени в /sys/class/block/*.
> 
> Но может быть использовать `/dev/root` в качестве алиаса ?
> 
> https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.rst#locally-defined-links
>

Хорошо. Давайте использовать `/dev/root`.
 
>>
>>>> kickstart файл у меня получился такой:
>>>> part --onpart=root --resize --grow --useexisting
>>>>
>>>> 3. Раздел увеличивается, но файловая система нет. Так и должно быть? Или
>>>> я что-то делаю не так.  Сразу не заметил, так как в /etc/fstab был
>>>> указан параметр монтирования x-systemd.growfs, благодаря чему файловая
>>>> система расширялась systemd.
>>>
>>> Я это не реализовал так как в тот момент мне это не было нужно. Но считаю,
>>> что раз возникла потребность, то это стоит сделать. Правда пока не не знаю
>>> несколько это будет хлопотно.
>>>
>>
>> В принципе, пока можно и с x-systemd.growfs жить.  Но он привязан к
>> systemd и не поддерживает, к примеру, f2fs, которая хорошо подходит для
>> флешек (что акутально для планшетов, смартфонов, одноплатников).
> 
> Сначала хотел привести относительно простой патч для поддержки, но беглое
> чтение документации превратило патч вот в это:
> 
> diff --git a/features/kickstart/data/bin/kickstart-sh-storage b/features/kickstart/data/bin/kickstart-sh-storage
> index 2cd7b12c..5e794586 100644
> --- a/features/kickstart/data/bin/kickstart-sh-storage
> +++ b/features/kickstart/data/bin/kickstart-sh-storage
> @@ -539,6 +539,59 @@ ks_get_dev_id()
>         printf '%s\n' "$1"
>  }
> 
> +ks_requires_ext4=("resizefs")
> +ks_requires_xfs=("xfs_growfs")
> +ks_requires_f2fs=("resize.f2fs")
> +ks_growfs()
> +{
> +       local PROG
> +       local fs="" requires="" ret=0
> +
> +       PROG="kickstart"
> +       message "command: ${FUNCNAME[0]} $*"
> +
> +       fs="$(blkid --output value --match-tag TYPE -c /dev/null "$1")" ||
> +               return 0
> +
> +       case "$fs" in
> +               ext*) requires="ks_growfs_ext4" ;;
> +               xfs)  requires="ks_growfs_xfs"  ;;
> +               f2fs) requires="ks_growfs_f2fs" ;;
> +               *)
> +                       # resize unsupported.
> +                       return 0
> +                       ;;
> +       esac
> +
> +       ks_check_requires "$requires" ||
> +               return 1
> +
> +       verbose "Increase filesystem to partition size: $1"
> +
> +       case "$fs" in
> +               ext*)
> +                       resizefs "$1" ||
> +                               ret=1
> +                       ;;
> +               xfs)
> +                       mount -n -o rw,X-mount.mkdir \
> +                               "$1" \
> +                               "$ks_datadir/xfs.dir"
> +                       xfs_growfs \
> +                               "$ks_datadir/xfs.dir" ||
> +                               ret=1
> +                       umount -f \
> +                               "$ks_datadir/xfs.dir"
> +                       ;;
> +               f2fs)
> +                       resize.f2fs "$1" ||
> +                               ret=1
> +                       ;;
> +       esac
> +
> +       return $ret
> +}
> +
>  ks_requires_part=("numfmt" "sfdisk")
>  part()
>  {
> @@ -828,6 +881,8 @@ part()
> 
>                 printf ', %s\n' "$size" |
>                         sfdisk -q -N "$partnum" "/dev/$dev"
> +
> +               ks_growfs "/dev/$dev$partnum"
>         fi
> 
>         if [ -n "$encrypted" ]; then
> 
> 

Попробую и отпишусь.

-- 
С уважением, Антон Мидюков <antohami at basealt.ru>


More information about the Make-initrd mailing list