Вопрос или проблема
Можно ли заставить apt-get скачать бинарник библиотеки, которую я хочу установить, для нескольких архитектур?
Или apt-get не является подходящим инструментом для этого?
Ответ @Tanasis верен, я обновил его для 2021 года (Ubuntu 20.04 LTS) для arm64
и armhf
.
-
Добавьте желаемые архитектуры следующим образом:
sudo dpkg --add-architecture armhf
sudo dpkg --add-architecture arm64
-
Создайте новый .list файл в
/etc/apt/sources.list.d
:sudo touch /etc/apt/sources.list.d/arm-cross-compile-sources.list
-
Добавьте стандартные источники в этот список с архитектурами (armhf, arm64), предварительно указав их:
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal main restricted deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-updates main restricted deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal universe deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-updates universe deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal multiverse deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-updates multiverse deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse
-
Обновите
/etc/apt/sources.list
, чтобы включить вашу стандартную архитектуру (если она еще не добавлена), иначе apt попытается использовать вновь добавленные архитектуры в этих источниках, что может вызвать ошибки, как это произошло у меня. Добавьте[arch=amd64]
для каждой строки в/etc/apt/sources.list
следующим образом:deb [arch=amd64] http://us.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
-
Выполните
sudo apt update
и убедитесь, что нет ошибок -
Теперь установка пакета с новыми архитектурами должна пройти успешно:
sudo apt install libasound2-dev:arm64
Сначала включите многопоточность архитектур
dpkg --add-architecture <arch>
Теперь настройте apt-сources для добавления новых репозиториев новой архитектуры (если это необходимо)
теперь обновите ваш sources.list
sudo apt-get update
Теперь вы можете устанавливать пакеты с несколькими архитектурами через apt-get, но вам нужно указать, какую архитектуру вы хотите скачать
apt-get install package:architecture
пример:
apt-get install gedit:i386
Для arm64
я делаю следующее в /etc/apt/sources.list
:
Пример для Ubuntu 16.04 (xenial):
Я отмечаю все текущие (по умолчанию) репозитории как [arch=<current_os_arch>]
, например:
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ xenial main restricted
И добавил следующее:
deb [arch=arm64] http://ports.ubuntu.com/ xenial main restricted
deb [arch=arm64] http://ports.ubuntu.com/ xenial-updates main restricted
deb [arch=arm64] http://ports.ubuntu.com/ xenial universe
deb [arch=arm64] http://ports.ubuntu.com/ xenial-updates universe
deb [arch=arm64] http://ports.ubuntu.com/ xenial multiverse
deb [arch=arm64] http://ports.ubuntu.com/ xenial-updates multiverse
deb [arch=arm64] http://ports.ubuntu.com/ xenial-backports main restricted universe multiverse
Не уверен, является ли это правильным решением, но, по крайней мере, кажется, что оно работает.
Примечание: Не забудьте добавить чужую архитектуру: dpkg --add-architecture arm64
Хорошо, это мне тоже нужно для моего образа docker. Странно, что для amd64 это работает, но не для arm64
Начало образа docker
FROM --platform=$TARGETPLATFORM mcr.microsoft.com/dotnet/aspnet:8.0-jammy AS base
COPY --from=mcr.microsoft.com/dotnet/sdk:6.0 /usr/share/dotnet/shared /usr/share/dotnet/shared
ENV DOTNET_NUGET_SIGNATURE_VERIFICATION=false
# Установите TARGETPLATFORM для совместимости с несколькими платформами
ARG TARGETARCH
ARG TARGETPLATFORM
ARG BUILD_CONFIGURATION
WORKDIR /app
EXPOSE 80
EXPOSE 443
RUN echo "dpkg --add-architecture $TARGETARCH"
RUN apt-get update
RUN apt install -y libc6:$TARGETARCH
RUN apt install -y libicu-dev:$TARGETARCH
RUN apt install -y libfontconfig1:$TARGETARCH
Ответ или решение
Как использовать apt-get для загрузки многоплатформенной библиотеки
Использование утилиты apt-get
для установки библиотек с поддержкой нескольких архитектур (multi-architecture) в Ubuntu подразумевает выполнение нескольких важных шагов. В этом руководстве мы подробно разберем, как правильно настроить систему для этой задачи.
Шаг 1: Включение поддержки нескольких архитектур
Для начала необходимо добавить нужные архитектуры в систему. Используйте команду dpkg
следующим образом:
sudo dpkg --add-architecture armhf
sudo dpkg --add-architecture arm64
Эти команды позволят вашей системе узнавать о доступности архитектур ARM.
Шаг 2: Настройка APT-репозиториев
Далее, вам нужно добавить источники APT, которые содержат пакеты для добавленных архитектур. Создайте новый файл списка репозиториев в каталоге /etc/apt/sources.list.d/
:
sudo touch /etc/apt/sources.list.d/arm-cross-compile-sources.list
Теперь добавьте в этот файл следующие строки (они предназначены для Ubuntu 20.04 LTS, замените focal
на нужную версию, если используете другую):
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal main restricted
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-updates main restricted
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal universe
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-updates universe
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal multiverse
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-updates multiverse
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse
Также важно убедиться, что у вас правильно указаны источники для вашей основной архитектуры (например, amd64
). Если в файле /etc/apt/sources.list
не указана архитектура, используйте следующий формат:
deb [arch=amd64] http://us.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
Шаг 3: Обновление списка пакетов
После того как вы добавили новые архитектуры и источники, обновите список доступных пакетов:
sudo apt update
Убедитесь, что в процессе обновления нет ошибок.
Шаг 4: Установка многоплатформенных пакетов
Теперь вы можете установить пакеты, поддерживающие несколько архитектур. Для этого укажите нужную архитектуру при установке. Например, чтобы установить библиотеку libasound2-dev
для архитектуры arm64
, выполните следующее:
sudo apt install libasound2-dev:arm64
Примечание о Docker
Если вы работаете с образами Docker, убедитесь, что команды для добавления архитектуры и установки пакетов выполняются в правильной последовательности. Вот пример команды, которая может быть использована в Dockerfile:
FROM --platform=$TARGETPLATFORM mcr.microsoft.com/dotnet/aspnet:8.0-jammy AS base
RUN dpkg --add-architecture $TARGETARCH
RUN apt-get update && \
apt install -y libc6:$TARGETARCH libicu-dev:$TARGETARCH libfontconfig1:$TARGETARCH
Заключение
Использование apt-get
для загрузки многоплатформенных библиотек требует выполнения нескольких шагов по настройке системы, включая добавление новых архитектур и соответствующих репозиториев. Следуя данным инструкциям, вы сможете успешно устанавливать необходимые пакеты для любых архитектур, что расширит ваши возможности разработки и тестирования на различных платформах.