【Linux】特定のUSBメモリを任意のデバイス名で固定する

USBポートデバイスを固定する Linux
スポンサーリンク

今回は、LinuxでUSBを特定のデバイス名で指定する方法をまとめました。

Linuxでは、USBは/dev/sda1、/dev/sdb1、/dev/sdcといったデバイス名で検出されます。

しかも、USBの挿入順で割り当てが変更されてしまいます。

このデバイス名の検出は不便な場面があったので、指定したデバイス名でUSBを検出する方法をまとめました。

実行環境

以下の環境で試しました。

・Debian・CentOS

・Ubuntu

・LinuxMint

・MXLinux

カーネルバージョン

$ uname -r
4.19.0-6-amd64

今回は、例としてMXLinuxで実行した結果を見ていきます。

udevで特定のUSBデバイスを検出する

現在、検出されているUSBを調べる。(今回の環境では、USBは/dev/sdb1と認識されています。)

mxlinux@mxlinux:~
$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   12G  0 disk 
├─sda1   8:1    0   11G  0 part /
└─sda2   8:2    0    1G  0 part [SWAP]
sdb      8:16   1 14.4G  0 disk 
└─sdb1   8:17   1 14.4G  0 part /media/mxlinux/67240c56-180c-4639-8b44-aa05f
sr0     11:0    1 73.6M  0 rom

現在のUSBデバイス名から、より詳しいデバイス情報を取得するためにudevadmを使用します。

出力される結果はかなり長いので一部抜粋しています。

$ udevadm info -a -p `udevadm info -q path -n /dev/sdb`

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '//devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host3/target3:0:0/3:0:0:0/block/sdb':
    KERNEL=="sdb"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{hidden}=="0"
    ATTR{discard_alignment}=="0"
    ATTR{ext_range}=="256"
    ATTR{events_async}==""
    ATTR{range}=="16"
    ATTR{size}=="30197760"
    ATTR{stat}=="     107        0     4632     2657        4        0        0       41        0     2220     2220        0        0        0        0"
    ATTR{inflight}=="       0        0"
    ATTR{ro}=="0"
    ATTR{alignment_offset}=="0"
    ATTR{capability}=="51"
    ATTR{removable}=="1"
    ATTR{events}=="media_change"
    ATTR{events_poll_msecs}=="-1"
  -省略(結構下の方にあります)-
  looking at parent device '//devices/pci0000:00/0000:00:06.0/usb1/1-2':
    KERNELS=="1-2"
    SUBSYSTEMS=="usb" <-- チェック
    DRIVERS=="usb" <-- チェック
    ATTRS{ltm_capable}=="no"
    ATTRS{urbnum}=="754"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bmAttributes}=="80"
    ATTRS{idProduct}=="1000"
    ATTRS{busnum}=="1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{idVendor}=="8564"
    ATTRS{rx_lanes}=="1"
    ATTRS{authorized}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{version}==" 2.10"
    ATTRS{devpath}=="2"
    ATTRS{serial}=="19USCAHGN6GNFGIK" <-- チェック
    ATTRS{maxchild}=="0"
    ATTRS{devnum}=="3"
    ATTRS{bMaxPower}=="300mA"
    ATTRS{bcdDevice}=="1100"
    ATTRS{manufacturer}=="JetFlash" <-- チェック
    ATTRS{product}=="Mass Storage Device" <-- チェック
    ATTRS{configuration}==""
    ATTRS{speed}=="12"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{tx_lanes}=="1"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{removable}=="unknown"
-以下省略-

ここで必要な情報は上記の「<–チェック」と明記した部分になります。

SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{serial}=="19USCAHGN6GNFGIK"
ATTRS{manufacturer}=="JetFlash"  
ATTRS{product}=="Mass Storage Device"

この情報を.rulesファイルに記述し、USBを特定のデバイス名/dev/USBDEV1で検出できようにします。

