2013/07/21

RaspberryPiのUSB接続を認識する

RaspberryPi で USB デバイスの抜き差しに応じてアプリの起動/終了をしたかったのでその調査メモ。

Linux では USB 制御は udev と言う仕掛けを使うらしい。

/etc/udev/rules.d/ に目的のデバイスの *.rules ファイルを記述すればOK。
rules ファイルは先頭が数字になっているので多分その順番で処理されるものと思われる。
rules の書き方は man udev でマニュアルが見れるが正直分かり辛い。

とりあえずサンプルをググりながら手持ちのJoyStickを認識する設定を書いてみた。

ルールファイル

/etc/udev/rules/10-joystick-test.rules:

ACTION=="add",\
        SUBSYSTEMS=="usb", \
        ATTRS{idVendor}=="0d9d", \
        ATTRS{idProduct}=="3011", \
        KERNEL=="js*", \
        RUN:="/tmp/test1.sh start", \
        OPTIONS+="last_rule"

ACTION=="remove",\
        SUBSYSTEMS=="usb", \
        ENV{ID_VENDOR_ID}=="0d9d", \
        ENV{ID_MODEL_ID}=="3011", \
        KERNEL=="js*", \
        RUN:="/tmp/test1.sh stop", \
        OPTIONS+="last_rule"
  • 1つの定義は1行で記述する。改行は「\」でエスケープできる。
  • 比較演算子が条件、代入演算子が処理と考えれば良い。
  • ACTION: "add"が接続、"remove"が切断。
  • SUBSYSTEMS: USB の場合は固定。
  • ATTRS: udevadm info コマンドで取れる属性値。
  • ENV: udevadm monitor コマンドで取れる環境変数値。
  • KERNEL: /dev/ 以下の名前と思えば良い。*はワイルドカード。
  • RUN: 実行スクリプト
  • OPTIONS: 多分無くても良い。サンプルに書いてあったのでそのまま。
  • add と remove で ATTRS と ENV の違いが有ることに注意。


udevadm info コマンド

以下のコマンドでデバイスの情報を色々表示してくれる。

$ sudo udevadm info -a -p $(udevadm info -q path -n /dev/input/js0)

但し、2013年6月時点のOSでは表示後ハングアップしてしまう。
Vendor/Productは dmesg でも見れるので無理に使う必要は無い。

udevadm monitor コマンド

起動して置いて USB を抜き差しすると接続ログとデバイス情報が吐き出される。

$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

UDEV  [258008.515110] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0/input/input18/js0 (input)
ACTION=add
DEVLINKS=/dev/input/by-id/usb-HuiJia_4Axes_16Key_GamePad-joystick /dev/input/by-path/platform-bcm2708_usb-usb-0:1.2.1:1.0-joystick
DEVNAME=/dev/input/js0
DEVPATH=/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0/input/input18/js0
ID_BUS=usb
ID_INPUT=1
ID_INPUT_JOYSTICK=1
ID_MODEL=4Axes_16Key_GamePad
ID_MODEL_ENC=4Axes\x2016Key\x20GamePad
ID_MODEL_ID=3011
ID_PATH=platform-bcm2708_usb-usb-0:1.2.1:1.0
ID_PATH_TAG=platform-bcm2708_usb-usb-0_1_2_1_1_0
ID_REVISION=4b24
ID_SERIAL=HuiJia_4Axes_16Key_GamePad
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030000:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=HuiJia
ID_VENDOR_ENC=HuiJia\x20
ID_VENDOR_ID=0d9d
MAJOR=13
MINOR=0
SEQNUM=1031
SUBSYSTEM=input
TAGS=:udev-acl:
UDEV_LOG=3
USEC_INITIALIZED=258008048772


実行スクリプト

/tmp/test1.sh:

#!/bin/bash
echo `date` $0 $1 $DEVNAME >> /tmp/test.log
  • 環境変数 DEVNAME はデバイス名が入っている。
  • その他に設定される環境変数はスクリプト内で env を実行すれば分かる。
実行結果

/tmp/test.log:

Sun Jul 21 18:46:35 JST 2013 /tmp/test1.sh start /dev/input/js0
Sun Jul 21 18:46:38 JST 2013 /tmp/test1.sh stop /dev/input/js0

ちゃんと呼ばれている。

後は JoyStick の操作を読み取って任意の処理を行うスクリプトを起動させれば良い。

RaspberryPiはshutdownボタンとか無いのが以外に不便なのだがこれで実現できる。 -> RaspberryPiでJoypadからコマンド入力


2013/07/15

RaspberryPiをDNSにする

前から自宅LAN用のDNSが欲しかったんだけど24時間稼働というハードルが以外に高く 実現できないでいた。

RaspberryPiにちょうど良いのでDNSにしてみた。

デフォルトでは入っていないようなのでインストール。

$ sudo apt-get install bind

しかし、この後困った。/etc/named.conf が無いのだ。

色々ググってやっと分かった。Debian系は /etc/bind/ なのね。
しかも named.conf が幾つかに分割されていて独自のお作法が有る様子...

良く分かんないけど適当にやったら動いたからメモっとく。

