libvirt/9p/kvm mount in fstab fails to mount at boot time

I am trying to mount a shared folder using qemu-kvm/9p and it fails to work if I add it to the fstab file. I get an error at boot that the device cannot be mounted, yet after start if I run "mount -a" the device will be mounted.

fstab line:

src_mnt /src 9p trans=virtio 0 0

From dmesg I can see:

[    7.606258] 9p: Could not find request transport: virtio

And a few lines later I see the "virtio-pci" entries. I'm not clear on how I would defer mounting until that device is available however.


Solution 1:

Don't know if it's the ideal solution, but on an Ubuntu 12.04 guest I got it to work by adding the 9p modules to the initramfs.

Added to /etc/initramfs-tools/modules:

9p
9pnet
9pnet_virtio

Then:

sudo update-initramfs -u

Solution 2:

In 2020, a better way to delay the mount until the time when we have access to the 9p modules from /lib/modules is to add _netdev as a mount parameter:

/data   /data   9p  trans=virtio,rw,_netdev 0   0

Solution 3:

On Ubuntu 14.04 only the 9pnet_virtio module needs preloading as per bhassel's answer.

The dmesg a few lines before the quoted one shows that the other two are already loaded but cannot find the required transport.

[ 1.370611] 9pnet: Installing 9P2000 support 
[ 1.376384] 9p: Installing v9fs 9p2000 file system support 
[ 1.376754] 9pnet: Could not find request transport: virtio 

Tested with Ubuntu 14.04 guest on qemu/KVM on openSUSE 13.2.

Solution 4:

The problem here is how the virtio mount is set up on the host. There are two ways to fix this problem.

Solution 1: Use mapped instead of transport

<filesystem type='mount' accessmode='mapped'>
  <source dir='/src_dir'/>
  <target dir='src'/>
</filesystem>

This works, but all files will be owned by the user libvirt is running as. This doesn't work well for tmp or log file systems.

Solution 2: Run libvirt as root and use passthrough

vi /etc/libvirt/qemu.conf

Then uncomment or add:

user=root
group=root

Reboot the host or restart all libvirt and qemu/kvm processes, and use passthrough:

<filesystem type='mount' accessmode='passthrough'>
  <source dir='/src_dir'/>
  <target dir='src'/>
</filesystem>

While there could be some security implications for the host, this makes the uid:gid of files on the host the same as on the guest, which works well for log and tmp file systems. This happens to be what I do in this situation.