【问题标题】:How to use chroot in a Makefile?如何在 Makefile 中使用 chroot?
【发布时间】:2014-03-14 09:15:21
【问题描述】:

我正在使用自己的内核和软件构建自己的基于 Debian 的 Linux。 make-process 的最后一个步骤必须在 chrooted 环境中完成:

  • 使用 dpkg 安装自定义内核
  • 创建指向内核和 initrd.img 的符号链接
  • 执行 ldconfig
  • 使用 plymouth 为初始屏幕设置我的自定义主题
  • 更新 initrd.img

虽然内核安装成功并且符号链接被正确创建,但所有其他命令似乎都不起作用。如果我启动到系统,启动画面设置为默认值,并且 initrd.img 找不到 HDD 或内核。因此,在 dpkg 安装过程中更新 initrd.img 似乎以某种方式失败。设置主题的普利茅斯脚本也不起作用。

为了解决这个问题,我手动 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 环境中发生了什么。但是我怎样才能找出问题所在呢?

一种可能的解决方法是将我上面提到的所有内容都放在一个 shell 脚本中,然后在 chrooted 环境中执行。但我更愿意在 Makefile 中做所有事情,我不知道解决方法是否真的有效。我还没有验证这一点。

【问题讨论】:

    标签: linux makefile debian splash-screen chroot


    【解决方案1】:
    • 您是否尝试过将命令输出保存在 chroot 环境中并稍后提取?例如:

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

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

      紧随其后

      cp $(ROOTFS)/root/chroot.log .
      
    • 从长远来看,我建议通过在单个 chroot 命令中传递所有内容或通过复制脚本来避免代码重复和 Makefile 混乱。
    • 您应该能够摆脱大部分或全部bash -c/bin/bash 调用。这应该会进一步简化事情。

    【讨论】:

    • 好的,我将日志记录添加到我的所有 chroot 命令中,但没有报告错误。我想我应该尝试脚本方法。
    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2014-09-04
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多