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

Alexey Gladkov legion at kernel.org
Sun Nov 24 15:51:47 MSK 2024


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

> 
> >> 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


-- 
Rgrds, legion



More information about the Make-initrd mailing list