Używam Yocto 1.8 do zbudowania systemu Linux.
Muszę użyć polecenia "setcap"aby ustawić możliwości plików podczas kompilacji, które są wprowadzane przez przepis pakietu libcap: http://cgit.openembedded.org/openembedded-core/tree/meta/recipes-support/libcap/libcap_2.25.bb?h=master
Problem polega na tym, że przepis zapewnia libcap pakiet, który jest tylko biblioteką i nazwany innym podpakietem libcap-bin który zawiera pliki binarne, których potrzebuję użyć. Ale nie mogłem go zbudować ani używać libcap-bin-native pakiet wewnątrz mojego przepisu jako zależność (używając ZALEŻY zmienna). więc za każdym razem, gdy dzwonię "setcap"binarny, Yocto używa binarnych hostów (64-bitowy system operacyjny Ubuntu 14.04), a nie systemowych (jak nie ma).
Muszę wiedzieć, jak dołączyć natywne binaria zbudowane z pakietu libcap-bin w moim natywnym systemie plików sysroot do użycia podczas wykonywania receptury.
Przykładowa receptura do użycia polecenia 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
Ten przepis działa dobrze, z wyjątkiem tego, że używa setcap polecenie z mojego systemu hosta (64-bitowy system Ubuntu 14.04), który znajduje się "/ sbin / setcap"
Pakiet zależności libcap-native zawiera tylko pliki bibliotek w moim rodzimym sysroot, ale nie pliki binarne.
Jeśli użyłem tego w moim przepisie:
DEPENDS = "libcap-bin"
Mam ten błąd:
ERROR: Nothing PROVIDES "libcap-bin"
Widziałem także ten wątek mówiący o tym samym temacie: Możliwości systemu Linux z yocto
Ale używa Yocto> 2.3 i używam Yocto 1.8, i nie mogę go teraz zaktualizować.
Jakaś pomoc?
PS: Już zaktualizowałem mój system budowania yocto, aby zachować listy ACL i rozszerzone atrybuty podczas tworzenia IPK, i to działa i jest zachowane wewnątrz IPK, wewnątrz rootfs i na celu po flashowaniu.
Odpowiedzi:
1 dla odpowiedzi № 1Znalazłem rozwiązanie. Musiałem dodać to do przepisu libcap
PACKAGECONFIG_class-native = "attr"
Ponieważ wygenerowane pliki binarne (setcap i getcap) zależą od libattr, należy to skonfigurować ręcznie.
Odkryłem, że jest już skonfigurowany dla pakietu docelowego
PACKAGECONFIG ??= "attr ${@bb.utils.contains("DISTRO_FEATURES", "pam", "pam", "", d)}"
Przepraszam, że przeszkadzam.
0 dla odpowiedzi nr 2
Nie mogę jeszcze komentować, więc komentarz tutaj.
Polecenie setcap powinno być zapewnione przez libcap-native. I sprawdź dokładnie, czy istnieje w tmp / work / x86_64-linux / libcap-native / 2.25-r0 / image /:
$ znajdź 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
Możesz znaleźć setcap tutaj po usunięciu prefiksu:
$ ls / buildarea3 / kkang / cgp9 / builds / qemumips64-Apr24 / tmp / sysroots / x86_64-linux / usr / sbin / setcap / buildarea3 / kkang / cgp9 / builds / qemumips64-Apr24 / tmp / sysroots / x86_64-linux / usr / sbin / setcap