From d637315aa9a25e4800ff51e7068e78b2cb1f6911 Mon Sep 17 00:00:00 2001 From: Kai Lueke Date: Fri, 29 Sep 2023 18:06:09 +0200 Subject: [PATCH] sgdisk: Run partx after partition changes The sgdisk tool does not update the kernel partition table with BLKPG in contrast to other similar tools but only uses BLKRRPART which fails as soon as one partition of the disk is mounted. Update the kernel partition table with partx. --- docs/release-notes.md | 2 ++ dracut/30ignition/module-setup.sh | 1 + internal/distro/distro.go | 2 ++ internal/sgdisk/sgdisk.go | 7 +++++++ 4 files changed, 12 insertions(+) diff --git a/docs/release-notes.md b/docs/release-notes.md index 165d5bfc90..76b15b8175 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -17,11 +17,13 @@ nav_order: 9 ### Changes +- The Dracut module now installs partx ### Bug fixes - Prevent races with udev after disk editing - Don't fail to wipe partition table if it's corrupted +- Force partition table update after repartitioning, even if one partition is already mounted ## Ignition 2.16.2 (2023-07-12) diff --git a/dracut/30ignition/module-setup.sh b/dracut/30ignition/module-setup.sh index ad7e80fdf8..2ea527dd51 100755 --- a/dracut/30ignition/module-setup.sh +++ b/dracut/30ignition/module-setup.sh @@ -33,6 +33,7 @@ install() { mkfs.xfs \ mkswap \ sgdisk \ + partx \ useradd \ userdel \ usermod \ diff --git a/internal/distro/distro.go b/internal/distro/distro.go index 61ca87aed9..15cc1aeafc 100644 --- a/internal/distro/distro.go +++ b/internal/distro/distro.go @@ -37,6 +37,7 @@ var ( mdadmCmd = "mdadm" mountCmd = "mount" sgdiskCmd = "sgdisk" + partxCmd = "partx" modprobeCmd = "modprobe" udevadmCmd = "udevadm" usermodCmd = "usermod" @@ -90,6 +91,7 @@ func GroupdelCmd() string { return groupdelCmd } func MdadmCmd() string { return mdadmCmd } func MountCmd() string { return mountCmd } func SgdiskCmd() string { return sgdiskCmd } +func PartxCmd() string { return partxCmd } func ModprobeCmd() string { return modprobeCmd } func UdevadmCmd() string { return udevadmCmd } func UsermodCmd() string { return usermodCmd } diff --git a/internal/sgdisk/sgdisk.go b/internal/sgdisk/sgdisk.go index 2991580982..e01d21c5d9 100644 --- a/internal/sgdisk/sgdisk.go +++ b/internal/sgdisk/sgdisk.go @@ -121,6 +121,13 @@ func (op *Operation) Commit() error { if _, err := op.logger.LogCmd(cmd, "deleting %d partitions and creating %d partitions on %q", len(op.deletions), len(op.parts), op.dev); err != nil { return fmt.Errorf("create partitions failed: %v", err) } + // In contrast to similar tools, sgdisk does not trigger the update of the + // kernel partition table with BLKPG but only uses BLKRRPART which fails + // as soon as one partition of the disk is mounted + cmd = exec.Command(distro.PartxCmd(), "-u", "-", op.dev) + if _, err := op.logger.LogCmd(cmd, "triggering partition table reread on %q", op.dev); err != nil { + return fmt.Errorf("re-reading partitions failed: %v", err) + } return nil }