私の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
まっすぐ。これは何のエラーも発生しません。python
yoctoスクリプト地獄で子プロセスとして実行すると、これらのエラーが発生します。場合に備えてtar
はい
$ tar --version
tar (GNU tar) 1.34
答え1
私たちは同じ問題に遭遇し、GNU tarの代わりにBSD tarを使用するようにYoctoをパッチして問題を回避しました。libarchive-tools
このバージョンのtarを入手するには、Debianにインストールする必要があります。
私たちはまたtar
PATHにBSDを入れようとしましたが、tar
Yoctoによって拒否されました。バージョン番号が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_NOFOLLOW
tarで/フラグ処理を正しくサポートしていませんでした。AT_SYMLINK_NOFOLLOW
この問題を解決するために、「ダミー」レシピをアップグレードして再び機能させるように060058bb29f70b244e685b3c704eb0641b736f73
しました。
答え3
Bullseyeにアップグレードした後も同様の問題が発生しました。
tar: ./var/log: Cannot change mode to rwxrwxrwx: No such file or directory
Debian 11サポートしていない。一時的な解決策は、Debian 10 dockerコンテナを使用することです。