LINUX.ORG.RU

Уменьшаем систему, собираемую при помощи Gentoo: продолжение банкета


0

1

Идея: собрать мини-дистрибутив с GParted и минимумом необходимого для его работы и запускать его из initramfs/initrd.
Реализация: для сборки используется Gentoo stage3 с USE-флагами "-* minimal" и другими настройками.
Предыдущая тема: [Gentoo]Как уменьшить размер системы?

Разобрался с неотложными делами и снова приступил к сборке.

По советам из предыдущей темы получились вот такие правила в Makefile:

buildroot:
	cp -L /etc/resolv.conf $(STAGE3)/etc/resolv.conf
	cp $(CONFIG)/make.conf $(STAGE3)/etc/make.conf
	cp $(CONFIG)/package.use $(STAGE3)/etc/portage/package.use
	cp -rv $(CONFIG)/savedconfig $(STAGE3)/etc/portage/
	chroot $(STAGE3) env-update
	chroot $(STAGE3) emerge --sync
	chroot $(STAGE3) emerge -un portage
	chroot $(STAGE3) eselect news read

target:
	mountpoint $(STAGE3)/proc || chroot $(STAGE3) mount -t proc proc /proc
	chroot $(STAGE3) emerge -un $(PACKAGES) gentoo-sources
	# А сейчас будет адский костыль
	chroot $(STAGE3) env ROOT=$(TARGET) USE="make-symlinks -python" emerge --with-bdeps=n -pt $(PACKAGES) | perl -ne 'if (/^\[.*(python|eselect|udev)/ and $$prev =~ /^\[[^\]]+\] +([^ ]+)/ and ($$file=$$1)=~s|([^/]+/)([a-z0-9\-]+)(-[0-9].*)|/usr/portage/$$1$$2/$$2$$3.ebuild|) {print $$file; system("sed","-ri.bak","/^[^ ]*PYTHON/s/^/#/;/^inherit/s/python//;s#[^\"(]*app-admin/eselect[^\")]*##;s#[^\"(]*sys-fs/udev[^\")]*##","$(STAGE3)".$$file); system("chroot","$(STAGE3)","ebuild","$$file","digest"); print "\n"}; $$prev=$$_' 
#	chroot $(STAGE3) env ROOT=$(TARGET) USE="make-symlinks -python" emerge --with-bdeps=n -ptv $(PACKAGES)
	chroot $(STAGE3) env ROOT=$(TARGET) USE="make-symlinks -python" emerge --with-bdeps=n $(PACKAGES)
	chroot $(STAGE3) env ROOT=$(TARGET) emerge --with-bdeps=n --depclean
	mountpoint $(STAGE3)/proc && chroot $(STAGE3) umount /proc || true
	# Чуть не снёс из-за опечатки кусок системы
	# С chroot'ом безопаснее
	chroot "$(STAGE3)" rm -vrf "$(TARGET)/usr/include" "$(TARGET)/usr/share/doc" "$(TARGET)/usr/share/locale" "$(TARGET)/var/db/pkg" "$(TARGET)/usr/share/aclocal" "$(TARGET)/usr/share/gnome" "$(TARGET)/usr/share/gtk-doc" "$(TARGET)/usr/share/man"
	cp -v $(STAGE3)//usr/lib/gcc/i686-pc-linux-gnu/*/lib*.so* $(STAGE3)/$(TARGET)/lib
