Мой Mint. Об Ubuntu Customization Kit вообще

Алексей Федорчук

После первого опыта по сборке собственного варианта 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 — сначала путём установки его в виртуальной машине, о чём пойдёт речь в следующей заметке.

Содержание

Добавить комментарий