今回は、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
これで毎回、起動時にシンボリックリンクの発行が実行されるため、ポート固定の設定は不要になります。
コメント