我如何知道是本地 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
其中-d
or--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
请注意,现代版本lsblk
(2.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 卡或任何其他可移动介质)。