From: Sebastian Krzyszkowiak Date: Thu, 10 Nov 2022 21:00:34 +0000 (+0100) Subject: Mount overlays on top of image mount points X-Git-Tag: 1.4.0~48 X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/waydroid.git/commitdiff_plain/40c6aa7ac2bcf00f42efd43be4c0a06dec1ed0a6?ds=sidebyside Mount overlays on top of image mount points This allows the user to make modifications to the images that may persist between image upgrades. For both the system and vendor image there's a set of two overlays. One, specified in config as "overlay", is a read-only persistent overlay meant for stuff like installing privileged apps that should persist. Second one, specified as "overlay-rw", is a read-write overlay that stores the changes made by the user in case they remount the mount point in read-write mode. This one is meant to be removed when performing image upgrade to not carry on potentially incompatible changes between images. --- diff --git a/tools/actions/initializer.py b/tools/actions/initializer.py index 7fec732..31b4fc9 100644 --- a/tools/actions/initializer.py +++ b/tools/actions/initializer.py @@ -119,6 +119,13 @@ def init(args): helpers.images.get(args) if not os.path.isdir(tools.config.defaults["rootfs"]): os.mkdir(tools.config.defaults["rootfs"]) + if not os.path.isdir(tools.config.defaults["overlay"]): + os.mkdir(tools.config.defaults["overlay"]) + os.mkdir(tools.config.defaults["overlay"]+"/vendor") + if not os.path.isdir(tools.config.defaults["overlay_rw"]): + os.mkdir(tools.config.defaults["overlay_rw"]) + os.mkdir(tools.config.defaults["overlay_rw"]+"/system") + os.mkdir(tools.config.defaults["overlay_rw"]+"/vendor") helpers.lxc.setup_host_perms(args) helpers.lxc.set_lxc_config(args) helpers.lxc.make_base_props(args) diff --git a/tools/config/__init__.py b/tools/config/__init__.py index 0ed3d46..1edbf17 100644 --- a/tools/config/__init__.py +++ b/tools/config/__init__.py @@ -40,6 +40,9 @@ defaults = { } defaults["images_path"] = defaults["work"] + "/images" defaults["rootfs"] = defaults["work"] + "/rootfs" +defaults["overlay"] = defaults["work"] + "/overlay" +defaults["overlay_rw"] = defaults["work"] + "/overlay_rw" +defaults["overlay_work"] = defaults["work"] + "/overlay_work" defaults["data"] = defaults["work"] + "/data" defaults["lxc"] = defaults["work"] + "/lxc" defaults["host_perms"] = defaults["work"] + "/host-permissions" diff --git a/tools/helpers/images.py b/tools/helpers/images.py index cf65a11..e00e9b1 100644 --- a/tools/helpers/images.py +++ b/tools/helpers/images.py @@ -128,8 +128,19 @@ def make_prop(args, cfg, full_props_path): def mount_rootfs(args, images_dir, session): helpers.mount.mount(args, images_dir + "/system.img", tools.config.defaults["rootfs"], umount=True) + helpers.mount.mount_overlay(args, [tools.config.defaults["overlay"], + tools.config.defaults["rootfs"]], + tools.config.defaults["rootfs"], + upper_dir=tools.config.defaults["overlay_rw"] + "/system", + work_dir=tools.config.defaults["overlay_work"] + "/system") helpers.mount.mount(args, images_dir + "/vendor.img", tools.config.defaults["rootfs"] + "/vendor") + helpers.mount.mount_overlay(args, [tools.config.defaults["overlay"] + "/vendor", + tools.config.defaults["rootfs"] + "/vendor"], + tools.config.defaults["rootfs"] + "/vendor", + upper_dir=tools.config.defaults["overlay_rw"] + "/vendor", + work_dir=tools.config.defaults["overlay_work"] + "/vendor") + for egl_path in ["/vendor/lib/egl", "/vendor/lib64/egl"]: if os.path.isdir(egl_path): helpers.mount.bind( diff --git a/tools/helpers/mount.py b/tools/helpers/mount.py index 2660952..a0d34be 100644 --- a/tools/helpers/mount.py +++ b/tools/helpers/mount.py @@ -149,3 +149,28 @@ def mount(args, source, destination, create_folders=True, umount=False, # Verify, that it has worked if not ismount(destination): raise RuntimeError("Mount failed: " + source + " -> " + destination) + +def mount_overlay(args, lower_dirs, destination, upper_dir=None, work_dir=None, + create_folders=True, readonly=True): + """ + Mount an overlay. + """ + dirs = [*lower_dirs] + options = ["xino=off", "lowerdir=" + (":".join(lower_dirs))] + + if upper_dir: + dirs.append(upper_dir) + dirs.append(work_dir) + options.append("upperdir=" + upper_dir) + options.append("workdir=" + work_dir) + + for dir_path in dirs: + if not os.path.exists(dir_path): + if create_folders: + tools.helpers.run.user(args, ["mkdir", "-p", dir_path]) + else: + raise RuntimeError("Mount failed, folder does not exist: " + + dir_path) + + mount(args, "overlay", destination, mount_type="overlay", options=options, + readonly=readonly, create_folders=create_folders, force=True)