[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