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.