#	cp $(CONFIG)/inittab $(STAGE3)/$(TARGET)/etc/inittab
#	cp $(CONFIG)/rc.init $(STAGE3)/$(TARGET)/sbin/rc.init
(плюс ещё патч для ebuild'а xorg-server, иначе он не собирается из-за бага в апстриме, но это вручную и, надеюсь, временно).

Обратите внимание на костыль, который убирает зависимости от python, eselect и udev, что даёт возможность выиграть ~200M от несжатой системы. Как правильно с точки зрения Gentoo-way хранить такие препарированные ebuild'ы? В локальном оверлее?

При этом du -sh для собранной системы даёт: 109M stage3/target/. При запуске ядро распаковывает initramfs (логично, правда?), что будет означать, что при таком подходе ещё до запуска init система займёт 109M ОЗУ. Для компьютера с 128M ОЗУ это будет неприлично много.

Правильно ли я понимаю, что получив в качестве initrd файловую систему squashfs, ядро её просто читает, а не распаковывает? Это уже лучше: в сжатом squashfs+xz виде initrd занимает всего 30M.

Что ещё можно вырезать из кишок Xorg или GTK+? Список устанавливаемых пакетов прилагаю.

★★★★★

Ответ на: комментарий от r2d2

Предварительно нужно запустить mdev (или хотя бы смонтировать devtmpfs) и запустить иксы, через которые и будет работать GParted.

AITap ★★★★★
() автор топика

Добавлю:
http://www.luxrender.net/forum/viewtopic.php?f=21&t=6509
Некоторые пакеты не соберутся ... разрулишь через package.env и env/gcc/no_flto и т.д(по ссылке)

Wl,--strip-all для ld
и
-falign-functions=1 -falign-loops=1 -falign-labels=1 -falign-jumps=1 для gcc

# С chroot'ом безопаснее

FEATURES=«nodoc noinfo noman » + про /usr/share/info ты забыл

PS не пользуйся prelink, время запуска и потребляемая память уменьшиться , но бинарь распухнет. // предупреждён && вооружён

foxrat
()
Ответ на: комментарий от foxrat

coreutils подтягиваются по зависимости от debianutils <- ca-certificaes <- openssl <- xorg-server.

Случаем, не знаете, зачем ему openssl? Попробую тоже удалить.

AITap ★★★★★
() автор топика
Ответ на: комментарий от bhfq

Я же устану собирать и устанавливать все эти 100 зависимостей руками.

AITap ★★★★★
() автор топика
Ответ на: комментарий от AITap

debianutils 4.1
PDEPEND=«|| ( >=sys-apps/coreutils-6.10-r1 sys-freebsd/freebsd-ubin )»

imho, сойдёт и make-symlinks в busybox.
ещё в inittab убери лишние Terminals, оставь для запуска X, шела.(сэкономит пару мегабайт рам)

зачем ему openssl?

м.б. для работы по сети.

foxrat
()
Ответ на: комментарий от foxrat

-falign-functions=1 -falign-loops=1 -falign-labels=1 -falign-jumps=1 для gcc

Тогда уж -Os.

anonymous
()
Ответ на: комментарий от AITap

Тогда ещё посмотрите в сторону INSTALL_MASK PKG_INSTALL_MASK.

uzbl
()
Ответ на: комментарий от foxrat

м.б. для работы по сети.

<imho> xorg чисто сетевой и вещает даже на localhost, если собрать kdrive, то openssl можно удалять, а так xorg в рантайме будет использовать openssl для передачи трафика на localhost.</imho>

foxrat
()

Собрал с -Os, -Wl,-falign-functions=1 -falign-loops=1 -falign-labels=1 -falign-jumps=1, --strip-all, FEATURES=«nodoc noinfo noman», получилась 107-мегабайтная система.

Проблема: из X-серверов в системе нашлись Xephyr и Xfbdev, но ни единого следа Xvesa. И это несмотря на VIDEO_CARDS=«vesa» в make.conf.
ЧЯДНТ?

AITap ★★★★★
() автор топика
Ответ на: комментарий от AITap

И это несмотря на VIDEO_CARDS=«vesa» в make.conf.
ЧЯДНТ?

Видео драйвер

video_cards_vesa          : VIDEO_CARDS setting to build driver for vesa video cards
Из серверов
dmx         : Build the Distributed Multiheaded X server
kdrive      : Build the kdrive X servers
xnest       : Build the Xnest server
xorg        : Build the Xorg X server (HIGHLY RECOMMENDED)
xvfb        : Build the Xvfb serve

-falign-functions=1 -falign-loops=1 -falign-labels=1 -falign-jumps=1

Входят в -Os.

foxrat
()
Ответ на: комментарий от foxrat

Ну да, в сжатом виде получаются те же 30 мегабайт.

Правильно ли я понял из списка USE-флагов, что собрать просто Xvesa не выйдет, и получится либо Xorg с драйвером VESA, либо какой-то другой kdrive-сервер?

AITap ★★★★★
() автор топика
Ответ на: комментарий от AITap

что собрать просто Xvesa не выйдет

Его нет в списке серверов.
Можно kdrive с vesa драйвером.

foxrat
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.