[devel] minimal system
Alexander Bokovoy
=?iso-8859-1?q?a=2Ebokovoy_=CE=C1_sam-solutions=2Enet?=
Пн Ноя 26 14:24:30 MSK 2001
On Mon, Nov 26, 2001 at 09:35:51AM +0300, Andrey Astafiev wrote:
> долго думал, куда постить, и решил сначала
> отправить сюда. надеюсь получить некоторые
> комментарии и после обсуждения сделать более
> приемлимый вариант описания моих действий по
> созданию минимального дистрибутива на основе
> Сизифа. по ходу описания приведено несколько
> ошибок и несколько идеологических вопросов.
Спасибо! Я некоторые моменты прокомментирую, дабы стало понятно текущее
направление нашего развития в этом контексте. Далее я буду довольно часто
ссылаться на BTE (Build & Test Environment), который сейчас находится в
разработке и при помощи которого некоторые ошибки в зависимостях (и не
только) нам уже удалось отловить.
> # rpm -i --root /mnt/test *.rpm
>
> при выполнении этой операции на экране появились
> следующие сообщения:
Все правильно. Подготовка chroot-а должна производится другим образом:
1. mkdir -t /mnt/test/{bin,etc/rpm,usr/lib/rpm,var/lib/rpm}
2. rpm2cpio rpm-4.0.3-alt*.i586.rpm | \
(cd /mnt/test ; \
cpio -iumd --quiet bin/rpm usr/lib/rpm/{rpmrc,macros})
3. echo "%_dbapi 3" >/mnt/test/etc/rpm/macros.db1
4. chroot /mnt/test /bin/rpm --initdb
Суть этих операций состоит в том, что:
1. Текущий RPM 4.0.3 содержит совместную с DB3 ошибку при работе с
chroot-ованием, проявляющуюся при использовании опции --root и
выражающуюся в порче как системной, так и за-chroot-енной базы RPM (видно
ниже в Вашем примере).
2. Поэтому мы используем статически собранный /bin/rpm, помещая его в
chroot и запуская внутри (chroot делается _перед_ запуском, а сам RPM
отрабатывает, не зная, что он в chroot-е).
3. Для того, чтобы запустился именно статический RPM, мы не ставим в
chroot /usr/lib/rpm/rpmpopt-4.0.3, где происходят переопределения
обработки опций RPM.
> # du -s /mnt/test
> 108M /mnt/test
В моем случае (в BTE), когда в систему ставятся setup и basesystem,
получается:
# du -s -x sandroot.K26513
212M sandroot.K26513
Количество установленных пакетов -- 117, вот полный список (все
зависимости вытянуты BTE из APT-а, список получен внутри chroot-а командой
rpm -qa --qf='[%{SIZE}\t%{NAME}-%{VERSION}-%{RELEASE}\n]'|sort -n ):
0 basesystem-sisyphus-alt1
0 filesystem-2.1.6-alt5
30 altlinux-release-Sisyphus-alt20011121
56 kernel-headers-common-1.0-alt1
439 pam-config-1.0-alt1
898 crontabs-1.7-ipl10mdk
6942 kbdrate-2.11j-alt1
8589 shadow-edit-20000902-alt3
9493 rootfiles-alt-alt3
11041 mkinitrd-2.7.1-alt5
16592 mktemp-1.4-alt1
18092 shadow-log-20000902-alt3
18224 info-install-4.0-ipl17mdk
18664 libgpm-1.19.4-alt1
19247 libtermcap-2.0.8-ipl21mdk
19252 libltdl-1.4-alt2
19361 libshhopt-1.1.6-alt1
20957 agetty-2.11j-alt1
22262 shadow-check-20000902-alt3
25239 shadow-convert-20000902-alt3
25470 losetup-2.11j-alt1
28935 bootloader-utils-0.1-alt1
30050 etcskel-1.65-ipl4mdk
30933 shadow-groups-20000902-alt3
33172 login-0.60-alt8
34199 libintl-0.10.40-alt1
35829 which-2.13-alt1
41335 libshadow-20000902-alt3
44055 getopt-1.1.2-alt1
47539 pam_passwdqc-0.4-alt2
48594 libpopt-1.7-alt2
49204 libpam-0.75-alt11
49463 perl-MDK-Common-1.0.2-alt2
51124 cfdisk-2.11j-alt1
52140 bzip2-1.0.1-alt2
56064 shadow-change-20000902-alt3
56845 zlib-1.1.3-ipl13mdk
58872 iconv-2.2.4-alt3
60160 libdb1-1.85-alt1
62020 setup-2.1.9-ipl21mdk
64052 sed-3.02-ipl10mdk
64456 bzlib-1.0.1-alt2
64565 sfdisk-2.11j-alt1
64974 psmisc-20.1-alt1
66669 hwclock-2.14-alt1
79891 cracklib-2.7-ipl13mdk
85571 gzip-1.3.2-alt1
92410 ed-0.2-ipl22mdk
102442 chkconfig-1.2.19-ipl1mdk
104752 fdisk-2.11j-alt1
116525 gdbm-1.8.0-ipl8mdk
123440 libe2fs-1.24a-alt1
126681 libexpat-1.95.2-alt1
128597 findutils-4.1.7-alt1
134478 SysVinit-2.83-alt1
147085 mount-2.11j-alt1
152080 dev-3.0.6-ipl5mdk
152471 diffutils-2.7-ipl22mdk
162289 glib-1.2.10-alt2
169897 rpm-build-4.0.3-alt0.9
169995 libreadline-4.2-alt5
174019 patch-2.5.4-ipl8mdk
183706 m4-1.4.1-alt1
205608 libpwdb-0.61.1-alt1
210948 libgmp-3.1.1-ipl2mdk
231503 cracklib-dicts-2.7-ipl13mdk
255282 libdb2-2.4.14-alt1
263194 procps-2.0.7-ipl5mdk
274108 cpp-2.96-ipl14mdk
311503 common-licenses-1.1-alt1
321563 glibc-timezones-2.2.4-alt3
335268 libncurses-5.2-ipl3mdk
365798 initscripts-5.49-ipl31mdk
384706 vim-minimal-6.0-alt1.026
425768 pam-0.75-alt11
439975 grep-2.4.2-ipl5mdk
443315 shadow-utils-20000902-alt3
500944 libbfd-2.11.92.0.10-alt1
514055 glibc-utils-2.2.4-alt3
546176 librpm-4.0.3-alt0.9
549760 gettext-0.10.40-alt1
565144 sash-3.4-ipl5mdk
633683 autoconf-2.13-alt2
636186 bash-2.05-alt4
639123 net-tools-1.60-alt1
720805 file-3.36-alt2
755526 gawk-3.1.0-alt1
758652 gettext-base-0.10.40-alt1
785721 make-3.79.1-ipl4mdk
815196 e2fsprogs-1.24a-alt1
864848 texinfo-4.0-ipl17mdk
886845 automake-1.4-alt3.p5
889520 libtool-1.4-alt2
894932 ncurses-5.2-ipl3mdk
906336 modutils-2.4.12-alt1
929626 tar-1.13.25-alt1
997143 glibc-2.2.4-alt3
1158665 libssl-0.9.6b-alt1
1633488 fileutils-4.1-alt2
1681684 textutils-2.0.14-alt1
1701020 sh-utils-2.0.11-alt2
1869390 perl-base-5.6.1-alt12
2088227 util-linux-2.11j-alt1
2123081 glibc-nss-2.2.4-alt3
2283367 libdb3-3.3.11-alt2
2559320 binutils-2.11.92.0.10-alt1
2742750 rpm-4.0.3-alt0.9
4166806 glibc-gconv-modules-2.2.4-alt3
5781455 kernel24-headers-2.4.15-alt0.61
6390871 gcc-2.96-ipl14mdk
9025561 glibc-core-2.2.4-alt3
11282069 python-2.1.1-alt3
13813981 perl-5.6.1-alt12
16799129 glibc-i18ndata-2.2.4-alt3
26191258 kernel24-up-2.4.15-alt0.61
38739812 glibc-devel-2.2.4-alt3
43610318 glibc-locales-2.2.4-alt3
> с некоторыми библиотеками были приключения.
> пакет libgpm-1.19.4-alt1.i586.rpm отказался
> ставиться, сославшись на необходимость
> libncurses.so.5, а libncurses-5.2-ipl3mdk.i586.rpm
> соответственно на libgpm.so.1. это легко лечится,
>
> # rpm -i --root /mnt/test libgpm-1.19.4-alt1.i586.rpm \
> libncurses-5.2-ipl3mdk.i586.rpm
>
> но выглядит по-моему все равно не очень хорошо.
Естественно. BTE использует вот такой алгоритм:
1. Команда
apt-get --print-uris
-o Dir::Cache=${root}/var/cache/apt \
-o Dir::State=${root}/var/lib/apt \
-o Dir::Etc=${root}/etc/apt \
-o Debug::pkgProblemResolver=false \
-o Debug::pkgRPMPM=false \
-o RPM::RootDir=${root} \
install имя-пакета
Дважды повторив эту команду для (последовательно) setup и basesystem
получаем список файлов, которые необходимо установить для минимальной системы.
Обратите внимание на переопределение RPM::RootDir и
Dir::{Cache,State,Etc}, чтобы использовалась установка из chroot.
2. Репозитарий, относительно которого строится система, монтируется внутрь
chroot-а (mount -o bind,ro или mount -t nfs localhost:/repository -o ro, в
зависимости от типа ядра).
3. Затем выданный список подсовывается внутри chroot-а имеющемуся там
статическому RPM-у, с соответствующей заменой пути к файлам на адекватную
внутри chroot-а (в случае BTE -- это /repos) и RPM ставит пакеты.
Очень важно ставить в два приема -- вначале setup, затем basesystem.
Дело в том, что setup содержит /etc/{group,passwd} с системными
пользователями, на которые опираются многие системные пакеты.
К сожалению, текущий glibc-core не содержит libnss_files и потому эти
пользователи и группы пока не ресолвятся. Дмитрий Левин, надеюсь, выпустит
обновленный glibc-core.
> при установке последнего появилось сообщение,
> которое было отмечено при установке сразу всех пакетов.
> warning: created %_tmppath directory /var/tmp
>
> что подвигло меня, к установке пакета filesystem,
> создающего директории для размещения файлов в
> дистрибутивах от ALTLinux. оказалось, что он зависит
> от пакета setup, в котором содержатся стандартные файлы.
> смысл этой зависимости я не понял, но в системе они
> появились, естественно в следующем порядке:
>
> setup-2.1.9-ipl21mdk.i586.rpm
> filesystem-2.1.6-alt5.i586.rpm
Смысл зависимостей таков:
1. Setup обеспечивает установку архитектурнонезависимых файлов,
содержащих описание системных пользователей, групп и некоторой другой
важной информации.
2. Filesystem содержит системообразующие файлы и директории, не
принадлежащие другим пакетам.
Оба этих пакета обязаны стоять в системе до установки basesystem.
> при установке последнего пакета появилось:
> chown: `root.utmp': invalid user
> chown: `root.utmp': invalid user
> такие пользователь и группа в системе есть :)
Это последствие отсутствия в glibc-core libnss_files.
> установка файлов устройств привело к вот такому эффекту:
>
> rpmdb: /mnt/test/var/lib/rpm/Providename: No such file or
> directory
> <skip>
> rpmdb: /mnt/test/var/lib/rpm/Conflictname: No such file or
> directory
> rpmdb: /mnt/test/var/lib/rpm/Providename: No such file or
> directory
> <skip>
> rpmdb: /mnt/test/var/lib/rpm/Name: No such file or directory
> rpmdb: /mnt/test/var/lib/rpm/Providename: No such file or
> directory
> rpmdb: /mnt/test/var/lib/rpm/Conflictname: No such file or
> directory
> <skip>
> error: db3 error(-30998) from db->close: DB_INCOMPLETE: Cache
> flush was unable to complete
> rpmdb: Non-empty page 32 in unused hash bucket 24
> rpmdb: Non-invalid page 3 on free list
> error: db3 error(-30985) from db->verify: DB_VERIFY_BAD: Database
> verification failed
Вот она и есть -- та самая ошибка RPM 4.0.3 + DB3, которая не позволяет
пользоваться опцией --root в RPM. Мы с Дмитрием смогли повторить ее на
базе пакетов из RedHat 7.2, понадобилось всего 10 пакетов, установленных в
две итерации, чтобы испортить обе базы -- системную и тестовую в chroot-е.
К сожалению, мне не известен текущий статус этой проблемы, думаю, что
Дмитрий здесь добавить что-то новое.
> пробуем установить rpm и видим, что он зависит от glibc,
> а не от glibc-core. это ошибка или rpm действительно
> рассчитывает на что-то большее чем библиотеки из glibc?
> обидно, прииходится поставить почти все пакеты, входящие
> в glibc, а это почти 40Мб.
Сам RPM собран статически, ему нужен только glibc-core для ресолвинга
пользователей и групп, но это будет работать только, когда Дмитрий
выпустит новый релиз glibc, пока что требуется установка glibc-nss и того,
от чего он зависит.
--
/ Alexander Bokovoy
$ cat /proc/identity >~/.signature
`Senior software developer and analyst for SaM-Solutions Ltd.`
---
Nov 21 20:58:58 alconost kernel: VFS: Busy inodes after unmount.
Self-destruct in 5 seconds. Have a nice day...
_______________________________________________
Devel mailing list
Devel на linux.iplabs.ru
http://www.logic.ru/mailman/listinfo/devel
Подробная информация о списке рассылки Devel