Алексей Федорчук
После первого опыта по сборке собственного варианта Mint’а я увлёкся этой темой. И, в частности, решил пересобрать вариант с десктопом MATE — причём уже с практическими целями, для установку на свою Ноутбучку, Cinnamon для неё оказался тяжеловатым. В процессе этого предприятия я (и, как выяснилось, не только я) столкнулся с непредвиденными сложностями, которые заставили немного покопаться во внутренностях Ubuntu Customization Kit (далее UCK). В результате этого копания и появилась данная заметка.
Всякий, кому приходилось заниматься модификацией существующего установочного образа какого-либо дистрибутива, представляет себе основные этапы этого процесса:
- монтирование образа как loop-устройства;
- развёртывание её файловой системы — нынче все дистрибутивы используют какой-либо механизм компрессии, в частности в убунтоидах это SquashFS;
- монтирование в loop-систему как связанных (bind) таких служебных, но абсолютно необходимых каталогов материнской системы, как
/dev
,/sys
и, на всякий случай,/proc
; - выполнение операции
chroot
в loop-каталог, становящийся таким образом корневым; - выполнение в chroot-окружении необходимых действий по удалению ненужных пакетов и установке необходимых;
- выход из chroot-окружения и обратная запаковка loop-каталога;
- размонтирование loop-устройства и создание из него загрузочного iso-образа с помощью
isolinux
.
Интуитивно было понятно, что UCK не делает ничего иного, кроме перечисленного, только автоматизирует процесс, делая его этапы почти незаметными для применителя. При ближайшем рассмотрении так и оказалось.
Основные исполняемые файлы пакета uck
(а их 16 штук) собраны, понятное дело, в каталоге /usr/bin
и имеют префикс uck-*
. Все они являются самыми обычными шелл-скриптами, причём по их именам легко догадаться о назначении каждого. «Головным», то есть запускающим весь процесс скриптом является /usr/bin/uck-gui
— именно он вызывается через пункт меню Администрирование -> Ubuntu Customization Kit — с опцией --wait-before-exit
, отвечающей за ожидание нажатия Enter перед выходом из программы после успешного завершения её работы.
Кстати говоря, при неуспешном завершении, то есть возникновении ошибки по любой причине (например, нехватке места на целевом устройстве), ничего не происходит, кроме остановки работы. Никаких возвратов назад не предусмотрено, остаётся только закрывать главное терминальное окно программы (то самое пустое, которое в предыдущей заметке можно видеть на первом скриншоте) и начинать всё сначала. Так что, учитывая длительность распаковки SquashFS и некоторых других процедур, лучше действовать аккуратно и не ошибаться. Надеюсь, что заметки эта и следующая помогут заинтересованным читателям избежать по крайней мере тех граблей, на которые наступил я.
Кроме указанной, команда uck-gui
(которая запускается от лица обычного пользователя — пароль для доступа к административным привилегиям запрашивается только тогда, когда они на самом деле потребуются) имеет ещё как минимум две опции. Первая, -m
, обеспечивающая кеширование модифицированных частей образа, работает, как сказано в man (1) uck-gui
, не всегда, и потому в стандартной ситуации не используется.
Вторая опция также штатно не задействована, но она может оказаться важной для применителя. Это опция remaster-dir
, определяющая рабочий каталог для UCK, отличный от умолчального ~/tmp
. Мне использование последнего по ряду причин было не желательно, поэтому итоговая команда для запуска UCK через меню приобрела такой вид:
uck-gui --wait-before-exit /home/data/my-mint
Кроме запуска процесса, сценарий uck-gui
отвечает, в том числе, и за выбор типа десктопа — unity
, gnome
, kde
, или others
. Однако попытки вносить здесь какие-либо изменения (например, пополнения списка доступных десктопов) никакого результата за собой не повлекут. То есть добавленные десктопы добавятся в меню их выбора (см. скриншот из ), ничего не изменят (впрочем, на эту тему будет разговор в заметке следующей).
Потому что на самом деле кроме исполняемых скриптов в каталоге /usr/bin
, основным компонентом UCK является также каталог /usr/lib/uck/
. А в нём, кроме всего прочего — файл /usr/lib/uck/customization-profiles/localized_cd/customize
, представляющий собой исполняемый шелл-сценарий. Запомним его — именно его придётся редактировать в следующей заметке.
А теперь есть смысл конспективно повторить содержание предыдущей заметки с комментариями, что же означают спрятанные за интерфейсом uck-gui
действия.
Начальная кастомизация связана с выбором локали для Live-носителя и инсталлированной системы — список всех доступных содержится в файле /usr/lib/uck/langlist
. Причём оказалось, что, вопреки сделанному при подготовке прошлой заметки, никакой ражей мовы определять определять не нужно: даже если ограничиться отметкой боксика ru
, в Live-среде локаль будет en_US, а в установленной системе к умолчальной локали — предположим, русской utf8
~ $=> locale LANG=ru_RU.UTF-8 LANGUAGE= LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL=
сами собой добавятся такие:
~ $=> locale -a C C.UTF-8 en_AG en_AG.utf8 en_AU.utf8 en_BW.utf8 en_CA.utf8 en_DK.utf8 en_GB.utf8 en_HK.utf8 en_IE.utf8 en_IN en_IN.utf8 en_NG en_NG.utf8 en_NZ.utf8 en_PH.utf8 en_SG.utf8 en_US.utf8 en_ZA.utf8 en_ZM en_ZM.utf8 en_ZW.utf8 POSIX ru_RU.utf8 ru_UA.utf8
Правда, в отличие от Ubuntu, ни одна из них не будет всплывать в самый неподходящий момент — но это совсем другой разговор.
Следующий шаг кастомизации — выбор рабочей среды. На самом деле он определяет не среду, а терминальную программу, в которой будет жить chroot-окружение. При выборе первых трёх вариантов её будет соответствующий штатный терминал (Konsole, GNOME Terminal или Xfce Terminal), в случае варианта четвёртого будут просто перебраны они же плюс LXTerminal из LXDE. Соответственно, запустится тот, что найдётся первым, так что выбор пункта other подойдёт в подавляющем большинстве случаев, вне зависимости от десктопа, используемого на потрошимом Live-носителе. А на самый крайняк предусмотрен запуск XTerm, который, казалось бы, имеется в любом дистрибутиве. Но вот в Mint’е ни в одной сборке его как раз нет, что и создало сюжет следующей заметки.
С выбором исходного образа диска всё понятно, как и с последующими шагами — вплоть до предложения ввести пароль для доступа к правам администратора. Они требуются для последующего монтирования исходного образа, его разворачивания и декомпрессии SquashFS, которая занимает немало времени. Когда же она закончится, каталог, определённый в качестве remaster-dir
, будет выглядеть так:
ls [remaster-dir] build.log customization-scripts/ remaster-apt-cache/ remaster-new-files/ remaster-root/ remaster-root/home
Очевидно, что build.log
содержит протоколирование хода процесса, а в каталоге customization-scripts/
собраны скрипты кастомизации, сгенерированные посредством сценариев из /usr/lib/uck/
. В каталоге remaster-apt-cache/
будет помещён локальный кеш устанавливаемых пакетов, а сами они в подкаталоге remaster-apt-cache/archives
— аналоге /var/cache/apt/archives
установленной системы. Таким образом, скачанные пакеты не засоряют ни корень развёрнутой из Live-образа системы (он расположен в каталоге remaster-root/
), ни, тем более, каталог для сборки уже непосредственно нового образа — remaster-new-files/
. В последнем после успешного завершения всего предприятия этот самый образ, под именем livecd.iso
, и окажется. Ну а remaster-root/home
, ясное дело, является домашним каталогом администратора (аналог /root
обычной файловой иерархии).
Далее предлагается выбрать пункт Run console application — это выполнение той самой команды chroot
, о которой я говорил раньше. И оно сопровождается запуском того самого терминала, определённого на стадии так называемого выбора десктопа.
Если предыдущие стадии завершились успешно, то начинается самое важное: собственно потрошение исходного образа. Тут требуется аккуратность и последовательность, нарушение которой влечёт ошибки, которые, как я уже говорил, крайне нежелательны. Так что предлагаю один из вариантов, испробованный на собственной шкуре.
Для начала подключить PPA-репозитории, если предполагается их использование. В частности, к будущему образу для Ноутбучки я подключил ppa:andrew-crew-kuznetsov/crew
, содержащий пакет hunspell-ru-ie-yo
(словарь с поддержкой буквы Ё). А к образу для большой машины — ещё и ppa:zfs-native/stable
, ибо по некоторым причинам был смертельно огорчён поведением XFS, но об этом в другой раз. Сделать это можно с помощью mintsources
, о котором я не так давно писал — именно из-за него тянуть с этим делом не следует, после удаления ненужных (мне) программ он стал работать с ошибками. Впрочем, если прибегнуть к стандартному add-apt-repository
, то подключение PPA-репозиториев можно и отложить.
Следующий шаг — удаление ненужных пакетов. Мой список удаляемых пакетов в обязательном порядке включает:
tomboy gimp thunderbird libreoffice banshee brasero totem vlc
Далее, в зависимости от субстрата (образ с Cinnamon’ом или с MATE) возможны вариации. Но об этом я расскажу в соответствующих заметках. А пока «отдельно, с большим наслажденьем», я поудалял шрифты — тайские, кхмерские и другие, столь же необходимые в наших широтах:
fonts-kacst fonts-kacst-one fonts-khmeros-core fonts-lao fonts-lklug-sinhala fonts-nanum fonts-sil-abyssinica fonts-sil-padauk fonts-takao-pgothic fonts-thai-tlwg fonts-tibetan-machine fonts-tlwg-garuda fonts-tlwg-kinnari fonts-tlwg-loma fonts-tlwg-mono fonts-tlwg-purisa fonts-tlwg-sawasdee fonts-tlwg-typewriter fonts-tlwg-typist fonts-tlwg-typo fonts-tlwg-umpush fonts-tlwg-waree ttf-indic-fonts-core ttf-punjabi-fonts
Однако тут важно не увлечься и следить, что будет удалено в качестве зависимостей. Например, попытка деинсталляции жизненно необходимого для нас шрифта fonts-wqy-microhei
(он предназначен для CJK) приведёт к сносу практически всего Mint’а.
Как удалять пакеты? Да как угодно. Можно запустить из командной строки Synaptic для пущей наглядности и более внятных предупреждений об удалении зависимостей. А можно воспользоваться командой apt purge
— и тогда удалить всё ненужное одной командой. Только, повторяю, нужно внимательно читать сообщение, предваряющее согласие на удаление.
После удаления пакетов можно добавить требуемые PPA-репозитории с помощью add-apt-repository
(если это не было сделано раньше, через mintsources
), а затем нажать кнопку Apply в Synaptic’е или выполнить команду
$ sudo apt update
для обновления локального кеша.
Теперь у меня было сильнейшее искушение получить полностью актуализированную систему, дав команду
$ sudo apt upgrade
Я ему поначалу поддался — и вскоре убедился, что зря: процесс тотального апгрейда привёл к ошибке на стадии обновления ядра и генерации initrd
. А, как я уже говорил, в этом случае приходится начинать всё сначала. Конечно, этого можно избежать, запретив обновление всех «околоядерных» компонентов. Но мне было лень возиться, и потому при следующей попытке я обошёлся без апгрейда — его проще будет провести в инсталлированной системе. Так что вслед за обновлением кеша я занялся установкой нужных мне пакетов. Список их к будущему образу с MATE, предназначенному для Ноутбучки, выглядел так:
gprename abiword gnumeric fbreader hunspell-ru-ie-yo geany geany-plugin-addons geany-plugin-extrasel geany-plugin-macro geany-plugin-spellcheck geany-plugin-tableconvert geany-plugin-treebrowser fonts-cantarell guake mc zsh shutter gnome-mplayer
Порядок установки был случайный, за исключением последних двух позиций. Потому что по своему первому опыту и для shutter
‘а, и для gnome-mplayer
‘а я ожидал проблем с зависимостями, в результате которых от установки всякой мультимедии мне тогда пришлось отказаться вообще. Тогда я списал это на конфликт версий библиотек, возникших из-за отсутствия общего апгрейда системы. Однако ныне никаких проблем не обнаружилось. Так что, скорее всего, в первый раз дело было в отсутствии последовательности — я чередовал удаление пакетов и их установку, и в какой-то момент это привело к «перехлёсту». Чего, видимо, делать категорически не следует.
Вариант с Cinnamon’ом (этот образ предназначался для большой машины — о причинах переустановки системы на ней я расскажу в другом месте) отличался отсутствием офисного пакета вообще, ибо с выбором между Apache OpenOffice и LibreOffice ещё не определился. Кроме того, из списка был изъят fbreader
, но добавлен calibre
— электронных книжек я на большой машине не читаю, а вот делать их — делаю. И разумеется, в образ для большой машины был включён uck
.
Вот собственно и всё, что нужно делать. Теперь по выходе из терминала (и одновременно — из chroot-окружения) и выбора пункта Continue building оставалось только ждать — сначала сборки образа, а затем очистки каталога remaster-dir
от продуктов жизнедеятельности UCK. Последний процесс был связан с удалением примерно 80000 (в скобах прописью восьмидесяти тысяч!) файлов и затянулся до неприличия, приведя, кроме того, к полному параличу системы, вплоть до браузера и текстового редактора. Но это, как я уже говорил будет предметом другой, очень страшной, истории.
А пока я приступил к проверке сначала первого из полученных образов, на базе десктопа MATE — сначала путём установки его в виртуальной машине, о чём пойдёт речь в следующей заметке.