Browse Source

virtfs root filesystem support

Qemu/KVM provides virtfs, a paravirtualised filesystem that is
implemented by running the Plan 9 folder sharing protocol over
virtio.

Make booting with root=virtfs:foobar use the virtfs filesystem
with mount tag 'foobar' as root filesystem, to allow booting
virtual machines off virtfs.

Note that this only handles 9p over virtio (i.e. virtfs), and
doesn't attempt to handle mounting 9p filesystems over TCP/IP,
for example.

Signed-off-by: Lennert Buytenhek <buytenh@wantstofly.org>
master
Lennert Buytenhek 13 years ago committed by Harald Hoyer
parent
commit
a7c9cbe1a2
  1. 1
      dracut.spec
  2. 27
      modules.d/95virtfs/module-setup.sh
  3. 75
      modules.d/95virtfs/mount-virtfs.sh
  4. 9
      modules.d/95virtfs/parse-virtfs.sh

1
dracut.spec

@ -270,6 +270,7 @@ rm -rf $RPM_BUILD_ROOT
%{dracutlibdir}/modules.d/95zfcp %{dracutlibdir}/modules.d/95zfcp
%{dracutlibdir}/modules.d/95terminfo %{dracutlibdir}/modules.d/95terminfo
%{dracutlibdir}/modules.d/95udev-rules %{dracutlibdir}/modules.d/95udev-rules
%{dracutlibdir}/modules.d/95virtfs
%{dracutlibdir}/modules.d/96securityfs %{dracutlibdir}/modules.d/96securityfs
%{dracutlibdir}/modules.d/97biosdevname %{dracutlibdir}/modules.d/97biosdevname
%{dracutlibdir}/modules.d/97masterkey %{dracutlibdir}/modules.d/97masterkey

27
modules.d/95virtfs/module-setup.sh

@ -0,0 +1,27 @@
#!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh

check() {
[[ $hostonly ]] || [[ $mount_needs ]] && {
for fs in ${host_fs_types[@]}; do
strstr "$fs" "\|9p" && return 0
done
return 1
}

return 0
}

depends() {
return 0
}

installkernel() {
instmods 9p 9pnet_virtio
}

install() {
inst_hook cmdline 95 "$moddir/parse-virtfs.sh"
inst_hook mount 99 "$moddir/mount-virtfs.sh"
}

75
modules.d/95virtfs/mount-virtfs.sh

@ -0,0 +1,75 @@
#!/bin/sh
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh

type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh

filter_rootopts() {
rootopts=$1
# strip ro and rw options
local OLDIFS="$IFS"
IFS=,
set -- $rootopts
IFS="$OLDIFS"
local v
while [ $# -gt 0 ]; do
case $1 in
rw|ro);;
defaults);;
*)
v="$v,${1}";;
esac
shift
done
rootopts=${v#,}
echo $rootopts
}

mount_root() {
local _ret

rootfs="9p"
rflags="trans=virtio,version=9p2000.L"

modprobe 9pnet_virtio

mount -t ${rootfs} -o "$rflags",ro "${root#virtfs:}" "$NEWROOT"

rootopts=
if getargbool 1 rd.fstab -n rd_NO_FSTAB \
&& ! getarg rootflags \
&& [ -f "$NEWROOT/etc/fstab" ] \
&& ! [ -L "$NEWROOT/etc/fstab" ]; then
# if $NEWROOT/etc/fstab contains special mount options for
# the root filesystem,
# remount it with the proper options
rootopts="defaults"
while read dev mp fs opts rest; do
# skip comments
[ "${dev%%#*}" != "$dev" ] && continue

if [ "$mp" = "/" ]; then
rootopts=$opts
break
fi
done < "$NEWROOT/etc/fstab"

rootopts=$(filter_rootopts $rootopts)
fi

# we want rootflags (rflags) to take precedence so prepend rootopts to
# them; rflags is guaranteed to not be empty
rflags="${rootopts:+"${rootopts},"}${rflags}"

umount "$NEWROOT"

info "Remounting ${root#virtfs:} with -o ${rflags}"
mount -t ${rootfs} -o "$rflags" "${root#virtfs:}" "$NEWROOT" 2>&1 | vinfo

[ -f "$NEWROOT"/forcefsck ] && rm -f "$NEWROOT"/forcefsck 2>/dev/null
[ -f "$NEWROOT"/.autofsck ] && rm -f "$NEWROOT"/.autofsck 2>/dev/null
}

if [ -n "$root" -a -z "${root%%virtfs:*}" ]; then
mount_root
fi

9
modules.d/95virtfs/parse-virtfs.sh

@ -0,0 +1,9 @@
#!/bin/sh
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh

if [ "${root%%:*}" = "virtfs" ] ; then
modprobe 9pnet_virtio

rootok=1
fi
Loading…
Cancel
Save