Когда впервые возникла необходимось подготовить образ системы к тиражированию, это было легко сделать: ставим систему, прописываем свои репозитории, устанавлиаем и настраиваем наш продукт, затем извлекаем флешку и через dd делаем образ. Флешка всего 8 гб, поэтому, предварительно зачистив свободное место на диске нулями из /dev/zero удалось сжать образ до 300 мб.
Первая проблема выяснилась очень быстро: при старте образа на новой машине сбивалась нумерация сетевых интерфейсов. Оказалось, по-умолчанию Debian жестко привязывает имена к MAC-адресам в файле /etc/udev/rules.d/70-persistent-net.rules. Заново переставлять систему не было никакого желания, поэтому захотелось исправить файлик прямо в образе. Поскольку мы делали образ всего диска, а монтировать можно только файловую систему, необходимо было узнать топологию диска, чтобы найти необходимое смещение.
Для того, чтобы узнать топологию файловой системы используем fdisk:
После чего успешно зачищаем файл с настройками интерфейсов. При следующей загрузке нумерация, как и положено, пойдет с eth0.
#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.
Первая проблема
Первая проблема выяснилась очень быстро: при старте образа на новой машине сбивалась нумерация сетевых интерфейсов. Оказалось, по-умолчанию 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
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
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.