SSブログ

Raspberry PiのGPIOアプリのリモートデバグの問題 [Raspberry Pi]

クロスのめんどくささはあるけど、OS XからRaspberry Piのリモートデバグができるようになって快適になったところで、ひとつ困ったことができた。Raspberry PiのGPIOアクセスにはroot権限が必要。ところがEclipseからリモートデバグするときに、sudoコマンドを発行してからデバガを動かそうとしたんだけど、なぜか動かない。なんでだ?僕だけなんだろうか?

よくわからないので、いろいろ試した。でもいい方法がない。誰か教えて....

僕はGPIOアクセスにbcm2835ライブラリを使っている。root権限を持たずにGPIOをアクセスしようとすると
bcm2835_init: Unable to open /dev/mem: Permission denied
とメッセージを吐いて、初期化できない。ちゃんとソースを見ているわけではないんだけど、bcm2835ライブラリはおそらく/dev/memを開いてmmapで仮想アドレスにマップしてGPIOにアクセスしてるんだろうと思う(というか普通はそうするだろうな)。したがって/dev/memにアクセス権限がないとGPIOが使えない。

Eclipseでリモートデバグするときに、デバガの起動オプションに「Commands to execute before application」という入力があって、そこでいいだろうと思ってsudo suとか入れても動かない。よく見るとsudo suでブロックしてるらしい。なんでだろう。そもそもこれがわからん。

しょうがないので/dev/memをユーザに解放することを試した。/dev/memは
raspi2:~> ls -l /dev/mem
crw------- 1 root kmem 1, 1  1月  1  1970 /dev/mem
となっている。つまりオーナがroot、グループがkmemでオーナだけが読み書きできる。これを
raspi2:~> sudo chmod 666 /dev/mem
raspi2:~> ls -l /dev/mem
crw-rw-rw- 1 root kmem 1, 1  1月  1  1970 /dev/mem
としたんだけどやはりオープンできない。それにリブートすると
raspi2:~> ls -l /dev/mem
crw-r----T 1 root kmem 1, 1  1月  1  1970 /dev/mem
となってしまう。なんだ、「T」って?

kmemグループのグループIDは5なのでpiユーザのグループ(グループ1000のpi)からkmemに変更して、/dev/memのパーミッションを660にしても同じだった。まあそうだろうな。それにやっぱりリブートすると640になって、グループのパーミッションがせいぜいr--なので読み書き属性ではオープンできない。せっかく専用のグループを作ってあるんだから、グループの人ぐらい許してくれればいいのに。

もちろんグループ0のrootの人でもダメだし、/dev/memのオーナを変えてしまうと他の/dev/memを使っているコマンドが動かなるなるだろうからできない(なにか重要なコマンドがあったよな。すぐ思い出せないけど)。したがって/dev/memを読み書きできるのは、rootその人以外存在しないといいうことになる。そしてRaspbianはrootではログインできないようになっている。

結局、passwdファイルをいじってユーザIDが0のユーザを作って、そいつがログインできるようにすることしか思いつかなかった。つまり名前だけが違うroot本人で、loginコマンドがrootを拒絶するのをオーバーライドするということにしたけど、これって最悪の解決方法。Raspbianがこまかくグループ分けしてパーミッションを設定してあるのを全部チャラにすることになる。

こういう解決策しか与えないRaspbianのパーミッション設定ポリシがそもそも悪いんではないか。Raspberry PiはGPIOアクセスがウリなんだから、やっぱりkmemグループには/dev/memアクセスを許すようにすべきだろう。でも、そうするとセキュリティはザルになるなあ。他のmmapで物理アドレスがアクセスできるlinuxではどうなってたっけ? まあRaspberry Piではデフォルトのユーザであるpiがsudoにパスワード無しなんで、ザルなのは同じなんだけど。いや、それ以前にEclipseのリモートデバグでsudoがブロックするのがおかしいよなあ。なんかセキュリティ上の問題があるんだっけ?

それとも他になにかいいやり方があるんだろうか....
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。