Собираем свой дистрибутив с Calculate Linux Scratch

журнал "Системный администратор" декабрь 2009


СЕРГЕЙ ЯРЕМЧУК, фрилансер. Автор более 800 статей и 4 книг. С «СА» с первого номера. Интересы: сетевые технологии, защита информации, свободные ОС

Практически каждый пользователь Linux хоть раз да собирал свой дистрибутив. Разработчики Calculate Linux предлагают свой вариант

Необходимость иметь свой вариант системы для системного администратора, да и обычного пользователя может быть продиктована многими факторами. Среди главных – удобство развертывания, когда в устанавливаемой системе присутствуют все необходимые приложения, последние версии ядра и системных библиотек, модули локализации, драйвера и так далее.

В Microsoft, кстати, это тоже отлично понимают, и корпорация предлагает средства пересборки системы – пакет автоматической установки Windows (Windows Automated Installation Kit) [1] и Microsoft Deployment Toolkit.

Конечно же, Linux развивается несколько иным путем, дистрибутивы выходят гораздо чаще Windows и собираются по другому принципу. Хотя не все релизы считаются стабильными и рекомендуются разработчиками к промышленному применению. А при массовом развертывании на предприятии используются стабильные релизы, рекомендуемые разработчиками, например Ubuntu LTS (Long Term Support).

Очевидно, это одна из причин, по которой в Linux большее распространение получили системы автоматической инсталляции, например, такие как – Kickstart. При помощи подготовленного Kickstart-файла можно установить дистрибутив с заданными параметрами и набором приложений. Изначально Kickstart появился в RedHat, и сегодня используется его многочисленными клонами и некоторыми другими дистрибутивами вроде Ubuntu. Пересборка системы производится в основном энтузиастами и для собственных нужд. А в инструментарии большинства дистрибутивов мы не найдем удобных средств для этого.

Здесь можно отметить Ubuntu Customization Kit (UCK) [2] и rBuilder, средство сборки дистрибутива rPath [3]. Конечно, есть Linux From Scratch, который хотя и пользуется некоторой популярностью, но вряд ли может послужить средством массового применения.

Основой Calculate Linux [4], о котором уже говорилось на страницах журнала [5], послужил Gentoo. До недавнего времени развивались две основные ветки – серверная CDS (Calculate Directory Server) и для настольных систем CLD (Calculate Linux Desktop). Последняя была представлена в двух вариантах с разными рабочими столами: CLD это KDE 4.x и CLDX – XFCE 4.6.х.

Недавно в семействе Calculate Linux появился совершенно новый вариант Calculate Linux Scratch (CLS) – представляющий собой LiveCD, предназначенный для самостоятельной сборки системы под любые задачи. Идея, в общем, проста – вместо готовых сборок, в которых часто нет необходимого конкретному пользователю софта, дать удобный инструмент позволяющий создать нужное решение самостоятельно.

История появления CLS проста. Вначале была собрана информация о том, что не устраивает пользователей Gentoo в других бинарных дистрибутивах, построенных на Gentoo, в частности Calculate и Sabayon. Выяснились две причины: отсутствие нужного софта и отсутствие сборки Calculate Linux с рабочим столом GNOME.

В итоге оптимальный дистрибутив, устраивающий всех, должен был содержать только те программы и библиотеки, которые будут установлены в большинстве случаев – XOrg, Firefox, библиотеки, системные утилиты, драйвера. Так, собственно, и выглядит CLS.

Первая CLS-версия под номером 9.8 вышла в августе 2009 года. Главная особенность – появление режима интерактивной сборки системы, позволяющего внести изменения в состав дистрибутива. Причем сразу стало доступно два варианта: CLS и CLSG.

Версия CLSG содержит облегченную среду Gnome (gnome-base/gnome-light), менеджер сеансов GDM и Wicd для графической настройки проводных и Wi-Fi-сетей (всего приблизительно на 80 пакетов больше CLS). Дистрибутив выпущен под две архитектуры i686 и x86_64.

Первоначально CLS ориентировался именно на стороннего пользователя, сами же разработчики не планировали использовать его для сборки Calculate Linux. Но результат заставил пересмотреть это мнение, и теперь CLS является основной для всех будущих версий Calculate Linux, как серверных, так и настольных. Ведь CLS может выступать при сборке в роли stage3, содержит portage и базовый софт, а все что отличается в USE-флагах (например, в KDE-версии) при необходимости пересобирается, но таких пакетов достаточно мало.

