Armadilloフォーラム

ベンダディレクトリのMakefileでの/usr/binのchmod

y.nakamura

2016年4月19日 0時31分

中村です。

たぶん、200シリーズ(9含む)以外のほとんどのMakefileが
該当すると思うのですが、400シリーズ、800シリーズ、
それから、IoTとBox WS1を選択しました。
(300と500は使ったことがないので入れてません。
IoT-G3もまだ使ってないので除外しておきました)

たとえば、ベンダディレクトリのArmadillo-IoTG-Stdの
Makefileに次の行があります。

        find $(ROMFSDIR)/usr/bin -type f -exec chmod 755 {} +

このusr/binの下のもの全てに対するchmodは
何のために必要なのでしょうか?

この疑問が出てきた理由は次のとおりです。

atmark-distの下でmakeをするとベンダーディレクトリの下と
userの下など全部に対してmake all を実行します。
また、make romfs も、ベンダーディレクトリの下と
userの下など全部に対してmake romfs を実行します。

userの下のある特定のコマンドのソースを直したときや、
ベンダーの下のちょっとしたものだけを修正したときに、
(ベンダーの下は、etcの下だけということもよくあります)
全部のサブディレクトリをallやromfsでmakeするのは
作業効率が悪いので、
make user/hoge_only
make user/hoge_romfs

make vendor_romfs
などを使って、特定のディレクトリの下だけをmakeする
ことがあります。
(トップのMakefileの"%_only:"、"%_romfs:"、
"vendor_%:"などのターゲットを使います)

ベンダーディレクトリのMakefileでromfsを実行すると、
最初に書いた

        find $(ROMFSDIR)/usr/bin -type f -exec chmod 755 {} +

によって、romfs/usr/binの下のすべてのファイルのパーミッションが
755に書き換えられてしまいます。

これにより、romfs/usr/sudoのsetuidビットが落ちてしまい、
sudoができなくなることに、最近気づきました。

sudoのsetuidビットは、user/sudo/Makefileのromfsの
次の処理で設定されています。

romfs:
        $(ROMFSINST) /usr/bin/sudo
        chmod 4611 $(ROMFSDIR)/usr/bin/sudo

--
なかむら

コメント

at_yashi

2016年4月19日 10時34分

> このusr/binの下のもの全てに対するchmodは
> 何のために必要なのでしょうか?

昔々、まだ git が世の中に無いころ、Atmark Dist は patch で管理されてました。

普通のパッチは、ファイルのパーミッションを管理する機能がありません。そ
のため、例えば shell スクリプトを追加するようなパッチがあって、開発者
がシェルスクリプト自体にパーミッションを付けていても、patch がマージさ
れると、実行権限が落ちてしまいます。

この副作用によって不具合を数回出したことがあるので、bin/以下には強制的
に実行権限を付けるように変更しました。これ以上の権限の変更は、起動時に
変更するようにしています。

> これにより、romfs/usr/sudoのsetuidビットが落ちてしまい、
> sudoができなくなることに、最近気づきました。

たしかに seuid のファイルには影響がありますね。

y.nakamura

2016年4月19日 12時22分

中村です。

yashiさん、
説明ありがうございます。

文脈から誤記はわかると思いますが、元の私の1ヵ所訂正しておきます。
> > これにより、romfs/usr/sudoのsetuidビットが落ちてしまい、
は、romfs/usr/bin/sudo です。

> この副作用によって不具合を数回出したことがあるので、bin/以下には強制的
> に実行権限を付けるように変更しました。これ以上の権限の変更は、起動時に

バイナリのディレクトリはbin,usr/bin,sbin,usr/sbinとあるのに
usr/binの下だけchmodしているのは、プロダクトディレクトの下は
usr/binだけなので、そこからromfに入れたものに対して+xを
したかったということのようですね。
本来ならば、プロダクトディレクトリ/usr/bin/の下にあるファイルだけ、
romfs/usr/binから探してchmodするように、もう少し手間をかけて
Makefileを書くべきと思います。findで一括全部というのではなく。

そうすれば、他のプログラム、たとえば今回のsudoのパーミッションを
勝手に書き換えてしまうことはなくなりますから。

--
なかむら