Shared folder between QEMU Windows guest and Linux host
QEMU's built-in Samba service
The not-functioning -net user,smb
option was caused by an incompatibility with newer Samba versions (>= 4). This is fixed in QEMU v2.2.0 and newer with these changes:
- b87b8a8 slirp/smb: Move ncalrpc directory to tmp (since v2.1.0)
- 44d8d2b net/slirp: specify logbase for smbd (since v2.2.0)
- 7912d04 slirp/smbd: modify/set several parameters in generated smbd.conf (since v2.2.0, disables printer too)
(Debian has backported the latter two patches to 2.1+dfsg-6 which is present in Jessie.)
Usage
You can export one folder as \\10.0.2.4\qemu
when using User networking:
qemu-system-x86_64 \
-net user,smb=/absolute/path/to/folder \
-net nic,model=virtio \
...
When QEMU is successfully started with these options, a new /tmp/qemu-smb.*-*/
directory will be created containing a smb.conf
. If you are fast enough, then this file could be modified to make paths read-only or export more folders.
Mode of operation
The samba daemon is executed whenever ports 139 or 445 get accessed over a "user" network. Communication happens via standard input/output/error of the smbd process. This is the reason why newer daemons failed, it would write its error message to the pipe instead of protocol messages.
Due to this method of operation, the daemon will not listen on host ports, and therefore will only be accessible to the guest. So other clients in the network and even local users cannot gain access to folders using this daemon.
Since QEMU v2.2.0 printer sharing is completely disabled through the samba configuration, so another worry is gone here.
The speed depends on the network adapter, so it is recommended to use the virtio netkvm
driver under Windows.
Also note that the daemon is executed by its absolute path (typically /usr/sbin/smbd
) as specified at compile time (using the --smbd
option). Whenever you need to try a new binary or interpose smbd
, you will need to modify the file at that path.
Other caveats
Executables (*.exe
) must be executable on the host (chmod +x FILE
) for the guest to have execute permissions. To allow execution of any file, add the acl allow execute always = True
option to a share.
Example read-only smb.conf configuration which allows execution of any file (based on QEMU v2.2.0):
... [qemu] path=/home/peter/windows read only=yes guest ok=true force user=peter acl allow execute always = True
In 2018 a simple way to share a folder between a Linux host & Windows virtual machine is to enable RDP in the Windows guest
& connect to the vm
with the Remmina Remote Desktop Client & enable a Shared Folder:
This creates a folder under This pc (shared folder on Linux hostname
) & a \\tsclient\shared-folder-name
network share inside the guest
. You can also map a network drive:
This solution does not require
samba
to be running.Tested under
libvirt
/virt-manager
but should work with any virtualization.