Так, если при стандартной сборке Gentoo (и CLS) команда «emerge -e system» выполняется дважды, то далее уже в этом нет необходимости, а значит, экономятся время и ресурсы. Кроме того, учитывая достаточно небольшой состав приложений, для самостоятельной сборки CLS не требуется больших ресурсов. Продолжая ежемесячный цикл выпуска новых версий, последние два релиза дистрибутива (август и сентябрь) были именно CLS/CLSG.

В середине сентября появился следующий релиз CLS 9.9, в котором:

  • перешли на файловую систему Aufs2;
  • сохранена 100-процентная совместимость с Gentoo (по сути, Calculate уже практически является частью Gentoo, оверлей помещен в layman, ebuild calculate2 планируется перенести в портежи);
  • используется ядро gentoo-sources;
  • поддерживается установка на USB-Flash и на HDD/USB-HDD (с файловой системой: ext4, ext3, ext2, reiserfs, xfs и jfs);
  • появилась новая утилита cl-unmask, предназначенная для размаскировки пакетов;
  • обновлены X.Org 7.4, Kernel 2.6.30.5, Firefox 3.5.3, Gnome 2.24.1 (в CLSG).

Размер образа:

  • CLS 9.9: i686 – 573 Мб, x86_64 – 629 Мб;
  • CLSG 9.9: i686 – 651 Мб, x86_64 – 709 Мб.

Собираем дистрибутив в интерактивном режиме

Чтобы воспользоваться режимом интерактивной сборки, следует установить дистрибутив на жесткий диск с параметром --build либо выбрать режим загрузки Builder в загрузочном меню LiveCD. В этом случае файловая система после загрузки системы будет состоять из трех слоев aufs2 (Advanced Multi Layered Unification File System, представляет собой усовершенствованную реализацию файловой системы Unionfs 2):

  • calculate – первый слой, являющийся образом системы, загружаемой с носителя (livecd.squashfs), и смонтированный в режиме «только для чтения». Это основа будущего дистрибутива, которую можно менять;
  • delta – слой, в котором сохраняются все изменения, произведенные во время сборки;
  • workspace – рабочий слой, в котором производятся все манипуляции по изменению исходной системы.


Рисунок 1. В загрузочном меню Calculate Linux Scratch выбираем Build

Все указанные слои являются подкаталогами в /mnt/scratch и автоматически образуются после загрузки системы.

# mount | grep /mnt/scratch

tmpfs on /mnt/scratch/delta type tmpfs (rw,relatime)
tmpfs on /mnt/scratch/workspace type tmpfs (rw,relatime)
/dev/loop0 on /mnt/scratch/calculate type squashfs (ro,relatime)

Собственно, по наличию каталога /mnt/scratch и определяется текущий режим работы системы (в нашем случае Builder).

Переходим в режим интерактивной сборки, введя в консоли cl-builder, после выполнения команды приглашение изменит цвет. Вся дальнейшая работа в текущей виртуальной консоли будет производиться в chroot-окружении /mnt/builder. Теперь можно работать как обычно в Gentoo – обновить портежи, устанавливать, обновлять программы. Здесь необходимо сделать важное замечание. В обычном режиме слои монтируются в таком порядке: calculate + delta + workspace, в интерактивном – calculate + delta.

После установки каждого пакета (завершения выполнения emerge) скрипт cl-builder выполняет команду «mount -o remount», перемонтируя заново слой delta. В итоге все изменения в delta сразу же становятся доступными в основной системе (например, появляются ярлыки приложений) и их можно протестировать перед сборкой нового образа. Запуск приложения в chroot-окружении приводит к созданию нежелательных временных файлов, которые затем попадают в образ. Именно поэтому во избежание конфликтов в работе устанавливаемых программ установку и удаление пакетов следует производить только в chroot-окружении через cl-builder, а тестировать в обычном.

Рисунок 2. В Calculate 1.2.6 необходимо закомментировать строчку

Обновляем утилиту calculate.

# layman -S; emerge calculate

Обновляем портежи (в принципе релизы CLS выходят раз в месяц и этот шаг можно пропустить):

# eix-sync

И устанавливаем нужное приложение:

# emerge weechat

По окончании сборки программа будет сразу же доступна в рабочей системе. В слое delta появятся новые файлы и библиотеки. Аналогичным образом добавляем и остальные приложения. По окончании работы выходим из режима сборки командой exit.

