Это старая версия документа.


Конечно очень радостно, что существуют такие инструменты как Reconstructor и Ubuntu Customization Kit, однако они всё выполняют в автоматическом режиме и не очень-то подходят для тонкой настройки под себя. В этой статье я постараюсь рассказать как можно руками сделать всё то, что делают вышеназванные инструменты и как изменить многие недоступные им параметры.

Фронт работ

Для создания Ubuntu Custom Live CD нужно продумать три важных момента: 1) В какой системе мы будем строить наш диск. Надеюсь, все Вы прекрасно понимаете, что мы ведем речь про компьютер под управлением Ubuntu. Если Ubuntu у Вас не установлена, то Вы можете поставить ее на виртуальную машину и там уже строить образ диска. Помимо этого, нам нужно поставить следующие пакеты для создания живого диска: SYSLINUX, Squashfs-tools, genisoimage Первый пакет — загрузчик ядра, второй — файловая система SquashFS, а третий — создатель образа диска.

2) Папка для образа диска. Образ диска — это то, что будет записано на CD/DVD/BluRay/USB (в зависимости от того кому что нравится). Просто создайте отдельную папку для образа диска. Для образа нужно скопировать: - Загрузчик ISOLinux - Ядро с initrd и изолированной системой - Дополнительные файлы для указания времени загрузки и других важных (и не очень) параметров

Папка для образа диска создается отдельно от корня будущей изолированной системы.

3) Изолированная система

Изолированная система — это та система, которая будет загружена в LiveCD. Ей не нужны ни ядро, ни загрузчик, если Вы собираетесь устанавливать ОС с помощью установщика Ubiquity. Для того чтобы провести автоматическое определение и настройку оборудования, потребуется живая система под символичным названием Casper. Ее нужно установить в initrd, а ядро Casper скопировать в папку образа диска.

Изолированная система хранится и выполняется в виде файла, сжатого в файл SquashFS. На данный момент ИС будет сохранена в виде папки в хост-системе.

Таким образом, создание ISO образа сводится к - созданию изолированной системы и установки в ней пакетов с ПО; - сжатию изолированной системы в файл; - созданию и конфигурированию образа диска, состоящего из загрузчика ISOLinux, ядра системы, сжатого файла файловой системы (простите за тавтологию) и многого другого; - записи ISO на диск и проверки его работы.

Создание изолированной системы

Для начала, установим debootstrap в хост-системе с помощью командной строки, после чего создадим папки «work» (для работы) и «image» (для изолированной системы). После установки запускаем debootstrap

Обратите внимание: Версия debootstrap для Ubuntu содержит файлы для загрузки только следующего релиза Ubuntu! Т. е. Вы не сможете скачать базовую систему для raring (Ubuntu 13.04) в precise (Ubuntu 12.04 LTS). На наше счастье, обойти это ограничение легко обойти, скачав debootstrap из репозитория raring или взяв последнюю версию из папки pool и установив его с помощью dpkg. Помимо того, у debootstrap нет зависимостей, а значит его установка вручную не вызовет никаких проблем в Вашей системе

sudo apt-get install debootstrap
mkdir -p work/chroot
cd work 
sudo debootstrap —arch=i386 trusty chroot http://mirror.yandex.ru/ubuntu

Обратите внимание: Если Вы хотите собрать следующий релиз Ubuntu, но не можете его загрузить, воспользуйтесь следующей хитростью:

cd /usr/share/debootstrap/scripts/ # переходим в папку со скриптами загрузки
sudo ln -s gutsy trusty # Создаем символическую ссылку в trusty на gutsy (т. е. показываем программе: загружать Ubuntu 14.04 надо также, как и 7.10) 
mkdir -p work/chroot # создаем папку для работы и изолированной системы
cd work 
sudo debootstrap —arch=i386 trusty chroot http://mirror.yandex.ru/ubuntu # скачиваем минимальную базовую систему (Ubuntu 14.04 LTS x86) в папку chroot с зеркала Яндекса
Обратите внимание, что в последней строке вместо trusty (Ubuntu 14.04 LTS) можно написать любое другое прилагательное из списка отсюда, например precise или quantal: http://ru.wikipedia.org/wiki/Ubuntu#.D0.92.D1.8B.D0.BF.D1.83.D1.81.D0.BA.D0.B8 Помимо этого, Вы можете загрузить систему не только из главного архива, но и с одного из множества зеркал. Для этого нужно дописать адрес зеркала в конце команды debootstrap. По умолчанию будет использован адрес http://archive.ubuntu.com/ubuntu.

