diff options
author | Andy Lutomirski <luto@kernel.org> | 2020-07-19 11:05:29 -0700 |
---|---|---|
committer | Andy Lutomirski <luto@kernel.org> | 2020-07-19 11:05:29 -0700 |
commit | 5e80c9310ca2280db20ff984046251da88c0095f (patch) | |
tree | 1e985496a128599e6689d7373324d378ec28d950 | |
parent | 1fd86a05556b5a3363fb964c3891b81a7c516222 (diff) | |
download | virtme-5e80c9310ca2280db20ff984046251da88c0095f.tar.gz |
Use -fsdev multidevs=remap on QEMU 4.2+
Apparently having a virtfs export that spans multiple host
filesystems can cause problems in the guest. QEMU 4.2+ will warn
about this and supports a workaround: multidevs=remap. Probe for
new enough QEMU and pass multidevs=remap on 4.2+.
See #60.
Signed-off-by: Andy Lutomirski <luto@kernel.org>
-rw-r--r-- | virtme/commands/run.py | 9 | ||||
-rw-r--r-- | virtme/qemu_helpers.py | 4 |
2 files changed, 10 insertions, 3 deletions
diff --git a/virtme/commands/run.py b/virtme/commands/run.py index 5d9b96b..46cf312 100644 --- a/virtme/commands/run.py +++ b/virtme/commands/run.py @@ -236,13 +236,16 @@ def find_kernel_and_mods(arch, args) -> Kernel: return kernel -def export_virtfs(qemu, arch, qemuargs, path, mount_tag, security_model='none', readonly=True) -> None: +def export_virtfs(qemu: qemu_helpers.Qemu, arch: architectures.Arch, + qemuargs: List[str], path: str, + mount_tag: str, security_model='none', readonly=True) -> None: # NB: We can't use -virtfs for this, because it can't handle a mount_tag # that isn't a valid QEMU identifier. fsid = 'virtfs%d' % len(qemuargs) - qemuargs.extend(['-fsdev', 'local,id=%s,path=%s,security_model=%s%s' % + qemuargs.extend(['-fsdev', 'local,id=%s,path=%s,security_model=%s%s%s' % (fsid, qemu.quote_optarg(path), - security_model, ',readonly' if readonly else '')]) + security_model, ',readonly' if readonly else '', + ',multidevs=remap' if qemu.has_multidevs else '')]) qemuargs.extend(['-device', '%s,fsdev=%s,mount_tag=%s' % (arch.virtio_dev_type('9p'), fsid, qemu.quote_optarg(mount_tag))]) def quote_karg(arg: str) -> str: diff --git a/virtme/qemu_helpers.py b/virtme/qemu_helpers.py index 8ddc3dd..6ba0c03 100644 --- a/virtme/qemu_helpers.py +++ b/virtme/qemu_helpers.py @@ -30,6 +30,10 @@ class Qemu(object): self.cannot_overmount_virtfs = ( re.search(r'version 1\.[012345]', self.version) is not None) + # QEMU 4.2+ supports -fsdev multidevs=remap + self.has_multidevs = ( + re.search(r'version (?:1\.|2\.|3\.|4\.[01][^\d])', self.version) is None) + def quote_optarg(self, a): """Quote an argument to an option.""" return a.replace(',', ',,') |