public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: Henning Schild <henning.schild@siemens.com>
To: "Schaffner, Tobias (T CED SES-DE)" <tobias.schaffner@siemens.com>
Cc: "isar-users@googlegroups.com" <isar-users@googlegroups.com>,
	"Moessbauer, Felix (T CED INW-CN)" <felix.moessbauer@siemens.com>,
	"Kiszka, Jan (T CED)" <jan.kiszka@siemens.com>
Subject: Re: [PATCH] expand-on-first-boot: wait for udev to create symlink
Date: Thu, 8 Dec 2022 20:42:14 +0100	[thread overview]
Message-ID: <20221208204214.74ec0390@md1za8fc.ad001.siemens.net> (raw)
In-Reply-To: <12b922b2-8e32-2520-add6-dfbb9b772b48@siemens.com>

Am Thu, 8 Dec 2022 20:18:28 +0100
schrieb "Schaffner, Tobias (T CED SES-DE)"
<tobias.schaffner@siemens.com>:

> On 08.12.22 18:39, Schild, Henning (T CED SES-DE) wrote:
> > Am Thu, 8 Dec 2022 17:55:42 +0100
> > schrieb "T. Schaffner" <tobias.schaffner@siemens.com>:
> >   
> >> From: Tobias Schaffner <tobias.schaffner@siemens.com>
> >>
> >> systemd-growfs depends on a symlink to the partition of the
> >> filesystem that should be resized. This symlink is created by udev
> >> in /dev/block/.
> >>
> >> If this symlink is not yet created for example because
> >> systemd-udev is not up yet systemd-growfs will fail.
> >>
> >> We could use Require and After to depend on the systemd-udev
> >> service but this could again create a race condition if udev is up
> >> but not fast enough after the partx -u.
> >>
> >> Resolve the symlinks in /dev/block/ periodically until the symlink
> >> appears before running systemd-growfs.
> >> ---
> >>   .../files/expand-last-partition.sh               | 16
> >> +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
> >>
> >> diff --git
> >> a/meta/recipes-support/expand-on-first-boot/files/expand-last-partition.sh
> >> b/meta/recipes-support/expand-on-first-boot/files/expand-last-partition.sh
> >> index 57055cc..7ebb3e5 100755 ---
> >> a/meta/recipes-support/expand-on-first-boot/files/expand-last-partition.sh
> >> +++
> >> b/meta/recipes-support/expand-on-first-boot/files/expand-last-partition.sh
> >> @@ -38,7 +38,8 @@ if [ "$DISK_SIZE" -lt "$MINIMAL_SIZE" ]; then
> >> exit 0 fi -LAST_PART="$(sfdisk -d "${BOOT_DEV}" 2>/dev/null | tail
> >> -1 | cut -d ' ' -f 1)" +LAST_PART_NAME="$(lsblk -l -o NAME
> >> "${BOOT_DEV}" | tail -1)" +LAST_PART="/dev/${LAST_PART_NAME}"
> >>   
> >>   # Transform the partition table as follows:
> >>   #
> >> @@ -79,6 +80,19 @@ if [ ! -d "${MOUNT_POINT}" ]; then
> >>   	exit 1
> >>   fi
> >>   
> >> +START_TIME="$(date +%s)"
> >> +
> >> +# Wait for udev to create the symlink to the partition in  
> > 
> > Newer systemd versions will not need that anymore. Maybe write down
> > which version that would be and starting from which debian distro we
> > can drop that. Who knows when that udev stuff changes and the
> > symlinks will never appear ... We should only wait for them in
> > systemd versions that use them.
> > 
> > If we already have a version out there ... like bookworm? We can
> > already implement it without the wait.  
> 
> Yes you are right. I will add a check and skip the loop from V252 on.
> 
> >> /dev/block/ as +# systemd-growfs depends on it
> >> +while ! readlink /dev/block/* | grep -q "${LAST_PART_NAME}"; do  
> > 
> > I would make that much stricter to not be tricked by partial matches
> > 
> > sda4 vs sda42
> > 
> > readlink -f /dev/block/* | grep -e -q "^${LAST_PART}$"  
> 
> I get a relative path from readlink. So I will have to skip the ^ but
> to use match the end of the line is a good idea. -e is not needed for
> start and end line matches. ;)
> 
> >> +    sleep 0.1  
> > 
> > I wonder if there is anything we could do here. Maybe "udevadm
> > trigger" and depend on udev after all. Because the 5 is a nasty
> > guess ...  
> 
> 
> Nothing that I am aware of. The main reason for the issues that we
> have seen was that the udev service was not up yet. We could maybe
> check if it is up first and after that only allow a small period. But
> then again how long do we wait for the service to be up and running.
> 
> >> +    CURRENT_TIME="$(date +%s)"
> >> +    if [ $(( CURRENT_TIME - START_TIME )) -gt "5" ]; then  
> > 
> > we can simply i++ > 50, no need to call date
> > 
> > so maybe
> > 
> > err=1
> > for i in $(seq 0 50); do
> > 	if readlink -f /dev/block/* | grep -e -q "^${LAST_PART}$";
> > then err=0
> > 		break
> > 	fi
> > 	sleep 0.1
> > done
> > 
> > if $err ...  
> >> +        echo "Could not find symlink to last part in /dev/block/."
> >> +        exit 1
> >> +    fi
> >> +done
> >> +
> >>   mount "${LAST_PART}" "${MOUNT_POINT}"
> >>   /lib/systemd/systemd-growfs "${MOUNT_POINT}"  
> > 
> > we could also loop over calling this until it goes "0" or we reach a
> > retry counter, that way we magically handle new systemd versions
> > that do not need symlinks and do not implement anything with
> > symlinks.  
> 
> 
> That's a cool idea. As systemd-growfs returns 1 in all error cases we
> will have to parse stderr to determine if we ran in the error case
> that we want to handle. I will give it a try.

True ... parsing the error smells bad. But let us have a look at the
code we get. We should probably do some code reading of < 252 to make
sure the parser would catch it in all affected versions since stretch.
And if >= 252 solved that for us that code will hopefully never fail
again ... famous last expand-on-first-boot patch ;)
I will do a 252 (bookworm) test run on the raspbi which i used to
repro. In theory that should work without this upcoming patch already.
Also gives the chance to add "raspios-bookworm" to isar.

Henning

> 
> > Henning
> >   
> >>   umount "${MOUNT_POINT}"  
> >   


  reply	other threads:[~2022-12-08 19:42 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-08 16:55 T. Schaffner
2022-12-08 17:39 ` Henning Schild
2022-12-08 19:18   ` Schaffner, Tobias
2022-12-08 19:42     ` Henning Schild [this message]
2022-12-09  0:22   ` Roberto A. Foglietta
2022-12-09 10:51     ` Schaffner, Tobias
2022-12-09 17:17       ` Roberto A. Foglietta

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221208204214.74ec0390@md1za8fc.ad001.siemens.net \
    --to=henning.schild@siemens.com \
    --cc=felix.moessbauer@siemens.com \
    --cc=isar-users@googlegroups.com \
    --cc=jan.kiszka@siemens.com \
    --cc=tobias.schaffner@siemens.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox