Pull to refresh

Кастомный LiveCD Ubuntu за 5 шагов / Ubuntu LiveCD Remastering

Reading time6 min
Views25K

Предисловие

Последние года 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 upgrade или pacman -Syu). Иначе придется возиться с настройкой нового ядра (точнее initramfs). Если умеете - в путь. Я предпочитаю не усложнять.

2. Чтобы перенести настроки рекомендую воспользоваться ленивым вариантом. Загружаетесь в нужной системе, можно даже в LiveCD. Выполняем настроки системы и приложений. После этого большинство из них можно найти в папке .config личного каталога пользователя. Просто находим файлы настроек приложений копируем их в любой каталог, я скопировал в каталог files. Туда же отправляем картинки, обои например, если вы их используете.

После "сбора" всех необходимых настроек, нам нужно знать куда их разместить. В Linux есть "чудо-католог" /etc/skel (от слова skeleton). Когда создается новый пользователь, файлы лежащие в этом каталоге будут закидываться в личную папку пользователя. Это нам и нужно. Просто создадим подкатологи /etc/skel/.config и другие если нам они нужны и скопируем настройки сюда. Таким образом, при создании любого пользователя в личную папку будут копироваться все наши настройки.

Далее собственно код с подробными комментариями.

# создаем скрипт настроек системы
sudo tee /home/$USER/livecd/rootfs/settings.sh <<EOF
#!/bin/bash

# prepare
export LC_ALL=C
dbus-uuidgen > /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}

# После кидаем настройки сохраненные в папке files ранее
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.timer
systemctl disable apt-daily-upgrade.timer
systemctl disable apport

# удаляю из автозапуска программу проверки обновлений, предпочитаю вручную
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

# копируем папку с нашими настройками в корень системы будущего LiveCD
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 -comp lz4

Шаг №5. Собираем новый iso

ДОПОЛНЕНИЕ С УЧЕТОМ КОММЕНТАРИЕВ

Чтобы LiveCD работал без ошибок и сохранилась возможность установки с вашей сборки, необходимо обновить в исходных файлах iso сумму md5, файл filesystem.size и список установленных пакетов в файле filesystem.manifest.

# создаем filesystem.manifest
sudo chroot /home/$USER/livecd/rootfs dpkg-query -W --showformat='${Package} ${Version}\n' | sudo tee /home/$USER/livecd/iso/casper/filesystem.manifest
sudo cp -v /home/$USER/livecd/iso/casper/filesystem.manifest /home/$USER/livecd/iso/casper/filesystem.manifest-desktop

# удаляем список пакетов установщика для десктопной версии
REMOVE='ubiquity ubiquity-frontend-gtk ubiquity-frontend-kde casper lupin-casper live-initramfs user-setup discover1 xresprobe os-prober libdebian-installer4'
for i in $REMOVE
do
	sudo sed -i "/${i}/d" /home/$USER/livecd/iso/casper/filesystem.manifest-desktop
done

# обновляем файл filesystem.size
printf $(sudo du -sx --block-size=1 /home/$USER/livecd/rootfs | cut -f1) > /home/$USER/livecd/iso/casper/filesystem.size

# считаем md5 hash сумму
cd /home/$USER/livecd/iso
sudo rm md5sum.txt
find . -type f -print0 | sudo xargs -0 md5sum | grep -v isolinux/boot.cat | sudo tee md5sum.txt

Далее собираем образ 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.

Всем благ.

Tags:
Hubs:
Total votes 15: ↑14 and ↓1+13
Comments12

Articles