/etc/bind/named.conf.options:

acl localnet {
        192.168.0.0/24;
        127.0.0.1;
};

options {
        directory "/var/cache/bind";
        allow-query { localnet; };
        allow-transfer { none; };
        forwarders { 192.168.0.1; };      # 家のルータはNS持ってるので
        forward only;

        dnssec-validation auto;
        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };         
};

PS. forwardersが効いていなかったので修正

        allow-transfer { localnet; };
        dnssec-validation no;

/etc/bind/named.conf.local:

zone "myhome.jp" {
        type master;
        file "/etc/bind/myhome.jp.zone";
};

zone "0.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/myhome.jp.rev";
};

/etc/bind/myhome.jp.zone:

$TTL    86400
@       IN      SOA     ns.myhome.jp. root.myhome.jp. (
                        2013063001      ; Serial
                        3600            ; Refresh
                        900             ; Retry
                        604800          ; Expire
                        86400 ) ; Negative Cache TTL
;
@       IN      NS      ns.myhome.jp.   ; this host
@       IN      A       127.0.0.1
@       IN      AAAA    ::1
ns      IN      A       192.168.0.7     ; this host
rpi     IN      A       192.168.0.7     ; this host
router  IN      A       192.168.0.1     ;

/etc/bind/myhome.jp.rev:

$TTL    86400
@       IN      SOA     ns.myhome.jp. root.myhome.jp. (
                        2013063001      ; Serial
                        3600            ; Refresh
                        900             ; Retry
                        604800          ; Expire
                        3600 )  ; Negative Cache TTL
;
@       IN      NS      ns.myhome.jp.
7       IN      PTR     rpi.myhome.jp.
1       IN      PTR     router.myhome.jp.

で bind 再起動。

$ sudo service bind9 restart

参照側PCでDNSを設定して確認する。

$ sudo vi /etc/resolve.conf
domain myhome.jp
nameserver      192.168.0.7
$ nslookup rpi
Server:         192.168.0.7
Address:        192.168.0.7#53

Name:   rpi.myhome.jp
Address: 192.168.0.7

$ nslookup 192.168.0.7
Server:         192.168.0.7
Address:        192.168.0.7#53

7.0.168.192.in-addr.arpa        name = rpi.myhome.jp.

問題無さげ。地味に嬉しい。


2013/07/11

RaspberryPiのパーティション

RaspberryPiを購入してみたの続き。

とりあずOSを入れただけなのでその他の設定したメモです。

固定IPの設定

DHCPは不便なので固定IPを振ります。

$ sudo vi /etc/network/interfaces   #以下の修正を入れる
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.0.xxx
netmask 255.255.255.0
gateway 192.168.0.1

パーティションの切り直し

img ファイルは2Gの状態なのでSDカードサイズの16Gまで使えるようにします。
単純に最大まで使うだけならば raspi-config コマンドの expand_rootfs から行えます。

しかし、書込回数に上限のあるSDカードで /var がルートパーティションに有るのは嫌なので手動で /var 専用のパーティションを切る事にしました。

-> と思ったのですが今時のフラッシュメモリはウェアレベリング機能が入っていて同じセルに書き込まないらしいです。 なので意味無いのですがせっかくなのでパーティション分け方法のメモとして残します。

  • ルートパーティションを10Gに拡張
$ sudo fdisk /dev/mmcblk0

Command (m for help): p
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880     XXXXXXX     XXXXXXX   83  Linux

Command (m for help): d
Partition number (1-4): 2
Partition 2 is deleted

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (2048-xxxxxxx, default 2048): 122880   ←元と同じStart
Last sector, +sectors or +size{K,M,G} (8192-xxxxxxx, default xxxxxxx): +10G
Using default value 10485760

Command (m for help): p
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    21094399    10485760   83  Linux

Command (m for help): w

$ sudo reboot
  • ルートパーテションのファイルシステムを再構築します。
$ sudo resize2fs /dev/mmcblk0p2
$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
rootfs          10321208 1462516   8421024  15% /
/dev/root       10321208 1462516   8421024  15% /
devtmpfs          216132       0    216132   0% /dev
tmpfs              44880     232     44648   1% /run
tmpfs               5120       0      5120   0% /run/lock
tmpfs              89740       0     89740   0% /run/shm
/dev/mmcblk0p1     57288   18960     38328  34% /boot


  • 拡張領域に/var用の1Gのパーティションを切ります。
$ sudo fdisk /dev/mmcblk0
Command (m for help): p
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    21094399    10485760   83  Linux

Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): e
Partition number (1-4, default 3): 
Using default value 3
First sector (2048-30881791, default 2048): 21094400    ←End+1
Last sector, +sectors or +size{K,M,G} (21094400-30881791, default 30881791):
Using default value 30881791

Command (m for help): p
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    21094399    10485760   83  Linux
/dev/mmcblk0p3        21094400    30881791     4893696    5  Extended

