summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Bungert <[email protected]>2024-04-13 11:25:37 -0600
committerDan Bungert <[email protected]>2024-04-13 16:52:14 -0600
commit83947e8f090e2344e20ff60572030d94c1a414c0 (patch)
treede9d91594708f33553537e8881b5b9fc53aa37ef
parent204562c277b096229ca20ba546149deef1d85e38 (diff)
zfs: add flock for keystore
In LP: #2057661 and the (currently) 3 duplicates, the luksFormat of keystore can randomly fail. stracing of udevd looking for https://systemd.io/BLOCK_DEVICE_LOCKING/ shows that indeed udevd is examining these keystore devices. Lock the keystore, and add some `udevadm settle` to be more like Ubiquity behavior.
-rw-r--r--curtin/block/zfs.py18
1 files changed, 14 insertions, 4 deletions
diff --git a/curtin/block/zfs.py b/curtin/block/zfs.py
index ccdddbb3..519fa513 100644
--- a/curtin/block/zfs.py
+++ b/curtin/block/zfs.py
@@ -12,6 +12,7 @@ from contextlib import ExitStack
from pathlib import Path
from curtin.config import merge_config
+from curtin.udev import udevadm_settle
from curtin import distro
from curtin import util
from . import blkid, get_supported_filesystems
@@ -89,25 +90,34 @@ class ZPoolEncryption:
zfs_create(
self.poolname, "keystore", {"encryption": "off"}, keystore_size,
)
+ keystore_volume = f"/dev/zvol/{self.poolname}/keystore"
+ udevadm_settle(exists=keystore_volume)
with ExitStack() as es:
for vdev in self.vdevs:
es.enter_context(util.FlockEx(vdev))
# cryptsetup format and open this keystore
- keystore_volume = f"/dev/zvol/{self.poolname}/keystore"
cmd = ["cryptsetup", "luksFormat", keystore_volume, self.keyfile]
- util.subp(cmd)
+
+ # strace has shown that udevd does indeed probe this keystore
+ with util.FlockEx(keystore_volume):
+ util.subp(cmd, capture=True)
+
+ udevadm_settle()
+
dm_name = f"keystore-{self.poolname}"
cmd = [
"cryptsetup", "open", "--type", "luks", keystore_volume,
dm_name, "--key-file", self.keyfile,
]
- util.subp(cmd)
+ util.subp(cmd, capture=True)
+
+ dmpath = f"/dev/mapper/{dm_name}"
+ udevadm_settle(exists=dmpath)
with ExitStack() as es:
# format as ext4, mount it, move the previously-generated systemkey
- dmpath = f"/dev/mapper/{dm_name}"
es.enter_context(util.FlockEx(dmpath))
cmd = ["mke2fs", "-t", "ext4", dmpath, "-L", dm_name]
util.subp(cmd, capture=True)