Путаница при использовании Qemu в Docker

В настоящее время я учусь создавать образы ARM Docker на хостах x86. я нашел это руководство, а также пара других, которые в основном говорят об одном и том же. Им всем несколько лет, поэтому ответ на этот вопрос может заключаться в том, что Qemu или Docker больше не работают таким образом, но я не могу это проверить.

По сути, вам нужно сделать две вещи:

  1. Установите qemu-user-binfmt упаковка. Это создаст файл с именем /proc/sys/fs/binfmt_misc/qemu-arm со следующим содержанием:

    enabled
    interpreter /usr/bin/qemu-arm-static
    flags: OCF
    offset 0
    magic 7f454c4601010100000000000000000002002800
    mask ffffffffffffff00fffffffffffffffffeffffff
    
  2. Установите qemu-user-static пакет, чтобы получить /usr/bin/qemu-arm-static устный переводчик. Это удалит предыдущий пакет, но binfmt-вход останется.


Далее в руководстве говорится, что для создания образа ARM вам необходимо скопировать интерпретатор с шага 2 в то же место, что и в вашей системе в образе, а для запуска образа ARM вам необходимо смонтировать две копии с использованием опции -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static.

Чтобы проверить это, я создал два изображения, qemu-test а также qemu-test:noqemuсо следующими файлами Docker (я скопировал интерпретатор в свой рабочий каталог):

qemu-test:

FROM armv7/armhf-ubuntu

COPY qemu-arm-static /usr/bin

CMD ["sh", "-c", "echo 'Hello World'"]

qemu-test:noqemu:

FROM armv7/armhf-ubuntu

CMD ["sh", "-c", "echo 'Hello World'"]

Затем я попробовал следующие четыре команды (все еще на моей машине x86):

docker run qemu-test
docker run -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static qemu-test
docker run qemu-test:noqemu
docker run -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static qemu-test:noqemu

И к моему удивлению, они все работали. Пока binfmt-вход присутствовал, то есть. Когда я его удалил, ни один из них не работал. Я также запустил оба образа на машине ARM, где они оба работали.

Это подводит меня к моему вопросу (ам): В чем собственно смысл помещать интерпретатор в изображение? И какой смысл его монтировать? Нужен ли мне вообще Qemu? Помните, что этим гидам пара лет. Если ответ действительно «все так не работает», мне также было бы интересно узнать, как это работает сейчас.

1 ответ
1

В конфигурации модуля ядра binfmt_misc есть одно важное поле — флаг F. Этот флаг указывает, что путь к интерпретатору фиксирован независимо от пространства имен монтирования. В противном случае, когда обнаруживается файл, предназначенный для другой платформы, binfmt будет искать интерпретатор (/usr/bin/qemu-arm-static) в том же пространстве имен монтирования, что и команда, которую вы пытаетесь запустить, и вы получите file not found ошибка.

Часть установки для qemu-user-static должен бежать update-binfmts который нуждается в --fix-binary флаг. Обычно это делается в более новых версиях пакета для обработки сценария использования докера, но если у вас старая версия, вы столкнетесь с такой проблемой, как этот отчет об ошибке описывает.

После правильной настройки я предпочитаю создавать образы для других платформ с помощью buildkit, а docker делает это доступным через свой buildx CLI. С buildkit вы получаете переменные для выбора платформы для отдельных этапов (может быть быстрее загрузить некоторые двоичные файлы с вашей собственной платформой, а затем скопировать их в целевой образ). Подробнее о buildx см. документация докера.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *