如何知道 /dev/sdX 是连接的 USB 还是 HDD?

如何知道 /dev/sdX 是连接的 USB 还是 HDD?

我如何知道是本地 HDD 还是 USB 闪存盘?我更喜欢一种没有root权限的方法。/dev/sdX

好的,udevadm帮助很大:

对于本地硬盘:

udevadm info --query=all --name=sdb | grep ID_BUS
E: ID_BUS=ata

对于 USB 密钥:

udevadm info --query=all --name=sdc | grep ID_BUS
E: ID_BUS=usb

答案1

有几种方法可以在没有 root 权限的情况下进行判断,其中许多方法很棘手/hacky:

使用/dev/disk/by-id

find /dev/disk/by-id/ -lname '*sdX'

如果它的响应类似于/dev/disk/by-id/usb-blah-blah-blah,那么它就是 USB 磁盘。其他前缀包括ata, dm, memstick,scsi等。

使用/dev/disk/by-path没有显着不同:

find /dev/disk/by-path/ -lname '*sdX'

你会得到类似的东西/dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0。这显示了通往磁盘的设备路径。在这种情况下,大致路径是 PCI → USB → 磁盘。 (注意-usb-)。

使用 udev(我运行 Debian。我的udevadm不在/sbin我的上$PATH——你的可能在其他地方,在你的 上或之外$PATH):

/sbin/udevadm info --query=all --name=sdX | grep ID_BUS

您将获得设备所在的总线类型。删除| grep ID_BUS以获得完整的信息列表(您可能需要添加|less)。

如果你已经lshw安装了,惠更斯的回答可能还可以工作:

lshw -class disk -class storage | less

并查看磁盘的输出。在 中less,尝试/sdX 并查看前面的bus info几行 - 第一行只会说scsi@…,但前面的几行会更具启发性。然而,你确实应该作为超级用户运行它,所以它可能不适合。 (症状:在我尝试过的笔记本电脑上,它列出了 SATA 磁盘,但没有列出 USB 磁盘 — 运行时sudo列出了​​两者)

还有其他的,或多或少比这些直接的。

答案2

您可以使用lsblk报告TRAN (设备传输类型):

lsblk -do name,tran

NAME TRAN
sda  sata
sdb  sata
sdd  usb

其中-dor--nodeps表示不打印从属设备,-o name,tran--output name,tran表示仅列出设备名称和设备传输类型。添加rm到输出列列表以查看哪些设备可移动(1如果true):

lsblk --nodeps --output NAME,TRAN,RM

NAME TRAN   RM
sda  sata    0
sdb  sata    0
sdd  usb     1

或者-n删除标题,例如仅打印特定驱动器的传输类型:

lsblk -ndo tran /dev/sdb

sata

请注意,现代版本lsblk2.27和更新版本)支持JSON输出,因此您也可以执行以下操作:

lsblk -Jdo name,tran | jq -r '.blockdevices[] | select(.tran=="usb") | .name'

仅列出USB总线上连接的块设备。

答案3

我知道一个解决方案,但遗憾的是,它需要 root 权限。无论如何,您可能仍然发现它很有用:

sudo lshw -class disk -class storage

对于每个设备,它将打印逻辑名称(例如,/dev/sda)和总线信息,如果是 USB 设备,则类似于“usb@1:2”。

示例输出:

[...]
  *-storage
       description: SATA controller
       physical id: d
       bus info: pci@0000:00:0d.0
       configuration: driver=ahci latency=64
[...]
     *-disk:0
          description: ATA Disk
          physical id: 0
          bus info: scsi@2:0.0.0
          logical name: /dev/sda
[...]
  *-scsi
       physical id: 3
       bus info: usb@1:2
       configuration: driver=usb-storage
     *-disk
          description: SCSI Disk
          physical id: 0.0.0
          bus info: scsi@6:0.0.0
          logical name: /dev/sdc
[...]

答案4

只需读取 的值/sys/block/sdX/removable

例如:

$ cat /sys/block/sda/removable
0
$ cat /sys/block/sdc/removable
1

/dev/sdc是 USB 密钥(可以是 SD 卡或任何其他可移动介质)。

相关内容