You’ve loaded your filesystem in guestfish, how do you extract all the files into the local directory on the host? Easy …
><fs> tgz-out / - | tar zxf -
This is a little bit subtle. Here’s how it works:
On the left hand side of the pipe, we run the guestfish “tgz-out” command which turns / into a tarball and sends it to “-” (stdout).
On the right hand side of the pipe is a host command, tar, which unpacks stdin into the local directory. (This explains how pipes work in guestfish)
N.B.: An alternative, for VM images, is to use the higher-level virt-tar command.
I’ve added tar support to libguestfs. Two examples:
Extract a directory subtree
This pulls out
/usr/share/doc from the guest and saves it as a local file called
$ guestfish -a guest.img -m /dev/VolGroup00/LogVol00
Welcome to guestfish, the libguestfs filesystem interactive shell for
editing virtual machine filesystems.
Type: 'help' for help with commands
'quit' to quit the shell
><fs> tgz-out /usr/share/doc /tmp/doc.tar.gz
Convert a tarball to an ext3 filesystem
$ cat /tmp/tar2ext3.sh
if [ $# -ne 2 ]; then
echo "tar2ext3 input.tgz output.img"; exit 1
alloc $2 100M
sfdisk /dev/sda 0 0 0 ,
mkfs ext3 /dev/sda1
mount /dev/sda1 /
tgz-in $1 /
$ /tmp/tar2ext3.sh libguestfs-1.0.2.tar.gz test.img
$ ll test.img
-rw-rw-r--. 1 rjones rjones 104857600 2009-04-20 15:49 test.img
test.img contains all those files, inside an ext3 filesystem.