From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RP_MATCHES_RCVD autolearn=ham autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1732452712; bh=C6c09c06wBgVYcsf+8l6nLGfjPSl+lEgH2XOJVBJeNE=; h=Date:From:To:Subject:References:In-Reply-To:From; b=uANSE+SsPr+xWWesCi+QNHrhuDwaqFAlYzL1MhSVjcYNh9CVD5fcP/eCWF88n+MK6 6HSUhVeucfhmlIMmTB7XChI9xh1fJkmIpVucFMrtPmRFa72XHbRDvlkpIKJszQUgR4 bY7AF4sNP3xs/yt30aYpuUw6Cpkq9GBzad6PEaMYZHoOsPC+0QDBKZQE5/qNNPOnkm z/oY/HtouA7Oa63Gz1eaA6PowvW/2q6KsXmIkzH22wbQvRwVZF1D3p98kh80Ciz13L XVnR5PBprD134//ZiT5dv/jiYn7GHQ6eQxmWtJdbp0gMuAzwCPS6Z/6fJsTJCMzxDL nsqnrQ3kmHpmQ== Date: Sun, 24 Nov 2024 13:51:47 +0100 From: Alexey Gladkov To: make-initrd@lists.altlinux.org Message-ID: References: <20241116122309.df5fdad73578af49341206ad@basealt.ru> <8a849bcc-e792-40e5-a558-6c8693935278@basealt.ru> <27e1acdc-8776-4089-831d-693dedc642cd@basealt.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <27e1acdc-8776-4089-831d-693dedc642cd@basealt.ru> Subject: Re: [make-initrd] =?utf-8?b?0KDQsNGB0YjQuNGA0LXQvdC40LUg0YDQsNC30LQ=?= =?utf-8?b?0LXQu9CwINGBINC60L7RgNC90LXQvA==?= X-BeenThere: make-initrd@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: make-initrd@lists.altlinux.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Nov 2024 12:51:57 -0000 Archived-At: List-Archive: 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