Я создаю свой собственный 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, и я не знаю, действительно ли работает обходной путь. Я еще не проверял это.