Skip to content

Commit

Permalink
feat(virtiofs): virtiofs root filesystem support
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
germag authored and johannbg committed May 5, 2022
1 parent 319dc7f commit 4632f79
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 0 deletions.
19 changes: 19 additions & 0 deletions man/dracut.cmdline.7.asc
Original file line number Diff line number Diff line change
Expand Up @@ -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=**....::
Expand Down
31 changes: 31 additions & 0 deletions modules.d/95virtiofs/module-setup.sh
Original file line number Diff line number Diff line change
@@ -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"
}
19 changes: 19 additions & 0 deletions modules.d/95virtiofs/mount-virtiofs.sh
Original file line number Diff line number Diff line change
@@ -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
:
9 changes: 9 additions & 0 deletions modules.d/95virtiofs/parse-virtiofs.sh
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions pkgbuild/dracut.spec
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 4632f79

Please sign in to comment.