Как использовать chroot в Makefile?

Я создаю свой собственный Linux на основе Debian с собственным ядром и программным обеспечением. Один из последних шагов make-процесса должен быть выполнен в chroot-окружении:

  • Установите кастомное ядро ​​с помощью dpkg
  • Создать символические ссылки на ядро ​​и initrd.img
  • Выполнить ldconfig
  • Установите мою пользовательскую тему для заставки с помощью plymouth
  • Обновите initrd.img

Хотя установка ядра прошла успешно и символические ссылки действительно созданы, все остальные команды, похоже, не работают. Если я загружаюсь в систему, заставка устанавливается по умолчанию, и initrd.img не может найти жесткий диск или ядро. Таким образом, обновление initrd.img в процессе установки dpkg каким-то образом не удается. Скрипт plymouth для установки темы тоже не работает.

Чтобы исправить это, я вручную захожу в систему и делаю следующее:

  • Установите мою пользовательскую тему для заставки с помощью 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 не знает, что происходит внутри chroot-окружения. Но как я могу узнать, что идет не так?

Возможный обходной путь — поместить все, что я упомянул выше, в сценарий оболочки и выполнить его в среде с 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