Skip to content

Commit

Permalink
sgdisk: Run partx after partition changes
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
pothos committed Nov 7, 2023
1 parent 528dbbf commit 0469e9d
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 0 deletions.
2 changes: 2 additions & 0 deletions docs/release-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ nav_order: 9
### Changes

- Require Go 1.19+
- 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)
Expand Down
1 change: 1 addition & 0 deletions dracut/30ignition/module-setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ install() {
mkfs.xfs \
mkswap \
sgdisk \
partx \
useradd \
userdel \
usermod \
Expand Down
2 changes: 2 additions & 0 deletions internal/distro/distro.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ var (
mdadmCmd = "mdadm"
mountCmd = "mount"
sgdiskCmd = "sgdisk"
partxCmd = "partx"
modprobeCmd = "modprobe"
udevadmCmd = "udevadm"
usermodCmd = "usermod"
Expand Down Expand Up @@ -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 }
Expand Down
7 changes: 7 additions & 0 deletions internal/sgdisk/sgdisk.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down

0 comments on commit 0469e9d

Please sign in to comment.