Hasher/CentOS

Материал из ALT Linux Wiki

Использование пакетов CentOS 6 с hasher

Оказалось возможным с незначительными правками скриптов hasher-1.3.22-alt1 добиться формирования с его помощью базового сборочного чрута на основе пакетной базы CentOS 6.0[1] (по идее, RHEL6 и Scientific Linux 6 должны подойти точно так же).

Вводная

С точки зрения запускающего hasher одним из существенных различий в пакетных базах является то, каков должен быть состав минимального и сборочного чрутов. Первое led@ в процессе экспериментов решил созданием пакета hasher-pkg-init, предназначенного для втягивания всего необходимого и предоставления всего формально требуемого, но отсутствующего именно в таком виде.

Изначально такой пакет был создан для репозитория openSUSE 11.4, где имеются дополнительные особенности раннего этапа построения чрутов.

Одним из неисправимых преимуществ пакетной базы RHEL6 является «закалка» пакета filesystem[2]. Для объезда пришлось форкнуть этот пакет, откатить патч и дополнительно убрать /dev[3].

Подготовка репозиториев

Потребуется локальное зеркало centos с дополнительным симлинком для apt, в данном случае это[4]:

$ rsync -Pav ftp.linux.kiev.ua::pub/Linux/CentOS/6.0/os/x86_64/Packages/ /var/ftp/pub/Linux/CentOS/6.0/os/x86_64/Packages/
$ ln -s Packages /var/ftp/pub/Linux/CentOS/6.0/os/x86_64/RPMS.Packages
$ rsync -Pav ftp.linux.kiev.ua::pub/Linux/ALT/people/mike/repos/hasher/centos/6/ /var/ftp/pub/Linux/CentOS/6.0/hasher/[5]

и соответственно конфигурация apt к нему:

# cat > /etc/apt/apt.conf.centos6.0.x86_64 <<EOF
Dir::Etc::main "/dev/null";
Dir::Etc::parts "/var/empty";
Dir::Etc::SourceParts "/var/empty";
Dir::Etc::sourcelist "/etc/apt/sources.list.centos6.0.x86_64";
EOF
# cat >/etc/apt/sources.list.centos6.0.x86_64 <<EOF
rpm-dir file:/var/ftp/pub/Linux/CentOS/6.0/os     x86_64 Packages
rpm-dir file:/var/ftp/pub/Linux/CentOS/6.0/hasher x86_64 hasher
rpm-dir file:/var/ftp/pub/Linux/CentOS/6.0/hasher noarch hasher
EOF

Грязные хаки

В двух скриптах из состава hasher пришлось наскоро заглушить избыточные для данного случая проверки путём замены вызова fatal на verbose[6]:

  • /usr/bin/hsh-sh-functions: 'RPM database update failed.'
  • /usr/bin/hsh-initroot: 'Failed to update faked /proc permissions.'
# cp -a /usr/bin/hsh-sh-functions{,-orig}
# cp -a /usr/bin/hsh-initroot{,-orig}
# sed -i "s,fatal 'RPM database update failed.',verbose 'RPM database update failed.'," /usr/bin/hsh-sh-functions
# sed -i "s,fatal 'Failed to update faked /proc permissions.',verbose 'Failed to update faked /proc permissions.'," /usr/bin/hsh-initroot

Понятно, что для промышленного применения понадобится придумать, как обрабатывать минимум первую ситуацию[7] в общем виде.

Результат

Получилось собрать в полученном сборочном чруте сам filesystem-2.4.30-3.1, а также выполнить сборку шаблона контейнера для OpenVZ при помощи минимально модифицированного[8] mkimage-profiles.

chroot

$ export HSHDIR=${TMP:=/tmp}/centos6
$ hsh-rmchroot $HSHDIR
$ mkdir -p $HSHDIR
$ nice time hsh --initroot --pkg-init-list='hasher-pkg-init' \
  --apt-config=/etc/apt/apt.conf.centos6.0.x86_64 -vv --save-fakeroot $HSHDIR

Примечания

  1. эксперимент с 6.2 «в лоб» не удался: зачем-то лезут и 32-битные пакеты
  2. произведённая без особых пояснений и предназначенная вроде бы как для усиления безопасности, хотя у экспертов по таковой есть сомнения насчёт буйного перехода на capabilities
  3. http://permalink.gmane.org/gmane.linux.altlinux.devel/11942
  4. наверное, можно выкрутиться с помощью ftpfs и удалённого зеркала, но это будет заметно медленней
  5. оригинальный ftp.linux.kiev.ua уже недоступен, на яндексе ALT/people не продублировано, при необходимости пишите mike@ насчёт офлайнового архива
  6. также можно воспользоваться true(1) для понижения шумности
  7. развёрнутые с помощью rpm2cpio пакеты повторно устанавливаются с --justdb, однако оказываются уже установленными
  8. http://lists.altlinux.org/pipermail/sysadmins/2007-December/024257.html