Содержание

Сборка собственного билда Debian/Ubuntu на базе официального дистрибутива

Подготовка

Все действия будут производится в среде, аналогичной собираемой, то есть в дебиано-подобной системе. По идее все тоже самое можно сделать с любым дистром и в любом дистре, но так как я сам юзаю Ubuntu, то соответственно пример сборки будет специфичен для данной ОС.

Так как во время сборки часто придется выполнять команды от имени привилегированного пользователя (ROOT), лучше сразу выполнить в терминале, в котором мы и будем производить почти все операции по сборке:

sudo -s

введем свой пароль и продолжим…

Для начала, нам необходимо определится с выбором дистрибутива, для этого идем на страницу загрузки Ubuntu, выбираем версию дистрибутива, который собираемся «форкнуть» под свои нужды и скачиваем его любыми доступными нам способами. Например это будет ubuntu-14.04-desktop-i386.iso.

Допустим, все уже скачано и скопировано в домашнюю папку пользователя 1) - все примеры путей для копирования и перемещения, а также других операций с файлами будут отталкиваться именно от этого факта.

Создадим и войдем в директорию, в которой и будем проводить все работы:

mkdir Ubuntu-build && cd Ubuntu-build

Создадим директорию, в которую скопируем все файлы с примонтированного образа компакт-диска дистрибутива Ubuntu:

mkdir ubuntu-iso
mount -o loop /home/username/ubuntu-14.04-desktop-i386.iso /mnt
rsync -a /mnt/ ubuntu-iso
umount /mnt

Распаковываем squashfs-образ live-cd и переименуем полученный каталог:

unsquashfs ubuntu-iso/casper/filesystem.squashfs
mv squashfs-root ubuntu-root

Вход в chroot-окружение

Теперь можно приступить к изменениям системы. Для этого надо использовать chroot.
Копируем /etc/hosts и /etc/resolv.conf из основной системы в «гостевую» для обеспечения соединения с интернетом:

cp /etc/hosts ubuntu-root/etc/
cp /etc/resolv.conf ubuntu-root/etc/
chroot ubuntu-root

Следующие команды необходимы для нормальной работы системы в chroot-окружении, в частности — для пакетных менеджеров.

mount -t proc none /proc
mount -t sysfs none /sys
mount -t devpts none /dev/pts
export HOME=/root
export LC_ALL=C
dbus-uuidgen > /var/lib/dbus/machine-id
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl

Теперь у нас есть возможность пользоваться консольными утилитами, как и в обычной Ubuntu (nano, vi, apt-get, aptitude, gconftool-2, mv, cp и так далее)

Работа в chroot-окружении (установка пакетов, настройка и т.п.)

Также есть возможность воспользоваться графическими утилитами (такими как synaptic, например или любым графическим приложением). Для этого в другом вновь открытом терминале запустите отдельный X-server:

Xnest -ac :2

или

Xephyr :2 -screen 1024x768

Лично я предпочитаю «Зефир», так как можно явно указать разрешение окна X-сервера. У вас появится окно, в котором и будут работать гуишные проги. В терминале, в котором запущено chroot-окружение нужно указать монитор (то самое окно Xnest’а или Xephyr'а):

export DISPLAY=localhost:2

И дальше уже можно запускать synaptic и т.п. Чтобы запустить полностью все рабочее окружение, с рабочим столом и панелями, надо дать команду в chroot-терминале:

gnome-session &

Тут уже можно проделывать любые операции, как и в обычной Ubuntu — будь то установка пакетов, изменение конфигов, установка прикольных обоев LOL и т.п.
Что мы и сделаем…

Итак, мы установили необходимые нам программы, настроили их, как нам нравится и теперь пора сохранить результаты нашей работы, чтобы при загрузке с live-cd мы смогли насладиться результатами нашей работы. Для этого в chroot-терминале скомандуйте:

cp -R /root/* /etc/skel

Затем можно зачистить директорию /root (если для вас критичен размер сборки), для этого удалите в /home/username/Ubuntu-build/ubuntu-root/root файлы и папки программ, в которые вы вносили изменения. Не забудьте очистить историю, куки и кеш браузеров, которые вы настраивали, удалите все загруженные файлы, исходники и пакеты. Последние удаляются например с помощью aptitude

aptitude clean

Выход из chroot-окружения

После проделанных изменений и очистки временных файлов, надо отмонтировать файловые системы и т.п.:

rm -rf /tmp/* ~/.bash_history
rm /etc/hosts
rm /etc/resolv.conf
rm /var/lib/dbus/machine-id
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl
umount /proc
umount /sys
umount /dev/pts
exit

Подготовка ISO-образа

Так как был изменен состав программного обеспечения в сборке, то надо выполнить следующие команды, которые создадут новые списки пакетов:

chmod +w ubuntu-iso/casper/filesystem.manifest
chroot ubuntu-root dpkg-query -W --showformat='${Package} ${Version}\n' > ubuntu-iso/casper/filesystem.manifest
cp ubuntu-iso/casper/filesystem.manifest ubuntu-iso/casper/filesystem.manifest-desktop
sed -i '/ubiquity/d' ubuntu-iso/casper/filesystem.manifest-desktop
sed -i '/casper/d' ubuntu-iso/casper/filesystem.manifest-desktop

Файлы *.manifest — это списки пакетов в системе. filesystem.manifest-desktop — это файл только тех пакетов, которые буду устанавливаться на компьютер. То есть, если вы хотите оставить пакет на live-cd, но сделать так, чтобы он не ставился на компьютер во время установки, то просто удалите его упоминание в этом файле.

Если вы поменяли или обновили ядро в chroot-окружении, то это же ядро надо скопировать в каталог образа, чтобы могли грузиться модули. Например:

cp ubuntu-root/boot/vmlinuz-3.13.0-39-generic ubuntu-iso/casper/vmlinuz
cp ubuntu-root/boot/initrd.img-3.13.0-39-generic ubuntu-iso/casper/initrd.gz
gzip -dc ubuntu-iso/casper/initrd.gz | sudo lzma -7 > ubuntu-iso/casper/initrd.lz

Теперь необходимо запаковать корневую файловую систему обратно в squashfs-образ:

rm ubuntu-iso/casper/filesystem.squashfs
mksquashfs ubuntu-root ubuntu-iso/casper/filesystem.squashfs

Так как в составе образа меняли и добавляли файлы и директории, необходимо пересоздать файл md5sum.txt:

cd ubuntu-iso
rm -v md5sum.txt
find -type f -print0 | sudo xargs -0 md5sum | grep -v isolinux/boot.cat | sudo tee md5sum.txt

Теперь можно приступить к созданию самого iso-образа:

genisoimage -D -r -V "$IMAGE_NAME" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o /home/username/Ubuntu-fork-build.iso /home/username/Ubuntu-build/ubuntu-iso

Пьем чай, ожидая сборки образа, затем проверяем его, запустив в Virtualbox или же на каком-нибудь компьютере. Если запуск и работа в live-cd прошли успешно, пробуем установить, если же и на этот раз не возникает ошибок - поздравляю, у вас все получилось и прокачан еще один «скилл» 8-) .

Luciferus 2014/04/02 01:48

1)
/home/username