VirtualBox/ConfigDrive

Материал из ALT Linux Wiki

Задача: (полу) автоматически создать диск, посредством которого можно обмениваться файлами с виртуальной машиной VirtualBox.

  • Доступ к диску на чтение / запись и с хоста, и из гостя.
  • Предполагается, что либо гость остановлен и с диском работает хост, либо гость запущен и с диском работает только он.

Похоже на Cloud-init, но (1) R/W, (2) для VirtualBox. Традиционный путь решения этой задачи — Shared folders, однако он требует установки в гостевую систему guest additions и ядерного драйвера к ним.

Идея в том, что формат VMDK поддерживает RAW диски; при этом сам VMDK-файл — просто текстовый описатель, а RAW-образ складывается в соседний файл с суффиксом flat.

Создаём диск:

$ VBoxManage createmedium disk --format=VMDK --variant=fixed --size=10 --filename=/home/george/VirtualBox\ VMs/cfgdrv/configdrive.vmdk
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: 99d3715c-3793-4c6e-a6f7-0800b69c3049

Получаются два файла — configdrive.vmdk (текстовый) и configdrive-flat.vmdk (10Мб нулей)

Теперь берём mtools и форматируем (можно указать метку CIDATA для совместимости с Cloud-init)

$ mformat -i VirtualBox\ VMs/cfgdrv/configdrive-flat.vmdk -v CIDATA
$ mdir -i VirtualBox\ VMs/cfgdrv/configdrive-flat.vmdk   
 Volume in drive : is CIDATA
 Volume Serial Number is 6AF0-01B0
 Directory for ::/
 No files
                        10 457 088 bytes free

Подключаем этот диск к машине (можно по пути, можно по UUID). В моей виртуалке на нулевом порту — собственный диск, вешаем на первый.

$ VBoxManage storageattach cfgdrv --storagectl "SATA Controller" --port 1 --type hdd --medium 99d3715c-3793-4c6e-a6f7-0800b69c3049

Пока это только идея. Если у кого-то получится дописать сюда примеры применения cloud-init или иной системы проброса конфигураций, будет здорово.

Пример работы

Этот диск вполне виден изнутри:

cfgdrv login: root
Password: 
Last login: Wed Sep 24 21:11:41 UTC 2025 on ttyS0
[root@cfgdrv ~]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sdb  /dev/sdb1
[root@cfgdrv ~]# mount --label=CIDATA /mnt/
[root@cfgdrv ~]# df
Filesystem      Size  Used Avail Use% Mounted on
udevfs          5.0M     0  5.0M   0% /dev
runfs           106M  584K  105M   1% /run
/dev/sda1       3.9G  740M  3.0G  20% /
tmpfs           106M     0  106M   0% /dev/shm
tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service
tmpfs           106M     0  106M   0% /tmp
tmpfs           1.0M     0  1.0M   0% /run/credentials/getty@tty1.service
tmpfs           1.0M     0  1.0M   0% /run/credentials/serial-getty@ttyS0.service
tmpfs            22M  4.0K   21M   1% /run/user/0
/dev/sdb1        10M     0   10M   0% /mnt
[root@cfgdrv ~]# cal -3 > /mnt/calend.txt
[root@cfgdrv ~]# poweroff

И снаружи

$ mdir -i VirtualBox\ VMs/cfgdrv/configdrive-flat.vmdk
 Volume in drive : is CIDATA
 Volume Serial Number is 6AF0-01B0
Directory for ::/
CALEND   TXT       520 2025-09-24  21:13  calend.txt
       1 file                  520 bytes
                        10 452 992 bytes free
$ mcopy -i VirtualBox\ VMs/cfgdrv/configdrive-flat.vmdk ::calend.txt .
$ cat calend.txt 
    August 2025         September 2025         October 2025    
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
                1  2      1  2  3  4  5  6            1  2  3  4
 3  4  5  6  7  8  9   7  8  9 10 11 12 13   5  6  7  8  9 10 11
10 11 12 13 14 15 16  14 15 16 17 18 19 20  12 13 14 15 16 17 18
17 18 19 20 21 22 23  21 22 23 24 25 26 27  19 20 21 22 23 24 25
24 25 26 27 28 29 30  28 29 30              26 27 28 29 30 31   
31