Raspberry PiのGPIOアプリのリモートデバグの問題 [Raspberry Pi]
クロスのめんどくささはあるけど、OS XからRaspberry Piのリモートデバグができるようになって快適になったところで、ひとつ困ったことができた。Raspberry PiのGPIOアクセスにはroot権限が必要。ところがEclipseからリモートデバグするときに、sudoコマンドを発行してからデバガを動かそうとしたんだけど、なぜか動かない。なんでだ?僕だけなんだろうか?
よくわからないので、いろいろ試した。でもいい方法がない。誰か教えて....
僕はGPIOアクセスにbcm2835ライブラリを使っている。root権限を持たずにGPIOをアクセスしようとすると
Eclipseでリモートデバグするときに、デバガの起動オプションに「Commands to execute before application」という入力があって、そこでいいだろうと思ってsudo suとか入れても動かない。よく見るとsudo suでブロックしてるらしい。なんでだろう。そもそもこれがわからん。
しょうがないので/dev/memをユーザに解放することを試した。/dev/memは
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がブロックするのがおかしいよなあ。なんかセキュリティ上の問題があるんだっけ?
それとも他になにかいいやり方があるんだろうか....
よくわからないので、いろいろ試した。でもいい方法がない。誰か教えて....
僕は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がブロックするのがおかしいよなあ。なんかセキュリティ上の問題があるんだっけ?
それとも他になにかいいやり方があるんだろうか....
2015-08-27 21:40
nice!(0)
コメント(0)
トラックバック(0)
コメント 0