LXD: запуск образа с чужой архитектурой

Я хочу использовать LXD для начальной загрузки корневой файловой системы для развертывания во встроенной системе ARM с моего хоста AMD64 под управлением Ubuntu 16.04. Ранее я сделал это с помощью сценария и chroot команда, но сценарий, который я использовал, был подвержен ошибкам и имел плохую привычку удалять мои записи / dev.

Я был в состоянии скопировать изображение локально, используя lxc image copy images:ubuntu/16.04/arm64 --alias=ubuntu-server-arm64и установили qemu-user-static, но я не могу запустить контейнер из этого образа. Я получаю следующую ошибку:

$ lxc launch ubuntu-server-arm64 bootstrap
Creating bootstrap
error: Requested architecture isn't supported by this host

Есть ли способ заставить lxd игнорировать несоответствие архитектуры и использоватьqemu-user-static запустить дочерний контейнер?

1 ответ

Решение

По словам Стефана Грабера, который отвечает за проект LXC/LXD (в ответ на мой запрос на их дискуссионном сайте):

qemu-user-static - это помощник binfmt, который позволяет вам на лету выполнять преобразование между архитектурами. Он эффективно позволяет запускать двоичные файлы для архитектур, отличных от текущей.

Сам qemu-user-static должен нормально работать внутри контейнера и позволит вам запускать некоторые двоичные файлы сторонних архитектур внутри него.

Попытка запустить весь контейнер через qemu-user-static очень непрактична из-за некоторых больших ограничений qemu-user-static, например, всего, что зависит от ptrace (системы инициализации и средства отладки), netlink (все сетевые инструменты и некоторые системы инициализации) или потоки (намного больше программного обеспечения) обычно с треском проваливаются.

Подход, который я реализовал в LXC, состоял в том, чтобы создать смешанный контейнер, в котором большинство пакетов были иностранной архитектуры, но система инициализации, сетевые инструменты... были родной архитектуры. Это было любопытно, но также не особо полезно, не говоря уже о том, что это очень медленно.

Поскольку это, по нашему мнению, фактически не поддерживается, мы не предоставляем образы сторонней архитектуры для LXD. Однако вы можете создать свой собственный, собрав rootfs сторонней архитектуры, затем включив необходимые двоичные файлы qemu-user-static, заменив любой двоичный файл, который не будет работать с эмуляцией, и сгенерируйте его как образ LXD (пометив его архитектурой, для которой он предназначен чтобы работать на, а не архитектура, которую он содержит).

Таким образом, попытка запустить чужую архитектуру на LXD фактически не поддерживается, и метод LXC был более или менее "взломом" в "смешанной среде".

Звучит так, как будто это тоже можно было бы сделать, но потребовало бы, чтобы вы создали rootfs сторонней архитектуры и в основном сами создавали "образ", который все это выполняет, что по разным причинам может быть головной болью и большой работой, которую нужно выполнить.

Мне удалось заставить иностранную архитектуру работать с LXD. Взял образ ARMv7, создал из него сквошфс, добавил qemu-arm-static под /usr/bin. Уловка, чтобы заставить его работать с LXD, заключалась в том, чтобы tarball метаданных говорил, что изображение - x86_64 (или какая-то другая архитектура вашего хоста). Импорт и запуск этого образа работают, LXD считает, что это поддерживаемая архитектура (соответствует хосту) и может работать из-за qemu-arm-static а также binfmt.

ALPINE_MIRROR_URL="http://ams.edge.kernel.org/alpine"
ALPINE_VERSION="3.11.5"
ALPINE_ARCH="armhf"

version=$(echo $ALPINE_VERSION | cut -d '.' -f 1-2)
curl -O ${ALPINE_MIRROR_URL}/v${version}/releases/${ALPINE_ARCH}/alpine-minirootfs-${ALPINE_VERSION}-${ALPINE_ARCH}.tar.gz

ROOTFS=alpine-rootfs
mkdir ${ROOTFS}
tar xzf alpine-minirootfs-${ALPINE_VERSION}-${ALPINE_ARCH}.tar.gz -C ${ROOTFS}

cp /usr/bin/qemu-arm-static ${ROOTFS}/usr/bin/
mksquashfs ${ROOTFS} rootfs.squashfs

lxc import meta.tar.xz rootfs.squashfs --alias crossx
lxc launch crossx x
lxc exec x -- uname -a
Linux x 4.15.0-50-generic #54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 armv7l Linux
lxc image ls
| crossx   | 1e5e5a2dafb8 | no     | Alpinelinux  x86_64 (20200330_1354) | x86_64       | CONTAINER | 5.45MB | Apr 2, 2020 at 6:25pm (UTC)  |

Вы можете видеть в последних двух командах, что контейнер действительно armv7l но LXD думает, что это x86_64.

Другие вопросы по тегам