Blame 0010-virtfs-root-filesystem-support.patch

Harald Hoyer ab65ae
From 4c32a717692fa5a74d10d9710dd5d358890f0d4e Mon Sep 17 00:00:00 2001
Harald Hoyer ab65ae
From: Lennert Buytenhek <buytenh@wantstofly.org>
Harald Hoyer ab65ae
Date: Sun, 15 Apr 2012 02:40:17 +0200
Harald Hoyer ab65ae
Subject: [PATCH] virtfs root filesystem support
Harald Hoyer ab65ae
Harald Hoyer ab65ae
Qemu/KVM provides virtfs, a paravirtualised filesystem that is
Harald Hoyer ab65ae
implemented by running the Plan 9 folder sharing protocol over
Harald Hoyer ab65ae
virtio.
Harald Hoyer ab65ae
Harald Hoyer ab65ae
Make booting with root=virtfs:foobar use the virtfs filesystem
Harald Hoyer ab65ae
with mount tag 'foobar' as root filesystem, to allow booting
Harald Hoyer ab65ae
virtual machines off virtfs.
Harald Hoyer ab65ae
Harald Hoyer ab65ae
Note that this only handles 9p over virtio (i.e. virtfs), and
Harald Hoyer ab65ae
doesn't attempt to handle mounting 9p filesystems over TCP/IP,
Harald Hoyer ab65ae
for example.
Harald Hoyer ab65ae
Harald Hoyer ab65ae
Signed-off-by: Lennert Buytenhek <buytenh@wantstofly.org>
Harald Hoyer ab65ae
---
Harald Hoyer ab65ae
 dracut.spec                        |    1 +
Harald Hoyer ab65ae
 modules.d/95virtfs/module-setup.sh |   27 +++++++++++++
Harald Hoyer ab65ae
 modules.d/95virtfs/mount-virtfs.sh |   75 ++++++++++++++++++++++++++++++++++++
Harald Hoyer ab65ae
 modules.d/95virtfs/parse-virtfs.sh |    9 +++++
Harald Hoyer ab65ae
 4 files changed, 112 insertions(+)
Harald Hoyer ab65ae
 create mode 100755 modules.d/95virtfs/module-setup.sh
Harald Hoyer ab65ae
 create mode 100755 modules.d/95virtfs/mount-virtfs.sh
Harald Hoyer ab65ae
 create mode 100755 modules.d/95virtfs/parse-virtfs.sh
Harald Hoyer ab65ae
Harald Hoyer ab65ae
diff --git a/dracut.spec b/dracut.spec
Harald Hoyer ab65ae
index 074cb10..9cd08b7 100644
Harald Hoyer ab65ae
--- a/dracut.spec
Harald Hoyer ab65ae
+++ b/dracut.spec
Harald Hoyer ab65ae
@@ -270,6 +270,7 @@ rm -rf $RPM_BUILD_ROOT
Harald Hoyer ab65ae
 %{dracutlibdir}/modules.d/95zfcp
Harald Hoyer ab65ae
 %{dracutlibdir}/modules.d/95terminfo
Harald Hoyer ab65ae
 %{dracutlibdir}/modules.d/95udev-rules
Harald Hoyer ab65ae
+%{dracutlibdir}/modules.d/95virtfs
Harald Hoyer ab65ae
 %{dracutlibdir}/modules.d/96securityfs
Harald Hoyer ab65ae
 %{dracutlibdir}/modules.d/97biosdevname
Harald Hoyer ab65ae
 %{dracutlibdir}/modules.d/97masterkey
Harald Hoyer ab65ae
diff --git a/modules.d/95virtfs/module-setup.sh b/modules.d/95virtfs/module-setup.sh
Harald Hoyer ab65ae
new file mode 100755
Harald Hoyer ab65ae
index 0000000..a6081c2
Harald Hoyer ab65ae
--- /dev/null
Harald Hoyer ab65ae
+++ b/modules.d/95virtfs/module-setup.sh
Harald Hoyer ab65ae
@@ -0,0 +1,27 @@
Harald Hoyer ab65ae
+#!/bin/bash
Harald Hoyer ab65ae
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
Harald Hoyer ab65ae
+# ex: ts=8 sw=4 sts=4 et filetype=sh
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+check() {
Harald Hoyer ab65ae
+    [[ $hostonly ]] || [[ $mount_needs ]] && {
Harald Hoyer ab65ae
+        for fs in ${host_fs_types[@]}; do
Harald Hoyer ab65ae
+            strstr "$fs" "\|9p" && return 0
Harald Hoyer ab65ae
+        done
Harald Hoyer ab65ae
+        return 1
Harald Hoyer ab65ae
+    }
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+    return 0
Harald Hoyer ab65ae
+}
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+depends() {
Harald Hoyer ab65ae
+    return 0
Harald Hoyer ab65ae
+}
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+installkernel() {
Harald Hoyer ab65ae
+    instmods 9p 9pnet_virtio
Harald Hoyer ab65ae
+}
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+install() {
Harald Hoyer ab65ae
+    inst_hook cmdline 95 "$moddir/parse-virtfs.sh"
Harald Hoyer ab65ae
+    inst_hook mount 99 "$moddir/mount-virtfs.sh"
Harald Hoyer ab65ae
+}
Harald Hoyer ab65ae
diff --git a/modules.d/95virtfs/mount-virtfs.sh b/modules.d/95virtfs/mount-virtfs.sh
Harald Hoyer ab65ae
new file mode 100755
Harald Hoyer ab65ae
index 0000000..dfebf38
Harald Hoyer ab65ae
--- /dev/null
Harald Hoyer ab65ae
+++ b/modules.d/95virtfs/mount-virtfs.sh
Harald Hoyer ab65ae
@@ -0,0 +1,75 @@
Harald Hoyer ab65ae
+#!/bin/sh
Harald Hoyer ab65ae
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
Harald Hoyer ab65ae
+# ex: ts=8 sw=4 sts=4 et filetype=sh
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+filter_rootopts() {
Harald Hoyer ab65ae
+    rootopts=$1
Harald Hoyer ab65ae
+    # strip ro and rw options
Harald Hoyer ab65ae
+    local OLDIFS="$IFS"
Harald Hoyer ab65ae
+    IFS=,
Harald Hoyer ab65ae
+    set -- $rootopts
Harald Hoyer ab65ae
+    IFS="$OLDIFS"
Harald Hoyer ab65ae
+    local v
Harald Hoyer ab65ae
+    while [ $# -gt 0 ]; do
Harald Hoyer ab65ae
+        case $1 in
Harald Hoyer ab65ae
+            rw|ro);;
Harald Hoyer ab65ae
+            defaults);;
Harald Hoyer ab65ae
+            *)
Harald Hoyer ab65ae
+                v="$v,${1}";;
Harald Hoyer ab65ae
+        esac
Harald Hoyer ab65ae
+        shift
Harald Hoyer ab65ae
+    done
Harald Hoyer ab65ae
+    rootopts=${v#,}
Harald Hoyer ab65ae
+    echo $rootopts
Harald Hoyer ab65ae
+}
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+mount_root() {
Harald Hoyer ab65ae
+    local _ret
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+    rootfs="9p"
Harald Hoyer ab65ae
+    rflags="trans=virtio,version=9p2000.L"
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+    modprobe 9pnet_virtio
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+    mount -t ${rootfs} -o "$rflags",ro "${root#virtfs:}" "$NEWROOT"
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+    rootopts=
Harald Hoyer ab65ae
+    if getargbool 1 rd.fstab -n rd_NO_FSTAB \
Harald Hoyer ab65ae
+        && ! getarg rootflags \
Harald Hoyer ab65ae
+        && [ -f "$NEWROOT/etc/fstab" ] \
Harald Hoyer ab65ae
+        && ! [ -L "$NEWROOT/etc/fstab" ]; then
Harald Hoyer ab65ae
+        # if $NEWROOT/etc/fstab contains special mount options for
Harald Hoyer ab65ae
+        # the root filesystem,
Harald Hoyer ab65ae
+        # remount it with the proper options
Harald Hoyer ab65ae
+        rootopts="defaults"
Harald Hoyer ab65ae
+        while read dev mp fs opts rest; do
Harald Hoyer ab65ae
+            # skip comments
Harald Hoyer ab65ae
+            [ "${dev%%#*}" != "$dev" ] && continue
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+            if [ "$mp" = "/" ]; then
Harald Hoyer ab65ae
+                rootopts=$opts
Harald Hoyer ab65ae
+                break
Harald Hoyer ab65ae
+            fi
Harald Hoyer ab65ae
+        done < "$NEWROOT/etc/fstab"
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+        rootopts=$(filter_rootopts $rootopts)
Harald Hoyer ab65ae
+    fi
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+    # we want rootflags (rflags) to take precedence so prepend rootopts to
Harald Hoyer ab65ae
+    # them; rflags is guaranteed to not be empty
Harald Hoyer ab65ae
+    rflags="${rootopts:+"${rootopts},"}${rflags}"
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+    umount "$NEWROOT"
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+    info "Remounting ${root#virtfs:} with -o ${rflags}"
Harald Hoyer ab65ae
+    mount -t ${rootfs} -o "$rflags" "${root#virtfs:}" "$NEWROOT" 2>&1 | vinfo
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+    [ -f "$NEWROOT"/forcefsck ] && rm -f "$NEWROOT"/forcefsck 2>/dev/null
Harald Hoyer ab65ae
+    [ -f "$NEWROOT"/.autofsck ] && rm -f "$NEWROOT"/.autofsck 2>/dev/null
Harald Hoyer ab65ae
+}
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+if [ -n "$root" -a -z "${root%%virtfs:*}" ]; then
Harald Hoyer ab65ae
+    mount_root
Harald Hoyer ab65ae
+fi
Harald Hoyer ab65ae
diff --git a/modules.d/95virtfs/parse-virtfs.sh b/modules.d/95virtfs/parse-virtfs.sh
Harald Hoyer ab65ae
new file mode 100755
Harald Hoyer ab65ae
index 0000000..ce6de6d
Harald Hoyer ab65ae
--- /dev/null
Harald Hoyer ab65ae
+++ b/modules.d/95virtfs/parse-virtfs.sh
Harald Hoyer ab65ae
@@ -0,0 +1,9 @@
Harald Hoyer ab65ae
+#!/bin/sh
Harald Hoyer ab65ae
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
Harald Hoyer ab65ae
+# ex: ts=8 sw=4 sts=4 et filetype=sh
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+if [ "${root%%:*}" = "virtfs" ] ; then
Harald Hoyer ab65ae
+    modprobe 9pnet_virtio
Harald Hoyer ab65ae
+
Harald Hoyer ab65ae
+    rootok=1
Harald Hoyer ab65ae
+fi