QA@IT

PATHの確認法

3402 PV

Hyper-v+ubuntu15.04です。
64bit環境でARM7-cotex9用のコードを出力するpetalinuxという処理系のBuildで躓いています。
Buildの過程で
[ALL ] dpkg: 警告: 'ldconfig' が PATH 上に見つからないか実行可能になっていません
[ERROR] dpkg: 警告: 'start-stop-daemon' が PATH 上に見つからないか実行可能になっていません
[ALL ] dpkg: 警告: --force が有効なので、問題を無視します:

というERRORが表示されます。
ldconfigというファイルは実際にそれらしい場所に存在します:
-rwxr-xr-x 64843 300 617068 10月 25 21:58 ldconfig

ERRORの原因として
1.処理系のMakefileがここにPATHを設定していない。
スタート時には$PATHにはありません。
2.Ownerとgroupが数字表示になっていることがアクセスを阻んでいる
の二つが考えられます。
実行状況として
1.root権限
2.ldconfigは処理の過程でダイナミックに生成され、生成直後に停止させてOwner:Groupをroot:rootに変更して再スタートと言うことができません。
そこで質問なのですが
推定原因1に対してはMakefileを解析するしか追求の手段はないと思いますが、推定原因2の可能性はありますでしょうか?。Owner:Groupが数字表示になっていてもroot権限で実行すればお構いなしにアクセスできると考えたのですが、Linuxの素人で判断できません。
ご示唆いただけると助かります。

回答

2.は可能性が低いと思います。

-rwxr-xr-x 64843 300 617068 10月 25 21:58 ldconfig

からすると、otherの実行権限があるので、誰でも実行可能になっているように見えます。

たぶん1.の$PATH等の問題ではないでしょうか。他にも$PETALINUXという環境変数も必要そうです。

PetaLinuxは僕は使ったことはないのですが、「Getting Started Guide」のP.6「Environment Setup」を見ると、使っているshellがbashなら

$ source <path-to-installed-PetaLinux>/settings.sh

を実行し、使っているのがcshなら

$ source <path-to-installed-PetaLinux>/settings.csh

を実行せよとあります。注意書きに

You must run the settings script each time you open a new terminal window or shell. The PetaLinux tools will fail otherwise.

とあるので、これを毎回やらないとたぶん$PATH、$PETALINUX等が設定されないのだろうと思います。

追記

PetaLinuxをよく知らないのですが、たぶんホストOS環境とターゲットOS環境とがあるんじゃないかと思います。

finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'

これは既存の$PATHの末尾に/sbinを追加して、ホストOS環境のldconfig(通常は/sbin/ldconfig)を使おうとしているように見えます。

./build/linux/rootfs/stage/sbin/ldconfig
./build/linux/rootfs/packages-repo/targetroot/sbin/ldconfig
./build/linux/rootfs/targetroot/sbin/ldconfig

他方、これらはターゲットOS環境用に生成されたldconfigのように見えます。普通に考えると、これらは$PATHに入っている必要はなさそうに思えますね。

最初に$PATHに/sbinが入っていることからすると、なぜ/sbin/ldconfigが見つからないのかという点が疑問ですよね。そこは僕も分かりませんが、推測だけでいうと、例えばsudoなんかを使っていると、そういうこともありうるとは思います。

PetaLinuxとは直接関係ありませんが、より一般的な話だとしたら、下のページなども参考になるかもしれません。

dpkg cannot find ldconfig/start-stop-daemon in the PATH variable

http://unix.stackexchange.com/questions/160019/dpkg-cannot-find-ldconfig-start-stop-daemon-in-the-path-variable

追記(2015/10/29)

試しにこっちでもXilinxのサイトからPetaLinuxをダウンロードしてマニュアルを見ながら一通りのことをやってみたのですが、特に問題ないようです。ビルドも別に問題ないようです。テストは実機がないのでQEMUの方だけ行ないました。ただCentOSでやったので、dpkgの問題が再現するかは見られませんでした。

環境

  • CentOS 6.7 32bit

