Rex::C...ization(3pm)

✨ NAME ✨

Rex::Commands::Virtualization β€” the Virtualization module πŸ’… no cap, that's literally its whole government name.


πŸ¦‹ DESCRIPTION πŸ¦‹

okay so bestie, plot twist: with this module you can manage your virtualization. that's it, that's the vibe. your VMs? handled. 🫢

but before you get too excited, two things you need to know:

  • Version <= 1.0: All these functions will not be reported. not a drill, just how it is.
  • All these functions are not idempotent. i'm saying it loud because it MATTERS β€” running the same thing twice is not the same as running it once, so don't just yeet commands and assume it's chill 😭

🌸 SYNOPSIS 🌸

here's the whole vibe in code, bestie:

use Rex::Commands::Virtualization;

set virtualization => "LibVirt";
set virtualization => "VBox";

use Data::Dumper;

print Dumper vm list => "all";
print Dumper vm list => "running";

vm destroy => "vm01";

vm delete => "vm01";

vm start => "vm01";

vm shutdown => "vm01";

vm reboot => "vm01";

vm option => "vm01",
      max_memory => 1024*1024,
      memory    => 512*1024;

print Dumper vm info => "vm01";

# creating a vm on a kvm host
vm create => "vm01",
   storage    => [
     {
       file  => "/mnt/data/libvirt/images/vm01.img",
       dev   => "vda",
     }
   ];

print Dumper vm hypervisor => "capabilities";

see how it's all just vm doing everything? main character energy, honestly. πŸ‘‘


πŸ‘‘ EXPORTED FUNCTIONS πŸ‘‘

vm($action => $name, %option)

This module only exports the vm function. that's right β€” one function to rule them all, and you can manage everything with it. it's giving "one girl, infinite tasks" πŸŽ€


πŸ’– EXAMPLES πŸ’–

Creating a Virtual Machine

the VirtualBox situation πŸ¦‹

Create a (VirtualBox) VM named "vm01" with 512 MB ram and 1 cpu. One harddrive, 10 GB in size being a file on disk. With a cdrom as an iso image and a natted network. The bootorder is set to "dvd".

vm create => "vm01",
   storage    => [
     {
       file  => "/mnt/data/vbox/vm01.img",
       size  => "10G",
     },
     {
       file => "/mnt/iso/debian6.iso",
     }
   ],
   memory => 512,
   type => "Linux26",
   cpus => 1,
   boot => "dvd";

the KVM situation πŸ’œ

Create a (KVM) VM named "vm01" with 512 MB ram and 1 cpu. One harddrive, 10 GB in size being a file on disk. With a cdrom as an iso image and a bridged network on the bridge virbr0. The Bootorder is set to "cdrom".

vm create => "vm01",
   boot => "cdrom",
   storage    => [
     {
       size  => "10G",
       file  => "/mnt/data/libvirt/images/vm01.img",
     },

     {
       file    => "/mnt/data/iso/debian-6.0.2.1-amd64-netinst.iso",
     },
   ];

