Talked to someone today who was confused by how to get files in and out of a virtual machine disk image. Libguestfs, guestfish, virt-cat, virt-edit, virt-ls and virt-tar offer several ways to do this, and in this article I’m going to summarize all these different ways.
First of all, answer these questions:
- Upload (ie. from your host into the disk image) or
download (disk image down to host)?
- Single file or lots of files?
- Have you got / do you want a tarball, or a directory containing the individual files?
- Do you want to download the files or just get a list of files?
I should note as usual that uploading or modifying a guest is only safe if the guest is shut off. If you try to modify a live guest you’ll get disk corruption, so watch out.
Downloading a single file
Easiest way is with virt-cat:
virt-cat GuestName /path/to/file > file
An alternative is to use guestfish download:
guestfish -i --ro -d GuestName \
download /path/to/file ./localfile
Uploading a single file
If the file exists and it’s a text file that you want to edit, the easiest way is to use virt-edit:
virt-edit GuestName /path/to/file
To upload a single file in general, use guestfish upload:
guestfish -i -d GuestName \
upload ./localfile /path/to/file
Downloading multiple files
Easiest way is probably to use the copy-out command:
guestfish -i --ro -d GuestName \
copy-out /directory ./localdir
Uploading multiple files
Use guestfish copy-in command:
guestfish -i -d GuestName <<EOF
mkdir /directory
copy-in ./localdir /directory
EOF
If you want to quickly upload lots of files, the fastest method is to prepare an ISO (mkisofs) or squashfs containing the files and attach it as an extra disk. You can then copy files quickly to where you need them, eg:
guestfish -i -d GuestName -a my.iso <<EOF
mount-ro /dev/sdb /mnt
cp-a /mnt/files /someplace
EOF
Downloading or uploading a tarball
There is a high level tool called virt-tar which automates this. You can also do it semi-manually using the guestfish commands tar-in, tar-out, tgz-in, tgz-out (and more, see the guestfish documentation).
Listing files
Finally to list out files, use the high level virt-ls tool, or the low level guestfish commands ls (flat list of a single directory) or find0 (recursive listing of subdirectories).