Теперь чтобы собрать загрузочный ISO-образ, достаточно смонтировать раздел жесткого диска (если объема ОЗУ достаточно, этот шаг можно пропустить):

# mount /dev/sda3 /usr/calculate/share/linux

И затем собираем образ командой:

# calculate --iso

Через некоторое время в каталоге /usr/calculate/share/linux появится ISO-образ с новой системой.

# ls /usr/calculate/share/linux/

cls-9.9-i686.iso cls-9.9-i686.iso.DIGESTS

Еще важный момент. Если CLS для сборки установлен на флешку (calculate -d /dev/sdX), можно пересобрать оригинальный файл livecd.squashfs, в котором, собственно, и находится система, сохранив изменения. Для этого достаточно ввести команду:

# calculate --rebuild

Новый файл будет иметь другой порядковый номер сборки. При следующей загрузке будет уже использован новый образ со всеми изменениями.

Следует заметить, что полученный в интерактивном режиме дистрибутив подходит для массового пользователя, но считается не совместимым с Calculate Directory Server (CDS). Чтобы собрать совместимый с CDS вариант, необходимо использовать обычный режим сборки.

Рисунок 3. Подготавливаем систему к сборке

Обычный режим сборки

Чтобы использовать обычный режим сборки системы, следует установить Calculate Linux (любую версию CLS/CLSG, CLD, CLDX или CDS) на жесткий диск обычным образом. Затем копируем в каталог /usr/calculate/share/linux установленной системы ISO-образ CLS оригинальный (если нужна оригинальная версия системы, предложенная разработчиками) или созданный нами в интерактивном режиме.

Вначале следует приготовить систему для сборки командой calcalute, запустив ее с параметром:

# calculate -c/--configure

По умолчанию будет производиться сборка текущей версии системы, то есть если работаем в CLS, то и собираться будет CLS. Чтобы указать другой вариант дистрибутива, добавляем параметр –s/--os=[CLD|CLDX|CLS|CLSG|CDS]. И готовим систему к сборке, например CLDX.

# layman -S; emerge calculate
# calculate -c -s CLDX

Building Calculate Linux Desktop
Collecting system information
  Language: en_US
  Keymap: en_US
  Timezone: UTC
  Computer name: calculate
  Network devices: eth0 (DHCP)
Hardware
  Machine hardware name: i686
  Quantity processors: 1
  Create directory stages...  done.
…

В текущей версии скрипта calculate (1.2.6) не убраны проверки наличия архивов stage3 и portage, которые требовались ранее для сборки системы. Так, если в процессе появится сообщение:

To continue copy file "stage3-i686-YYYYMMDD.tar.bz2" to directory "/usr/calculate/share/stages".

Значит в /usr/calculate/share/linux недоступен ISO-образ. Проверяем:

# ls /usr/calculate/share/linux/

cls-9.9-i686.iso

Второе возможное сообщение требует архив с portage.

To continue copy file "portage-YYYYMMDD.tar.bz2" to directory "/usr/calculate/share/snapshots".

Для всех систем, кроме CDS и CLS, в stage3 и portage нет необходимости, их заменяет сам CLS. Для этих двух систем уже понадобятся последние версии архивов с stage3 и portage. В будущей версии 1.2.8 проверку наличия portage для настольных версий систем обещают убрать (в GIT уже исправления присутствуют). Если это так, можно обновить вручную оверлей Сalculate командой eix-sync (в ходе выполнения configure обновляются оверлей и утилита calculate).

Рисунок 4. Проверка зависимостей

Как вариант лучше изменить сам скрипт, закомментировав одну строку в разделе «Определим наличие stage, portage» (строка 1828):

# "Определим наличие stage, portage" 

if(!$data{portage} && !defined $data{arg}{'vars'}){
printmes("\n");
printmes(gettext('To continue copy file'));
printmes(" \"portage-YYYYMMDD.tar.bz2\"\n");

 printmes(gettext('to directory')); printmes(" \"$data{portagepath}\".\n");
beep();
# Комментируем строку с exit
#                      exit;
}

После этого подготовка системы к сборке должна пройти без проблем. Если ввести команду «calculate -c» в режиме Builder, получим сообщение:

