pmbootstrap install: add --ondev --no-rootfs (MR 1995)

Skip building the postmarketOS rootfs, and allow either installing a
pre-built pmOS rootfs, or even another operating system.
This commit is contained in:
Oliver Smith 2020-10-06 11:34:19 +02:00
parent 74d71c1b6c
commit 2247fc5aad
No known key found for this signature in database
GPG Key ID: 5AE7F5513E0885CB
3 changed files with 48 additions and 15 deletions

View File

@ -70,6 +70,24 @@ def _parse_suffix(args):
return "native" return "native"
def _install_ondev_verify_no_rootfs(args):
chroot_dest = "/var/lib/rootfs.img"
dest = f"{args.work}/chroot_installer_{args.device}{chroot_dest}"
if os.path.exists(dest):
return
if args.ondev_cp:
for _, chroot_dest_cp in args.ondev_cp:
if chroot_dest_cp == chroot_dest:
return
raise ValueError(f"--no-rootfs set, but rootfs.img not found in install"
" chroot. Either run 'pmbootstrap install' without"
" --no-rootfs first to let it generate the postmarketOS"
" rootfs once, or supply a rootfs file with:"
f" --cp os.img:{chroot_dest}")
def aportgen(args): def aportgen(args):
for package in args.packages: for package in args.packages:
logging.info("Generate aport: " + package) logging.info("Generate aport: " + package)
@ -236,6 +254,11 @@ def install(args):
else: else:
if args.ondev_cp: if args.ondev_cp:
raise ValueError("--cp can only be combined with --ondev") raise ValueError("--cp can only be combined with --ondev")
if args.ondev_no_rootfs:
raise ValueError("--no-rootfs can only be combined with --ondev."
" Do you mean --no-image?")
if args.ondev_no_rootfs:
_install_ondev_verify_no_rootfs(args)
# On-device installer overrides # On-device installer overrides
if args.on_device_installer: if args.on_device_installer:

View File

@ -608,10 +608,11 @@ def install_recovery_zip(args, steps):
def install_on_device_installer(args, step, steps): def install_on_device_installer(args, step, steps):
# Generate the rootfs image # Generate the rootfs image
suffix_rootfs = f"rootfs_{args.device}" if not args.ondev_no_rootfs:
install_system_image(args, 0, suffix_rootfs, step=step, steps=steps, suffix_rootfs = f"rootfs_{args.device}"
split=True) install_system_image(args, 0, suffix_rootfs, step=step, steps=steps,
step += 2 split=True)
step += 2
# Prepare the installer chroot # Prepare the installer chroot
logging.info(f"*** ({step}/{steps}) CREATE ON-DEVICE INSTALLER ROOTFS ***") logging.info(f"*** ({step}/{steps}) CREATE ON-DEVICE INSTALLER ROOTFS ***")
@ -624,12 +625,13 @@ def install_on_device_installer(args, step, steps):
pmb.chroot.apk.install(args, packages, suffix_installer) pmb.chroot.apk.install(args, packages, suffix_installer)
# Move rootfs image into installer chroot # Move rootfs image into installer chroot
img = f"{args.device}-root.img"
img_path_src = f"{args.work}/chroot_native/home/pmos/rootfs/{img}"
img_path_dest = f"{args.work}/chroot_{suffix_installer}/var/lib/rootfs.img" img_path_dest = f"{args.work}/chroot_{suffix_installer}/var/lib/rootfs.img"
logging.info(f"({suffix_installer}) add {img} as /var/lib/rootfs.img") if not args.ondev_no_rootfs:
pmb.install.losetup.umount(args, img_path_src) img = f"{args.device}-root.img"
pmb.helpers.run.root(args, ["mv", img_path_src, img_path_dest]) img_path_src = f"{args.work}/chroot_native/home/pmos/rootfs/{img}"
logging.info(f"({suffix_installer}) add {img} as /var/lib/rootfs.img")
pmb.install.losetup.umount(args, img_path_src)
pmb.helpers.run.root(args, ["mv", img_path_src, img_path_dest])
# Run ondev-prepare, so it may generate nice configs from the channel # Run ondev-prepare, so it may generate nice configs from the channel
# properties (e.g. to display the version number), or transform the image # properties (e.g. to display the version number), or transform the image
@ -659,9 +661,10 @@ def install_on_device_installer(args, step, steps):
# Remove $DEVICE-boot.img (we will generate a new one if --split was # Remove $DEVICE-boot.img (we will generate a new one if --split was
# specified, otherwise the separate boot image is not needed) # specified, otherwise the separate boot image is not needed)
img_boot = f"{args.device}-boot.img" if not args.ondev_no_rootfs:
logging.info(f"(native) rm {img_boot}") img_boot = f"{args.device}-boot.img"
pmb.chroot.root(args, ["rm", f"/home/pmos/rootfs/{img_boot}"]) logging.info(f"(native) rm {img_boot}")
pmb.chroot.root(args, ["rm", f"/home/pmos/rootfs/{img_boot}"])
# Generate installer image # Generate installer image
size_reserve = round(os.path.getsize(img_path_dest) / 1024 / 1024) + 200 size_reserve = round(os.path.getsize(img_path_dest) / 1024 / 1024) + 200
@ -740,7 +743,7 @@ def install(args):
elif args.android_recovery_zip: elif args.android_recovery_zip:
steps = 3 steps = 3
elif args.on_device_installer: elif args.on_device_installer:
steps = 7 steps = 4 if args.ondev_no_rootfs else 7
else: else:
steps = 4 steps = 4
@ -751,8 +754,9 @@ def install(args):
build=False) build=False)
step += 1 step += 1
create_device_rootfs(args, step, steps) if not args.ondev_no_rootfs:
step += 1 create_device_rootfs(args, step, steps)
step += 1
if args.no_image: if args.no_image:
return return

View File

@ -144,6 +144,12 @@ def arguments_install(subparser):
metavar="HOST_SRC:CHROOT_DEST", type=type_ondev_cp, metavar="HOST_SRC:CHROOT_DEST", type=type_ondev_cp,
help="copy one or more files from the host system path" help="copy one or more files from the host system path"
" HOST_SRC to the target path CHROOT_DEST") " HOST_SRC to the target path CHROOT_DEST")
group.add_argument("--no-rootfs", dest="ondev_no_rootfs",
help="do not generate a pmOS rootfs as"
" /var/lib/rootfs.img (install chroot). The file"
" must either exist from a previous"
" 'pmbootstrap install' run or by providing it"
" as CHROOT_DEST with --cp", action="store_true")
def arguments_export(subparser): def arguments_export(subparser):