Создание iso со своим образом Ubuntu и набором программ

Я собирал собственный образ ISO Ubuntu 18.04 по инструкции LiveCDCustomization на системе Ubuntu 14.04.

Мне необходимо было поставить некоторые программы, чтобы они были доступны сразу с LiveCD, без установки. Это удобно, особенно без наличия интернета.

В конце я получил свою персональную загрузочную флешку, кастомизированную под себя.

В оригинальной инструкции LiveCDCustomization есть некоторые неясные моменты и неточности. Сама инструкция устарела, и частично не работала.

Поэтому я делал по шагам и записывал выполняемые действия.

Осторожно! Почти все команды выполняются под root.

Важно понимать, что вы делаете: вся кастомизация LiveCD проходит под chroot, и на рабочую систему (ту, где вы сейчас работаете) влияния не оказывает.

Но если выйти из chroot, все введенные команды применяются к рабочей системе. Это требуется в некоторых местах инструкции: при первичной подготовке, и в конце, при сборке. Смотри не перепутай =)

Подготовка

Устанавливаем зависимости на хост-систему

Потребуется 2 пакета, один занимается работой со сжатой файловой системой squashfs, другой для создания ISO-образа CDROM (ISO-9660):

sudo apt install squashfs-tools genisoimage

Странно, но у меня уже были установлены эти пакеты. Ради интереса найдем, когда эти пакеты были установлены, для чего поищем в истории apt:

cd /var/log/apt
# ищем в history.log
grep -r squashfs --color=always
# если прошло много времени, история упаковывается в .gz, ищем в ней:
find -name \*.gz -print0 | xargs -0 zgrep squashfs --color=always
# --color=always добавляет подсветку найденных слов

Также потребуется виртуальная машина для быстрого тестирования. Я использовал Virtualbox

Монтируем оригинальный образ ISO в mnt

Скачиваем оригинальный ISO образ Ubuntu, который будем модифицировать под свои нужны. Допустим, образ скачан и находится в ~/downloads/ubuntu-18.04-desktop-amd64.iso.

Подмонтируем этот ISO образ в каталог ~/livecdtmp/mnt для дальнейшей работы:

# создаем сразу два вложенных каталога
mkdir -p ~/livecdtmp/mnt
# копируем ISO образ диска
cp ~/downloads/ubuntu-18.04-desktop-amd64.iso ~/livecdtmp
# входим в каталог, где будет проводиться основная работа
cd ~/livecdtmp
# монтируем CD-диск
sudo mount -o loop ubuntu-18.04-desktop-amd64.iso mnt

Копируем содержимого mnt в extract-cd

mkdir extract-cd
rsync --exclude=/casper/filesystem.squashfs -a mnt/ extract-cd

Расжимаем файловую систему squashfs и перемещаем содержимое в edit

sudo unsquashfs mnt/casper/filesystem.squashfs
sudo mv squashfs-root edit

Подготавливаем рабочую среду

Копируем resolv.conf с рабочей системы, чтобы было сетевое соединение внутри чрута, также делаем это для сети::

sudo cp /etc/resolv.conf edit/etc/
sudo mount -o bind /run/ edit/run
sudo mount --bind /dev/ edit/dev

FIXME resolv.conf в следующих шагах оказался пустым, надо понять почему, и исправить

Чрутимся, и начинаем работать со своим кастомизированным образом.

# chroot выполняется только от суперпользователя
sudo su
# чрутимся:
chroot edit # < зачрутились
# важно! чтобы не перепутать, где мы работаем, сразу сменим вид приглашения командной строки:
PS1="(CHROOT) $PS1"

Настраиваем:

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 из оригинальной инструкции я пропустил

Файл /etc/resolv.conv оказался пустым, значит что-то я сделал не так. Отредактируем его вручную, скопировав содержимое /etc/resolv.conv из рабочей системы:

vi /etc/resolv.conv
# это не команды, а содержимое файла, которое следует внести. Не копировать слепо! Подставить из своей рабочей системы, файл /etc/resolv.conv! У меня оно такое:
nameserver 127.0.1.1

Теперь сеть у нас доступна внутри чрута, проверим

ping ya.ru

Кастомизация своего образа Ubuntu

Напомню, сейчас мы находимся под чрутом (chroot edit), и у нас работает сеть. Все что написано ниже, является делом вкуса.

