Содержание
Создание 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
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
узнать, какие репо следует добавить для установки
Установить программы можно и из deb-пакетов, на примере Atom:
- Скачиваем Atom через консоль или браузер
- Если скачано из браузера, то:
sudo mv ~/downloads/atom-amd64.deb ~/livecdtmp/edit/tmp
- Устанавливаем:
dpkg -i /tmp/atom-amd64.deb
У меня установка не удалась, так как этот пакет зависит от gconf2
и gconf-service
. Эти зависимости apt не сумел разрешить. Чтобы это исправить, требуется добавить в /etc/apt/
дополнительные репо. какие?
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.