udevを用いてUSBメモリの挿入を検知しmountコマンドを実行する
udevは、Linuxカーネル用のデバイス管理ツールです。
デバイスが接続もしくは接続解除された時にカーネルはueventをudevに通知します。
この時udevは予め設定しておいたルールに従って、受け取ったueventに対応した処理を行います。
udevを活用することでデバイスの挿抜をトリガに任意のホストコマンドを実行できますので、コンテナ内で何かを設定する必要はありません。
以下ではUSBメモリの挿抜時にmountコマンドを実行し、/mntディレクトリにマウントする例を紹介します。
まず、/etc/udev/rules.d/に、99-usb-automount.rulesというファイルを作成して、以下のように内容を編集します。
[armadillo ~/]# cat /etc/udev/rules.d/99-usb-automount.rules
ACTION=="add", KERNEL=="sd*", SUBSYSTEM=="block", ENV{ID_FS_USAGE}=="filesystem", RUN+="/bin/mount /dev/%k /mnt"
その後、以下のコマンドを実行してudevルールの再読込みを行います。
[armadillo ~/]# udevadm control -R
以上で設定完了ですので、動作確認をしてみます。
[armadillo ~/]# mount | grep /mnt
[armadillo ~/]#
[84250.573893] usb 1-1: new high-speed USB device number 8 using xhci-hcd
[84250.732277] usb-storage 1-1:1.0: USB Mass Storage device detected
: (省略)
[84252.013348] sda: sda1
[84252.020039] sd 0:0:0:0: [sda] Attached SCSI removable disk
[84252.214274] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
[armadillo ~/]# mount | grep /mnt
/dev/sda1 on /mnt type ext4 (rw,relatime)
|
/mntディレクトリに何もマウントされていないことを確認します。
|
|
ここでUSBメモリを挿入します。
|
|
USBメモリが/mntディレクトリに自動的にマウントされていることを確認します。
|
動作確認後、persist_fileコマンドを実行して設定したudevルールを永続化します。
[armadillo ~/]# persist_file /etc/udev/rules.d/99-usb-automount.rules
上記手順ではmountを例に紹介しましたが、他のコマンドやシェルスクリプトの実行なども可能です。
buttondを用いてユーザースイッチの押下を検知してホストコマンドを実行する
Armadillo Base OSには、ユーザースイッチや外付けのキーボードなどの入力をイベントとして検知し、予め定義したルールによってそのイベントに対応させた処理を実行できるbuttondという仕組みがあります。
buttondについての詳細は、Armadillo-IoT ゲートウェイ G4の製品マニュアルの「 ボタンやキーを扱う」を参照してしてください。
以下では、buttondを用いてユーザースイッチを5秒以上長押しするとrebootコマンドを実行する例を紹介します。
まず、/etc/atmark/buttond.confを以下のように作成して、persist_fileコマンドで永続化します。
また、buttondサービスを再起動させます。
[armadillo ~/]# vi /etc/atmark/buttond.conf
BUTTOND_ARGS="$BUTTOND_ARGS -l prog1 -t 5000 -a 'reboot'"
[armadillo ~/]# persist_file /etc/atmark/buttond.conf
[armadillo ~/]# rc-service buttond restart
|
/etc/atmark/buttond.confを作成・編集します。
|
|
persist_fileコマンドで永続化します。
|
|
buttondサービスを再起動させます。
|
その後、Armadillo-IoT ゲートウェイ G4のユーザースイッチ(SW1)を5秒長押しして再起動することを確認してください。
上記手順ではrebootを例に紹介しましたが、他のコマンドやシェルスクリプトの実行なども可能です。