pmbootstrap/pmb/install/format.py

106 lines
4.1 KiB
Python
Raw Normal View History

2021-01-07 22:30:30 +00:00
# Copyright 2021 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
2017-05-26 20:08:45 +00:00
import os
import logging
import pmb.chroot
def format_and_mount_boot(args, boot_label):
"""
:param boot_label: label of the root partition (e.g. "pmOS_boot")
When adjusting this function, make sure to also adjust
ondev-prepare-internal-storage.sh in postmarketos-ondev.git!
"""
2017-05-26 20:08:45 +00:00
mountpoint = "/mnt/install/boot"
device = "/dev/installp1"
2018-05-29 19:33:40 +00:00
filesystem = args.deviceinfo["boot_filesystem"] or "ext2"
logging.info(f"(native) format {device} (boot, {filesystem}), mount to"
" mountpoint")
2018-05-29 19:33:40 +00:00
if filesystem == "fat16":
pmb.chroot.root(args, ["mkfs.fat", "-F", "16", "-n", boot_label,
device])
elif filesystem == "fat32":
pmb.chroot.root(args, ["mkfs.fat", "-F", "32", "-n", boot_label,
device])
2018-05-29 19:33:40 +00:00
elif filesystem == "ext2":
pmb.chroot.root(args, ["mkfs.ext2", "-F", "-q", "-L", boot_label,
device])
2018-05-29 19:33:40 +00:00
else:
raise RuntimeError("Filesystem " + filesystem + " is not supported!")
2017-05-26 20:08:45 +00:00
pmb.chroot.root(args, ["mkdir", "-p", mountpoint])
pmb.chroot.root(args, ["mount", device, mountpoint])
2017-05-26 20:08:45 +00:00
def format_luks_root(args, device):
"""
:param device: root partition on install block device (e.g. /dev/installp2)
"""
2017-05-26 20:08:45 +00:00
mountpoint = "/dev/mapper/pm_crypt"
logging.info(f"(native) format {device} (root, luks), mount to"
f" {mountpoint}")
logging.info(" *** TYPE IN THE FULL DISK ENCRYPTION PASSWORD (TWICE!) ***")
# Avoid cryptsetup warning about missing locking directory
pmb.chroot.root(args, ["mkdir", "-p", "/run/cryptsetup"])
pmb.chroot.root(args, ["cryptsetup", "luksFormat",
"-q",
"--cipher", args.cipher,
"--iter-time", args.iter_time,
"--use-random",
device], output="interactive")
pmb.chroot.root(args, ["cryptsetup", "luksOpen", device, "pm_crypt"],
output="interactive")
if not os.path.exists(f"{args.work}/chroot_native/{mountpoint}"):
raise RuntimeError("Failed to open cryptdevice!")
def format_and_mount_root(args, device, root_label, sdcard):
"""
:param device: root partition on install block device (e.g. /dev/installp2)
:param root_label: label of the root partition (e.g. "pmOS_root")
:param sdcard: path to sdcard device (e.g. /dev/mmcblk0) or None
"""
# Format
if not args.rsync:
logging.info("(native) format " + device)
# Some downstream kernels don't support metadata_csum (#1364).
# When changing the options of mkfs.ext4, also change them in the
# recovery zip code (see 'grep -r mkfs\.ext4')!
mkfs_ext4_args = ["mkfs.ext4", "-O", "^metadata_csum", "-F",
"-q", "-L", root_label]
# When we don't know the file system size before hand like
# with non-block devices, we need to explicitely set a number of
# inodes. See #1717 and #1845 for details
if not sdcard:
mkfs_ext4_args = mkfs_ext4_args + ["-N", "100000"]
pmb.chroot.root(args, mkfs_ext4_args + [device])
# Mount
2017-05-26 20:08:45 +00:00
mountpoint = "/mnt/install"
logging.info("(native) mount " + device + " to " + mountpoint)
2017-05-26 20:08:45 +00:00
pmb.chroot.root(args, ["mkdir", "-p", mountpoint])
pmb.chroot.root(args, ["mount", device, mountpoint])
2017-05-26 20:08:45 +00:00
def format(args, size_reserve, boot_label, root_label, sdcard):
"""
:param size_reserve: empty partition between root and boot in MiB (pma#463)
:param boot_label: label of the boot partition (e.g. "pmOS_boot")
:param root_label: label of the root partition (e.g. "pmOS_root")
:param sdcard: path to sdcard device (e.g. /dev/mmcblk0) or None
"""
root_dev = "/dev/installp3" if size_reserve else "/dev/installp2"
if args.full_disk_encryption:
format_luks_root(args, root_dev)
root_dev = "/dev/mapper/pm_crypt"
format_and_mount_root(args, root_dev, root_label, sdcard)
format_and_mount_boot(args, boot_label)