Идея: собрать мини-дистрибутив с 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
Обратите внимание на костыль, который убирает зависимости от python, eselect и udev, что даёт возможность выиграть ~200M от несжатой системы. Как правильно с точки зрения Gentoo-way хранить такие препарированные ebuild'ы? В локальном оверлее?
При этом du -sh для собранной системы даёт: 109M stage3/target/. При запуске ядро распаковывает initramfs (логично, правда?), что будет означать, что при таком подходе ещё до запуска init система займёт 109M ОЗУ. Для компьютера с 128M ОЗУ это будет неприлично много.
Правильно ли я понимаю, что получив в качестве initrd файловую систему squashfs, ядро её просто читает, а не распаковывает? Это уже лучше: в сжатом squashfs+xz виде initrd занимает всего 30M.
Что ещё можно вырезать из кишок Xorg или GTK+? Список устанавливаемых пакетов прилагаю.