ヘッドレスなラズパイで、デバイスを抜き差しする時にマウントを自動で行ってみます。
まぁ、使うシチュエーションは限定的だと思いますが….。
データを「小分け」にして持つという発想です。
こんなイメージですかねぇ。
マウントとアンマウント用のシェルスクリプト作成
と、その前にマウントするデバイス名を固定しておきます。
通常デバイス名は/dev/sdaとか/dev/sdbと表示されますが、これは起動時に入れ替わる可能性があります。
USBメモリーのようなブロックデバイス名はいつもいっしょというわけではないので、マウントコマンド作成時には考慮します。
ほぼ変動しないUUIDを使います。
UUID(Universally Unique Identifier)確認
デバイスチェックします。
sudo fdisk -l
以下のコマンドでUUIDを確認します。
ls -l /dev/disk/by-uuid/
OR
sudo blkid /dev/sda1
こんな感じです。これは一例ですが、CAB2-5726というのが/dev/sdaのUUIDです。
ここで確認されたUUIDはデバイス名が/dev/sdaであろうと/dev/sdbになろうと同じです。
マウント用シェルスクリプトの例
UUIDを使ってマウントします。
CAB2-5726は例です。
uidやgidの値はidコマンドで確認してください。
/var/lib/mod_tile/ajtがマウントポイントだとします。
【mount_usb.sh】
1 2 3 4 5 |
#!/bin/sh echo "ユーザーパスワード" | sudo -S mount -o owner,uid=1001,gid=1001,utf8,flush UUID="CAB2-5726" /var/lib/mod_tile/ajt exit 0 |
パーミッション設定
sudo chmod 777 mount_usb.sh
アンマウント用シェルスクリプトの例
【umount_usb.sh】
1 2 3 4 |
#!/bin/sh echo "ユーザーパスワード" | sudo -S umount /var/lib/mod_tile/ajt exit 0 |
パーミッション設定
sudo chmod 777 umount_usb.sh
注:
マウント先のデバイスがexFatでフォーマットされている場合
現在Ubuntuはこのフォーマットをデフォルトでサポートしていません。
以下をインストールしておきます。
1 |
sudo apt-get install exfat-fuse exfat-utils |
USBストレージの挿入を待ち受けます
Pythonで書くなら、例えばこんな感じのコードです。デバイス管理ツールのudevを使います。
sudo apt-get install python-pyudev
cd ~/
sudo nano usb_monitor.py
【usb_monitor.py】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import pyudev import subprocess import time context = pyudev.Context() monitor = pyudev.Monitor.from_netlink(context) monitor.filter_by(subsystem='usb') monitor.start() bind_flag = False for device in iter(monitor.poll, None): if(device.action == "bind"): if(bind_flag == False): time.sleep(2) cmd = "/home/tileserver/mount_usb.sh" res = subprocess.call(cmd) bind_flag = True if(device.action == "unbind"): if(bind_flag == True): cmd = "/home/tileserver/umount_usb.sh" res = subprocess.call(cmd) bind_flag = False |
パーミッション設定
sudo chmod 777 /home/tileserver/usb_monitor.py
rc.localで起動時に待ち受け用Pythonを起動
sudo nano /etc/rc.local
1 2 |
#!/bin/sh /home/tileserver/usb_monitor.py |
パーミッション設定
sudo chmod 777 /etc/rc.local
USBストレージが挿したままなら抜いてから….
おまじない
sudo chmod -R a+x /var/lib/mod_tile
ラズパイを再起動
こういうのが必要になる具体例
OSMタイルサーバーにしたラズパイをWi-Fiのアクセスポイントにしてみる
で、例えば旅行に行く際にアドホックに地図を使うという前提で
USBメモリーAには東京のタイルデータ、USBメモリーBには大阪のタイルデータ、USBメモリーCには京都のタイルデータを入れとけば旅先でそれぞれの地図が使えます。
そうでなければ、スマホでGoogle Mapsを使うほうが便利です。
なんでこんなことをするかというと、例えば、Google Mapsを見て「この地図、見ずらい!もっと見やすい自分だけの地図が欲しい!」という欲望をOpenStreetMapで実現するためですね、まぁそれ以外にもいろいろありますけど(^^)。
シングルボードコンピューターにOpenStreetMapのタイルサーバーを立ててみる
JOSMによる地図データ編集は準備中(変更点の差分をローカルのDBに戻すのは、ちと厄介そうなのでしばしお待ちください)
現状アドホックに起動したヘッドレスラズパイをシャットダウンする方法は
端末からSSH接続してシャットダウンコマンドを実行するしかないですが……
USBストレージを抜くときにdevice.actionのunbindイベントが検出された際にアンマウントを実行していますが、このタイミングでシャットダウンを実行する手もあります。その際はdevice.get()でID_MODEL_IDやID_SERIAL_IDなどを見て特定のUSBデバイスの場合は…という識別が必要になると思います。
USBストレージ接続しても無事起動する場合にUSBストレージを自動マウントしてみる
起動時にマウントする場合、/etc/fstabに以下を記述
UUID=[UUID] [マウント先のディレクトリ] [フォーマット(vfat、ext4等)] defaults,nobootwait 0 0
nobootwaitでポートにストレージが無い場合に途中で起動がストップするのを回避します。
ただし、起動時マウントに失敗する場合もあります。なぜかvfatを認識してくれない。その場合はマニュアルでマウントしてください。
例
1 2 3 |
sudo nano /etc/fstab UUID=826F-FF52 /var/lib/mod_tile/ajt vfat defaults,nobootwait 0 0 |
Leave a Reply