aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2020-07-19 11:05:29 -0700
committerAndy Lutomirski <luto@kernel.org>2020-07-19 11:05:29 -0700
commit5e80c9310ca2280db20ff984046251da88c0095f (patch)
tree1e985496a128599e6689d7373324d378ec28d950
parent1fd86a05556b5a3363fb964c3891b81a7c516222 (diff)
downloadvirtme-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.py9
-rw-r--r--virtme/qemu_helpers.py4
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(',', ',,')