Виртуальные системы для практикума, технические подробности
Подготовка образа к безопасному использованию
Образ виртуальной машины состоит из двух частей:
- конфигурационный файл
- образ диска + снимки
Образ проходит следующую подготовку (можете сделать и вы) для безопасности:
- импортируется конфигурация (добавляется на тестовую машину)
- отключается диск от машины
- настройки диска меняются на multiattach
- нельзя изменить, если диск используется/подключен
- в этот момент создается пустой (2MB) снимок изменений (snapshot)
- подключается обратно в машину
- в конфигурации запоминается, что образ подключен как multiattach и что нужно использовать снимок.
Далее измененная конфигурация, обновленный образ диска и начальный снимок распространяется на остальные рабочие станции.
Пример для SATA образа с Windows 10
Для Windows10 было выполнено:
- VBoxManage registervm /virtualbox/vms/Windows10/prac.win10.vbox
- VBoxManage list vms
- Убеждаемся, что добавилась, под каким именем
- VBoxManage showvminfo prac.win10
- Смотрим имя контроллера, куда подключен диск
- Имя:SATA, порт: 0
- VBoxManage storageattach prac.win10 --storagectl SATA --port 0 --medium none
- VBoxManage storageattach prac.win10 --storagectl SATA --port 0 --type hdd --medium /virtualbox/vms/Windows10/prac.win10.vdi --mtype multiattach
- Для сохранения:
- tar -cf - Windows10 | 7zr a -si -t7z -m0=lzma -mx=9 -mfb=64 -md=32m /mnt/data/Win10/Win10.tar.7z
- Можно и просто 7zr, т.к. особенные права пользователям не нужны:
- 7zr a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m /mnt/data/Win10/Win10.7z Windows10
Пример для IDE образа с Windows XP
После того как зашли в её директорию:
- VBoxManage registervm WinXP_Minimal.vbox
- VBoxManage list vms
- Убеждаемся, что добавилась, под каким именем (WinXP_Minimal)
- VBoxManage showvminfo WinXP_Minimal
- Смотрим имя контроллера, куда подключен диск
- Имя:IDE, порт: 0,0 * Значит порт 0 и устройство 0
- VBoxManage storageattach WinXP_Minimal --storagectl IDE --port 0 --device 0 --medium none
- VBoxManage storageattach WinXP_Minimal --storagectl IDE --port 0 --device 0 --type hdd --medium winxp_disk.vdi --mtype multiattach
- Для сохранения только образа, без архива:
- plzip -n 8 -k winxp_disk.vdi
Создание виртуальной машины
Если дан только образ диска, то cначала создается (допустим, мы хотим создать машину prac.debian.r7):
- VBoxManage createvm --name prac.debian.r7
- VBoxManage list vms
- VBoxManage registervm "$HOME/VirtualBox VMs/prac.debian.r7/prac.debian.r7.vbox"
- VBoxManage storagectl prac.debian.r7 --name SATA --add sata
- VBoxManage storageattach prac.debian.r7 --storagectl SATA --port 0 --type hdd --medium /virtualbox/vdi/prac.debian/prac.debian.r7.vmdk
А потом аналогично предыдущим вариантам:
- VBoxManage storageattach prac.debian.r7 --storagectl SATA --port 0 --medium none
- VBoxManage modifymedium disk /virtualbox/vdi/prac.debian/prac.debian.r7.vmdk --type multiattach
- VBoxManage storageattach prac.debian.r7 --storagectl SATA --port 0 --type hdd --medium /virtualbox/vdi/prac.debian/prac.debian.r7.vmdk --mtype multiattach
Обновление образа
- Переключаете диск обратно в normal
- Обновляете
- Переключаете в multiattach
- сжимаете образ (7z/gzip/bzip2/...) и присылаете
- т.к. изменений в конфигурации нет, то она не требуется
- в вашей конфигурации пропишется и создаться другой снимок, чем в классах, но это не страшно, т.к. они отличаются лишь идентификаторами, а данных не содержат, поэтому на старой конфигурации, где прописано использование предыдущего пустого снимка, всё будет работать. А вот смешивать один файл конфигурации со снимком от другого уже нельзя.
Сравнение компрессоров
Был взят снимок от Linux-Ubuntu
тип |
компрессор |
время real/user |
размер |
декомпрессор |
время real/user |
исходный |
cat |
2m18.513s/0m0.048s |
8304721920 |
cat |
2m18.513s/0m0.048s |
plzip |
plzip -n 8 -k olymp-linux.vdi |
8m0.202s/63m8.660s |
2919147664 |
plzip -d -n 8 -k olymp-linux.vdi.lz |
2m25/4m13 |
7z lzma |
7zr a -t7z -m0=lzma olymp-linux.7z olymp-linux.vdi |
20m33.273s/36m11.004s |
2867524309 |
7zr x olymp-linux.7z |
3m52/2m46 |
parallel gzip (pigz) |
pigz -k olymp-linux.vdi |
1m10.802s/5m15.928s |
3538554722 |
unpigz -k olymp-linux.vdi.gz |
1m44.298s/0m32.976s |
Нужно ли сжимать образ
Для Windows XP:
Plzip:
- сжатый образ: 15826428655
- разливка на класс сжатого plzip образа: 10 мин
- декомпрессия: 15 мин
Надо учесть еще предварительное сжатие (одно для всех классов): 34 минуты
Если не сжимать, то:
Для классов со 100Mbit/s будет хуже
Pigz:
- сжатый образ: 19747988523
- разливка на класс сжатого gzip образа: 12 мин (оценка)
- декомпрессия: 11 мин
Надо учесть еще предварительное сжатие (одно для всех классов): 8m12s
Вариант с tee (mbuffer -4 -I 9091 -s 128k -m 10000M | tee test.gz| unpigz -p 8 > test):
Если передавать образ (1GB от olymp-linux.vdi): ( dd | комрессор| mbuffer -> сеть -> mbuffer| декомпрессор | dd)
тип |
время (c) |
cat |
10 |
gzip -1 |
16 |
pigz -p 8 -1 |
4 |
plzip -n 8 -1 |
26 |
Вывод: можно сжать pigz и разжимать тоже им.
Устройство виртуализатора
- /virtualbox: общее хранилище
- /virtualbox/vms: хранение неизменяемых данных
- /virtualbox/write: хранение изменяемых данных
- /virtualbox/vbox: хранение данных для копирования/изменения для пользователя
- /virtualbox/bin: скрипты, которые обеспечивают работу пользователя с VM:
- shell: основной скрипт. Дальше он запускает либо скрипт выбора (если есть выбор), либо безальтернативный запуск
- dialog: скрипт с выбором из меню. Левая часть - имя Vm
- dialog-one: запуск одной системы
- start-vm: подготовка и запуск VM
- startvbox.sh: непосредственная команда запуска VM
Добавление образа
Положить неизменяемый образ в /virtualbox/vms, положить архив со снапшотом и vbox-файл в /virtualbox/vbox.
Названия файлов == названию VM (смотри примеры в директории).
Прописать VM в /virtualbox/bin/dialog, проверить файл /virtualbox/bin/shell
Изменение образа
Заменить образ в /virtualbox/vms, если изменился снапшот и/или vbox-файл, то обновить их в /virtualbox/vbox.
Важно: снепшоты от старого образа могут не подходить к новому. Их надо удалить:
rm -rf /virtualbox/write/home/*
Разливка системы
Подготовленная вышеозначенным способом система состоит из двух компонент:
- образ диска, несколько GB
- служебные данные (vbox-файлы, начальные снапшоты, меню):
- barashkov-bd.tbz (несколько KB):
- vdi/BarashkovDB/ — куда будут положены подготовленные образы дисков
- vbox/BarashkovDB/BarashkovDB-snap.tbz — архив снапшотов (дисков в VM может быть несколько, снимков для них — тоже)
- vbox/BarashkovDB/BarashkovDB.vbox — сам файл параметров для VM, в частности должны соответствововать и путь до образов, и до снапшотов
- etc/dialog-data/31-barashkov-bd — файл для показа в меню
Служебные данные заливаются в класс аналогично:
- for host in `cat classes/371`; do echo -n $host ; ssh $host "cd /virtualbox; tar -jpxf -" < files/vbox-with-menu/371-class-router.tbz ; done
Образы дисков — т.к. через служебные данные директория для образов уже создана, то можно о создании не беспокоиться, будет аналогично:
- ./class-sender-list.sh /virtualbox/vdi/FreeBSD-Router.tbz classes/371 10.6.11.21