USB のブロックデバイス (USB メモリや HDD)を列挙する方法
USB のブロックデバイス (USB メモリや HDD)を列挙する方法 (Part2) の方法もあります。
方法
ls /sys/block/ -1 | \
xargs -I{} echo /sys/block/{} | \
xargs readlink | \
grep usb | sed -e 's!.*/\([a-z]\+\)!\1!'
解説
ブロックデバイスの列挙
-
/sys/block/
以下を列挙すると、linux 上のブロックデバイスを列挙できる。 - 各項目はシンボリックリンクになっている。
- usb のデバイスの場合はシンボリックリンクのパスに
usb
という文字列が含まれる。
ls /sys/block/ -l
合計 0
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop0 -> ../devices/virtual/block/loop0
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop1 -> ../devices/virtual/block/loop1
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop10 -> ../devices/virtual/block/loop10
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop2 -> ../devices/virtual/block/loop2
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop3 -> ../devices/virtual/block/loop3
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop4 -> ../devices/virtual/block/loop4
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop5 -> ../devices/virtual/block/loop5
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop6 -> ../devices/virtual/block/loop6
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop7 -> ../devices/virtual/block/loop7
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop8 -> ../devices/virtual/block/loop8
lrwxrwxrwx 1 root root 0 12月 27 19:08 loop9 -> ../devices/virtual/block/loop9
lrwxrwxrwx 1 root root 0 12月 27 19:08 sda -> ../devices/pci0000:00/0000:00:17.0/ata1/host0/target0:0:0/0:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 12月 27 19:19 sdb -> ../devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host3/target3:0:0/3:0:0:0/block/sdb
lrwxrwxrwx 1 root root 0 12月 27 19:08 sr0 -> ../devices/pci0000:00/0000:00:17.0/ata2/host1/target1:0:0/1:0:0:0/block/sr0
t
USB のブロックデバイスを列挙する
-
ls /sys/block/ -1
の出力をxargs
に渡して、更にreadlink
でシンボリックリンクの実体を列挙する
$ ls /sys/block/ -1 | xargs -I{} echo /sys/block/{} | xargs readlink | grep usb
../devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host3/target3:0:0/3:0:0:0/block/sdb
USB のブロックデバイスの部分を抽出する
sed -e 's!.*/\([a-z]\+\)!\1!'
のような正規表現を使うことで ...block/sdb
の最後の sdb
の部分を抽出する。
最終的に以下のコマンドでデバイスファイルの部分 (sdb など) を抽出できる。
ls /sys/block/ -1 | \
xargs -I{} echo /sys/block/{} | \
xargs readlink | \
grep usb | sed -e 's!.*/\([a-z]\+\)!\1!'
以下のようなコマンドにすると /dev/sdb
という形式で出力できる。
ls /sys/block/ -1 | \
xargs -I{} echo /sys/block/{} | \
xargs readlink | \
grep usb | sed -e 's!.*/\([a-z]\+\)!\1!' | \
xargs -I{} echo /dev/{}
参考情報
ブロックデバイスのサイズ
以下のコマンドで /dev/sdb
のブロックデバイスのセクタサイズを取得できる。
$ cat /sys/block/sdb/size
15646720
/sys/block/sdb/size
の値に 512
を掛けることでブロックデバイス全体のサイズをバイト単位で取得できる。