Важно установить приложения вроде MySQL, Virtualbox после того как были скачаны ядро Linux (а оно у нас не скачано!(настолько у нас минимальна система)) и установлены общие настройки, потому что эти приложения требуют установки своих модулей ядра для полной настройки.

Если Вы планируете установить что-либо, использующее метапакеты окружений рабочего стола (например xfce4), Вам также потребуется связать файл в изолированной системе как следует (не только с помощью devpts). Иначе, GRUB при установке выдаст ошибку и Вы не сможете настроить пакеты. Чтобы этого избежать свяжите устройства с помощью команды:

sudo mount —bind /dev путь/до/chroot/dev

Аналогично нужно примонтировать proc, sysfs и devpts Теперь скопируем системные файлы (их можно взять на любой машине с Ubuntu, подключенной к интернету):

sudo cp /etc/hosts путь/до/chroot/etc/hosts
sudo cp /etc/resolv.conf путь/до/chroot/etc/resolv.conf
sudo cp /etc/apt/sources.list путь/до/chroot/etc/apt/sources.list
Обратите внимание: Если Вы скачали одну версию Ubuntu, а у Вас установлена другая, Вам нужно сменить прилагательное в chroot/etc/apt/sources.list командой:
sudo sed s/<Версия, которая у Вас установлена>/<Версия, которую Вы скачали>/ </etc/apt /sources.list> путь/до/chroot/etс/apt/sources.list
Например, у Вас стоит Ubuntu 12.04, а Вы скачали Ubuntu 11.10, то команда будет выглядеть так:
sudo sed s/precise/oneiric/ < /etс/apt/sources.list > chroot/etc/apt/sources.list

Если Вам нужно, Вы можете подправить sources.list и добавить туда сторонний репозиторий. Если Вы добавляете PPA репозиторий, то Вам помимо самого репозитория нужно добавить еще и OpenPGP ключ для пакетного менеджера в изолированной системе. Его можно найти на странице описания репозитория (он может выглядеть вот так: 1024/12345678). Скопируйте или запишите часть после косой черты (как здесь: 12345678). Этот ключ нужно добавить как можно скорее, как только мы чрутнемся в изолированную систему.

Обязательно! Сделайте бекап /sbin/initctl, потому что следующий шаг удаляет этот файл. Дело в том что начиная с версии 10.04 upstart не содержит файла /sbin/initctl.distrib и обновление этого пакета этот файл не возвращает.
sudo chroot chroot
mount none-t proc /proc
mount none-t sysfs /sys
mount none-t devpts /dev/pts
export HOME=/etc/skel
export LC_ALL=C
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 12345678 # Substitute " 12345678 " with the PPA's OpenPGP ID.
apt-get update
apt-get install --yes dbus
dbus-uuidgen > /var/lib/dbus/machine-id
dpkg-divert --local --rename --add /sbin/initctl

Отсутствие этого файла вызывает массу проблем в изолированных системах во всех системах, начиная с Ubuntu 9.10: https://bugs.launchpad.net/ubuntu/+source/upstart/+bug/430224

Решением может стать символическая ссылка на /bin/true:

ln -s /bin/true /sbin/initctl

Если Вы этого не сделаете, то консоль выругается:

initctl: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
initctl: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
start: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
invoke-rc.d: initscript systemd-logind, action "start" failed.
dpkg: error processing package libpam-systemd:i386 (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 libpam-systemd:i386
E: Sub-process /usr/bin/dpkg returned an error code (1)

Обновите пакеты, если хотите :

apt-get --yes upgrade

Установите пакеты, необходимые для живой системы:

apt-get install --yes ubuntu-standard casper lupin-casper
apt-get install --yes discover laptop-detect os-prober
apt-get install --yes linux-generic

Ранее, до Ubuntu 10.10 пакет discover назывался discover1.

Если Вы загружаете ОС Ubuntu 10.04, то Вам нужно поставить следующие пакеты: grub2 plymouth-x11

apt-get install --yes grub2 plymouth-x11

Для ранних релизов (заканчивая версией 9.04) была характерна следующая проблема: ОС вешала сеть, если был установлен Network Manager. На наше счастье, данная проблема была устранена в релизе 9.10. Команда для установки NM:

apt-get install --no-install-recommends network-manager

Далее, установите те программы какие Вы захотите. На данном этапе Вы создаете свою систему. Заполняйте ее тем, чем хотите. Однако перед этим поставьте программу ubuntu after install для установки тех программ, которые Вы добавить забыли. После наполнения ПО возвращайтесь к данному руководству.

Установка программы установки

Для GTK интерфейса — Unity, GNOME, XFCE и LXDE

Unity — стандартная ОРС для ubuntu, самая красивая ОРС (по моему мнению) GNOME — что-то по-новому от старого доброго Mac OS X XFCE и LXDE — это ОРС, не нагружающие ресурсы. Рекомендованы для установки на старых компьютерах

apt-get install ubiquity-frontend-gtk

Для Qt интерфейса — KDE

KDE — это Windows-подобное окружение рабочего стола и пожалуй, во всем хочет походить на своего старшего собрата (например это ОРС самое большое по объему данных)

apt-get install ubiquity-frontend-kde

Дополнительная подготовка

На данном этапе я расскажу, как создать файлы initrd.lz и casper-uuid-generic, необходимые для нормальной работы образа. В chroot выполняем

cd /tmp # Заходим в оперативную память
cp /initrd.img ./initrd0.gz # копируем в /tmp initrd.img  
casper-new-uuid /tmp/initrd0.gz /tmp/initrd.gz /tmp/casper-uuid-generic # Создаем файлы initrd.gz и casper-uuid-generic
mkdir /tmp/tmp # создаем папку для временного хранения initramfs
cd ./tmp # входим в нее
gunzip -dc ../initrd.gz | cpio -imvd --no-absolute-filenames # распаковка gz
find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../initrd.lz # упаковка в lz

В том же терминале открываем вторую вкладку и выполняем:

cp -v chroot/tmp/{initrd.lz,casper-uuid-generic} . # копируем файлы за chroot

Возращаемся в первую вкладку и удаляем из /tmp все:

cd /
rm -rfv /tmp/*

Очистка Чрута.

Если Вы установили все программы, то убедитесь что будет работать

rm /var/lib/dbus/machine-id

Ранее в этом руководстве я просил Вас сделать бекап /sbin/initctl. Вы его сделали? Он сейчас может потребоваться. Если эта команда не сработает, восстановите /sbin/initctl из бекапа.

rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl

Если у Вас более одного ядра Linux, удалите старые ядра:

ls /boot/vmlinuz-3.**-**-generic > list.txt
sum=$(cat list.txt | grep '[^ ]' | wc -l)
if [ $sum -gt 1 ]; then
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge
fi
rm list.txt

После чего проведите очистку:

apt-get clean
rm -rf /tmp/*
rm /etc/resolv.conf
umount -lf  /proc
umount -lf  /sys
umount -lf  /dev/pts
exit

Если у Вас все еще подключен /dev, отключите его:

sudo umount  /путь/до/чрута/dev

То есть, Вы вошли в изолированную систему, установили пакеты, провели очистку и вышли.

Настройка окружающей среды по умолчанию

Данный пункт не является обязательным. При загрузке окружения рабочего стола (в моем случае Unity 7) хочется настроить программы на боковой панели, настроить часы, которые выглядят ужасно в обычной версии Unity. Поэтому здесь я расскажу как можно настроить unity 7. Общеизвестно, что Unity 7 настраивается через dconf. Файлы настроек по умолчанию находятся в папке

/usr/share/glib-2.0/schemas/

и имеют имена соответствующие иерархии в dconf-editor. Мы изменим некоторые из них:

com.canonical.Unity.gschema.xml # Основная схема настройка Unity 7. В ней изменим программы по умолчанию.
com.canonical.indicator.timedate.gschema.xml # Схема по настройке часов в апплете уведомлений. Изменим формат часов
org.gnome.desktop.nautilus.gschema.xml

Создание папки для CD диска и ее заполнение

Необходимо установить на хост-систему 4 пакета: 1. Syslinux — загрузчик, позволяющий сделать ISO образ загружаемым; 2. SquashFS-tools — программа для сжатия образа системы 3. Genisoimage — пакет для работы с файлами образов диска. Нам из этого пакета понадобится утилита mkisofs 4. SBM — загрузчик для LiveCD

следующей командой:

sudo apt-get install syslinux squashfs-tools genisoimage sbm

Создайте папку для cd с тремя подкаталогами:

mkdir -p image/{casper,isolinux,install}

# То же самое можно сделать командой 'mkdir image image/casper image/isolinux image/install' Во-первых, Вам нужно скопировать ядро и initrd, созданное с помощью Casper в изолированной системе. Скопируйте их куда-нибудь вне изолированной системы и проведите следующее:

cp chroot/boot/vmlinuz-3.**-**-generic image/casper/vmlinuz
cp initrd.lz image/casper

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

for file in chroot/boot/vmlinuz-3.**-**-generic; do cp $file image/casper/vmlinuz; done
for file in chroot/boot/initrd.img-3.**-**-generic; do cp $file image/casper/initrd.gz; done

Теперь надо поставить ISOLinux и SBM командами:

cp /usr/lib/syslinux /isolinux.bin image/isolinux/
cp /boot/memtest86+.bin image/install/memtest
cp /boot/sbm.img  image/install/

Инструкции при загрузке при создании Remix

Для того чтобы дать какие-либо инструкции при загрузке пользователю нужно создать файл image/isolinux/isolinux.txt, например:

# splash.rle
************************************************** **********************
This is an Ubuntu Remix Live CD.
For the default live system, enter "live". To run memtest86 +, enter "memtest"
************************************************** **********************

Графика во время загрузки может отсутвовать, но это не главное. Главное состоит в том, что в тексте сверху есть спецсимвол, указывающий на файл splash.rle. Чтобы создать этот хитрый символ нужно:

1. Скопировать текст и потом его изменить. или 2. Использовать следующую команду:

printf "\x18" > emptyfile

и изменить файл emptyfile, используя любой текстовый редактор. Добавьте имя файла после символа и затем со следующей строки напишите то, что Вы хотите вывести на экран в качестве приветствия. Сохраните данный файл как isolinux.txt и дело в шляпе!

или

3. (Способ для Ъ-линуксоидов!) Используйте vi, нажмите Ctrl+v и затем Ctrl+x для того чтобы создать спецсимвол. Это не работает ни в nano, ни в gedit, ни в каком редакторе, похожем на них!

Для того чтобы создать файл splash.rle, создайте изображение 640*480, конвертируйте его в 15 цветов и сохраните файл в формате .bmp. После установите NetPBM и выполните команды:

bmptoppm splash.bmp > splash.ppm
ppmtolss16 '#ffffff=7' <splash.ppm> splash.rle

Если Вы хотите использовать анимированные изображения, такие как Usplash, убедитесь в том что Вы добавили «VGA=RRR», где RRR — ширина изображения.

Настройка загрузчика

Создайте файл image/isolinux/isolinux.cfg для настройки загрузчика. Пожалуйста, прочтите инструкцию по созданию конфига в /usr/share/doc/syslinux для того чтобы узнать все возможности конфигурирования. Здесь я выложу образец конфига (если что, сверяйтесь с ним):

DEFAULT live
LABEL live
menu label ^Start or install Ubuntu
kernel /casper/vmlinuz
append file=/cdrom/preseed/ubuntu.seed boot=casper initrd=/casper/initrd.gz quiet splash
LABEL check
menu label ^Check CD for defects
kernel /casper/vmlinuz
append boot=casper integrity-check initrd=/casper/initrd.gz quiet splash -
LABEL memtest
menu label ^Memory test
kernel /install/memtest
append -
LABEL hd
menu label ^Boot from first hard disk
localboot 0x80
append -
DISPLAY isolinux.txt
TIMEOUT 300
PROMPT 1
# prompt flag_val
#
# If flag_val is 0 , display the "boot:" prompt
# Only if the Shift or Alt key is pressed,
# Or Caps Lock or Scroll lock is set (this is the default).
# If flag_val is 1 , always display the "boot:" prompt.
# Http://linux.die.net/man/1/syslinux syslinux manpage

Не забудьте выбрать правильное расширение для initrd (initrd.gz или initrd.lz). Теперь в CD можно войти, по крайней мере после того, как мы создадим образ.

Помимо этого зададим нужную нам локаль при запуске с помощью стандартной темы ubuntu. Для этого выполним

sudo aptitude install dpkg-dev uck
apt-get source gfxboot-theme-ubuntu gfxboot
cd gfxboot-theme-ubuntu*/
make DEFAULT_LANG=ru
sudo cp -af boot/* ../image/isolinux/

Формальности.

Следующие действия нужны для нормальной работы LiveCD. Нравится Вам это или нет, это нужно сделать.

Создание манифеста.

sudo chroot chroot dpkg-query -W --showformat='${Package} ${Version} \n' | sudo tee image/casper/filesystem.manifest
sudo cp -v image/casper/filesystem.manifest image/casper/filesystem.manifest-desktop
REMOVE = 'ubiquity ubiquity-frontend-gtk ubiquity-frontend-kde casper lupin-casper live-initramfs user-setup discover xresprobe os-prober libdebian-installer4'
for i in $ REMOVE
do
sudo sed -i "/${i}/d" image/casper/filesystem.manifest-desktop
done

Сжатие изолированной системы.

Для того чтобы сжать систему в один файл, нужно ввести команду:

sudo mksquashfs chroot image/casper/filesystem.squashfs

Эта команда создаст на диске filesystem.squashfs с сжатой ОС. Если Вам нужно установить с LiveCD, оставьте раздел /boot в покое. Если Вы хотите создать LiveCD только для демонстрации, то /boot можно удалить. Тогда команда, указанная выше, будет иметь вид:

sudo mksquashfs chroot image/casper/filesystem.squashfs -e /boot

Да, и еще: если Вы создаете Убунту на версии, которая вышла раньше, то нужно установить пакет из той версии, какую Вы хотите создать! (Иначе Ваш LiveCD не загрузится) Например, у Вас установлена Ubuntu 12.04, а Вы хотите создать сборку Ubuntu 14.04. Тогда Вам потребуются инструменты из trusty (14.04) репозитория. Помимо файла сжатой файловой системы, нужно написать файл с размером этой ФС. Для этого выполним команду

printf $(sudo du -sx --block-size=1 chroot | cut -f1) > image/casper/filesystem.size

Создание diskdefines

nano image/README.diskdefines

Пример:

# define DISKNAME Ubuntu 14.04 LTS "Trusty Tahr" - Release i386 ** Remix **
# define TYPE binary
# define TYPEbinary 1
# define ARCH i386
# define ARCHi386 1
# define DISKNUM 1
# define DISKNUM1 1
# define TOTALNUM 0
# define TOTALNUM0 1

Признание LiveCD подлинной

Создайте жесткую ссылку ubuntu на папку с образом диска и папку «.disk». Без этого LiveCD будет загружаться но USB Creator работать не будет. На всякий пожарный, создайте файлы со следующей информацией:

cd image
ln -s . ubuntu
mkdir .disk
cd .disk
cp ../../casper-uuid-generic .
touch base_installable
echo "full_cd/single"> cd_type
echo 'Ubuntu 14.04 LTS "Trusty Tahr" - Release i386 ** Remix **'> info
echo "http://ubuntu-rescue-remix.org"> release_notes_url
cd ../..

Вычисление MD5

sudo -s
(cd image && find . -type f -print0 | xargs -0 md5sum | grep -v "\./md5sum.txt" > md5sum.txt)
exit

Это вычислит контрольные суммы md5 для всех файлов в будущем образе.

Создание ISO образа системы

Создать ISO образ из одной папки можно командой

cd image
sudo mkisofs -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 ../ubuntu-custom-i386.iso .
cd ..

Файл boot.cat будет создан автоматически. Теперь созданный Вами образ можно использовать для установки в Virtualbox и на реальном железе.

Полезные ссылки