Създавам собствен базиран на Debian Linux със собствено ядро и софтуер. Една от последните стъпки на make-процеса трябва да се извърши в chroot среда:
- Инсталирайте персонализираното ядро с помощта на dpkg
- Създайте символни връзки към ядрото и initrd.img
- Изпълнете ldconfig
- Задайте моя персонализирана тема за началния екран с помощта на plymouth
- Актуализирайте initrd.img
Въпреки че инсталирането на ядрото е успешно и символните връзки са създадени точно, всички други команди не изглежда да работят. Ако стартирам системата, началният екран е зададен по подразбиране и initrd.img не може да намери твърдия диск, нито ядрото. Така че актуализирането на initrd.img в процеса на инсталиране на dpkg изглежда се проваля по някакъв начин. Скриптът на plymouth за задаване на темата също не работи.
За да поправя това, ръчно chroot в системата и правя следното:
- Задайте моя персонализирана тема за началния екран с помощта на plymouth
- Изпълнете ldconfig
- Актуализирайте initrd.img
Това работи перфектно. Следващият път, когато стартирам системата, моят начален екран се показва и всичко започва правилно.
Ето моя подход да направя това в моя Makefile:
cp $(INTEGRATION_KERNEL_IMAGE) $(ROOTFS)/tmp/kernel.deb
cd $(ROOTFS); /usr/bin/sudo /bin/mount -t proc proc proc/; /usr/bin/sudo /bin/mount -t sysfs sys sys/; /usr/bin/sudo /bin/mount -o bind /dev dev/
/usr/sbin/chroot --userspec=0:0 $(ROOTFS) /usr/bin/env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin HOME=/root bash -c "/usr/bin/dpkg --force-not-root -i /tmp/kernel.deb"
/usr/sbin/chroot --userspec=0:0 $(ROOTFS) /usr/bin/env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin HOME=/root bash -c "/bin/ln -nsf vmlinuz-3.2.54-rt75custom /boot/vmlinuz"
/usr/sbin/chroot --userspec=0:0 $(ROOTFS) /usr/bin/env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin HOME=/root bash -c "/bin/ln -nsf initrd.img-3.2.54-rt75custom /boot/initrd.img"
/usr/sbin/chroot --userspec=0:0 $(ROOTFS) /usr/bin/env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin HOME=/root bash -c "/sbin/ldconfig"
/usr/sbin/chroot --userspec=0:0 $(ROOTFS) /usr/bin/env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin HOME=/root bash -c "/bin/bash /usr/sbin/plymouth-set-default-theme my_theme"
/usr/sbin/chroot --userspec=0:0 $(ROOTFS) /usr/bin/env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin HOME=/root bash -c "/bin/bash /usr/sbin/update-initramfs -u"
/usr/bin/sudo /bin/umount $(ROOTFS)/proc; /usr/bin/sudo /bin/umount $(ROOTFS)/sys; /usr/bin/sudo /bin/umount $(ROOTFS)/dev
Резултатът от make не предоставя никакви грешки по тази тема. Е, вероятно не може да направи това, защото make не знае какво се случва в chrooted средата. Но как мога да разбера какво не е наред?
Възможно заобиколно решение би било да поставите всичко, което споменах по-горе, в шел скрипт и да го изпълните в chroot среда. Но бих предпочел да направя всичко в Makefile и не знам дали заобиколното решение наистина работи. Все още не съм проверил това.