試したもの

  • petalinux-v2014.2-final-installer.run
  • Xilinx-ZC702-v2014.2-final.bsp

参照したマニュアル

  • Installation Guide / UG976 (v2014.2) June 3, 2014
  • Getting Started Guide / UG977 (v2014.2) June 3, 2014
編集 履歴 (2)
  • 試しにこっちでもやってみたので、結果を追記しました。
    -

2回目のコメントありがとうございます。
手のかかるPetaLinuxのBuildを通してやっていただけなんて感激です。

実は私も成功しました。その理由はubnutuからCentOS(64Bit)に変更したことにあると思います。
さらにその真の理由は追加Packageにありそうです。本Installerは64bit環境で作業しても32bitコードを出力することが目的になっています。
unbuntsuではXilinxが指定した32bit用lib32bz2-1.0がdownloadできません。ところが成功を報告した人たちは
apt-get install lib32bz2-1.0
ができた人たちです。私は6か所ほど海外のサイトにアクセスしましたが結局成功しませんでした。そこで
http://askubuntu.com/questions/637113/unable-to-locate-package-lib32bz2-1-0
を参考に複数のPackageから構成されるlib32bz2-1.0の中身を分解して必要と思われるpackage:i386を依存関係にも配慮しながら追加したのですがどこかに不備があったのでしょう。XilinxのツールがERROR個所をReportしてくれない不親切なものであったため一か月にもおよぶ作業になってしまいました。
CentOSであっさり成功したのは指定の32bit Packageに曖昧さがなかったためと思っています。

ただスレのテーマにしたERRORはなぜかcentOSでは全く発生しません。BaseのOSによるこの差が生じた理由は素人の私にはわかりません。

それからご指摘のようにroot権限でBuildを実行することはトラブルを持ち込む原因になり得るとは思っています。以前別の会社がサポートするシステムではrootによる現に戒めていました。ただ今回の状況ではいたしかたないでしょう。

これでようやく次のステップに進めそうです。本当にありがとうございました。

編集 履歴 (0)

待望のResありがとうございます。petalinuxにまで踏み込んでいただいたことに重ねて御礼を申し上げます。

source /settings.sh
は毎回実行しています。
それからDashではなくBashを指定されているのでそのようにしています。
$PATH、$PETALINUX等はスタート前にチェックしています。$PATHの方はubuntuが設定した:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
の他にInstallerのPathが7個追加されています。

今回Ownerとgroupが数字表示であることは原因である可能性は少ないと指摘していただいて大変助かるのですが、ldconfigに関与するところだけにERROR表示が行われる原因を探るためGrepで調べた結果、
---/etc/template/libs/template-autoconf/@libname@-0.1/configure
---/etc/template/libs/template-autoconf/@libname@-0.1/aclocal.m4
というファイル中の15個度
finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
という記述をみつけました。OriginalのPATHがわからないのでこれ以上追及はできていないのですが、失敗に終わった後でldconfigの所在を調べると:
./build/linux/rootfs/stage/sbin/ldconfig
./build/linux/rootfs/packages-repo/targetroot/sbin/ldconfig
./build/linux/rootfs/targetroot/sbin/ldconfig
の3か所にあることが分かりました。finish_cmdsの記述と整合しているようにも感じます。
終了後追加されたDirectory:stage, packages-repo, targetrootをecho $PATHでチェックしたところ存在しませんでした。上記ファイル中で見かけたdlpathが消したのかもしれません。

petalinuxのBuildは世界中で不調が伝えられていますが原因は追加packageにあるとされています。成功例も数多くあるのでしょうからできないはずはありません。私が直面したERRORは報告されていませんがこれがPackageの不足をもたらしている可能性があるので避けて通るわけにはいかないと思っています。しかし一方で
dpkg: 警告: --force が有効なので、問題を無視します:
が出力されBuild作業は続行されるので無視しても差し支えないのかもしれません。
ご意見をいただければ幸いです。

編集 履歴 (0)
  • こちらについては自分の回答に追記しました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。