この.rulesファイルは、/etc/udev/rules.d/以下に配置し、ファイル名は「10-local-usb.rules」とします。

この「10」という数字は、優先順位を表しています。小さいほど優先順位は高く、数値が大きいほど優先順位は低くなります。

$ sudo vim.tiny /etc/udev/rules.d/10-local-usb.rules
SUBSYSTEMS=="usb",ATTRS{serial}=="19USCAHGN6GNFGIK",NAME="USBDEV1"

ファイルがあるか確認してみます。

$ ls -l /etc/udev/rules.d
合計 16
-rw-r--r-- 1 root root  134  4月 27 22:54 60-vboxadd.rules
-rw-r--r-- 1 root root   97  8月 13  2019 61-optical-polling-rules.rules
-rw-r--r-- 1 root root 1143  9月 15  2019 69-wacom.rules
-rw-r--r-- 1 root root    0 11月  7  2017 80-net-name-slot.rules
-rw-r--r-- 1 root root    0 11月  7  2017 80-net-setup-link.rules
-rw-r--r-- 1 root root    0 11月  7  2017 90-usb-semiauto.rules
-rw-r--r-- 1 root root   66  4月 27 23:20 10-local-usb.rules

設定を反映させるために、とりあえず再起動。

再起動後、マウントできればOKです。

シンボリックリンクを生成してデバイス名を固定する

この方法は、USBデバイス名を固定するのではなく、USBポート名を固定することになります。

ポート1の名称を「USB1」とすると、固定したポートにどんなUSBを挿入しても「USB1」と認識できるようになります。

USBポートのパス情報は、/dev/disk/by-path/以下に情報が格納されています。

$ ls -l /dev/disk/by-path/
合計 0
lrwxrwxrwx 1 root root  9  4月 27 23:35 pci-0000:00:01.1-ata-2 -> ../../sr0
lrwxrwxrwx 1 root root  9  4月 27 23:36 pci-0000:00:06.0-usb-0:2:1.0-scsi-0:0:0:0 -> ../../sdb
lrwxrwxrwx 1 root root 10  4月 27 23:36 pci-0000:00:06.0-usb-0:2:1.0-scsi-0:0:0:0-part1 -> ../../sdb1
lrwxrwxrwx 1 root root  9  4月 27 23:35 pci-0000:00:0d.0-ata-1 -> ../../sda
lrwxrwxrwx 1 root root 10  4月 27 23:35 pci-0000:00:0d.0-ata-1-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10  4月 27 23:35 pci-0000:00:0d.0-ata-1-part2 -> ../../sda2

ls -l コマンドで確認すると、USBポートの情報が、それぞれのデバイスパスへシンボリックリンクが発行されていることがわかります。

システム起動時に、このシンボリックリンクが各デバイスパスに発行されることで、ポート名を固定することができます。

今回は/dev/sdb1を認識しているポートを、「USBDEV1」にポート名を固定します。

$ sudo ln -s /dev/disk/by-path/pci-0000\:00\:06.0-usb-0\:2\:1.0-scsi-0\:0\:0\:0-part1 /dev/USBDEV1

マウントして確認

mxlinux@mxlinux:~
$ sudo mount /dev/USBDEV1 /mnt

上手くマウントできればOK。

 

ただ、このシンボリックリンクは毎回シャットダウン時にリセットされます。

毎回設定が必要になるので、起動時に必ず実行される設定ファイル「rc.local」に先程のシンボリックリンクを登録しましょう。

/etc/rc.local

mxlinux@mxlinux:~
$ cat /etc/rc.local 
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#

ln -s /dev/disk/by-path/pci-0000\:00\:06.0-usb-0\:2\:1.0-scsi-0\:0\:0\:0-part1 /dev/USBDEV1

exit 0

これで毎回、起動時にシンボリックリンクの発行が実行されるため、ポート固定の設定は不要になります。

コメント

タイトルとURLをコピーしました