Как да използвам chroot в Makefile?

Създавам собствен базиран на 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 и не знам дали заобиколното решение наистина работи. Все още не съм проверил това.


person redhead    schedule 14.03.2014    source източник


Отговори (1)


  • Опитахте ли да запазите изхода на командата в средата на chroot и да го извлечете по-късно? Например:

    /usr/sbin/chroot [...] bash -c "/usr/bin/dpkg [...] >> /root/chroot.log"
    

    or

    /usr/sbin/chroot [...] bash -c "/usr/bin/dpkg [...] | tee -a /root/chroot.log"
    

    следван от

    cp $(ROOTFS)/root/chroot.log .
    
  • В дългосрочен план бих предложил да се избягва дублирането на код и безпорядъка на Makefile, или чрез предаване на всичко в една единствена команда chroot, или чрез копиране върху скрипт.
  • Трябва да можете да се отървете от повечето или всички bash -c и /bin/bash извиквания. Това трябва да опрости нещата още повече.
person l0b0    schedule 14.03.2014
comment
Добре, добавих регистрирането към всички мои chroot команди, но не се съобщава за грешка. Мисля, че трябва да опитам подхода на сценария. - person redhead; 14.03.2014