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: Использование принудительного применения патча
Самый быстрый обходной путь - заставить применять патч путем изменения локальной конфигурации:
echo 'PATCHTOOL = "patch"' >> conf/local.conf
Это указывает Yocto использовать базовую команду patch вместо quilt, что может обойти некоторые ограничения разрешений.
Решение 2: Временное отключение AppArmor
Поскольку ваш первоначальный подход с AppArmor не сработал полностью, попробуйте более полное отключение AppArmor:
sudo systemctl stop apparmor
sudo systemctl disable apparmor
После применения этого исправления перезапустите сборку. Не забудьте повторно включить AppArmor после завершения сборки:
sudo systemctl enable apparmor
sudo systemctl start apparmor
Решение 3: Изменение конкретного профиля AppArmor
Создайте пользовательский профиль AppArmor для разрешения необходимых операций:
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:
sudo systemctl reload apparmor
Альтернативные подходы для постоянного исправления
Решение 4: Обновление Yocto и инструментов патчирования
Сообщество OpenEmbedded уже решило подобные проблемы в более новых версиях. Рассмотрите возможность обновления до последней версии Yocto Project:
cd poky
git pull
git checkout scarthgap
bitbake-layers show-layers
Решение 5: Сборка в другом месте
Иногда проблема связана с расположением файловой системы. Попробуйте собирать в домашней директории вместо этого:
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, использование контейнерной среды может обойти многие проблемы с разрешениями:
docker run -it --rm \
-v ~/.ssh:/home/builduser/.ssh:ro \
-v /media/someone/Elements/yocto-build:/home/builduser/yocto-build \
yoctoproject/mickey-build:scarthgap
Профилактические меры для будущих сборок
Настройка правильного пользователя сборки
Создайте выделенного пользователя для сборки с соответствующими разрешениями:
sudo useradd -m -s /bin/bash yocto-build
sudo usermod -aG sudo yocto-build
su - yocto-build
Правильная настройка среды сборки
Убедитесь, что ваша среда сборки имеет правильного владельца:
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 для обработки проблем с разрешениями:
# Использовать базовый инструмент патчирования вместо quilt
PATCHTOOL = "patch"
# Включить принудительное применение патча
PATCH_FORCE = "1"
# Установить соответствующие разрешения файлов
FILESPATH = "${@base_pathoffset(d, '${FILE_DIRNAME}')}"
Когда обращаться за дополнительной помощью
Если ни одно из вышеперечисленных решений не работает, рассмотрите эти дополнительные ресурсы:
-
Документация Yocto Project: Проверьте официальную документацию Yocto для руководства по устранению неполадок.
-
Форумы сообщества: Опубликуйте свою проблему на рассылках Yocto Project или Stack Overflow с полными журналами ошибок.
-
Отчеты об ошибках: Если вы считаете, что это ошибка Yocto, создайте отчет в Bugzilla Yocto с подробными шагами воспроизведения.
Помните, что проблемы с разрешениями в сборках Yocto являются распространенными, особенно на более новых дистрибутивах Linux с усиленными функциями безопасности. Предоставленные решения должны решить вашу текущую проблему и помочь предотвратить подобные проблемы в будущих сборках.
Источники
- Сообщество NXP - Проблемы с разрешениями системы сборки Yocto
- Рассылка OpenEmbedded Core - Исправления Perl патча
- Microsoft WSL - Проблемы с разрешениями файлов
- Stack Overflow - Решения ошибок сборки Yocto
- Документация Yocto Project
Заключение
- Ошибка разрешений вызвана политиками безопасности AppArmor, блокирующими модификацию атрибутов файлов при применении патчей
- Существует несколько решений, от временных обходных путей до постоянных изменений конфигурации
- Для получения немедленных результатов попробуйте использовать базовый инструмент
patchвместоquiltили измените политики AppArmor - Для долгосрочных решений рассмотрите возможность сборки в контейнере или выделенной пользовательской среде
- Всегда обеспечивайте правильные разрешения на файлы и владельца в директории сборки
- Если проблемы сохраняются, обращайтесь за помощью к сообществу Yocto с подробными журналами ошибок и информацией о системе