【问题标题】:apt-get failure in chroot environment在 chroot 环境中 apt-get 失败
【发布时间】:2019-08-13 09:34:57
【问题描述】:

我的主机系统是一个 ubuntu:18.04 docker 容器。在那里,我使用 yocto 项目为 x86_64 架构构建了一个根文件系统。 root-fs 的位置由 ${IMAGE_ROOTFS} 变量定义。我在系统中 chroot 并尝试安装 dos2unix 包。我的代码如下所示:

    mount --bind /proc ${IMAGE_ROOTFS}/proc 
    mount --bind /dev ${IMAGE_ROOTFS}/dev 

    # copy host files to make network function in chroot
    sudo cp /etc/resolv.conf ${IMAGE_ROOTFS}/etc/resolv.conf

    # configure apt
    sudo mkdir -p ${IMAGE_ROOTFS}/log/apt

    # set time
    sudo cp ${IMAGE_ROOTFS}/usr/share/zoneinfo/Europe/Berlin ${IMAGE_ROOTFS}/etc/localtime

    #######################
    #### Entering Chroot 
    #######################

    # chroot into the target system 
    sudo chroot ${IMAGE_ROOTFS}/bin/bash

    # install packages
    apt-get install -y dos2unix

但是,我收到以下错误:

bash-4.4# apt-get install dos2unix
Reading package lists... Done
Building dependency tree       
Reading state information... Done
dos2unix is already the newest version (7.3.4-3).
0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.
1 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] y
E: Can not write log (Is /dev/pts mounted?) - posix_openpt (2: No such file or directory)
Setting up sysvinit-inittab (2.88dsf-r10) ...
/bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
dpkg: error processing package sysvinit-inittab (--configure):
 installed sysvinit-inittab package post-installation script subprocess returned error exit status 1
Errors were encountered while processing:
 sysvinit-inittab
E: Directory '/var/log/apt/' missing
E: Sub-process /usr/bin/dpkg returned an error code (1)

似乎 root-fs 没有完全配置为运行 apt。我需要向 yocto 添加哪些额外的包?

更新-1: 一点上下文:我不确定如何在图像构建期间从 yocto 中的 apt 源安装 deb 包。所以我开始为根文件系统创建一个后处理脚本,以执行 apt 并安装包。在那里,我使用 apt 安装来自各种 apt 源的软件包,包括自定义 apt 源。

【问题讨论】:

  • 您已经制作了 ${IMAGE_ROOTFS}/log/apt,但您制作了 ${IMAGE_ROOTFS}/var/log/apt 吗?另外,根据我的经验,时区应该是符号链接而不是复制,但我以前从未使用过 Yocto。
  • @Aurelius 我的错。那么 sysvinit-inittab 错误呢。和/var/log/apt有关系吗?
  • 很难说,因为它只是说安装后脚本返回了错误。一旦你创建了正确的 apt 日志目录,我相信你可以查看更详细的日志。安装后脚本的错误可能是它也无法写入 apt 日志目录。
  • 也许可以告诉我们更多关于您的用例的信息。因为如果它只是关于 dos2unix,则无需这样做:只需通过 Yocto 本身添加它,甚至在核心中也提供了一个配方:cgit.openembedded.org/openembedded-core/tree/meta/… 话虽如此,这里有关于在基于 Yocto 的构建中运行包管理器的大量信息: intel.com/content/dam/www/public/us/en/documents/white-papers/…
  • @LetoThe2nd 这不仅适用于 dos2unix。我不确定如何在 yocto 中从 apt 源安装 deb 包。所以我开始为根文件系统创建一个后处理脚本,以执行 apt 并安装包。我正在使用 apt 安装来自各种 apt 源的软件包,包括自定义 apt 源。

标签: yocto apt chroot


【解决方案1】:

在补充说明的情况下,Yocto式的解决方案如下:

您将为要安装到映像中的每个项目编写一个配方。如果它是捆绑为.deb 的某种形式的包,则标准方法称为“打包外部生成的二进制文件”并描述为here。然后,您创建一个包含所有这些内容的图像配方。

正如您特别要求构建类型的解决方案,这是要走的路。从您的角度来看,start-in-docker 方法可以被认为是“构建时间”,因为 Dockerfile 是提前执行的。但从图像的 POV 来看,它是运行时的,因为您 chroot 进入它并在其上执行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多