Используйте команду Linux setcap для настройки возможностей во время сборки Yocto

Я использую Yocto 1.8 для сборки Linux-системы.

Мне нужно использовать команду «setcap» для установки возможностей файлов во время сборки, которая вводится через рецепт пакета libcap: http://cgit.openembedded.org/openembedded-core/tree/meta/recipes-support/libcap/libcap_2.25.bb?h=master

Проблема в том, что рецепт предоставляет пакет libcap, который является только библиотекой, и другой подпакет, называемый libcap-bin, который содержит двоичные файлы, которые мне нужно использовать. Но я не мог собрать или использовать пакет libcap-bin-native внутри своего рецепта в качестве зависимости (с использованием переменной DEPENDS). поэтому каждый раз, когда я вызываю двоичный файл "setcap", Yocto использует двоичные файлы хоста (64-разрядная версия Ubuntu 14.04), а не системные файлы сборки (поскольку их там нет).

Мне нужно знать, как включить собственные двоичные файлы, созданные из пакета libcap-bin, в мою собственную систему сборки sysroot, которая будет использоваться во время выполнения рецепта.

Пример рецепта использования команды setcap:

DESCRIPTION = "Apply  CAPs on files"
SECTION = "bin"
LICENSE = "CLOSED"

do_install() {
    install -d ${D}${bindir}
    touch ${D}${bindir}/testacl
}

DEPENDS = "libcap libcap-native"

#New task will be added to each recipe to apply attributes inside ipks
fakeroot do_setcaps() {
    setcap 'cap_sys_admin,cap_sys_rawio+ep' ${WORKDIR}/packages-split/${PN}${bindir}/testacl
}

#Adding the new task  just before do_package_write_ipk task
addtask setcaps before do_package_write_ipk after do_packagedata

Этот рецепт работает нормально, за исключением того, что он использует команду setcap из моей хост-системы (64-разрядная версия Ubuntu 14.04), которая находится в "/ sbin / setcap".

Пакет зависимостей libcap-native включает только файлы библиотеки внутри моего собственного sysroot, но не двоичные файлы.

Если бы я использовал это в своем рецепте:

DEPENDS = "libcap-bin"

У меня такая ошибка:

ERROR: Nothing PROVIDES 'libcap-bin'

Я также видел эту ветку, посвященную той же теме: Возможности Linux с yocto

Но он использует Yocto> 2.3, а я использую Yocto 1.8, и я не могу его обновить прямо сейчас.

Любая помощь?

PS: Я уже обновил свою систему сборки yocto, чтобы сохранить списки управления доступом и расширенные атрибуты во время создания IPK, и она работает и сохраняется внутри IPK, внутри rootfs и на целевой машине после перепрошивки.


person shatrix    schedule 18.04.2017    source источник


Ответы (2)


Я нашел решение. Мне пришлось добавить это в рецепт libcap

PACKAGECONFIG_class-native = "attr"

Поскольку сгенерированные двоичные файлы (setcap и getcap) зависят от libattr, и это нужно настраивать вручную.

Я обнаружил, что он уже настроен для целевого пакета

PACKAGECONFIG ??= "attr ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam', '', d)}"

Простите за беспокойство.

person shatrix    schedule 26.04.2017

Я пока не могу комментировать, так что комментируйте здесь.

Команда setcap должна предоставляться libcap-native. И, пожалуйста, дважды проверьте, существует ли он в tmp / work / x86_64-linux / libcap-native / 2.25-r0 / image /:

$ find tmp / work / x86_64-linux / libcap-native / 2.25-r0 / sysroot-destdir / -name setcap tmp / work / x86_64-linux / libcap-native / 2.25-r0 / sysroot-destdir / buildarea3 / kkang / cgp9 / builds / qemumips64-апрель 24 / tmp / sysroots / x86_64-linux / usr / sbin / setcap

Вы можете найти здесь setcap после удаления префикса:

$ ls / buildarea3 / kkang / cgp9 / builds / qemumips64-апрель 24 / tmp / sysroots / x86_64-linux / usr / sbin / setcap / buildarea3 / kkang / cgp9 / builds / qemumips64-апрель 24 / tmp / sysroots / x86_r64-linux / sbin / setcap

person Kai    schedule 19.04.2017
comment
В этом проблема, он не предоставляется libcap-native, так как не является частью пакета libcap; он включен только в пакет libcap-bin. - person shatrix; 19.04.2017
comment
откуда libcap-bin? Я не вижу подпакета в рецепте libcap? - person Kai; 21.04.2017
comment
Рецепт libcap наследует класс lib_package, который предоставляет подпакет $ {PN} -bin. - person shatrix; 24.04.2017
comment
@shatrix как ваше описание Мне нужно использовать команду setcap для установки возможностей файлов во время build, все команды, которые используются во время сборки, либо из хоста, либо из -native пакетов. В моем каталоге проекта запустите $ find tmp / work / x86_64-linux / libcap-native / 2.25-r0 / sysroot-destdir / -name setcap tmp / work / x86_64-linux / libcap-native / 2.25-r0 / sysroot-destdir / buildarea3 / kkang / cgp9 / builds / qemumips64-Apr24 / tmp / sysroots / x86_64-linux / usr / sbin / setcap Здесь вы можете найти setcap после удаления префикса: / buildarea3 / kkang / cgp9 / builds / qemumips64-Apr24 / tmp / Системные корни / x86_64-Linux / usr / sbin / setcap - person Kai; 02.05.2017