rmdir: failed to remove `/mnt/builder':
Device or resource busy

Смотрим:

# mount | grep /mnt/builder

none on /mnt/builder type aufs (rw,relatime,si=150eca98)
/usr/calculate/share on /mnt/builder/usr/calculate/share type none (rw,bind)
none on /mnt/builder/proc type proc (rw)
/dev on /mnt/builder/dev type none (rw,bind)
/dev/pts on /mnt/builder/dev/pts type none (rw,bind)

При конфигурировании ISO-образ CLS будет распакован в свободный дисковый раздел (специально, чтобы было легко чистить временные файлы), который автоматически форматируется в ReiserFS и монтируется в /mnt/builder.

# mount | grep /mnt/builder

/dev/sda3 on /mnt/builder type reiserfs (rw)

Если скрипт не сможет определить раздел самостоятельно, его следует указать при помощи параметра -d.

В процессе работы команды будет изменен файл /mnt/builder/etc/make.conf в соответствии с настройками выбранной системы, в частности USE-флаги, языковые настройки. Сравним оригинальный make.conf с CLS и образовавшийся после ввода «calculate -c -s CLDX»:

# diff /etc/make.conf /mnt/builder/etc/make.conf

7c7
< CFLAGS="-O2 -march=i686 -pipe" 
---
> CFLAGS="-Os -march=i686 -pipe" 
28c28
<   gtk
---
>   gtk -eds -gnome -kde
40c40
< LINGUAS="en ru" 
---
> LINGUAS="en de es fr it pl pt_BR ru uk" 
42c42
< PKGDIR="/usr/calculate/share/packages/CLS/9.9/i686" 
---
> PKGDIR="/usr/calculate/share/packages/CLDX/9.9/i686" 

После обновления портежей и выполнения команды «emerge sys-apps/portage» скрипт закончит этап подготовки. Cостав пакетов, которые будут установлены, можно просмотреть при помощи:

# calculate –l

Правим при необходимости /mnt/builder/etc/make.conf (man make.conf) и переходим к шагу проверки и размаскировки зависимостей, для чего используем ключ -D/--dependence.

# calculate -D

По окончании – самый долгий этап – сборка системы при помощи ключа -m/--make:

# calculate –m

Все новые пакеты пересобираются с флагом --newuse, то, что есть, пропускается. По окончании упаковываем дистрибутив в архив (7z) командой:

# calculate -p

И создаем ISO-образ:

# calculate --iso -s cld

Результат сборки системы можно увидеть в каталоге /usr/calculate/share/linux/.

.p= ***

В итоге сборка системы при помощи Calculate Linux Scratch выглядит на порядок проще и происходит быстрее, чем сборка того же Gentoo. Путем довольно нехитрых манипуляций можно получить на выходе готовый дистрибутив под свои задачи.

Приложение

Новое в Calculate Linux

С момента выхода первой статьи в Calculate Linux появилась поддержка «из коробки» DNS- и DHCP-серверов, в качестве реализации выбраны BIND и dhcpd. Соответственно, добавлены и новые утилиты:

  • Для управления DNS – cl-dns-recadd, cl-dns-recdel, cl-dns-recmod, cl-dns-zoneadd, cl-dns-zonedel, cl-dns-zonemod.
  • Для управления DHCP – cl-dhcp-hostadd, cl-dhcp-hostdel, cl-dhcp-hostmod, cl-dhcp-netadd, cl-dhcp-netdel, cl-dhcp-netmod.

Установка и управление заданными сервисами осуществляется также просто. Например, чтобы установить DNS, используем команду:

cl-setup dns

Во время установки DHCP сразу задаются параметры работы при помощи такой команды:

cl-setup --router <ip шлюза> --dnames <имена доменов> --range <диапазон ip> --net <ip сети с маской /24> --dnsip <ip DNS сервера> dhcp

Плюс полезная утилита cl-unmask, предназначенная для размаскировки пакетов, которая является альтернативой autounmask. Формат вывода прост:

# cl-unmask package1 package2

Файл размаскировки создается для всех версий включая последнюю.


  1. Яремчук С. Основные изменения в WAIK для Windows Server 2008 R2/7. //Системный администратор, №4, 2009 г. – С. 16-19.
  2. Ubuntu Customization Kit – http://uck.sourceforge.net.
  3. rPath rBuilder – http://www.rpath.org.
  4. Сайт проекта Calculate Linux – http://www.calculate-linux.ru.
  5. Яремчук С. Строим сеть на Calculate Directory Server. //Системный администратор, №8, 2009 г. – С. 16-22.
Спасибо!