Ставим необходимые пакеты

Смотрим установленные пакеты:

dpkg-query -W --showformat='${Installed-Size}\t${Package}\n' | sort -nr | less

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

apt update
apt upgrade

Устанавливаем свои пакеты:

# программы для работы с сетью
apt install curl net-tools whois nmap
# остальные - также по желанию
apt install vim git htop zsh tmux 

Следующие пакеты поставить не удалось, так как их нет в /etc/apt/:

shutter
krusader
filezilla
lynx

FIXME узнать, какие репо следует добавить для установки

Установить программы можно и из deb-пакетов, на примере Atom:

  • Скачиваем Atom через консоль или браузер
  • Если скачано из браузера, то: sudo mv ~/downloads/atom-amd64.deb ~/livecdtmp/edit/tmp
  • Устанавливаем: dpkg -i /tmp/atom-amd64.deb

У меня установка не удалась, так как этот пакет зависит от gconf2 и gconf-service. Эти зависимости apt не сумел разрешить. Чтобы это исправить, требуется добавить в /etc/apt/ дополнительные репо. FIXME какие?

dpkg: dependency problems prevent configuration of atom:
atom depends on gconf2; however:
Package gconf2 is not installed.
atom depends on gconf-service; however:
Package gconf-service is not installed.

Кастомизация

Это по-желанию: читаем оригинальную инструкцию LiveCDCustomization, раздел Customizations и настраиваем фон рабочего стола, шрифты, региональные настройки и прочее. Первый шаг dbus-uuidgen и dpkg-divert можно пропустить, для Ubuntu 18.04 они не повлияли на работу apt.

Проверка и сборка ISO образа

Мы все еще находимся в чруте chroot edit

Проверяем, что нет пользователя UID=999

В оригинальной мане указано, что если существует пользователь с UID 999, с LiveCD невозможно будет загрузиться. Такой пользователь может возникнуть при установке Virtualbox.

awk -F: '$3 == 999' /etc/passwd

есть есть, то выполнить usermod -u 500 $hit, где $hit - имя проблемного пользователя

Пересобираем initrd

После модификации ядра, скриптов загрузки или добавления модулей ядра, нужно пересобрать initrd.gz и переместить его в каталог casper

mkinitramfs -o /initrd.gz 4.15.0-23-generic
# выходим из чрута и перемещаем собранный образ
exit
mv edit/initrd.gz extract-cd/casper/

Снова чрутимся:

chroot edit
PS1="(CHROOT) $PS1"

Очищаем образ

Удаляем все, что не установилось и чистим систему:

apt --fix-broken install
apt autoremove
rm -rf /tmp/*
rm /etc/resolv.conf
rm /var/lib/dbus/machine-id # у меня файла не было

Размонтируем

umount /proc || umount -lf /proc
umount /sys
umount /dev/pts
exit # выходим из chroot
umount edit/dev

Собираем ISO образ

Манифест

# делаем манифест записываемым
chmod +w extract-cd/casper/filesystem.manifest
# обновляем манифест
chroot edit dpkg-query -W --showformat='${Package} ${Version}\n' > extract-cd/casper/filesystem.manifest
# пишем установленные пакеты
cp extract-cd/casper/filesystem.manifest extract-cd/casper/filesystem.manifest-desktop
# удаляем упоминания пакетов
sed -i '/ubiquity/d' extract-cd/casper/filesystem.manifest-desktop
sed -i '/casper/d' extract-cd/casper/filesystem.manifest-desktop

Сжимаем файловую систему

rm extract-cd/casper/filesystem.squashfs ## у меня не было этого файла
mksquashfs edit extract-cd/casper/filesystem.squashfs -b 1048576

Пишем размер файловой системы и md5 хеши файлов

printf $(du -sx --block-size=1 edit | cut -f1) > extract-cd/casper/filesystem.size
cd extract-cd
rm md5sum.txt
find -type f -print0 | xargs -0 md5sum | grep -v isolinux/boot.cat | tee md5sum.txt

Создаем готовый ISO

mkisofs -D -r -V "My Ubuntu custom image" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../my-ubuntu.iso .

Итоговый образ my-ubuntu.iso проверяем в Virtualbox.

Записываем ISO на флешку

Для записи я использовал unetbootin, который доступен из центра приложений Ubuntu.

unetbootin свой образ LiveCD загрузочной флешки