diff --git a/main/busybox-initscripts/APKBUILD b/main/busybox-initscripts/APKBUILD index c4513926f34831cadd87176f33ee85d655659180..f6a36785bf55c93895cb67140fd8b626b7087640 100644 --- a/main/busybox-initscripts/APKBUILD +++ b/main/busybox-initscripts/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Natanael Copa pkgname=busybox-initscripts pkgver=4.1 -pkgrel=0 +pkgrel=1 pkgdesc="Init scripts for busybox daemons" url="https://git.alpinelinux.org/aports/tree/main/busybox-initscripts" arch="noarch" @@ -16,7 +16,9 @@ replaces="alpine-baselayout openntpd" source="acpid.initd crond.initd dnsd.initd httpd.initd inetd.initd klogd.initd mdev.initd ntpd.initd rdate.initd syslog.initd udhcpd.initd loadkmap.initd watchdog.initd crond.confd klogd.confd ntpd.confd rdate.confd syslog.confd - watchdog.confd loadkmap.confd mdev.conf dvbdev usbdev persistent-storage + watchdog.confd loadkmap.confd mdev.conf dvbdev usbdev + persistent-storage + persistent-storage.bats ptpdev ptpdev.bats " @@ -77,10 +79,11 @@ b0ba67585f39d83320ed6de183d7463a0e163807b9f3dc6f0baa212236056f22aeb2c5399dfdcd54 bf8173ee33a5d2b61cbdbc1b070e599a17a21e5433a0d8aa9beef71e4ac831304076af8e7e58dc594cdee61562329793afdc57af91e5496bf5fffb9b734a3d9c syslog.confd 359af0a4a1841dd6557eaf3e71d39f0d7a2687bad6a8fc6ef436eccf72a40f85c6400a3b7880c7f64d8e460b6af8a0ff3dd5ffc3a4b1aa8eb0d8f7eaf99ee3e4 watchdog.confd acbba3385fb2c416362eb9176f24146b617a2e394ee0e00b9eff89350f82468a5ab8396f4f52b0aaf03d341ac6150c73182e808fa3f29a2dc71c69271cdfb811 loadkmap.confd -b5c299d5dcd854eb23717aab6938e2e1c9572d10ed667595b4a98f9cddca9f81c3f8f7ae508b62db5fe203c45c696d3c2a9ce62761aa329b2bcfcc5e5a3a9224 mdev.conf +4834182912405a38bafea775f7c75ee4b2690167b477d4e673e97723e505478ee67b012c09e0e1f3f58627e3ec143e663e80c14ad52b955d29534055203f3b72 mdev.conf ebd82f935da2ca89097234dd8a8f47e179a423652c151123a1f3343f3e1e7bfaba2b8800380e988d4e8f4294545d3a9ab6708ae2e77c5b108b5f091bbce8f94a dvbdev b2dcf0ded9264334d79fbbb05dd12d649dc3119a060db5893f0e8aeca2141323961c3ba4c822a0ffb00dba848742d5cb374dc77e776b57cecde352a3e8e30f8a usbdev -0f54666072a8ee32965cc1b5205a6d35bc2ba6655f298c37ba9ccd72949fa7c41b1e540ec91f41b11f4b261ace614cdcc42dccf390bf0a22698d0ba499feae39 persistent-storage +18daa68535b2914f48a6e89ea1c0bfd1dbfd73ce71dcb1009d5fe72ef69ee3aea24851176b73b0dea24021e4d919213d417862d7f9665e17d5a44fe72be4eb55 persistent-storage +96c456afdfa72969bced7d84d98bdab7a635c00cf1a79469679f4d4b216bf516bde9e23c69fa37365e66726f84d7c2918724ddcb09368c992cffe39f76cd4eb7 persistent-storage.bats 46b9379a5def08ce0afffae546693c19be158ca4fa4ce3c619ec81e0adbaa087ea5dd6df10abbfcd59bfdaf351d7170a7d24c2b403eceeb80f4f04f090630227 ptpdev 5e1f6fabd7845f9cd6f90477f10a0b428b4414caed18a6dfe8e86e2ce3d373521d593aa6a9ee475b138a18b15c7a403a2bb0e1987b1dbdb6d465ebd7d5836a86 ptpdev.bats " diff --git a/main/busybox-initscripts/mdev.conf b/main/busybox-initscripts/mdev.conf index 0857942cabeb90b773ae43cb2f3db67913e55f0b..6a8860e234106df6caa2777206c7318cfa10217c 100644 --- a/main/busybox-initscripts/mdev.conf +++ b/main/busybox-initscripts/mdev.conf @@ -39,6 +39,7 @@ loop([0-9]+) root:disk 0660 >loop/%1 # persistent storage dasd.* root:disk 0660 */lib/mdev/persistent-storage +dm-.* root:disk 0660 */lib/mdev/persistent-storage mmcblk.* root:disk 0660 */lib/mdev/persistent-storage nbd.* root:disk 0660 */lib/mdev/persistent-storage nvme.* root:disk 0660 */lib/mdev/persistent-storage diff --git a/main/busybox-initscripts/persistent-storage b/main/busybox-initscripts/persistent-storage index ea6894829471278221933d2db5c0fb350158a12b..3730a186e28b77bfbbb06460ae0cba4e2818880e 100644 --- a/main/busybox-initscripts/persistent-storage +++ b/main/busybox-initscripts/persistent-storage @@ -7,10 +7,26 @@ symlink_action() { esac } +sanitise_file() { + sed -E -e 's/^\s+//' -e 's/\s+$//' -e 's/ /_/g' "$@" 2>/dev/null +} + +sanitise_string() { + echo "$@" | sanitise_file +} + +blkid_encode_string() { + # Rewrites string similar to libblk's blkid_encode_string + # function which is used by udev/eudev. + echo "$@" | sed -e 's| |\\x20|g' +} + + + # cdrom symlink case "$MDEV" in sr*|xvd*) - caps="$(cat /sys/block/$MDEV/capability 2>/dev/null)" + caps="$(cat ${SYSFS:-/sys}/block/$MDEV/capability 2>/dev/null)" if [ $(( 0x${caps:-0} & 8 )) -gt 0 ]; then symlink_action $MDEV cdrom fi @@ -19,13 +35,29 @@ esac # by-id symlinks mkdir -p disk/by-id -partition=$(cat /sys/class/block/$MDEV/partition 2>/dev/null) -case "$partition" in - [0-9]*) partsuffix="-part$partition";; -esac +if [ -f "${SYSFS:-/sys}/class/block/$MDEV/partition" ]; then + # This is a partition of a device, find out its parent device + _parent_dev="$(basename $(${SBINDIR:-/usr/bin}/readlink -f "${SYSFS:-/sys}/class/block/$MDEV/.."))" + + partition=$(cat ${SYSFS:-/sys}/class/block/$MDEV/partition 2>/dev/null) + case "$partition" in + [0-9]*) partsuffix="-part$partition";; + esac + # Get name, model, serial, wwid from parent device of the partition + _check_dev="$_parent_dev" +else + _check_dev="$MDEV" +fi -wwid=$(cat /sys/class/block/$MDEV/wwid 2>/dev/null) -: ${wwid:=$(cat /sys/class/block/$MDEV/device/wwid 2>/dev/null)} +model=$(sanitise_file "${SYSFS:-/sys}/class/block/$_check_dev/device/model") +name=$(sanitise_file "${SYSFS:-/sys}/class/block/$_check_dev/device/name") +serial=$(sanitise_file "${SYSFS:-/sys}/class/block/$_check_dev/device/serial") +wwid=$(sanitise_file "${SYSFS:-/sys}/class/block/$_check_dev/wwid") +: ${wwid:=$(sanitise_file "${SYSFS:-/sys}/class/block/$_check_dev/device/wwid")} + +# Sets variables LABEL, PARTLABEL, PARTUUID, TYPE, UUID depending on +# blkid output (busybox blkid will not provide PARTLABEL or PARTUUID) +eval $(${SBINDIR:-/sbin}/blkid /dev/$MDEV | cut -d: -f2-) if [ -n "$wwid" ]; then case "$MDEV" in @@ -36,33 +68,57 @@ if [ -n "$wwid" ]; then esac fi -serial=$(sed -E -e 's/^\s+//' -e 's/\s+$//' -e 's/ /_/g' \ - /sys/class/block/$MDEV/device/serial 2>/dev/null) - -model=$(sed -E -e 's/^\s+//' -e 's/\s+$//' -e 's/ /_/g' \ - /sys/class/block/$MDEV/device/model 2>/dev/null) +if [ -n "$serial" ]; then + if [ -n "$model" ]; then + case "$MDEV" in + nvme*) symlink_action ../../$MDEV disk/by-id/nvme-${model}_${serial}${partsuffix};; + sd*) symlink_action ../../$MDEV disk/by-id/ata-${model}_${serial}${partsuffix};; + esac + fi + if [ -n "$name" ]; then + case "$MDEV" in + mmcblk*) symlink_action ../../$MDEV disk/by-id/mmc-${name}_${serial}${partsuffix};; + esac + fi -if [ -n "$serial" ] && [ -n "$model" ]; then + # virtio-blk case "$MDEV" in - nvme*) symlink_action ../../$MDEV disk/by-id/nvme-${model}_${serial}${partsuffix};; + vd*) symlink_action ../../$MDEV disk/by-id/virtio-${serial}${partsuffix};; esac fi -# virtio-blk -if [ -n "$serial" ]; then - case "$MDEV" in - vd*) symlink_action ../../$MDEV disk/by-id/virtio-${serial}${partsuffix};; - esac +# TYPE="LVM2_member" is only indicated by util-linux's blkid, not by Busybox's +if [ "$TYPE" = "LVM2_member" ] && [ -n "$UUID" ]; then + symlink_action ../../$MDEV disk/by-id/lvm-pv-uuid-"$UUID" fi -# by-uuid, by-partuuid -eval $(blkid /dev/$MDEV | cut -d: -f2-) -if [ -n "$UUID" ]; then - mkdir -p disk/by-uuid - symlink_action ../../$MDEV disk/by-uuid/$UUID +# dm (i.e. LUKS and LVM) +case "$MDEV" in + dm-*) dm_name=$(sanitise_file "${SYSFS:-/sys}/class/block/$MDEV/dm/name") + dm_uuid=$(sanitise_file "${SYSFS:-/sys}/class/block/$MDEV/dm/uuid") + if [ -n "$dm_name" ]; then + symlink_action ../../$MDEV disk/by-id/dm-name-${dm_name} + fi + if [ -n "$dm_uuid" ]; then + symlink_action ../../$MDEV disk/by-id/dm-uuid-${dm_uuid} + fi + ;; +esac + +# by-label, by-partlabel, by-partuuid, by-uuid symlinks +if [ -n "$LABEL" ]; then + mkdir -p disk/by-label + symlink_action ../../$MDEV disk/by-label/"$(blkid_encode_string "$LABEL")" +fi +if [ -n "$PARTLABEL" ]; then + mkdir -p disk/by-partlabel + symlink_action ../../$MDEV disk/by-partlabel/"$PARTLABEL" fi if [ -n "$PARTUUID" ]; then mkdir -p disk/by-partuuid - symlink_action ../../$MDEV disk/by-partuuid/$PARTUUID + symlink_action ../../$MDEV disk/by-partuuid/"$PARTUUID" +fi +if [ -n "$UUID" ]; then + mkdir -p disk/by-uuid + symlink_action ../../$MDEV disk/by-uuid/"$UUID" fi - diff --git a/main/busybox-initscripts/persistent-storage.bats b/main/busybox-initscripts/persistent-storage.bats new file mode 100644 index 0000000000000000000000000000000000000000..b4f2688f477144433c687648dfa0138bf0a43cfa --- /dev/null +++ b/main/busybox-initscripts/persistent-storage.bats @@ -0,0 +1,556 @@ +setup() { + mdevscript=${BATS_TEST_FILENAME%.bats} + root="$BATS_FILE_TMPDIR" + mkdir -p "$root"/dev/disk "$root"/sys "$root"/bin + PATH="$root/bin:$PATH" + export SYSFS="$root/sys" + export SBINDIR="$root/sbin" + + mkdir -p "$SBINDIR" + + cd "$root"/dev +} + +teardown() { + rm -r "$root" +} + +@test "persistent-storage cdrom" { + # + # sata/scsi/usb/virtio_scsi cdrom, /dev/sr0 + # ISO9660 filesystem, label "cidata" + + cdrom="sr0" + cdrom_fs_label="cidata" + cdrom_fs_type="iso9660" + cdrom_fs_uuid="2022-05-15-22-31-31-00" + + mkdir -p "$root"/sys/block/${cdrom} + echo "119" > "$root"/sys/block/${cdrom}/capability + + cat <<-EOF >> "$SBINDIR"/blkid + #!/bin/sh + # blkid mock + case \$1 in + /dev/${cdrom} ) + echo "/dev/${cdrom}: BLOCK_SIZE=\"2048\" UUID=\"${cdrom_fs_uuid}\" LABEL=\"${cdrom_fs_label}\" TYPE=\"${cdrom_fs_type}\"" ;; + esac + EOF + chmod +x "$SBINDIR"/blkid + + + MDEV=${cdrom} ACTION=add sh $mdevscript + [ "$(readlink cdrom)" = "${cdrom}" ] + [ "$(readlink disk/by-label/${cdrom_fs_label})" = "../../${cdrom}" ] + [ "$(readlink disk/by-uuid/${cdrom_fs_uuid})" = "../../${cdrom}" ] + + + MDEV=${cdrom} ACTION=remove sh $mdevscript + run readlink "cdrom" + [ "$status" -ne 0 ] + run readlink "disk/by-label/${cdrom_fs_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${cdrom_fs_uuid}" + [ "$status" -ne 0 ] +} + + +@test "persistent-storage luks" { + # + # NVME /dev/nvme0 + # GPT partitioned + # partitions: + # nvme0n1p1: ESP vfat + # nvme0n1p2: luks + + disk="nvme0" + disk_namespace="${disk}n1" + + disk_part1_number="1" + disk_part1="${disk_namespace}p${disk_part1_number}" + disk_part1_label="EFI" + disk_part1_uuid="00283cf5-01" + disk_part1_fs_label="EFI System" + disk_part1_fs_label_safe="$(echo "${disk_part1_fs_label}" | sed -e 's| |\\x20|g')" + disk_part1_fs_type="vfat" + disk_part1_fs_uuid="1234-6750" + + disk_part2_number="2" + disk_part2="${disk_namespace}p${disk_part2_number}" + disk_part2_label="LUKS" + disk_part2_uuid="00283cf5-01" + + dm_device="dm-0" + luks_name="cryptroot" + luks_uuid="a53716b7-a7e2-2b5d-ca7a-d18346b92044" + luks_version="1" + dm_fs_label="rootfs" + dm_fs_type="ext4" + dm_fs_uuid="16b7a472-5e12-9bf2-35fc-1da60ab204d0" + + + mkdir -p "$root"/sys/class/block/${dm_device}/dm + echo "${luks_name}" > "$root"/sys/class/block/${dm_device}/dm/name + echo "CRYPT-LUKS${luks_version}-${luks_uuid}" > "$root"/sys/class/block/${dm_device}/dm/uuid + + cat <<-EOF >> "$SBINDIR"/blkid + #!/bin/sh + # blkid mock + case \$1 in + /dev/${dm_device} ) + echo "/dev/${dm_device}: LABEL=\"${dm_fs_label}\" UUID=\"${dm_fs_uuid}\" TYPE=\"${dm_fs_type}\"" ;; + /dev/${disk_part1} ) + echo "/dev/${disk_part1}: LABEL=\"${disk_part1_fs_label}\" UUID=\"${disk_part1_fs_uuid}\" TYPE=\"${disk_part1_fs_type}\" PARTLABEL=\"${disk_part1_label}\" PARTUUID=\"${disk_part1_uuid}\"" ;; + /dev/${disk_part2} ) + echo "/dev/${disk_part2}: UUID=\"${luks_uuid}\" TYPE=\"crypto_LUKS\" PARTUUID=\"${disk_part2_uuid}\"" ;; + esac + EOF + chmod +x "$SBINDIR"/blkid + + + MDEV=${disk_namespace} ACTION=add sh $mdevscript + + MDEV=${disk_part1} ACTION=add sh $mdevscript + [ "$(readlink disk/by-label/${disk_part1_fs_label_safe})" = "../../${disk_part1}" ] + [ "$(readlink disk/by-partlabel/${disk_part1_label})" = "../../${disk_part1}" ] + [ "$(readlink disk/by-partuuid/${disk_part1_uuid})" = "../../${disk_part1}" ] + [ "$(readlink disk/by-uuid/${disk_part1_fs_uuid})" = "../../${disk_part1}" ] + + MDEV=${disk_part2} ACTION=add sh $mdevscript + [ "$(readlink disk/by-partuuid/${disk_part2_uuid})" = "../../${disk_part2}" ] + [ "$(readlink disk/by-uuid/${luks_uuid})" = "../../${disk_part2}" ] + + MDEV=${dm_device} ACTION=add sh $mdevscript + [ "$(readlink disk/by-id/dm-name-${luks_name})" = "../../${dm_device}" ] + [ "$(readlink disk/by-id/dm-uuid-CRYPT-LUKS${luks_version}-${luks_uuid})" = "../../${dm_device}" ] + [ "$(readlink disk/by-label/${dm_fs_label})" = "../../${dm_device}" ] + [ "$(readlink disk/by-uuid/${dm_fs_uuid})" = "../../${dm_device}" ] + + + MDEV=${dm_device} ACTION=remove sh $mdevscript + run readlink "disk/by-id/dm-name-${luks_name}" + [ "$status" -ne 0 ] + run readlink "disk/by-id/dm-uuid-CRYPT-LUKS{$luks_version}-${luks_uuid}" + [ "$status" -ne 0 ] + run readlink "disk/by-label/${dm_fs_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${dm_fs_uuid}" + [ "$status" -ne 0 ] + + MDEV=${disk_part2} ACTION=remove sh $mdevscript + run readlink "disk/by-partuuid/${disk_part2_uuid}" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${luks_uuid}" + [ "$status" -ne 0 ] + + MDEV=${disk_part1} ACTION=remove sh $mdevscript + run readlink "disk/by-label/${disk_part1_fs_label_safe}" + [ "$status" -ne 0 ] + run readlink "disk/by-partlabel/${disk_part1_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-partuuid/${disk_part1_uuid}" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${disk_part1_fs_uuid}" + [ "$status" -ne 0 ] + + MDEV=${disk_namespace} ACTION=remove sh $mdevscript +} + +@test "persistent-storage lvm" { + # + # sata/scsi/usb/virtio_scsi disk, /dev/sda + # Partitions: + # sda1: LVM + # LVM: single VG and single LV + + disk_device="sda" + + disk_part="${disk_device}1" + disk_part_uuid="00283cf5-01" + + dm_device="dm-0" + dm_name="vg0-rootfs" + dm_uuid="LVM-AB37Hgwxc00DArb4LsrGTpoVaeGJncOsejkekyiW31xLsBHqa50PALdkfnW96EQQ" + + lvm_device="vg0-root" + lvm_pv_uuid="63cb47-xfuu-amaA-nUfg-FAAz-cG69-BeWu8L" + + fs_label="rootfs" + fs_uuid="a53716b7-a7e2-2b5d-ca7a-d18346b92044" + + + mkdir -p "$root"/sys/class/block/${dm_device}/dm + + echo "${dm_name}" > "$root"/sys/class/block/${dm_device}/dm/name + echo "${dm_uuid}" > "$root"/sys/class/block/${dm_device}/dm/uuid + + cat <<-EOF >> "$SBINDIR"/blkid + #!/bin/sh + # blkid mock + case \$1 in + /dev/${dm_device} ) + echo "/dev/${dm_device}: LABEL=\"${fs_label}\" UUID=\"${fs_uuid}\"" ;; + /dev/${disk_part} ) + echo "/dev/${disk_part}: UUID=\"${lvm_pv_uuid}\" TYPE=\"LVM2_member\" PARTUUID=\"${disk_part_uuid}\"" ;; + esac + EOF + chmod +x "$SBINDIR"/blkid + + + MDEV=${disk} ACTION=add sh $mdevscript + + MDEV=${disk_part} ACTION=add sh $mdevscript + [ "$(readlink disk/by-id/lvm-pv-uuid-${lvm_pv_uuid})" = "../../${disk_part}" ] + + MDEV=${dm_device} ACTION=add sh $mdevscript + [ "$(readlink disk/by-id/dm-name-${dm_name})" = "../../${dm_device}" ] + [ "$(readlink disk/by-id/dm-uuid-${dm_uuid})" = "../../${dm_device}" ] + [ "$(readlink disk/by-label/${fs_label})" = "../../${dm_device}" ] + [ "$(readlink disk/by-uuid/${fs_uuid})" = "../../${dm_device}" ] + + + MDEV=${dm_device} ACTION=remove sh $mdevscript + run readlink "disk/by-id/dm-name-${dm_name}" + [ "$status" -ne 0 ] + run readlink "disk/by-id/dm-uuid-${dm_uuid}" + [ "$status" -ne 0 ] + run readlink "disk/by-label/${fs_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${fs_uuid}" + [ "$status" -ne 0 ] + + MDEV=${disk_part} ACTION=remove sh $mdevscript + run readlink "disk/by-id/lvm-pv-uuid-${lvm_pv_uuid}" + [ "$status" -ne 0 ] + + MDEV=${disk} ACTION=remove sh $mdevscript +} + +@test "persistent-storage mmc" { + # + # SD Card, /dev/mmcblk0 + # msdos/mbr partitioned + # partitions: + # sda: vfat + + device="mmcblk0" + device_name="SL16G" + device_serial="0x167c4a85" + + device_part_number="1" + device_part="${device}p${device_part_number}" + + fs_type="vfat" + fs_uuid="1234-6750" + + mkdir -p "$root"/sys/class/block/${device}/device + echo "${device_name}" > "$root"/sys/class/block/${device}/device/name + echo "${device_serial}" > "$root"/sys/class/block/${device}/device/serial + + mkdir -p "$root"/sys/class/block/${device_part} + echo "${device_part_number}" > "$root"/sys/class/block/${device_part}/partition + + cat <<-EOF >> "$SBINDIR"/blkid + #!/bin/sh + # blkid mock + case \$1 in + /dev/${device_part} ) + echo "/dev/${device_part}: UUID=\"${fs_uuid}\" TYPE=\"${fs_type}\"" ;; + esac + EOF + chmod +x "$SBINDIR"/blkid + + cat <<-EOF >> "$SBINDIR"/readlink + #!/bin/sh + # readlink mock + case \$2 in + ${SYSFS}/class/block/${device_part}/.. ) + echo "/sys/devices/pci0000:00/0000:00:1c.4/0000:3a:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/${device}" ;; + esac + EOF + chmod +x "$SBINDIR"/readlink + + + MDEV=${device} ACTION=add sh $mdevscript + [ "$(readlink disk/by-id/mmc-${device_name}_${device_serial})" = "../../${device}" ] + + MDEV=${device_part} ACTION=add sh $mdevscript + [ "$(readlink disk/by-id/mmc-${device_name}_${device_serial}-part1)" = "../../${device_part}" ] + [ "$(readlink disk/by-uuid/${fs_uuid})" = "../../${device_part}" ] + + + MDEV=${device_part} ACTION=remove sh $mdevscript + run readlink "disk/by-id/mmc-${device_name}_${device_serial}-part1" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${fs_uuid}" + [ "$status" -ne 0 ] + + MDEV=${device} ACTION=remove sh $mdevscript + run readlink "disk/by-id/mmc-${device_name}_${device_serial}" + [ "$status" -ne 0 ] +} + +@test "persistent-storage nvme" { + # + # NVME disk, /dev/nvme0 + # Partitions: + # nvme0n1p1: swap partition + # nvme0n1p2: ext4 + + disk="nvme0" + disk_namespace="${disk}n1" + disk_model="SAMSUNG MZVLW128HEGR-00000" + disk_model_safe="$(echo $disk_model | sed -e 's/ /_/g')" + disk_serial="S12ABC0D234024" + disk_wwid="eui.00123e5b21fadea3" + + disk_part1_number="1" + disk_part1="${disk_namespace}p${disk_part1_number}" + disk_part1_fs_label="SWAP" + disk_part1_fs_uuid="f24173f4-c2c8-6e7a-ad3b-a18346f92041" + disk_part1_type="swap" + + disk_part2_number="2" + disk_part2="${disk_namespace}p${disk_part2_number}" + disk_part2_fs_label="rootfs" + disk_part2_fs_uuid="a53716b7-a7e2-2b5d-ca7a-d18346b92044" + disk_part2_label="rootpart" + disk_part2_type="ext4" + disk_part2_uuid="1ca4df25-47" + + + mkdir -p "$root"/sys/class/block/${disk_namespace}/device + echo "${disk_model}" > "$root"/sys/class/block/${disk_namespace}/device/model + echo "${disk_serial}" > "$root"/sys/class/block/${disk_namespace}/device/serial + echo "${disk_wwid}" > "$root"/sys/class/block/${disk_namespace}/device/wwid + + mkdir -p "$root"/sys/class/block/${disk_part1} + echo "${disk_part1_number}" > "$root"/sys/class/block/${disk_part1}/partition + + mkdir -p "$root"/sys/class/block/${disk_part2} + echo "${disk_part2_number}" > "$root"/sys/class/block/${disk_part2}/partition + + cat <<-EOF >> "$SBINDIR"/blkid + #!/bin/sh + # blkid mock + case \$1 in + /dev/${disk_part1} ) + echo "/dev/${disk_part1}: LABEL=\"${disk_part1_fs_label}\" UUID=\"${disk_part1_fs_uuid}\" TYPE=\"${disk_part1_type}\"" ;; + /dev/${disk_part2} ) + echo "/dev/${disk_part2}: LABEL=\"${disk_part2_fs_label}\" UUID=\"${disk_part2_fs_uuid}\" TYPE=\"${disk_part2_type}\" PARTLABEL=\"${disk_part2_label}\" PARTUUID=\"${disk_part2_uuid}\"" ;; + esac + EOF + chmod +x "$SBINDIR"/blkid + + cat <<-EOF >> "$SBINDIR"/readlink + #!/bin/sh + # readlink mock + case \$2 in + ${SYSFS}/class/block/${disk_part1}/.. ) + echo "/sys/devices/pci0000:00/0000:00:1d.0/0000:3c:00.0/nvme/${disk}/${disk_namespace}" ;; + ${SYSFS}/class/block/${disk_part2}/.. ) + echo "/sys/devices/pci0000:00/0000:00:1d.0/0000:3c:00.0/nvme/${disk}/${disk_namespace}" ;; + esac + EOF + chmod +x "$SBINDIR"/readlink + + + MDEV=${disk_namespace} ACTION=add sh $mdevscript + [ "$(readlink disk/by-id/nvme-${disk_model_safe}_${disk_serial})" = "../../${disk_namespace}" ] + [ "$(readlink disk/by-id/nvme-${disk_wwid})" = "../../${disk_namespace}" ] + + MDEV=${disk_part1} ACTION=add sh $mdevscript + [ "$(readlink disk/by-id/nvme-${disk_model_safe}_${disk_serial}-part${disk_part1_number})" = "../../${disk_part1}" ] + [ "$(readlink disk/by-id/nvme-${disk_wwid}-part${disk_part1_number})" = "../../${disk_part1}" ] + [ "$(readlink disk/by-label/${disk_part1_fs_label})" = "../../${disk_part1}" ] + [ "$(readlink disk/by-uuid/${disk_part1_fs_uuid})" = "../../${disk_part1}" ] + + MDEV=${disk_part2} ACTION=add sh $mdevscript + [ "$(readlink disk/by-id/nvme-${disk_model_safe}_${disk_serial}-part${disk_part2_number})" = "../../${disk_part2}" ] + [ "$(readlink disk/by-id/nvme-${disk_wwid}-part${disk_part2_number})" = "../../${disk_part2}" ] + [ "$(readlink disk/by-label/${disk_part2_fs_label})" = "../../${disk_part2}" ] + [ "$(readlink disk/by-partlabel/${disk_part2_label})" = "../../${disk_part2}" ] + [ "$(readlink disk/by-partuuid/${disk_part2_uuid})" = "../../${disk_part2}" ] + [ "$(readlink disk/by-uuid/${disk_part2_fs_uuid})" = "../../${disk_part2}" ] + + + MDEV=${disk_part2} ACTION=remove sh $mdevscript + run readlink "disk/by-id/nvme-${disk_model_safe}_${disk_serial}-part${disk_part2_number}" + [ "$status" -ne 0 ] + run readlink "disk/by-id/nvme-${disk_wwid}-part${disk_part2_number}" + [ "$status" -ne 0 ] + run readlink "disk/by-label/${disk_part2_fs_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-partlabel/${disk_part2_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-partuuid/${disk_part2_uuid}" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${disk_part2_fs_uuid}" + [ "$status" -ne 0 ] + + MDEV=${disk_part1} ACTION=remove sh $mdevscript + run readlink "disk/by-id/nvme-${disk_model_safe}_${disk_serial}-part${disk_part1_number}" + [ "$status" -ne 0 ] + run readlink "disk/by-id/nvme-${disk_wwid}-part${disk_part1_number}" + [ "$status" -ne 0 ] + run readlink "disk/by-label/${disk_part1_fs_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${disk_part1_fs_uuid}" + [ "$status" -ne 0 ] + + MDEV=${disk_namespace} ACTION=remove sh $mdevscript + run readlink "disk/by-id/${disk_wwn}" + [ "$status" -ne 0 ] + run readlink "disk/by-id/nvme-${disk_model_safe}_${disk_serial}" + [ "$status" -ne 0 ] +} + +@test "persistent-storage sd" { + # + # sata/scsi/usb/virtio_scsi disk, /dev/sda + # Partitions: + # sda1: swap partition + # sda2: ext4 + + disk="sda" + disk_model="HDD M52" + disk_model_safe="$(echo $disk_model | sed -e 's/ /_/g')" + disk_serial="123456" + disk_wwid="naa.5000c500cfd55846" + disk_wwn="$(echo $disk_wwid | sed -E 's/naa\.(.*)/wwn-0x\1/')" + + disk_part1="${disk}1" + disk_part1_fs_label="SWAP" + disk_part1_fs_uuid="f24173f4-c2c8-6e7a-ad3b-a18346f92041" + disk_part1_type="swap" + + disk_part2="${disk}2" + disk_part2_fs_label="rootfs" + disk_part2_fs_uuid="a53716b7-a7e2-2b5d-ca7a-d18346b92044" + disk_part2_label="rootpart" + disk_part2_type="ext4" + disk_part2_uuid="1ca4df25-47" + + + mkdir -p "$root"/sys/class/block/${disk}/device + echo "${disk_model}" > "$root"/sys/class/block/${disk}/device/model + echo "${disk_serial}" > "$root"/sys/class/block/${disk}/device/serial + echo "${disk_wwid}" > "$root"/sys/class/block/${disk}/device/wwid + + cat <<-EOF >> "$SBINDIR"/blkid + #!/bin/sh + # blkid mock + case \$1 in + /dev/${disk_part1} ) + echo "/dev/${disk_part1}: LABEL=\"${disk_part1_fs_label}\" UUID=\"${disk_part1_fs_uuid}\" TYPE=\"${disk_part1_type}\"" ;; + /dev/${disk_part2} ) + echo "/dev/${disk_part2}: LABEL=\"${disk_part2_fs_label}\" UUID=\"${disk_part2_fs_uuid}\" TYPE=\"${disk_part2_type}\" PARTLABEL=\"${disk_part2_label}\" PARTUUID=\"${disk_part2_uuid}\"" ;; + esac + EOF + chmod +x "$SBINDIR"/blkid + + + MDEV=${disk} ACTION=add sh $mdevscript + [ "$(readlink disk/by-id/ata-${disk_model_safe}_${disk_serial})" = "../../${disk}" ] + [ "$(readlink disk/by-id/${disk_wwn})" = "../../${disk}" ] + + MDEV=${disk_part1} ACTION=add sh $mdevscript + [ "$(readlink disk/by-label/${disk_part1_fs_label})" = "../../${disk_part1}" ] + [ "$(readlink disk/by-uuid/${disk_part1_fs_uuid})" = "../../${disk_part1}" ] + + MDEV=${disk_part2} ACTION=add sh $mdevscript + [ "$(readlink disk/by-label/${disk_part2_fs_label})" = "../../${disk_part2}" ] + [ "$(readlink disk/by-partlabel/${disk_part2_label})" = "../../${disk_part2}" ] + [ "$(readlink disk/by-partuuid/${disk_part2_uuid})" = "../../${disk_part2}" ] + [ "$(readlink disk/by-uuid/${disk_part2_fs_uuid})" = "../../${disk_part2}" ] + + + MDEV=${disk_part2} ACTION=remove sh $mdevscript + run readlink "disk/by-label/${disk_part2_fs_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-partlabel/${disk_part2_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-partuuid/${disk_part2_uuid}" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${disk_part2_fs_uuid}" + [ "$status" -ne 0 ] + + MDEV=${disk_part1} ACTION=remove sh $mdevscript + run readlink "disk/by-label/${disk_part1_fs_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${disk_part1_fs_uuid}" + [ "$status" -ne 0 ] + + MDEV=${disk} ACTION=remove sh $mdevscript + run readlink "disk/by-id/ata-${disk_model_safe}_${disk_serial}" + [ "$status" -ne 0 ] + run readlink "disk/by-id/${disk_wwn}" + [ "$status" -ne 0 ] +} + +@test "persistent-storage virtio" { + # + # virtio_blk disk, /dev/vda + # msdos/mbr partitioned + # partitions: + # vda: ext4 + + disk="vda" + disk_model="QEMU HARDDISK" + disk_model_safe="$(echo $disk_model | sed -e 's/ /_/g')" + disk_serial="123456" + disk_wwid="naa.5000c500cfd55846" + disk_wwn="$(echo $disk_wwid | sed -E 's/naa\.(.*)/wwn-0x\1/')" + + disk_part="${disk}1" + disk_part_label="rootpart" + disk_part_uuid="1ca4df25-47" + + fs_label="rootfs" + fs_type="xfs" + fs_uuid="a53716b7-a7e2-2b5d-ca7a-d18346b92044" + + + mkdir -p "$root"/sys/class/block/${disk}/device + echo "${disk_model}" > "$root"/sys/class/block/${disk}/device/model + echo "${disk_serial}" > "$root"/sys/class/block/${disk}/device/serial + echo "${disk_wwid}" > "$root"/sys/class/block/${disk}/device/wwid + + cat <<-EOF >> "$SBINDIR"/blkid + #!/bin/sh + # blkid mock + case \$1 in + /dev/${disk_part} ) + echo "/dev/${disk_part}: LABEL=\"${fs_label}\" UUID=\"${fs_uuid}\" TYPE=\"${fs_type}\" PARTLABEL=\"${disk_part_label}\" PARTUUID=\"${disk_part_uuid}\"" ;; + esac + EOF + chmod +x "$SBINDIR"/blkid + + + MDEV=${disk} ACTION=add sh $mdevscript + [ "$(readlink disk/by-id/virtio-${disk_serial})" = "../../${disk}" ] + [ "$(readlink disk/by-id/${disk_wwn})" = "../../${disk}" ] + + MDEV=${disk_part} ACTION=add sh $mdevscript + [ "$(readlink disk/by-label/${fs_label})" = "../../${disk_part}" ] + [ "$(readlink disk/by-partlabel/${disk_part_label})" = "../../${disk_part}" ] + [ "$(readlink disk/by-partuuid/${disk_part_uuid})" = "../../${disk_part}" ] + [ "$(readlink disk/by-uuid/${fs_uuid})" = "../../${disk_part}" ] + + + MDEV=${disk_part} ACTION=remove sh $mdevscript + run readlink "disk/by-label/${fs_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-partlabel/${disk_part_label}" + [ "$status" -ne 0 ] + run readlink "disk/by-partuuid/${disk_part_uuid}" + [ "$status" -ne 0 ] + run readlink "disk/by-uuid/${fs_uuid}" + [ "$status" -ne 0 ] + + MDEV=${disk} ACTION=remove sh $mdevscript + run readlink "disk/by-id/virtio-${disk_serial}" + [ "$status" -ne 0 ] + run readlink "disk/by-id/${disk_wwn}" + [ "$status" -ne 0 ] +}