如果连接物理设备,我怎么知道哪个设备文件属于它?


13

假设我插入了几个不会自动安装的USB驱动器。如何找出哪个设备文件属于哪个物理设备,例如可以挂载它?

我正在运行Mac OS X,但我更喜欢一个在所有(至少是最受欢迎的)Unix系统上都可以使用的答案。过去我在Linux上遇到过这个问题。



在MacOSX上,最简单的方法是通过卷标来识别卷。但是,吉尔斯(Gilles)拥有完美解决方案的权利。
peterh-恢复莫妮卡2015年

Answers:


14

使用udev:

您可以获得有用的信息查询udev(在使用它的系统上-肯定是几乎所有台式机类型的Linux)。例如,如果您想知道与哪个附加驱动器相关联/dev/sdb,可以使用:

udevadm info --query=property --name=sdb

它将显示该设备的属性列表,包括序列号(ID_SERIAL_SHORT)。有了这些信息,您可以查看的输出lsusb -v并找出诸如制造商和产品名称之类的信息。

这样做的更短路径是

udevadm info --query=property --name=sdb | grep "\(MODEL_ID\|VENDOR_ID\)"

$ID_VENDOR_ID:$ID_MODEL_ID在短得多的输出中看到匹配的行 lsusb

另一个有用的选项是udevadm monitor。如果您想知道在连接设备时创建哪个设备节点,请使用它。所以先跑

 udevadm monitor --udev --subsystem-match=block

然后连接设备。您将看到在每个输出行末尾打印的检测到的块设备(磁盘/分区)的设备名称。

一个实用的shell函数示例:

您可以在.bashrc(或.zshrc)中放入以下函数:

listusbdisks() 
{
    [[“ x $ 1” ==“ xv”]] &&移位&&本地VERBOSE = -v
    $ {@-/ dev / sd中的dsk?
    做
        / sbin / udevadm info --query = path --name =“ $ dsk” | grep --colour = auto -q usb || 继续
        回声“ =====设备$ dsk是:”
        (eval $(/ sbin / udevadm info --query = property --name =“ $ dsk” | grep“ \(MODEL \ | VENDOR \)_ ID”)
          [“ $ ID_VENDOR_ID:$ ID_MODEL_ID” ==“:”] &&回显“未知” || \
            lsusb $ VERBOSE -d“ $ ID_VENDOR_ID:$ ID_MODEL_ID”
        )
        grep -q“ $ dsk” / proc / mounts && echo“ -----设备已安装----”
        回声
    做完了
}

像这样使用它:

  • listusbdisks-识别所有/dev/sdx设备;
  • listusbdisks sdblistusbdisks /dev/sdblistusbdisks sdb sdc-获得有关特定设备的信息而已;
  • listusbdisks -v [optional devices as above] -显示的详细输出 lsusb

[编辑]:添加了一些功能,例如查询许多设备,检查安装和控制的详细程度lsusb


就其真实程度而言,确实足够,但并非所有系统都使用udev
Caleb

@Caleb True ...实际上,lsusb它也是一个可选程序。但是两者都是非常普遍的。
rozcietrzewiacz 2011年

@rozcietrzewiacz问题主要与OSX有关,但udev本质上是针对Linux的。
吉尔(Gilles)“所以,别再邪恶了”,

@吉尔好吧,是的。我没有使用OSX的经验,所以我只是更新了答案,以免引起误解。
rozcietrzewiacz 2011年

在这种情况下,我通常要做的是,将设备插入电源并立即运行dmesg。但是,如果已经插入设备并且在第一个设备之后插入了更多设备,这将无济于事。:)
Abhishek

3

没有普遍的答案。在Linux上,最简单的方法可能是启动gnome磁盘实用程序,它将显示所有检测到的磁盘(无论是否已安装)。在命令行中,您可以查询blkid或的输出udevadm info --export-db


3

在Mac OS X中,您可以尝试使用diskutil list


1

对于所有Unix,我认为这是不可行的。

如今,通常的外部总线不像IDE那样为它们的端口使用固定的编号方案。因此,所需的映射剩下的唯一数据源是驱动器的制造商名称,序列号或分区的UID。

制造商名称在给定的机器上不一定是唯一的(假设您连接了同一系列的两个外部驱动器-它们将标识相同)。序列号不像分区UID那样“从外部可见”。

因此,关于唯一可以想到的通用解决方案,是使用序列号标记物理驱动器,并使用rozcietrzewiacz的答案中给出的udevadm命令(如果UDEV可用)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.