chroot环境中的apt-get失败

时间:2019-08-13 09:34:57

标签: yocto apt chroot

我的主机系统是ubuntu:18.04 docker容器。在那里,我使用yocto项目为x86_64体系结构构建了一个根文件系统。根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添加哪些其他软件包?

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

1 个答案:

答案 0 :(得分:1)

鉴于其他说明,Yocto风格的解决方案如下:

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

正如您特别要求的构建类型解决方案一样,这就是方法。从您的角度来看,docker-start启动方法可能被认为是“构建时间”,因为Dockerfile是提前执行的。但是从映像的POV来看,它是运行时,您可以将其chroot并在其上执行事情。