Перейдем сразу к делу. Статья написана в виде набора консольных команд с комментариями, так как иначе сделать просто невозможно, а автоматизировать скриптами не имеет смысла, так как в данном случае нужна интерактивность. Для начала работы необходимо от 3 до 6 гигабайт свободного места на жестком диске, сам ISO-образ оригинальной убунты и так-же необходимо установить некоторые пакеты:
* squashfs-tools — утилиты для распаковки и упаковки squashfs-образов, в котором и запакована файловая система самого livecd убунты;
* genisoimage — утилиты для создания iso-образа, готового для записи на диск;
* xnest — это пригодиться для запуска графических приложений из измененной сборки убунты в самой убунте, в которой вы делаете сборку;
* virtualbox-3.1 или qemu или любой другой эмулятор для проверки уже самой сборки.
Установите эти пакеты в синаптике или с помощью apt-get и приступим уже к самой сборки.
Подготовка
Во время сборки часто придется выполнять команды с правами рута, поэтому сразу выполним:
sudo -s
Создадим папку, в которой и будем проводить все работы
mkdir ~/MyUbuntu
cd ~/MyUbuntu
Сделаем папку, в которую скопируем все файлы с образа компакт-диска убунты
mkdir myubuntu_iso
mount -o loop /путь/до/ubuntu-10.04-desktop-i386.iso /mnt
rsync -a /mnt/ myubuntu_iso
umount /mnt
или одной строкой
mkdir myubuntu_iso && mount -o loop /путь/до/ubuntu-10.04-desktop-i386.iso /mnt && rsync -a /mnt && myubuntu_iso && umount /mnt
А вот и пришло время распаковать уже сам squashfs-образ livecd, который из себя представляет корневую файловую систему убунты
unsquashfs myubuntu_iso/casper/filesystem.squashfs
mv squashfs-root myubuntu_root
Вход в chroot-окружение
Теперь можно приступить к изменениям. Для этого надо использовать chroot
cp /etc/hosts myubuntu_root/etc/
cp /etc/resolv.conf myubuntu_root/etc/ # Это строчка для того, чтобы в chroot-окружения работал инет
cp /etc/apt/sources.list myubuntu_root/etc/apt/sources.list # Это если вы планируете устанавливать ПО с помощью apt-get и т.п.
mount --bind /dev/ myubuntu_root/dev # Это для доступа к устройствам хостевого компа
chroot myubuntu_root
или одной строкой:
cp /etc/hosts myubuntu_root/etc/ && cp /etc/resolv.conf myubuntu_root/etc/ && mount --bind /dev/ myubuntu_root/dev && chroot myubuntu_root
Следующие команды необходимы для нормальной работы некоторых утилит в chroot-окружении, в частности — для самого apt-get, aptitude или synaptic
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
или одной строкой:
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
Теперь есть возможность пользоваться консольными утилитами, как и в обычной убунте (nano, vi, apt-get, aptitude, gconftool-2, mv, cp и так далее)
Работа в chroot-окружении (установка пакетов, настройка и т. п.)
Если же хочется воспользоваться графическими утилитами (такими как synaptic, наприме), то в другом терминале запустите эту команду:
Xnest -ac :1
И у вас появится окошко, в котором и будут работать гуишные проги. В самом-же chroot-окружении нужно указать монитор (то самое окошко xnest’а):
export DISPLAY=localhost:1
И дальше уже можно спокойно запускать synaptic и т. п. Чтобы были рамки окон, тогда еще надо:
metacity &
Тут уже можно проделывать любые операции как в обычной убунте — будь то установка пакетов, изменение конфигов и т. п.
Небольшой пример использования gconftool-2, чтобы кнопочки в metacity были справа:
# gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.defaults --type string --set «/apps/metacity/general/button_layout» «menu:minimize, maximize, close»
Выход из chroot-окружения
После проделанных изменений, нужно удалить временные файлы, отмонтировать фс и т. п.:
aptitude clean
эрэм эрэф /tmp/* ~/.bash_history
rm /etc/resolv.conf
rm /var/lib/dbus/machine-id
rm /sbin/initctl
rm /etc/apt/sources.list # Хотя этот файл можно оставить, если хотите, чтобы в сборке были прописаны зеркала
dpkg-divert --rename --remove /sbin/initctl
umount /proc
umount /sys
umount /dev/pts
exit
# Выходим из самого chroot-окружения
umount myubuntu_root/dev
или одной строкой:
aptitude clean && эрэм эрэф /tmp/* ~/.bash_history && 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 && umount myubuntu_root/dev
в этой команде * нужна
Подготовка ISO-образа
Если мы изменили состав ПО в сборке, то надо выполнить следующие команды, которые сделают новые списки пакетов:
chmod +w myubuntu_iso/casper/filesystem.manifest
chroot myubuntu_root dpkg-query -W --showformat='${Package} ${Version}\n' > myubuntu_iso/casper/filesystem.manifest
cp myubuntu_iso/casper/filesystem.manifest myubuntu_iso/casper/filesystem.manifest-desktop
sed -i '/ubiquity/d' myubuntu_iso/casper/filesystem.manifest-desktop
sed -i '/casper/d' myubuntu_iso/casper/filesystem.manifest-desktop
Собственно, файлы *.manifest — это список пакетов в системе и файл filesystem.manifest-desktop — это файл только тех пакетов, которые буду устанавливаться на комп. То есть, если вы хотите оставить пакет на livecd, но сделать так, чтобы он не ставился на компьютер во время установки, то просто удалите его упоминание в этом файле.
Если вы поменяли или обновили ядро в chroot-окружении, то это же ядро надо скопировать на сам диск, чтобы могли грузиться модули. Например:
cp myubuntu_root/boot/vmlinuz-2.6.32-22-generic myubuntu_iso/casper/vmlinuz
cp myubuntu_root/boot/initrd.img-2.6.32-22-generic myubuntu_iso/casper/initrd.gz
gzip -dc myubuntu_iso/casper/initrd.gz | sudo lzma -7 > myubuntu_iso/casper/initrd.lz
Теперь необходимо запаковать корневую файловую систему обратно в squashfs-образ:
rm myubuntu_iso/casper/filesystem.squashfs
mksquashfs myubuntu_root myubuntu_iso/casper/filesystem.squashfs
rm -r myubuntu_root
# Для экономии можно удалить распакованную корневую фс
Если хотите, чтобы при загрузке livecd автоматически выбирался русский язык:
echo "ru" > myubuntu_iso/isolinux/lang
Так как в составе диска убунты поменяли файлы, нужно пересоздать файл md5sum.txt
cd myubuntu_iso
rm md5sum.txt
find -type f -print0 | sudo xargs -0 md5sum | grep -v isolinux/boot.cat | sudo tee md5sum.txt
И можно уже приступить к созданию самого iso-образа:
# mkisofs -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 ../myubuntu-10.04.iso .
# cd ../
Примечание :
эрэм эрэф писать правильно

в последней команде точка в конце(после iso).
# и * не набирать
ядро в chroot-окружении лучше не обновлять
virtualbox-3.1 или qemu можно не ставить
IMAGE_NAME придумайте сами