Все действия будут производится в среде, аналогичной собираемой, то есть в дебиано-подобной системе. По идее все тоже самое можно сделать с любым дистром и в любом дистре, но так как я сам юзаю 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.
Копируем /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 и так далее)
Также есть возможность воспользоваться графическими утилитами (такими как synaptic, например или любым графическим приложением). Для этого в другом вновь открытом терминале запустите отдельный X-server:
Xnest -ac :2
или
Xephyr :2 -screen 1024x768
Лично я предпочитаю «Зефир», так как можно явно указать разрешение окна X-сервера. У вас появится окно, в котором и будут работать гуишные проги. В терминале, в котором запущено chroot-окружение нужно указать монитор (то самое окно Xnest’а или Xephyr'а):
export DISPLAY=localhost:2
И дальше уже можно запускать synaptic и т.п. Чтобы запустить полностью все рабочее окружение, с рабочим столом и панелями, надо дать команду в chroot-терминале:
gnome-session &
Тут уже можно проделывать любые операции, как и в обычной Ubuntu — будь то установка пакетов, изменение конфигов, установка прикольных обоев и т.п.
Что мы и сделаем…
Итак, мы установили необходимые нам программы, настроили их, как нам нравится и теперь пора сохранить результаты нашей работы, чтобы при загрузке с live-cd мы смогли насладиться результатами нашей работы. Для этого в chroot-терминале скомандуйте:
cp -R /root/* /etc/skel
Затем можно зачистить директорию /root (если для вас критичен размер сборки), для этого удалите в /home/username/Ubuntu-build/ubuntu-root/root файлы и папки программ, в которые вы вносили изменения. Не забудьте очистить историю, куки и кеш браузеров, которые вы настраивали, удалите все загруженные файлы, исходники и пакеты. Последние удаляются например с помощью aptitude
aptitude clean
После проделанных изменений и очистки временных файлов, надо отмонтировать файловые системы и т.п.:
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
Так как был изменен состав программного обеспечения в сборке, то надо выполнить следующие команды, которые создадут новые списки пакетов:
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 прошли успешно, пробуем установить, если же и на этот раз не возникает ошибок - поздравляю, у вас все получилось и прокачан еще один «скилл» .
— Luciferus 2014/04/02 01:48