pmb.install: create fstab and crypttab

It is needed for booting with UUIDs

Link: https://gitlab.com/postmarketOS/pmaports/-/issues/1531
Reviewed-by: Oliver Smith <ollieparanoid@postmarketos.org>
Tested-by: Oliver Smith <ollieparanoid@postmarketos.org>
Link: https://lists.sr.ht/~postmarketos/pmbootstrap-devel/%3C168964079267.5324.15935279761788836851-1@git.sr.ht%3E
This commit is contained in:
Anton Bambura 2022-10-20 15:50:43 +03:00 committed by Oliver Smith
parent 94f697c7f5
commit 46789ccee8
No known key found for this signature in database
GPG Key ID: 5AE7F5513E0885CB
1 changed files with 83 additions and 0 deletions

View File

@ -694,6 +694,74 @@ def get_partition_layout(reserve, kernel):
return ret
def get_uuid(args, partition):
"""
Get UUID of a partition
:param partition: block device for getting UUID from
"""
return pmb.chroot.root(
args,
[
"blkid",
"-s", "UUID",
"-o", "value",
partition,
],
output_return=True
).rstrip()
def create_crypttab(args, layout, suffix):
"""
Create /etc/crypttab config
:param layout: partition layout from get_partition_layout()
:param suffix: of the chroot, which crypttab will be created to
"""
luks_uuid = get_uuid(args, f"/dev/installp{layout['root']}")
crypttab = f"root UUID={luks_uuid} none luks\n"
open(f"{args.work}/chroot_{suffix}/tmp/crypttab", "w").write(crypttab)
pmb.chroot.root(args, ["mv", "/tmp/crypttab", "/etc/crypttab"], suffix)
def create_fstab(args, layout, suffix):
"""
Create /etc/fstab config
:param layout: partition layout from get_partition_layout()
:param suffix: of the chroot, which fstab will be created to
"""
# Do not install fstab into target rootfs when using on-device
# installer. Provide fstab only to installer suffix
if args.on_device_installer and "rootfs_" in suffix:
return
boot_dev = f"/dev/installp{layout['boot']}"
root_dev = f"/dev/installp{layout['root']}"
boot_mount_point = f"UUID={get_uuid(args, boot_dev)}"
root_mount_point = "/dev/mapper/root" if args.full_disk_encryption \
else f"UUID={get_uuid(args, root_dev)}"
boot_filesystem = args.deviceinfo["boot_filesystem"] or "ext2"
root_filesystem = pmb.install.get_root_filesystem(args)
fstab = f"""
# <file system> <mount point> <type> <options> <dump> <pass>
{root_mount_point} / {root_filesystem} defaults 0 0
{boot_mount_point} /boot {boot_filesystem} defaults 0 0
""".lstrip()
with open(f"{args.work}/chroot_{suffix}/tmp/fstab", "w") as f:
f.write(fstab)
pmb.chroot.root(args, ["mv", "/tmp/fstab", "/etc/fstab"], suffix)
def install_system_image(args, size_reserve, suffix, step, steps,
boot_label="pmOS_boot", root_label="pmOS_root",
split=False, sdcard=None):
@ -728,6 +796,21 @@ def install_system_image(args, size_reserve, suffix, step, steps,
pmb.install.format(args, layout, boot_label, root_label, sdcard)
# Create /etc/fstab and /etc/crypttab
logging.info("(native) create /etc/fstab")
create_fstab(args, layout, suffix)
if args.full_disk_encryption:
logging.info("(native) create /etc/crypttab")
create_crypttab(args, layout, suffix)
# Run mkinitfs to pass UUIDs to cmdline
logging.info(f"({suffix}) mkinitfs")
pmb.chroot.root(args, ["mkinitfs"], suffix)
# Clean up after running mkinitfs in chroot
pmb.helpers.mount.umount_all(args, f"{args.work}/chroot_{suffix}")
pmb.helpers.run.root(args, ["rm", f"{args.work}/chroot_{suffix}/in-pmbootstrap"])
# Just copy all the files
logging.info(f"*** ({step + 1}/{steps}) FILL INSTALL BLOCKDEVICE ***")
copy_files_from_chroot(args, suffix)