How do you share files between a Linux host and Windows guest?
So you've installed a Virtual Machine on your Linux system, and you've successfully
installed one or more Windows guest operating systems.
Now you wish to be able to share files between the guest and the Linux host.
How do you do it?
I've worked with a few different Virtual Machines, including VMware server,
VirtualBox, and QEMU. Each has its own suggested method of file sharing
between guest and host. I found that each left a bit to be desired.
Some VM recommended methods
VMware file sharing methods
VMware has a couple of fairly direct methods to share files with the host.
If you have spare disks or disk partitions, you can format them in vfat. Then in
the VMware setup menus for any given guest, you can add the entire disks or
partitions to the guest, where they will appear as other drives, like
With this method, the disks or partitions are always attached to the guest when
it's booted, and can be mounted to Linux when the guest is not booted. What you
don't want to do is try to have the disks or partitions mounted to both
the guest and Linux at the same time.
If you set up networking in the guest, either as host only or as NAT, then you
can simply FTP files to and from the host from the guest.
VirtualBox file sharing methods
The more recent versions of VirtualBox (versions 1.4 and newer) can, like VMware server,
connect entire disks or disk partitions to the guest system. As with VMware, this
system can work well, but precautions must be exercised.
As with VMware, it is only safe if the disks or disk partitions involved are
only exclusively mounted to either the host or the guest, and that both systems do
not try to mount the disks or partitions at the same time.
Through the guest additions packages in VirtualBox, a folder sharing
mechanism is also available. This package makes available file sharing similar to
the sharing between Windows systems. This method of sharing is only available
to Windows guests of Windows 2000 or newer, and Linux guests.
Qemu file sharing methods
Qemu doesn't support the mounting of entire disks, but it can mount host
directories as additional disks with the -hdb and -hdc command
line parameters. While it is permissible by qemu to mount these directories in
read/write mode, it's only safe if done in read only mode.
Thus this procedure, while easily implemented, is only useful for delivering
files from the host to the guest.
Direct FTP support for qemu doesn't work. There is a described feature using
TFTP for moving files to and from the host, but I was unable to get it to function.
I also found from web surfing that apparently I wasn't the only one having trouble
with that feature.
Another solution: SAMBA
After experimenting with the different Virtual Machines and guests, I was a
bit frustrated that each Virtual Machine had its own preferred method of file
sharing, and each method seemed either a bit clumsy (FTP or TFTP) or
potentially dangerous (disk or partition sharing).
What I resorted to was a method I used some time ago when my network was
setup to accommodate both Linux and Windows operating systems natively
installed on respective computers. I made my Linux host a SAMBA
This proved easy to do, worked the same on guests in all of the Virtual
Machines mentioned in this article, and worked even in older Windows guest
systems such as Windows NT.
The procedure followed in my Debian Etch system was as follows:
Installed SAMBA with: sudo apt-get install samba|
Added a user I wanted to use to the Linux system with adduser
Used smbpasswd to assign that user password for samba
Made entries into /etc/samba/smb.conf for folder shares
Made host directories corresponding to smb.conf entries
Edited workgroup name in smb.conf (if desired)
Made sure the virtual machine Windows install used the same user/password
In my Debian Etch distribution, the only changes I had to make to my smb.conf
file were to set a workgroup name (use same workgroup in the guests) and add the
directory access entries.
You really only need to change the default workgroup name if you have more than
one samba server on your network. Each server should service a different workgroup.
The following is an example smb.conf entry for a shared folder:
browseable = yes
path = /home/bob/winnt
read only = no
valid users = bob
create mask = 0666
directory mask = 0777
Of course, you'll adjust the path and valid users to reflect requirements
on your computer system.
For each host folder you wish to share, make an addition smb.conf entry like the
one above, giving each a unique label (the bracketed entry).
On the guest, set the workgroup to match the setup in smb.conf.
Now add desired users to the smbusers file as followes:
The smbpasswd utility will ask for the user password and add the user to the /etc/samba/smbusers file. If it does not, you may have to edit the
/etc/samba/smbusers file and add the user and password, such as:
You can read more about setting up samba at Samba Setup Guide.
With samba installed and these smb.conf entries, the guest network
neighborhood should show the host as a local connection, and under the host
the folders (smb.conf bracketed names). Now the guest can use the map
drives feature to map the folders as a drives.
Whenever a guest with mapped drives is activated, the user will be prompted
for the samba password, then the drive(s) will be mounted.
I find this to be one of the easiest, safest, and most universal file
sharing methods across Virtual Machines running Windows guests.