]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
feat(virtiofs): virtiofs root filesystem support
authorGerman Maglione <gmaglione@redhat.com>
Wed, 20 Apr 2022 16:15:23 +0000 (18:15 +0200)
committerJóhann B. Guðmundsson <johannbg@gmail.com>
Thu, 5 May 2022 22:21:33 +0000 (22:21 +0000)
Currently dracut can't mount virtiofs as root filesystem.
Make possible to boot virtual machines off virtiofs,
passing "root=virtiofs:<mtag>", using the mount tag <mtag>
as root filesystem. Alternatively this module also supports
"rootfstype=virtiofs root=<mtag>"

Signed-off-by: German Maglione <gmaglione@redhat.com>
man/dracut.cmdline.7.asc
modules.d/95virtiofs/module-setup.sh [new file with mode: 0755]
modules.d/95virtiofs/mount-virtiofs.sh [new file with mode: 0755]
modules.d/95virtiofs/parse-virtiofs.sh [new file with mode: 0755]
pkgbuild/dracut.spec

index 2fe800fe46aeb39900c15f089812d473b48e0c96..b867e15deb5f05cae481e8406fedbea6eef00d53 100644 (file)
@@ -928,6 +928,25 @@ NOTE:
     If "exportname" instead of "port" is given the standard port is used.
     Newer versions of nbd are only supported with "exportname".
 
+VIRTIOFS
+~~~~~~~~
+**root=**virtiofs:__<mount-tag>__::
+    mount virtiofs share using the tag <mount-tag>.
+    The tag name is arbitrary and must match the tag given in the qemu '-device' command.
+
+**rootfstype=**virtiofs **root=**__<mount-tag>__::
+    mount virtiofs share using the tag <mount-tag>.
+    The tag name is arbitrary and must match the tag given in the qemu '-device' command.
+
+Both formats are supported by the 'virtiofs' dracut module.
+See https://gitlab.com/virtio-fs/virtiofsd for more information.
+
+[listing]
+.Example
+--
+root=virtiofs:host rw
+--
+
 DASD
 ~~~~
 **rd.dasd=**....::
diff --git a/modules.d/95virtiofs/module-setup.sh b/modules.d/95virtiofs/module-setup.sh
new file mode 100755 (executable)
index 0000000..e5f209e
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/bash
+
+# called by dracut
+check() {
+    [[ $hostonly ]] || [[ $mount_needs ]] && {
+        is_qemu_virtualized && return 0
+
+        for fs in "${host_fs_types[@]}"; do
+            [[ $fs == "virtiofs" ]] && return 0
+        done
+        return 255
+    }
+
+    return 0
+}
+
+# called by dracut
+depends() {
+    return 0
+}
+
+# called by dracut
+installkernel() {
+    instmods virtiofs
+}
+
+# called by dracut
+install() {
+    inst_hook cmdline 95 "$moddir/parse-virtiofs.sh"
+    inst_hook pre-mount 99 "$moddir/mount-virtiofs.sh"
+}
diff --git a/modules.d/95virtiofs/mount-virtiofs.sh b/modules.d/95virtiofs/mount-virtiofs.sh
new file mode 100755 (executable)
index 0000000..507911c
--- /dev/null
@@ -0,0 +1,19 @@
+#!/usr/bin/sh
+
+if [ "${fstype}" = "virtiofs" -o "${root%%:*}" = "virtiofs" ]; then
+    if ! { modprobe virtiofs || strstr "$(cat /proc/filesystems)" virtiofs; }; then
+        die "virtiofs is required but not available."
+    fi
+
+    mount -t virtiofs -o "$rflags" "${root#virtiofs:}" "$NEWROOT" 2>&1 | vinfo
+    if ! ismounted "$NEWROOT"; then
+        die "virtiofs: failed to mount root fs"
+        exit 1
+    fi
+
+    info "virtiofs: root fs mounted (options: '${rflags}')"
+
+    [ -f "$NEWROOT"/forcefsck ] && rm -f -- "$NEWROOT"/forcefsck 2> /dev/null
+    [ -f "$NEWROOT"/.autofsck ] && rm -f -- "$NEWROOT"/.autofsck 2> /dev/null
+fi
+:
diff --git a/modules.d/95virtiofs/parse-virtiofs.sh b/modules.d/95virtiofs/parse-virtiofs.sh
new file mode 100755 (executable)
index 0000000..8b8cf76
--- /dev/null
@@ -0,0 +1,9 @@
+#!/usr/bin/sh
+# Accepted formats:
+#      rootfstype=virtiofs root=<tag>
+#      root=virtiofs:<tag>
+
+if [ "${fstype}" = "virtiofs" -o "${root%%:*}" = "virtiofs" ]; then
+    # shellcheck disable=SC2034
+    rootok=1
+fi
index 9144ef22cfadb834c93c97e2e5676dceba8edc26..4bd69a5d1e13dd34cc21baedf8be1bc666887fa5 100644 (file)
@@ -386,6 +386,7 @@ echo 'dracut_rescue_image="yes"' > $RPM_BUILD_ROOT%{dracutlibdir}/dracut.conf.d/
 %{dracutlibdir}/modules.d/95terminfo
 %{dracutlibdir}/modules.d/95udev-rules
 %{dracutlibdir}/modules.d/95virtfs
+%{dracutlibdir}/modules.d/95virtiofs
 %ifarch s390 s390x
 %{dracutlibdir}/modules.d/80cms
 %{dracutlibdir}/modules.d/81cio_ignore