Python 하위 프로세스로 호출되면 tar가 심볼릭 링크에서 실패합니다.

Python 하위 프로세스로 호출되면 tar가 심볼릭 링크에서 실패합니다.

내 Debian을 Buster에서 Bullseye로 업그레이드한 후 내 yocto 빌드 프로세스가 do_package: Function failed: perform_packagecopy다음과 같은 수백 개의 메시지와 함께 실패합니다.

tar: ./dir/linkfile: Cannot change mode to rwxrwxrwx: No such file or directory

( linkfile디렉토리의 심볼릭 링크입니다). 실제 복사 작업이 수행되고 파일과 해당 심볼릭 링크가 예상된 모드 설정으로 나타납니다. 심볼릭 링크가 가리키는 파일보다 먼저 복사되는 것처럼 보이며 tar는 심볼릭 링크의 패턴에 적응해야 한다고 생각하지만 심볼릭 링크가 가리키는 파일이 존재하지 않기 때문에 오류가 발생합니다(단지 가정일 뿐입니다).

안타깝게도 실행 시 오류를 재현할 수 없습니다.

tar -cf - -C /full/path/image -p -S . | tar -xf - -C /full/path/package

곧장. 이것은 어떤 오류도 발생하지 않습니다. pythonyocto 스크립트 지옥에서 하위 프로세스로 실행할 때 이러한 오류가 발생합니다 . 만일을 대비해서 tar그렇습니다

$ tar --version
tar (GNU tar) 1.34

답변1

우리는 같은 문제에 부딪혔고 GNU tar 대신 BSD tar를 사용하도록 Yocto를 패치하여 문제를 피했습니다. libarchive-tools이 버전의 tar를 얻으려면 Debian에 설치 해야 합니다 .

우리는 또한 tarPATH 에 BSD를 넣으려고 시도했지만 tarYocto에 의해 거부되었습니다. 버전 번호가 1.28보다 큰지 확인합니다(GNU가 아닌 버전의 버전 번호가 다르다는 사실을 무시함 tar).tar

이것은 우리에게 문제가 되지 않는 것 같습니다.

From aebcd4668cc3500d6072b7ef3fba2e6ea2cf9f43 Mon Sep 17 00:00:00 2001
From: Florian Viguier <[email protected]>
Date: Wed, 3 Nov 2021 09:15:47 +0100
Subject: [PATCH 1/2] [LCB-318] Switch Gnu tar for bsd tar for Debian 11
 compatibility

---
 meta/classes/package.bbclass | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 5a32e5c2e3..db47edc92a 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -814,7 +814,7 @@ python perform_packagecopy () {
     # Start by package population by taking a copy of the installed
     # files to operate on
     # Preserve sparse files and hard links
-    cmd = 'tar -cf - -C %s -p -S . | tar -xf - -C %s' % (dest, dvar)
+    cmd = '/usr/bin/bsdtar -cf - -C %s -p -S . | /usr/bin/bsdtar -xf - -C %s' % (dest, dvar)
     subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
 
     # replace RPATHs for the nativesdk binaries, to make them relocatable
-- 
2.30.2

From 7680a3ba35c321fc915714fb835782f0b03d105e Mon Sep 17 00:00:00 2001
From: Adrien Destugues <[email protected]>
Date: Thu, 4 Nov 2021 17:43:47 +0100
Subject: [PATCH 2/2] [FIX] Use bsdtar also in sstate

---
 meta/classes/sstate.bbclass | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index d08d950e76..4e0be994c7 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -849,7 +849,7 @@ python sstate_report_unihash() {
 # Will be run from within SSTATE_INSTDIR.
 #
 sstate_unpack_package () {
-   tar -xvzf ${SSTATE_PKG}
+   /usr/bin/bsdtar -xvzf ${SSTATE_PKG}
    # update .siginfo atime on local/NFS mirror
    [ -O ${SSTATE_PKG}.siginfo ] && [ -w ${SSTATE_PKG}.siginfo ] && [ -h ${SSTATE_PKG}.siginfo ] && touch -a ${SSTATE_PKG}.siginfo
    # Use "! -w ||" to return true for read only files
-- 
2.30.2

답변2

최근에 이전 Yocto 버전(sumo)을 사용하여 OpenSUSE 배포판을 업그레이드하는 동안 동일한 문제가 발생했습니다. 문제는 tar 자체와 직접적인 관련이 없습니다. 왜냐하면 tar는 Yocto 외부에서 작동하기 때문입니다. 그러나 "pseudo"(Yocto의 fakeroot 구현)와 함께 사용할 때 발생합니다. 실제로 이전 버전의 "pseudo"는 O_NOFOLLOWtar에서 / 플래그 처리를 올바르게 지원하지 않았습니다.AT_SYMLINK_NOFOLLOW

이 문제를 해결하기 위해 "더미" 레시피를 업그레이드하여 060058bb29f70b244e685b3c704eb0641b736f73다시 작동하도록 했습니다.

답변3

Bullseye로 업그레이드한 후에도 비슷한 문제가 발생했습니다.

tar: ./var/log: Cannot change mode to rwxrwxrwx: No such file or directory

데비안 11은지원하지 않음. 임시 해결책은 Debian 10 docker 컨테이너를 사용하는 것입니다.

관련 정보