Occasionally I have need to copy files to/from a VMware instance. The usual process for this would involve starting up the virtual machine, loading the OS, copying the files, then shutting it down and exiting VMware. However, this adds a lot of overhead to a simply file copy process. There are some easy to find utilities for doing this under a Windows host OS, but doing so under Linux has proved a bit more difficult. After a good bit of searching, I found this VMware forum post that suggested I could use a utility called
vmware-mount.pl to achieve this.
Excellent. Of course, as with many things in Linux, it's not that easy.
To begin with, I had to track down a copy of the utility. I use (and highly recommend) the excellent free VMware Player to run my guest instances. It works like a champ, but unfortunately contains only a limited selection of support tools. To get a copy of
vmware-mount.pl, you'll need to download the VMware Server package for Linux. Specifically, download the file labeled "VMware Server for Linux Binary (tar.gz)". This script may also come with VMware Workstation, but VMware Server, like the Player product, is free to download and use.
Once you've downloaded VMware Server, extract the contents of the tarball (
tar xf VMware-server-1.0.3-44356). Change to the
bin/ directory, and copy
vmware-loop to the
bin/ directory of your installed copy of VMware Player. In my case, this this
/opt/vmware/player/bin/. Verify that both scripts are executable (
chmod a+x >files< if necessary).
That takes care of installing the necessary files. In order to use these scripts, however, you need support enabled for certain kernel features. Depending on your distribution this may already be enabled, but for troubleshooting purposes I'm including the three main options that I'm aware of:
- Loopback device support (allows mounting of file objects as block devices):
Device Drivers -> Block devices -> Loopback device support
- Network block device support (not sure exactly what this does, but it's necessary):
Device Drivers -> Block devices -> Network block device support
- Filesystem support for guest OS partition(s) (eg., FAT32 or NTFS for Windows partitions, etc.)
File systems -> DOS/FAT/NT Filesystems -> VFAT (substitute for needed filesystems)
Note: all of these options can be compiled as modules if preferred.
Now, time to test the script. From the command line, change to a directory containing a VMware disk image (*.vmdk file). Issue the following command (substituting the name of your own disk filename):
vmware-mount.pl -p WinXP_Pro_SP2.vmdk
This should like the available partitions inside the virtual disk:
VMware for Linux - Virtual Hard Disk Mounter
Version: 1.0 build-44356
Copyright 1998 VMware, Inc. All rights reserved. -- VMware Confidential
Nr Start Size Type Id Sytem
-- ---------- ---------- ---- -- ------------------------
1 63 12562767 BIOS 7 HPFS/NTFS
In this case, I have a single NTFS partition, labeled as partition 1. Next, we'll try mounting the partition. These commands must be run as root:
vmware-mount.pl WinXP_Pro_SP2.vmdk 1 -o ro mount_test
These commands will create a temporary directory for testing, then mount the first partition of my VMDK file in read-only mode. You will likely be given a warning about using this program with 2.4+ kernels. In my experience it is safe to ignore this warning, so enter
Y to continue. You may also be given a warning about loading the Network Block Device driver; again, enter
Y to continue. If successful, switch to another console, switch to root again, and change to the
mount_test/ directory. You should see a list of files and directories from the guest OS. Switch back to the first console and enter Control-C to unmount the disk.
Assuming all went well, you can now copy files to/from your virtual disk (remove the read-only switch in the above code to write to the disk). However, mounting the disk from the command line and performing all copy operations as root is not very convenient, so let's setup a method to automatically mount the disk using your standard user account. The next part of this tip utilizes techniques from my Adding Custom Actions to KDE Context Menus article, and will only work for KDE users.
To begin, we need to make KDE recognize the VMDK format by creating a file association. Within Konqueror, select
Settings, Configure Konqueror.... Select the File Associations tab, then click Add... under the Known Types pane. Select
application as the Group, enter the name
x-vmdk, and click OK. Click Add.. in the Filename Patterns pane, enter
*.vmdk, and click OK. Add another pattern for
*.VMDK so KDE will recognize both cases. Enter a description, such as
VMware disk image, then click OK to close the settings window.
Next, we need to tell KDE what to do with these files. Following the directions in the Adding Custom Actions to KDE Context Menus article, create the following servicemenu file:
[Desktop Action mountvmdk]
Exec=launch.sh %d mountvmdk.sh \"%f\"
As you can see by the Exec line, this requires two "support" scripts,
launch.sh can be found on the Adding Custom Actions to KDE Context Menus article page, and
mountvmdk.sh, which is based on my
mountiso.sh script from the same page, can be download here: mountvmdk.sh script. Both of these scripts must be made executable and placed in a directory in your user's path (eg,
The following command from
mountvmdk.sh does the magic:
echo 'y' | sudo vmware-mount.pl $1 1 -o ro,uid=`id -u` $DIR
echo 'y' will automatically answer the question about using a 2.4+ kernel.
sudo instruct the system to run the command as root (more on that later). The
1 instructs the command to mount the first partition. This shouldn't be an issue in most cases as there really isn't much of a need to create multiple partitions on a VMware disk, but keep it in mind in case you do need to work with multiple partitions. Moving along, the
'-o ro' option will mount the disk in read-only mode. I'm doing this purely for safety reasons (this is a new process for me), and it should not be needed. Finally, the
uid=`uid -u` option is important. This instructs the
mount command to mount the disk under your regular user's name rather than as root. The
id -u command will print out your uid (User ID) and pass it to the
sudo mount command. Without this, you would be unable to view the files as a non-root user.
Finally, we need to tell Linux that it's ok to do this as a regular user. This is done using the
sudo command. Make sure that
sudo is installed on your system, then run
visudo to edit the
sudoers file. Explanation of the file format is way beyond the scope of this article (this simple Google search should provide plenty of examples), but you'll need to give your regular user account permission to run the vmware-mount.pl command. Additionally, if you chose to compile either the loopback network block device drivers as modules you'll need to have permission to run the
modprobe command as well. Make sure that this access is only given to trusted accounts, as it can definitely be a security risk
That should do it. Save all of the files, restart Konqueror, and then right-click on a vmdk file. Select
Actions, Mount VMDK from the context menu. You should now have the contents of the vmdk file accessible in a subdirectory matching the name of the original file. When finished, simply enter
Ctrl-C in the
xterm window to unmount the disk image and remove the temporary directory.
Much easier. :-)