This service is available only in Japanese-language.
bbファイルでドットファイルをインストールしようとして以下の行を追加しました。
install -m 0600 ${S}/.pwd.lock ${D}/etc/.pwd.lock
ビルドすると以下のようのpath mismatchといったエラーが出てしまいます。
ERROR: Task (/home/keisuke/lts22/wrtools/windriver/layers/wrlinux/wrlinux-distro/recipes-base/images/wrlinux-image-small.bb:do_image_tar) failed with exit code '134'
Pseudo log:
path mismatch [1 link]: ino 109647635 db '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' req '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/group.15625'.
inode mismatch: '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' ino 109647635 in db, 109646385 in request.
Setup complete, sending SIGUSR1 to pid 15904.
ERROR: Task (/home/keisuke/lts22/wrtools/windriver/layers/wrlinux/wrlinux-distro/recipes-base/images/wrlinux-image-small.bb:do_image_ext4) failed with exit code '134'
Pseudo log:
path mismatch [1 link]: ino 109647635 db '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' req '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/group.15625'.
inode mismatch: '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' ino 109647635 in db, 109646385 in request.
path mismatch [1 link]: ino 109647635 db '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' req '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/group.15625'.
inode mismatch: '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' ino 109647635 in db, 109646385 in request.
Setup complete, sending SIGUSR1 to pid 15904.
ERROR: Task (/home/keisuke/lts22/wrtools/windriver/layers/wrlinux/wrlinux-distro/recipes-base/images/wrlinux-image-small.bb:do_image_wic) failed with exit code '134'
Pseudo log:
path mismatch [1 link]: ino 109647635 db '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' req '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/group.15625'.
inode mismatch: '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' ino 109647635 in db, 109646385 in request.
path mismatch [1 link]: ino 109647635 db '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' req '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/group.15625'.
inode mismatch: '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' ino 109647635 in db, 109646385 in request.
path mismatch [1 link]: ino 109647635 db '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' req '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/group.15625'.
inode mismatch: '/home/keisuke/lts22/wrtools/build/qemux86-64/tmp-glibc/work/qemux86_64-wrs-linux/wrlinux-image-small/1.0-r1/rootfs/etc/.pwd.lock' ino 109647635 in db, 109646385 in request.
Setup complete, sending SIGUSR1 to pid 15904.
インストール先を以下のように変更すると問題なくビルドが完了し、インストールされました。
${D}/etc/.pwd.lock
↓
${D}/etc/pwd.lock
ドットファイルをインストールする場合は特別な記述や設定が必要でしょうか。
yakuhito
2023/5/29 (月) 13:33
クラスファイルで定義されている処理の実行で生成されるファイルと同一の名称のファイルは注意が必要です
rootfsイメージを生成するタスク実行時に、各パッケージを展開後にパッケージで必要とされるユーザーやグループを追加するものがあり、その際に .pwd.lock ファイルも生成されます。その際にファイルのinode番号が更新されるため、レシピ内のdo_installで生成されたinode番号と異なるためエラーとなっています。
do_install タスク実行時は、別の名前でファイルをインストールを行い、ROOTFS_POSTINSTALL_COMMAND に追加する処理で、mv コマンドを使用して "pwd-lock" を ".pwd.lock" に置き換えれば実現可能と考えます。
https://docs.yoctoproject.org/4.0.10/ref-manual/variables.html#term-ROOT...
keisuke
2023/5/30 (火) 13:59
ROOTFS_POSTINSTALL_COMMAND試してみましたが同じエラーになりました
コメントありがとうございます。
ROOTFS_POSTINSTALL_COMMANDを試してみましたが同じエラーになりました。
エラー発生後にファイルを検索すると.pwd.lock(ドット付き)が存在しましたのでmv自体は実行されたようです。
関連ファイルの内容は以下のとおりです。
おかしいところがありますでしょうか。
[apl_1.0.bb]
#ドットなしのpwd.lockをインストール
install -m 0600 ${S}/.pwd.lock ${D}/etc/pwd.lock
bbclassファイルを新規作成
[mv_pwdlock.bbclass]
mv_pwdlock() {
if [ -e ${IMAGE_ROOTFS}/etc/pwd.lock ]; then
#ドットなしファイルをリネーム
mv ${IMAGE_ROOTFS}/etc/pwd.lock ${IMAGE_ROOTFS}/etc/.pwd.lock
fi
}
ROOTFS_POSTINSTALL_COMMAND += " mv_pwdlock; "
[conf/local.conf]
USER_CLASSES += "mv_pwdlock"
yakuhito
2023/5/31 (水) 10:28
他task内のpseudoで生成されるファイルに対して、外部で変更が行われるとエラーが発生する仕様となっています
YoctoProjectのwikiに記載された以下の情報がまさに発生している現象となります。
https://wiki.yoctoproject.org/wiki/Pseudo_Abort
.pwd.lock ファイルは、apl_1.0.bb 以外のレシピで定義されたタスク内で一時的に生成されているため、
ファイルの整合性が損なわれたと判断されています。
PSEUDO_IGNORE_PATHS変数に /etc/.pwd.lock を追記することで、ファイルの状態監視対象から外すことが可能ですので
ご確認ください。
https://docs.yoctoproject.org/4.0.10/ref-manual/variables.html#term-PSEU...
keisuke
2023/6/5 (月) 16:32
PSEUDO_IGNORE_PATHSでもうまくいきませんでした。
コメントありがとうございます。
PSEUDO_IGNORE_PATHS設定して試してみました。
ビルドは通るようになったのですが、肝心のファイルがインストールされていないようでした(無視された?)。
設定内容は以下の通りです。
--------------------------------------------
[app_1.0.bb]
#ドットが先頭についたファイルをインストール(.pwd.lock)
install -m 0600 ${S}/.pwd.lock ${D}/etc/.pwd.lock
[conf/local.conf]
PSEUDO_IGNORE_PATHS .= ",${WORKDIR}/rootfs/etc/.pwd.lock"
--------------------------------------------
また、以前のyocto(バージョン失念)ではこのような問題が起こらず、アプリのbbファイルに
install -m 0600 ${S}/.pwd.lock ${D}/etc/.pwd.lock
と書くだけでインストールされていたのですが、新しいバージョンのyoctoで仕様が変更されたのでしょうか。
よろしくお願いいたします。
yakuhito
2023/6/6 (火) 10:48
useradd 又はextrausers をinheritしたレシピは有りませんか?
.pwd.lock は、/etc/passwd に変更を行う際に排他制御を行うため使用されるファイルのため、上記クラスをinherit したレシピから生成されるパッケージがイメージに含まれる場合、イメージレシピのdo_rootfsタスクに対するPOSTPRESS_COMMANDとして/etc/passwd を変更する際に削除される可能性があります。
ファイルをインストールするレシピを追加するのではなく、イメージレシピに対するbbappendの中で、do_rootfs終了後、do_image実行前に、IMAGE_ROOTFS 変数以下/etc/.pwd.lock を生成するタスクを追加することで、/etc/.passwd.lock が含まれるimageが生成可能と考えます。
keisuke
2023/6/8 (木) 12:47
解決しました。
以下の変更をしたところ期待する結果になりました。
-------------------------------------------------
[app_1.0.bb]
#.pwd.lockのインストールは削除
- install -m 0600 ${S}/.pwd.lock ${D}/etc/.pwd.lock
[conf/local.conf]
+ USER_CLASSES += "pwdlock"
[classes/pwdlock.bbclass]
+ pwdlock() {
+ touch "${IMAGE_ROOTFS}/etc/.pwd.lock"
+ }
+ IMAGE_PREPROCESS_COMMAND += " pwdlock; "
-------------------------------------------------
bbappendの書き方がよく分からず上手くいかなかったので、bbclassファイルを作成してIMAGE_PREPROCESS_COMMANDを実行するようにしました。
どうもありがとうございました。