On 2015-12-11, Martin Michlmayr wrote: > Package: flash-kernel > Version: 3.52 > > I noticed these two patches: > > https://lists.debian.org/debian-kernel/2015/12/msg00167.html > https://lists.debian.org/debian-kernel/2015/12/msg00168.html > > flash-kernel probably needs a similar change, or should use the code > from initramfs-tools if possibl.
I didn't use blkid, but added support for PARTUUID in 3.69, and just
added support for PARTLABEL in git.
I don't think flash-kernel should use blkid in the way that
initramfs-tools is using it, as initramfs-tools uses blkid at boot time,
and the flash-kernel code is run at initramfs creation
time... hard-coding the specific device at that point doesn't seem like
the right approach.
That said, it was really quite simple to add:
# Translate LABEL, UUID, PARTLABEL and PARTUUID entries into a proper
# device name.
case "$rootdev" in
LABEL=* | UUID=* | PARTLABEL=* | PARTUUID=*)
rootdev="$(blkid -l -t "$rootdev" -o device)"
;;
*=*)
echo "/etc/fstab parse error; cannot recognize root
$rootdev" >&2
rootdev=/dev/sda2
echo "guessing that the root device is $rootdev" >&2
;;
esac
But it ends up hard-coding, for example, ROOT="/dev/sda3" into the
initramfs, which isn't really correct. The blkid resolution should be
resolved at boot, in initramfs-tools.
I think the current code is actually safer, as it doesn't depend on
device ordering remaining static at boot:
# Translate LABEL, UUID, and PARTUUID entries into a proper device name.
if echo "$rootdev" | grep -q "="; then
a=$(echo "$rootdev" | cut -d "=" -f 1)
b=$(echo "$rootdev" | cut -d "=" -f 2- | sed -e 's/^"\(.*\)"$/\1/')
case "$a" in
LABEL)
c=$(echo "$b" | sed 's#/#\\x2f#g')
if [ -e /dev/disk/by-label/$c ]; then
rootdev="/dev/disk/by-label/$c"
else
echo "Label $b not found in /dev/disk/by-label"
>&2
fi
;;
UUID)
rootdev=/dev/disk/by-uuid/$b
if [ ! -e $rootdev ]; then
echo "UUID $b doesn't exist in
/dev/disk/by-uuid" >&2
fi
;;
PARTUUID)
rootdev=/dev/disk/by-partuuid/$b
if [ ! -e $rootdev ]; then
echo "PARTUUID $b doesn't exist in
/dev/disk/by-partuuid" >&2
fi
;;
PARTLABEL)
rootdev=/dev/disk/by-partlabel/$b
if [ ! -e $rootdev ]; then
echo "PARTLABEL $b doesn't exist in
/dev/disk/by-partlabel" >&2
fi
;;
*)
echo "/etc/fstab parse error; cannot recognize root
$rootdev" >&2
rootdev=/dev/sda2
echo "guessing that the root device is $rootdev" >&2
;;
esac
fi
Although, older kernels or older versions of udev may not support the
/dev/disk/by-* symlink...
It might be worth exploring just passing ROOT="$rootdev" without any
modification, and let initramfs-tools resolve it appropriately.
live well,
vagrant
signature.asc
Description: PGP signature

