NAME

App::FuguVM::Disk - the qcow2 disk of a virtual machine

SYNOPSIS

use App::FuguVM::Disk;

my $disk = App::FuguVM::Disk->new($state_dir);

$disk->create('default', '8G');
$disk->create('default', undef, $base_image);   # an overlay

my $info = $disk->info('default');
my $base = $disk->backing_file('default');

DESCRIPTION

The module wraps qemu-img(1). Every invocation goes through Fugu::Process, which runs a list and never a shell, so no path needs quoting.

A disk lives at <state_dir>/<name>/disk.qcow2.

METHODS

new, path

new takes the directory that holds every VM's disk.

create

$disk->create($name, $size, $backing_image)

Create the disk. The size may be undef for an overlay, which then inherits the virtual size of its backing image. Every backing image is a qcow2: a cached base image or a snapshot.

The method returns the path unchanged when the file already exists. Thus a caller that replaces a disk with an overlay unlinks it first.

convert

App::FuguVM::Disk->convert($source, $target, %opts)

Convert $source into a fresh image at $target. This method is the one home of qemu-img convert in the distribution. The format option is qcow2 or raw, and the default is qcow2. A raw target is sparse: its apparent size is the virtual size of the disk. The backing option names a parent image, and the target then stores only the difference. The method also works on the class, because it reads no state directory. It returns the target path, or undef after a diagnostic.

info

Return the qemu-img(1) report as a hash reference, or undef.

The inspection asks for shared access. A running QEMU holds an exclusive lock, and without shared access the query would fail on exactly the VMs whose backing chain a caller most needs to resolve. If cache clear could not see the backing file of a running VM, it would remove the base from under it.

backing_file

Return the absolute path of the image that backs the disk, or undef when the disk is standalone.

qemu-img(1) reports the reference even when the file it names is gone. Thus a caller can diagnose a broken chain instead of meeting an opaque failure at boot.

check, repair

check returns { status, output, path }, where the status is ok or corrupted. repair runs the repair pass and returns 1 or 0.

SEE ALSO

qemu-img(1), Fugu::Process, App::FuguVM::DiskCache, App::FuguVM::Guest

AUTHOR

Dick Olsson <hi@senzilla.io>