Bug#1038818: grub-pc: Empty device (??? MB) in list during postinst with ZFS on / or /boot
Louis Sautier
sautier.louis at gmail.com
Wed Jun 21 19:07:11 BST 2023
Package: grub-pc
Version: 2.06-13
Hi,
When ZFS is used for the / or /boot partitions on legacy boot servers
(with vdevs using more than one disk/partition), grub-pc's postinst
shows this during the configure phase:
┌──────────────────┤ Configuring grub-pc ├──────────────────┐
│ GRUB install devices: │
│ │
│ [*] /dev/sda (240057 MB; SAMSUNG_MZ7LM240HMHQ-00005) │
│ [*] /dev/sdb (240057 MB; SAMSUNG_MZ7LM240HMHQ-00005) │
│ [ ] (??? MB; ???) │
│ [ ] /dev/md2 (1071 MB; md2) │
│ │
│ │
│ <Ok> │
│ │
└───────────────────────────────────────────────────────────┘
Along with errors:
Unknown device "/dev/": No such device
To reproduce, on a legacy boot server:
* Create a zpool with a mirror vdev using two partitions.
* Create a dataset and use it as /.
* Install Debian Bookworm on the server.
* Run "dpkg-reconfigure grub-pc".
On my test server:
root at localhost:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs tmpfs 1.6G 820K 1.6G 1% /run
zp0/zd0 zfs 216G 1.5G 214G 1% /
tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/md2 ext4 988M 66M 855M 8% /boot
tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/1000
root at localhost:~# lsblk -f
NAME FSTYPE FSVER LABEL
UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1
├─sda2 linux_raid_member 1.2 md2
371c03a8-59c4-5eb7-7fda-f6f5497ae463
│ └─md2 ext4 1.0 boot
197e5606-e75e-4809-87f9-13fbc42ed36d 854.7M 7% /boot
├─sda3 zfs_member 5000 zp0 8324519610909055574
├─sda4 swap 1 swap-sda4
08d6106d-f50d-4391-8515-5b2b8ffa1d6b [SWAP]
└─sda5 iso9660 Joliet Extension config-2 2023-06-16-18-40-55-00
sdb
├─sdb1
├─sdb2 linux_raid_member 1.2 md2
371c03a8-59c4-5eb7-7fda-f6f5497ae463
│ └─md2 ext4 1.0 boot
197e5606-e75e-4809-87f9-13fbc42ed36d 854.7M 7% /boot
├─sdb3 zfs_member 5000 zp0 8324519610909055574
└─sdb4 swap 1 swap-sdb4
55b30849-9949-4da0-9738-43e04b40a220 [SWAP]
root at localhost:~# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zp0 1.42G 214G 24K none
zp0/zd0 1.42G 214G 1.42G /
root at localhost:~# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP
HEALTH ALTROOT
zp0 222G 1.42G 221G - - 0% 0% 1.00x
ONLINE -
root at localhost:~# zpool status
pool: zp0
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
zp0 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sda3 ONLINE 0 0 0
sdb3 ONLINE 0 0 0
errors: No known data errors
root at localhost:~# cat /etc/fstab
UUID=197e5606-e75e-4809-87f9-13fbc42ed36d /boot ext4 defaults
0 0
UUID=08d6106d-f50d-4391-8515-5b2b8ffa1d6b swap swap defaults
0 0
UUID=55b30849-9949-4da0-9738-43e04b40a220 swap swap defaults
0 0
root at localhost:~# dpkg-reconfigure grub-pc
# With set -x / set +x added around line 281 of
/var/lib/dpkg/info/grub-pc.postinst
+++ grub-probe -t device /
++ partition='/dev/sda3
/dev/sdb3'
++ set +x
+++ grub-probe -t device /boot
++ partition=/dev/md2
++ set +x
+++ grub-probe -t device /boot/grub
++ partition=/dev/md2
++ set +x
Unknown device "/dev/": No such device
Unknown device "/dev/": No such device
Unknown device "/dev/": No such device
Unknown device "/dev/": No such device
grub-pc: Running grub-install ...
Installing for i386-pc platform.
Installation finished. No error reported.
grub-install success for /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
grub-install success for /dev/sdb
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.1.0-9-amd64
Found initrd image: /boot/initrd.img-6.1.0-9-amd64
done
My understanding is that the following happens:
* usable_partitions is called:
https://salsa.debian.org/grub-team/grub/-/blob/debian/2.06-13/debian/postinst.in#L275
* partition="$(grub-probe -t device "$path" || true)" is called:
https://salsa.debian.org/grub-team/grub/-/blob/debian/2.06-13/debian/postinst.in#L281
* It returns this:
# grub-probe -t device /
/dev/sda3
/dev/sdb3
* partition_id="$(device_to_id "$partition" || true)" is called:
https://salsa.debian.org/grub-team/grub/-/blob/debian/2.06-13/debian/postinst.in#L285
* device_to_id is called:
https://salsa.debian.org/grub-team/grub/-/blob/debian/2.06-13/debian/postinst.in#L95
* readlink -f "$1" is called:
https://salsa.debian.org/grub-team/grub/-/blob/debian/2.06-13/debian/postinst.in#L99
* It fails:
# readlink -f '/dev/sda3
/dev/sdb3'; echo $?
1
So, to sum up, when ZFS is used, grub-probe may return two partitions,
and "readlink -f 'part1\npart2'" obviously does not work.
More information about the Pkg-grub-devel
mailing list