diff --git a/README.md b/README.md index aba812c..256e139 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ For script support, you need CONFIG_VIRTIO_CONSOLE. For disk support, you need CONFIG_SCSI_VIRTIO. +For --overlay-rwdir support, you need CONFIG_OVERLAY_FS. + That kernel needs to be sane. Your kernel is probably sane, but allmodconfig and allyesconfig generate insane kernels. Sanity includes: CONFIG_CMDLINE_OVERRIDE=n diff --git a/virtme/commands/run.py b/virtme/commands/run.py index 8cecb07..8a07841 100644 --- a/virtme/commands/run.py +++ b/virtme/commands/run.py @@ -127,6 +127,9 @@ def make_parser() -> argparse.ArgumentParser: g.add_argument('--rodir', action='append', default=[], help="Supply a read-only directory to the guest. Use --rodir=path or --rodir=guestpath=hostpath.") + g.add_argument('--overlay-rwdir', action='append', default=[], + help="Supply a directory that is r/w to the guest but read-only in the host. Use --overlay-rwdir=path.") + return parser _ARGPARSER = make_parser() @@ -292,6 +295,9 @@ def do_it() -> int: config = mkinitramfs.Config() + if len(args.overlay_rwdir) > 0: + virtmods.MODALIASES.append('overlay') + kernel = find_kernel_and_mods(arch, args) config.modfiles = kernel.modfiles if config.modfiles: @@ -357,6 +363,9 @@ def do_it() -> int: export_virtfs(qemu, arch, qemuargs, hostpath, tag, readonly=(dirtype != 'rwdir')) kernelargs.append('virtme_initmount%d=%s' % (idx, guestpath)) + for i, d in enumerate(args.overlay_rwdir): + kernelargs.append('virtme_rw_overlay%d=%s' % (i, d)) + # Turn on KVM if available if is_native: qemuargs.extend(['-machine', 'accel=kvm:tcg']) diff --git a/virtme/guest/virtme-init b/virtme/guest/virtme-init index a3ef852..e616c1e 100755 --- a/virtme/guest/virtme-init +++ b/virtme/guest/virtme-init @@ -86,6 +86,16 @@ if ! findmnt --kernel --mountpoint /dev &>/dev/null; then fi fi +for tag in "${!virtme_rw_overlay@}"; do + td=`mktemp -d` + dir="${!tag}" + mount -t tmpfs none "$td" + mkdir "$td/cow" "$td/work" + mount -t overlay -o "lowerdir=$dir,upperdir=$td/cow,workdir=$td/work" cow "$dir" + umount "$td" + rmdir "$td" +done + for tag in "${!virtme_initmount@}"; do if [[ ! -d "${!tag}" ]]; then mkdir -p "${!tag}"