
Предисловие
Последние года 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.
Всем благ.
