USBメモリを指すポートによって、マウント先を固定する方法

　皆様、お疲れ様です。

　Raspberry Piなどで車載カメラを運用していると、USBメモリの容量が気になり、何本かのUSBメモリを使いまわしたりしたくなりますよね。
　あと、バックアップメディア（外付けHDDとか？）を曜日ごとに変えていて、マウント先は固定しておきたい、ってことありますよね。
　そういう人向けの手順です。

## 1) デバイスの指定には何が使えるの？
　通常、mount ではマウント元に/dev 直下にあるデバイスファイル名を指定します。
　また、/dev/disk/by-uuid以下のUUIDを使用することもあるでしょう。

## 2) なんでUUIDを使用しないの？
　UUID,便利ですよね。「到底誰とも重複することはない」一意なタグを割り当ててくれるので、「特定の機器」を間違いなく判別するのには便利です。
　でも、このUUIDの困ったところは「メディアをフォーマットするとUUIDが変わっちゃう」ことにあります。

``` command:UUIDの変化
yuki@Utsusemi ~ $ ls -al /dev/disk/by-uuid/ | grep sdc
lrwxrwxrwx 1 root root  10  5月  8 02:39 386A-8A21 -> ../../sdc1
yuki@Utsusemi ~ $ ls -al /dev/disk/by-uuid/ | grep sdc
lrwxrwxrwx 1 root root  10  5月  8 02:42 0739-057D -> ../../sdc1
yuki@Utsusemi ~ $ ls -al /dev/disk/by-uuid/ | grep sdc
lrwxrwxrwx 1 root root  10  5月  8 02:43 0AF2-6192 -> ../../sdc1
```
　同じデバイスなのですが、フォーマットするたびに、386A-8A21だったり、0739-057Dだったり、0AF2-6192だったりするのです。
　私の場合、Raspberry Piとmotionの組み合わせで車載カメラを作ってます。　USBメモリをフォーマットしたり、２本使いまわしたりするばあい、UUIDでは指定しにくいのです。
　ちなみに「特定の機器」を間違いなく判別したいのなら、UUIDだけでなく機器本体の固有ID(型番/シリアル番号の組み合わせ）も使えると思いますよ（[補足](http://qiita.com/titilat/items/018d3e1bb845b382c45e#3-1)で後述します）。

## 3) ボリュームラベルを固定しておいたらいいんじゃないの？
　ボリュームラベル,便利（ry
　これも「特定の機器」を人が判別するのには便利なのですが、曜日ごとにUSBメモリを交換する場合だと、全部「BACKUP」とかつけちゃいがちです。これ、何曜日のバックアップ用なの？　とかわからなくなります。

## 4) 接続ポートごとにマウント先を固定したら便利じゃない？
　というわけで、USBの接続ポートごとにマウント先を固定しておけば、いいんじゃないの？　と思いつきました。
　それは/dev/disk/by-pathを見てやればわかります。
　レッドハット社の[25.3. 永続的な命名](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/persistent_naming.html)　によると by-path は各種デバイスの接続先ポートを一意に決めてくれます。

## 5) ではやってみよう。
　事前に、「どのポートがどのようなIDで割り当てられているか？」を確認しておきます。

``` command:/dev/disk/by-pathの割り当て状況
yuki@Utsusemi ~ $ ls -al /dev/disk/by-path
合計 0
drwxr-xr-x 2 root root 120  5月  8 02:42 .
drwxr-xr-x 6 root root 120  5月  8 02:04 ..
lrwxrwxrwx 1 root root   9  5月  8 02:42 pci-0000:00:12.2-usb-0:1:1.0-scsi-0:0:0:0 -> ../../sdc
lrwxrwxrwx 1 root root  10  5月  8 02:43 pci-0000:00:12.2-usb-0:1:1.0-scsi-0:0:0:0-part1 -> ../../sdc1
lrwxrwxrwx 1 root root   9  5月  8 02:04 pci-0000:00:12.2-usb-0:3:1.0-scsi-0:0:0:0 -> ../../sdb
lrwxrwxrwx 1 root root  10  5月  8 02:04 pci-0000:00:12.2-usb-0:3:1.0-scsi-0:0:0:0-part1 -> ../../sdb1
```
 これを見ると、pci-0000:00:12.2-usb-0:1:1.0-scsi-0:0:0:0-part1　というのが、/dev/sdc1と紐付いていることがわかります。
　そこで、マウント先を作っておいてから、/etc/fstabに次のように記述します。

``` command:/etc/fstab
/dev/disk/by-path/pci-0000:00:12.2-usb-0:3:1.0-scsi-0:0:0:0-part1	/media/test	vfat		defaults,user	0	0
```

　上記の場合、特定のUSBポートに差し込んだUSBメモリは/media/testにマウントします。

### [補足]
　機器の固有のIDということなら、by-idでもいいと思いますよ。
　by-id はUUIDと似ているのですが、各デバイスに固有のID(WWID)となります。
　機器のシリアルナンバーなどを元に生成しているので、世界に一つだけのデバイスを指定できます。
　下の出力結果を見てもらってもわかるように、パーテイションの指定も可能です。

``` command:/dev/disk/by-idの出力結果
yuki@Utsusemi ~ $ ls -l /dev/disk/by-id
合計 0
lrwxrwxrwx 1 root root  9  5月  8 02:42 usb-TDK_LoR_TF10_0703419C9446E306-0:0 -> ../../sdc
lrwxrwxrwx 1 root root 10  5月  8 02:43 usb-TDK_LoR_TF10_0703419C9446E306-0:0-part1 -> ../../sdc1
lrwxrwxrwx 1 root root  9  5月  8 02:04 usb-TDK_LoR_TF10_0703419CA2473709-0:0 -> ../../sdb
lrwxrwxrwx 1 root root 10  5月  8 02:04 usb-TDK_LoR_TF10_0703419CA2473709-0:0-part1 -> ../../sdb1
```

あと、上述の[25.3. 永続的な命名](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/persistent_naming.html) によれば、by-path の識別子が指し示すポートは必ずしも永続的ではないようです。
例えば、物理的な構成が変わったりとか、起動時のバスアダプタなどの検出タイミングによっては変化する可能性があったりとかで、確実さは乏しいと思います。
うっかりすると、書き込んじゃまずいデバイスを書き換えてしまったりとかするかもしれません。
ので、自己責任でおねがいしますね。