2013-03-24

Тиражирование Debian

Когда впервые возникла необходимось подготовить образ системы к тиражированию, это было легко сделать: ставим систему, прописываем свои репозитории, устанавлиаем и настраиваем наш продукт, затем извлекаем флешку и через dd делаем образ. Флешка всего 8 гб, поэтому, предварительно зачистив свободное место на диске нулями из /dev/zero удалось сжать образ до 300 мб.


Первая проблема


Первая проблема выяснилась очень быстро: при старте образа на новой машине сбивалась нумерация сетевых интерфейсов. Оказалось, по-умолчанию Debian жестко привязывает имена к MAC-адресам в файле /etc/udev/rules.d/70-persistent-net.rules. Заново переставлять систему не было никакого желания, поэтому захотелось исправить файлик прямо в образе. Поскольку мы делали образ всего диска, а монтировать можно только файловую систему, необходимо было узнать топологию диска, чтобы найти необходимое смещение.

Для того, чтобы узнать топологию файловой системы используем fdisk:

# fdisk -l -u image

Disk image: 8019 MB, 8019099648 bytes
255 heads, 63 sectors/track, 974 cylinders, total 15662304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000b24e5

Device Boot      Start         End      Blocks   Id  System
image1   *        2048    14919679     7458816   83  Linux
image2        14921726    15661055      369665    5  Extended
image5        14921728    15661055      369664   82  Linux swap / Solaris
 
Блоки у нас по 512 байт

# echo 2048*512 | bc
1048576
 
Файлы монтируются при помощи loop device
# mount -t ext3 -o loop,offset=1048576 image /mnt

После чего успешно зачищаем файл с настройками интерфейсов. При следующей загрузке нумерация, как и положено, пойдет с eth0.

Вторая проблема

Второй затык не заставил себя долго ждать: необходимо было загрузить систему, чтобы установить дополнительный софт. Не смотря на то, что мы работаем в Ubuntu, использовать chroot окружение очень не хотелось. Смонтировать одну файловую систему было уже нельзя - необходимо было работать со всем образом. Сделать это можно при помощи losetup, который на самом деле вызывался при монтировании образа:

#losetup /dev/loop0 image

Не забыть поменять права, иначе нельзя будет работать с устройством (при этом права постоянно сбрасываются на root:disk)
#chown user:user /dev/loop0

В VirtualBox есть возможность работать с loopback устройствами, но в интерфейсе её нет, а командная строка предупреждает:

WARNING: This is a development tool and shall only be used to analyse
         problems. It is completely unsupported and will change in
         incompatible ways without warning.

$ VBoxManage internalcommands createrawvmdk -filename ~/workspace/image.vmdk -rawdisk /dev/loop0
RAW host disk access VMDK file /home/constantine/workspace/image.vmdk created successfully.


Создаем машину
$ VBoxManage createvm --name loop
$ VBoxManage registervm ~/VirtualBox\ VMs/loop/loop.vbox
$ VBoxManage storagectl loop --name sata --add sata

$ VBoxManage storageattach loop --storagectl ide0 --port 0 --device 0 --type hdd --medium /home/constantine/workspace/image.vmdk
$ VBoxManage startvm loop
Waiting for VM "loop" to power on...
VM "loop" has been successfully started.

Третья проблема

Третья проблема появилась, когда мы захотели залить образ на диск большего размера и было бы очень обидно на дорогущем 160 гб SSD диске использовать первые 8 гб. Для этого пришлось жонглировать флешками с Clonezilla и GParted, поскольку с первого раза развернуть образ никак не удавалось. Очень быстро это надоело. К счастью, оказалось что в clonezilla имеется консольная версия parted. В процессе были весьма неочевидные проблемы с изменением размеров разделов: разделы нельзя было менять местами, а только расширение вправо, перемещение, сжатие слева - тут могу наврать. Как в следующий раз будем заливать - допишу.

На будущее

В идеале хотелось бы автоматизировать создание образов заданного размера по нажатию одной кнопки или сразу по стабильному билду из CI. В первом приближении: ставим на QEMU при помощи preseed файла из стандартного образа Debian. Затем стартуем машину, через ssh производим необходимые настройки и дампим образ жесткого диска. Есть ощущение, что одного preseed файла не хватит, хотя у него и весьма богатые возможности.