НейроАгент

Ошибка патча Yocto: Отказ в доступе LXUID

Узнайте, как исправлять ошибки применения патча Yocto Project, вызванные политиками безопасности AppArmor в Ubuntu 24.04. Полное руководство с несколькими решениями для проблем с отказом в доступе LXUID, LXGID, LXMOD.

Yocto Project: Ошибка применения патча при сборке core-image-sato

Я новичок в Linux и Yocto Project. Я использую Ubuntu 24.04.3 на машине с двойной загрузкой и следую руководству по быстрой сборке Yocto со всеми настройками по умолчанию. Я проверил ветку scarthgap и пытаюсь собрать core-image-sato для машины qemux86-64.

Через некоторое время я столкнулся с ошибкой при применении патчей к perl:

ERROR: perl-5.38.4-r0 do_patch: Applying patch '0001-Somehow-this-module-breaks-through-the-perl-wrapper-.patch' on target directory '/media/someone/Elements/yocto-build/poky/build/tmp/work/core2-64-poky-linux/perl/5.38.4/perl-5.38.4'
CmdError('quilt --quiltrc /media/someone/Elements/yocto-build/poky/build/tmp/work/core2-64-poky-linux/perl/5.38.4/recipe-sysroot-native/etc/quiltrc push', 0, "stdout: Applying patch 0001-Somehow-this-module-breaks-through-the-perl-wrapper-.patch
File cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm is read-only; trying to patch anyway
patching file cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
Hunk #1 succeeded at 1161 (offset 51 lines).
Hunk #2 succeeded at 2100 (offset 91 lines).
patch: setting attribute '$LXUID' for '$LXUID': Permission denied
patch: setting attribute '$LXGID' for '$LXGID': Permission denied
patch: setting attribute '$LXMOD' for '$LXMOD': Permission denied
Patch 0001-Somehow-this-module-breaks-through-the-perl-wrapper-.patch does not apply (enforce with -f)

stderr: ")
ERROR: Logfile of failure stored in: /media/someone/Elements/yocto-build/poky/build/tmp/work/core2-64-poky-linux/perl/5.38.4/temp/log.do_patch.2384973
ERROR: Task (/media/someone/Elements/yocto-build/poky/meta/recipes-devtools/perl/perl_5.38.4.bb:do_patch) failed with exit code '1'

Я уже попробовал следующее решение, найденное на сайте STMicroelectronics:

sudo apparmor_parser -R /etc/apparmor.d/unprivileged_userns

Что мне делать дальше? Как заставить патч примениться успешно? Поскольку я новичок в Yocto, я просто пытался завершить первоначальную сборку.

НейроАгент

Оглавление

Понимание ошибки разрешений

Сообщение об ошибке указывает на то, что инструмент патчирования (quilt) не может установить расширенные атрибуты файлов для патчируемых файлов. Эти атрибуты (LXUID, LXGID, LXMOD) связаны с правами собственности на файлы и разрешениями, которые современные дистрибутивы Linux, такие как Ubuntu 24.04, защищают с помощью механизмов безопасности, таких как AppArmor.

Согласно обсуждению в сообществе NXP, эта проблема часто возникает при сборке Yocto на системах с усиленными политиками безопасности, которые ограничивают модификацию атрибутов файлов.

Основная причина заключается в том, что политики безопасности по умолчанию в Ubuntu считают операции с этими файловыми атрибутами потенциально опасными и ограничивают их, даже при выполнении в среде сборки. Это особенно проблематично для сборок Yocto, которые требуют extensive модификации файлов на этапе патчирования.

Немедленные решения для исправления ошибки патча

Решение 1: Использование принудительного применения патча

Самый быстрый обходной путь - заставить применять патч путем изменения локальной конфигурации:

bash
echo 'PATCHTOOL = "patch"' >> conf/local.conf

Это указывает Yocto использовать базовую команду patch вместо quilt, что может обойти некоторые ограничения разрешений.

Решение 2: Временное отключение AppArmor

Поскольку ваш первоначальный подход с AppArmor не сработал полностью, попробуйте более полное отключение AppArmor:

bash
sudo systemctl stop apparmor
sudo systemctl disable apparmor

После применения этого исправления перезапустите сборку. Не забудьте повторно включить AppArmor после завершения сборки:

bash
sudo systemctl enable apparmor
sudo systemctl start apparmor

Решение 3: Изменение конкретного профиля AppArmor

Создайте пользовательский профиль AppArmor для разрешения необходимых операций:

bash
sudo nano /etc/apparmor.d/local/usr.bin.patch

Добавьте следующее содержимое:

abi <abi/4.0>,
include <tunables/global>

/usr/bin/patch {
  # Разрешить установку атрибутов файлов
  capability dac_override,
  capability chown,
  
  # Разрешить операции с файлами
  /usr/bin/patch mr,
  /usr/bin/patch Px,
  
  # Разрешить доступ к директориям сборки
  /media/someone/Elements/yocto-build/** rw,
}

Затем перезагрузите AppArmor:

bash
sudo systemctl reload apparmor

Альтернативные подходы для постоянного исправления

Решение 4: Обновление Yocto и инструментов патчирования

Сообщество OpenEmbedded уже решило подобные проблемы в более новых версиях. Рассмотрите возможность обновления до последней версии Yocto Project:

bash
cd poky
git pull
git checkout scarthgap
bitbake-layers show-layers

Решение 5: Сборка в другом месте

Иногда проблема связана с расположением файловой системы. Попробуйте собирать в домашней директории вместо этого:

bash
cd ~
mkdir yocto-build
cd yocto-build
git clone git://git.yoctoproject.org/poky.git
cd poky
git checkout scarthgap
. oe-init-build-env
bitbake core-image-sato

Решение 6: Использование контейнера Docker

Как упоминалось в обсуждении проблем Microsoft WSL, использование контейнерной среды может обойти многие проблемы с разрешениями:

bash
docker run -it --rm \
  -v ~/.ssh:/home/builduser/.ssh:ro \
  -v /media/someone/Elements/yocto-build:/home/builduser/yocto-build \
  yoctoproject/mickey-build:scarthgap

Профилактические меры для будущих сборок

Настройка правильного пользователя сборки

Создайте выделенного пользователя для сборки с соответствующими разрешениями:

bash
sudo useradd -m -s /bin/bash yocto-build
sudo usermod -aG sudo yocto-build
su - yocto-build

Правильная настройка среды сборки

Убедитесь, что ваша среда сборки имеет правильного владельца:

bash
sudo chown -R yocto-build:yocto-build /media/someone/Elements/yocto-build
sudo chmod -R 755 /media/someone/Elements/yocto-build

Использование рекомендуемой конфигурации Yocto

Добавьте эти настройки в ваш conf/local.conf для обработки проблем с разрешениями:

bash
# Использовать базовый инструмент патчирования вместо quilt
PATCHTOOL = "patch"

# Включить принудительное применение патча
PATCH_FORCE = "1"

# Установить соответствующие разрешения файлов
FILESPATH = "${@base_pathoffset(d, '${FILE_DIRNAME}')}"

Когда обращаться за дополнительной помощью

Если ни одно из вышеперечисленных решений не работает, рассмотрите эти дополнительные ресурсы:

  1. Документация Yocto Project: Проверьте официальную документацию Yocto для руководства по устранению неполадок.

  2. Форумы сообщества: Опубликуйте свою проблему на рассылках Yocto Project или Stack Overflow с полными журналами ошибок.

  3. Отчеты об ошибках: Если вы считаете, что это ошибка Yocto, создайте отчет в Bugzilla Yocto с подробными шагами воспроизведения.

Помните, что проблемы с разрешениями в сборках Yocto являются распространенными, особенно на более новых дистрибутивах Linux с усиленными функциями безопасности. Предоставленные решения должны решить вашу текущую проблему и помочь предотвратить подобные проблемы в будущих сборках.

Источники

  1. Сообщество NXP - Проблемы с разрешениями системы сборки Yocto
  2. Рассылка OpenEmbedded Core - Исправления Perl патча
  3. Microsoft WSL - Проблемы с разрешениями файлов
  4. Stack Overflow - Решения ошибок сборки Yocto
  5. Документация Yocto Project

Заключение

  • Ошибка разрешений вызвана политиками безопасности AppArmor, блокирующими модификацию атрибутов файлов при применении патчей
  • Существует несколько решений, от временных обходных путей до постоянных изменений конфигурации
  • Для получения немедленных результатов попробуйте использовать базовый инструмент patch вместо quilt или измените политики AppArmor
  • Для долгосрочных решений рассмотрите возможность сборки в контейнере или выделенной пользовательской среде
  • Всегда обеспечивайте правильные разрешения на файлы и владельца в директории сборки
  • Если проблемы сохраняются, обращайтесь за помощью к сообществу Yocto с подробными журналами ошибок и информацией о системе