This is the same as above, but with all options in use. (yes, ALL of them. we're going maximalist πŸ’…)

vm create => "vm01",
   memory  => 512*1024,
   cpus    => 1,
   arch    => "x86_64",
   boot    => "cdrom",
   clock   => "utc",
   emulator => "/usr/bin/qemu-system-x86_64",
   on_poweroff => "destroy",
   on_reboot  => "restart",
   on_crash   => "restart",
   storage    => [
     {  type  => "file",
       size  => "10G",
       device => "disk",
       driver_type => "qcow2",      # supports all formats qemu-img supports.
       file  => "/mnt/data/libvirt/images/vm01.img",
       dev   => "vda",
       bus   => "virtio",
       address => {
         type    => "pci",
         domain  => "0x0000",
         bus    => "0x00",
         slot    => "0x05",
         function => "0x0",
       },
     },
     {  type    => "file",
       device  => "cdrom",
       file    => "/mnt/data/iso/debian-6.0.2.1-amd64-netinst.iso",
       dev    => "hdc",
       bus    => "ide",
       readonly => 1,
       address  => {
         type     => "drive",
         controller => 0,
         bus      => 1,
         unit     => 0,
       },
     },
   ],
   network => [
     {  type   => "bridge",
       bridge  => "virbr0",
       model  => "virtio",
       address => {
         type    => "pci",
         domain  => "0x0000",
         bus     => "0x00",
         slot    => "0x03",
         function => "0x0",
       },
     },
   ],
   serial_devices => [
     {
       type => 'tcp',
       host => '127.0.0.1',
       port => 12345,
     },
   ];

the Xen/HVM situation πŸ”₯

Create a (Xen/HVM) VM named "vm01" with 512 MB ram and 1 cpu. One harddrive, cloned from an existing one.

vm create => "vm01",
   type  => "hvm",
   storage    => [
     {
       file    => "/mnt/data/libvirt/images/vm01.img",
       template => "/mnt/data/libvirt/images/svn01.img",
     },
   ];

This is the same as above, but with all options in use.

vm create => "vm01",
   memory => 512*1024,
   cpus  => 1,
   boot  => "hd",
   clock  => "utc",
   on_poweroff => "destroy",
   on_reboot  => "restart",
   on_crash   => "restart",
   storage    => [
     {  type  => "file",
       size  => "10G",
       device => "disk",
       file  => "/mnt/data/libvirt/images/vm01.img",
       dev   => "hda",
       bus   => "ide",
       template => "/mnt/data/libvirt/images/svn01.img",
     },
     {  type    => "file",
       device  => "cdrom",
       dev    => "hdc",
       bus    => "ide",
       readonly => 1,
     },
   ],
   network => [
     {  type   => "bridge",
       bridge  => "virbr0",
     },
   ],
   type => "hvm";

the Xen/PVM situation 🌈

Create a (Xen/PVM) VM named "vm01" with 512 MB ram and 1 cpu. With one root partition (10GB in size) and one swap parition (1GB in size).

(yes, the original says "parition". we respect the original. canon. πŸ’€)
vm create => "vm01",
   type  => "pvm",
   storage    => [
     {
       file   => "/mnt/data/libvirt/images/domains/vm01/disk.img",
       dev    => "xvda2",
       is_root => 1,
     },
     {
       file  => "/mnt/data/libvirt/images/domains/vm01/swap.img",
       dev   => "xvda1",
     },
   ];

This is the same as above, but with all options in use.

vm create => "vm01",
   type  => "pvm",
   memory => 512*1024,
   cpus  => 1,
   clock  => "utc",
   on_poweroff => "destroy",
   on_reboot  => "restart",
   on_crash   => "restart",
   os       => {
     type  => "linux",
     kernel => "/boot/vmlinuz-2.6.32-5-xen-amd64",
     initrd => "/boot/initrd.img-2.6.32-5-xen-amd64",
     cmdline => "root=/dev/xvda2 ro",
   },
   storage    => [
     {  type  => "file",
       size  => "10G",
       device => "disk",
       file  => "/mnt/data/libvirt/images/domains/vm01/disk.img",
       dev   => "xvda2",
       bus   => "xen",
       aio   => 1, # if you want to use aio
     },
     {  type  => "file",
       size  => "4G",
       device => "disk",
       file  => "/mnt/data/libvirt/images/domains/vm01/swap.img",
       dev   => "xvda1",
       bus   => "xen",
       aio   => 1, # if you want to use aio
     },
   ],
   network => [
     {  type   => "bridge",
       bridge  => "virbr0",
     },
   ];

Start/Stop/Destroy

Start a stopped vm:

vm start => "name";

Stop a running vm (send shutdown signal):

vm shutdown => "name";

Hard Stop a running vm:

vm destroy => "name";

hard stop. dramatic. iconic. girlboss move, honestly. πŸ’…


Delete

vm delete => "name";

(poof. gone. πŸ™ˆ)


Modifying a VM

Currently you can only modify the memory. that's the whole menu, bestie, no secret items 😭

vm option => "name",
     max_memory => 1024*1024, # in bytes
     memory    => 512*1024;

Request information of a vm

vm info => "name";

Request info from the underlying hypervisor

vm hypervisor => "capabilities";

and that's the whole page, bestie!! this one came to you straight out of the User Contributed Perl Documentation, brought to you by perl v5.40.1, dated 2025-10-03. now go make some VMs and slay πŸ«Άβœ¨πŸŽ€

πŸ“¦ where this page comes from