Ошибка apt-get в среде chroot

Моя хост-система представляет собой док-контейнер Ubuntu: 18.04. Там я построил корневую файловую систему для архитектуры x86_64, используя проект yocto. Расположение корневой файловой системы определяется переменной ${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: Немного контекста: я не знал, как устанавливать пакеты deb из подходящих источников в yocto во время сборки образа. Поэтому я приступил к созданию сценария постобработки для корневой файловой системы, чтобы выполнить apt и установить пакеты. Там я использую apt для установки пакетов из различных источников apt, включая пользовательский источник apt.


person Ankit Koirala    schedule 13.08.2019    source источник
comment
Вы создали ${IMAGE_ROOTFS}/log/apt, но сделали ли вы ${IMAGE_ROOTFS}/var/log/apt? Кроме того, по моему опыту, часовые пояса должны быть символическими ссылками, а не копироваться, но я никогда раньше не использовал Yocto.   -  person Aurelius    schedule 13.08.2019
comment
@Aurelius Мой плохой. А как насчет ошибки sysvinit-inittab. Это связано с /var/log/apt?   -  person Ankit Koirala    schedule 13.08.2019
comment
Трудно сказать, потому что это просто говорит, что послеустановочный скрипт вернул ошибку. Как только вы создадите правильный каталог журнала apt, вы, я думаю, сможете взглянуть на более подробный журнал. Возможно, ошибка сценария после установки заключается в том, что он также не может записать в каталог журнала apt.   -  person Aurelius    schedule 13.08.2019
comment
Может быть, расскажите нам немного больше о вашем случае использования. Потому что, если речь идет только о dos2unix, не нужно танцевать: просто добавьте его через сам Yocto, рецепт предоставляется даже в ядре: cgit .openembedded.org/openembedded-core/tree/meta/ Сказав это, вот обширная информация о запуске менеджеров пакетов внутри сборок на основе Yocto: intel.com/content/dam/www/public/us/en /documents/white-papers/   -  person LetoThe2nd    schedule 13.08.2019
comment
@LetoThe2nd Это не только для dos2unix. Я не был уверен, как установить пакеты deb из подходящих источников в yocto. Поэтому я приступил к созданию сценария постобработки для корневой файловой системы, чтобы выполнить apt и установить пакеты. Там я использую apt для установки пакетов из различных источников apt, включая пользовательский источник apt.   -  person Ankit Koirala    schedule 13.08.2019
comment
@ LetoThe2nd И ссылка, которую вы предоставили для управления пакетами, предназначена для среды выполнения. Я ищу решение для времени сборки. Спасибо.   -  person Ankit Koirala    schedule 13.08.2019


Ответы (1)


Учитывая дополнительное объяснение, решение в стиле Yocto выглядит следующим образом:

Вы бы написали рецепт для каждого элемента, который хотите установить в образ. Если это пакет какой-либо формы, объединенный в виде .deb, то стандартный подход называется "упаковка внешних двоичных файлов" и описывается здесь. Затем вы создаете рецепт изображения, который включает в себя все эти вещи.

Поскольку вы специально попросили решение типа сборки, это путь. С вашей точки зрения подход start-in-docker может рассматриваться как "время сборки", поскольку Dockerfile выполняется заранее. Но, судя по изображению, это время выполнения, когда вы подключаетесь к нему и выполняете на нем что-то.

person LetoThe2nd    schedule 13.08.2019