Кастомный LiveCD Ubuntu за 5 шагов / Ubuntu LiveCD Remastering
Предисловие
Последние года 3 я активный пользователь Linux. Мне нравится возможность полной настройки и экспериментов, которые позволяет эта система. Единственным неудобством, на мой взгляд, являлась невозможность сохранить свои изменения в сам LiveCD с системой. Это решалось послеустановочными скриптами, но хотелось сделать уже настроенную под себя систему прямиком в LiveCD. Потратив кучу времени, сил и нервов мне удалось реализовать эту цель. Далее постараюсь описать все шаги подробно, чтобы не оставлять «пустых» мест.
Я прикипел к дистрибутиву Lubuntu, на его примере и опишу кастомизацию, но вы можете использовать мои рекомендации для Debian, Ubuntu (любой редакции), Manjaro. На этих Linux мой алгоритм испробован с успехом. Вероятно с другими ОС он тоже сработает, но сам не проверял.
Приступим.
Шаг №0
Подготовим хостовую систему (у меня Lubuntu) для сборки кастомного LiveCD. Нам понадобится несколько дополнительных приложений.
sudo apt install -y squashfs-tools xorriso isolinux
Если у вас хостовая система Manjaro или Arch, вместо пакета isolinux уствновите syslinux
sudo pacman -Sy squashfs-tools xorriso syslinux
Шаг №1. Копирование файлов iso
Этот шаг до ужаса прост. Монтируем LiveCD, создаем каталог для копирования файлов и копируем.
# монтируем iso
sudo mkdir /mnt/iso
sudo mount -o loop path/to/iso /mnt/iso
# создаем папку для копирования файлов iso
sudo mkdir -p /home/$USER/livecd/iso
# копируем
sudo cp -rf /mnt/iso/* /home/$USER/livecd/iso/
# отмонтируем iso и удаляем папку куда монтировали
sudo umount /mnt/iso
sudo rm -rf /mnt/iso
Шаг №2. Распаковываем систему
После копирования файлов iso образа нам необходимо найти запакованную систему. В Ubuntu это файл filesystem.sqashfs, находящийся в папке casper. Этот файл — и есть вся операционная система, сжатая в «архив». В iso других ОС название и расположение файла может отличаться.
# создаем папку для распаковки системы
mkdir /home/$USER/livecd/rootfs
# распаковываем
sudo unsquashfs -f -d /home/$USER/livecd/rootfs path/to/iso/casper/filesystem.squashfs
Шаг №3. Выполняем вход в систему и настраиваем ее
В папке rootfs у нас уже лежит операционная система. Теперь мы можем запустить ее в окружении chroot. По сути мы загружаем новую ОС в терминале, условно говоря. Если мы сейчас так и поступим, то все изменения нам придется вносить вручную. Вариант не лучший, на мой взгляд.
Предложу создать автоматизированный скрипт установки пакетов программ и настроек.
Маленькое отвлечение.
1. При настройке системы в chroot не рекомендую обновлять приложения (apt update или pacman -Syu). Иначе придется возиться с настройкой нового ядра (точнее initramfs). Если умеете — в путь. Я предпочитаю не усложнять.
2. Чтобы перенести настроки рекомендую воспользоваться ленивым вариантом. Загружаетесь в нужной системе, можно даже в LiveCD. Выполняем настроки системы и приложений. После этого большинство из них можно найти в папке .config личного каталога пользователя. Просто находим файлы настроек приложений копируем их в любой каталог, я скопировал в каталог files. Туда же отправляем картинки, обои например, если вы их используете.
После «сбора» всех необходимых настроек, нам нужно знать куда их разместить. В Linux есть «чудо-католог» /etc/skel (от слова skeleton). Когда создается новый пользователь, файлы лежащие в этом каталоге будут закидываться в личную папку пользователя. Это нам и нужно. Просто создадим подкатологи /etc/skel/.config и другие если нам они нужны и скопируем настройки сюда. Таким образом, при создании любого пользователя в личную папку будут копироваться все наши настройки.
Далее собственно код с подробными комментариями.
# создаем скрипт настроек системы
sudo tee /home/$USER/livecd/rootfs/settings.sh < /var/lib/dbus/machine-id
# устанавоиваем нужные приложения
apt update
apt install -y APP1 APP2
# удаляю лишнее
apt -y purge sylpheed
apt -y purge pidgin
apt -y purge xpad
apt -y purge transmission* transmission-gtk transmission-qt
apt autoremove -y
# распаковываю из архивов свои темы и иконки
tar -xzf /files/win-10-ico.tar.gz -C /usr/share/icons/
tar -xzf /files/themes.tar.gz -C /usr/share/themes/
## Обновляем кэш иконок, шрифтов
gtk-update-icon-cache /usr/share/icons/win-10-ico/
fc-cache -vf
# Сначала создаем папки для настроек в /etc/skel
mkdir -p /etc/skel/{.local/share/applications,.config/audacious,.config/clipit,.config/geany,.config/gpicview,.config/gtk-3.0,.config/leafpad,.config/libfm,.config/lxpanel/Lubuntu/panels,.config/lxsession/Lubuntu,.config/lxsession-default-apps,.config/lxterminal,.config/Mousepad,.config/openbox,.config/pcmanfm/lubuntu,.config/smplayer,.config/vlc,.config/xfce4/xfconf/xfce-perchannel-xml}
# После кидаем настройки
cat /files/bashrc | tee /etc/skel/.bashrc
cat /files/clipit/clipitrc | tee /etc/skel/.config/clipit/clipitrc
cp -f /files/shutdown.desktop /usr/share/applications/
####### И ТАК ДАЛЕЕ, СО ВСЕМИ НАСТРОЙКАМИ #########
# Отключаем ненужные службы из автозапуска
systemctl disable apt-daily
systemctl disable apt-daily-upgrade
# удаляю из автозапуска программу проверки обновлений
rm -f /etc/xdg/autostart/update-notifier.desktop
# clean and exit
apt-get clean
rm /var/lib/dbus/machine-id && rm -rf /tmp/*
echo '' > /etc/resolv.conf
# exit from chroot
exit
EOF
sudo chmod +x /home/$USER/livecd/rootfs/settings.sh
# копируем файл resolv.conf чтобы работала сеть в chroot
sudo cp -f /etc/resolv.conf /home/$USER/livecd/rootfs/etc/resolv.conf
# копируем папку с нашими настройками в корень системы
sudo cp -rf papka/files /home/$USER/livecd/rootfs/
# монтируем временные файловые системы
sudo mount --bind /proc /home/$USER/livecd/rootfs/proc
sudo mount --bind /dev /home/$USER/livecd/rootfs/dev
sudo mount --bind /sys /home/$USER/livecd/rootfs/sys
# запускаем chroot с нашим скриптом
sudo chroot /home/$USER/livecd/rootfs su -lc /settings.sh
# после завершения работы скрипта "прибираемся"
# удалем файл скрипта и папку с настроками
sudo rm -f /home/$USER/livecd/rootfs/settings.sh
sudo rm -rf /home/$USER/livecd/rootfs/files
# отмонтируем временные файловые системы
sudo umount -lR /home/$USER/livecd/rootfs/proc
sudo umount -lR /home/$USER/livecd/rootfs/dev
sudo umount -lR /home/$USER/livecd/rootfs/sys
Краткий комментарий к скрипту.
Чтобы не возиться с правами и владельцами файлов все настройки я переношу через следующую конструкцию: cat /files/файл-настроек | tee /etc/skel/.config/файл-настроек.
Все что написано между EOF … EOF передается цельным потоком в программу tee, которая все это записывает в файл.
Разумеется файл скрипта сокращен, полный вариант смотрите в моем GitHub, ссылка будет в конце статьи.
Вот и все. Далее соберем все обратно.
Шаг №4. Сжимаем кастомизированную систему
Когда мы внесли все необходимые изменения, можно собирать систему обратно в squashfs. Тут никаких хитростей. Удаляем filesystem.squashfs из папки с файлами iso и создаем новый.
sudo rm -f /home/$USER/livecd/iso/casper/filesystem.squashfs
sudo mksquashfs /home/$USER/livecd/rootfs/ /home/$USER/livecd/iso/casper/filesystem.squashfs
Шаг №5. Собираем новый iso
Здесь есть одна тонкость. В зависимости от вашей хостовой системы путь к файлу isohdpfx.bin может отличаться. В Ubuntu он в каталоге /usr/lib/ISOLINUX, в Manjaro /usr/lib/syslinux/bios (если не ошибаюсь).
В коде ниже смените ISO_NAME во второй и предпоследней строках на свои названия вашей сборки.
sudo xorriso -as mkisofs \
-r -J -V "ISO_NAME" \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot \
-partition_offset 16 \
-boot-load-size 4 \
-boot-info-table \
-isohybrid-mbr "/usr/lib/ISOLINUX/isohdpfx.bin" \
-o /home/$USER/ISO_NAME \
/home/$USER/livecd/iso
По итогу вы получаете свой кастомизированный LiveCD Ubuntu за 5 шагов. Все приведенные выше коды собраны мной в скрипты, которые вы можете взять на github.
Всем благ.