Command (m for help): n
Partition type:
   p   primary (2 primary, 1 extended, 1 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 5
First sector (21096448-30881791, default 21096448): 
Using default value 21096448
Last sector, +sectors or +size{K,M,G} (21096448-30881791, default 30881791): +1G

Command (m for help): p
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    21094399    10485760   83  Linux
/dev/mmcblk0p3        21094400    30881791     4893696    5  Extended
/dev/mmcblk0p5        21096448    23193599     1048576   83  Linux

Command (m for help): w

$ sudo reboot
  • 作成したパーティションに現在の /var の内容をコピーして次回からマウントされるようにします。
$ sudo mkfs -t ext4 /dev/mmcblk0p5
$ sudo mount /dev/mmcblk0p5 /mnt
$ sudo apt-get install rsync    #デフォルトでは入ってませんでした
$ sudo rsync -av /var/ /mnt
$ sudo vi /etc/fstab  #以下の一行追加
/dev/mmcblk0p5  /var            ext4    defaults,noatime  0       1
$ sudo reboot
$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
   :
/dev/mmcblk0p5   1032088  675428    304232  69% /var


拡張領域に余裕を残してあるのはこの /var に書き込め無くなったら 別のパーティションを切って引っ越す作戦です。

RAMディスクを使う作戦も有るのですが /var 全部はカバーできないしメモリが減るのでこの方法でしばらく試して見ようと思います。



これでやっと落ちついて作業ができます。


2013/07/04

RaspberryPiを購入してみた

気になっていたRaspberry-Piを買ってみた。

購入先は正規代理店の RSコンポーネンツ株式会社 から。

ここはアマゾンより安いのでお勧めだが個人の場合、幾つか注意事項がある。

  • 個人でも「通常のRSとのお取り引き」を選んでユーザ登録を行う。
  • 土日祝日の配送は行わないので配送先に平日受け取れる場所を設定する。
  • 支払いは「クレジット」か「代引」とする。

基本的に法人相手の取り引きを行う会社だが例外的に個人でも受け付けていると形。

で発注すると翌日には届いちゃう。

専用ケースも購入したが保管用のケースが付いてくるのでこれに穴空けしても充分な感じ。

その他に買った物。

SDカードは新調したほうが良いと思うがその他は手持ちがあれば不要。
セルフ電源付きのUSBハブはUSB-HDDとか繋げる時には必要になるので無ければ買って置いた方が良いと思います。

インストール

ググれば沢山出て来ますが一応メモります。

以下のサイトからOS(201X-xx-xx-wheezy-raspbian.zip)をDLします。

展開して中の img ファイルをSDカードに書き込みます。

$ sudo dd if=201X-xx-xx-wheezy-raspbian.img of=/dev/XXX bs=10240000

書き込み先のデバイス名はOS依存です。FreeBSDでUSB接続の場合は /dev/da0 とかです。 Windowsの場合は専用ツールが必要だったりします。適当にググってください。

OSを書き込んだSDカードを挿入し電源を繋げれば起動します。
LANケーブルを差して置けば DHCP で sshd が起動するので ssh で接続します。

$ ssh pi@192.168.0.x
Password: raspberry

ログインできればセットアップ終了です。

動画再生

動画プレーヤーが最初からOSに入っているのでYoutubeから落してきたmp4を再生してみます。

$ omxplayer PentaAsibuto.mp4

Full-HD(1920x1080p/30fps) の動画ファイルをモニタの都合で 1280x720p 再生しています。
この時のCPU使用率は15%程度で、コマ落ち等全くありませんでした。

とりあえず準備が整いました。
大変なのはここからですが...


2013/06/08

UbuntuでMouse over Active windowの設定

Ubuntu ではマウスクリックでウインドウが一番上に来てアクティブ化する。

Windows から入った人は当り前と感じるかも知れないが昔の X Window ではマウスカーソルが乗っているだけでそのウインドウがアクティブになるのが普通だった。 しかもアクティブ・ウインドウが一番上にはならない。

したがって一部でもウインドウが見えていればそのウインドウに入力ができる。

マウス・オーバー・アクティブ・ウインドウと言うんだけど慣れるとウインドウ間のコピペ 等が非常にやりやすくなる。

言葉では分かりづらいと思うが以下の画面の状態のままコンソールにコマンド入力ができる。 ブラウザからコンソールに複数コピペする場合に一々ブラウザが裏に行かないので非常に楽になる。

で、ubuntu でこの状態にする方法が以外に面倒臭かったので忘れないようにメモ

このサイトの情報を元にUbuntu 13.04でclassic-gnomeモード場合はこうする。

$ gsettings set org.gnome.desktop.wm.preferences focus-mode sloppy
$ gsettings set org.gnome.desktop.wm.preferences auto-raise false
$ gsettings set org.gnome.desktop.wm.preferences raise-on-click false

その他の条件は元ネタサイトを参照してください。

ubuntuの人は一度試してみて下さい。戻れなくなります。

Window7でも一応できる様ですが、多分下のウインドウの操作は出来ないでしょう。



プロフィール
20年勤めた会社がリーマンショックで消滅、紆余曲折を経て現在はフリーランスのSE。 失業をきっかけにこのブログを始める。

サイト内検索

登録
RSS/2.0

カテゴリ

最近の投稿【linux】

リンク

アーカイブ