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

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

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

我正在运行 Mac OS X,但我更喜欢一个适用于所有(或至少是最流行的)Unix 系统的答案。我以前在使用 Linux 时也遇到过这个问题。

答案1

使用 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) 中的函数:

列出usbdisks ()
{
    [[ "x$1" == "xv" ]] && 移位 && 本地 VERBOSE=-v
    对于${@-/dev/sd?}中的dsk
        /sbin/udevadm 信息 --query=path --name="$dsk" | grep --color=auto -q USB ||继续
        echo "===== 设备 $dsk 是:"
        ( eval $(/sbin/udevadm info --query=property --name="$dsk" | grep "\(MODEL\|VENDOR\)_ID")
          [ "$ID_VENDOR_ID:$ID_MODEL_ID" == ":" ] && echo "未知" || \
            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.

答案2

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

答案3

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

答案4

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

如今,常见的外部总线并不像 IDE 那样对其端口使用固定的编号方案。因此,您需要的映射的唯一剩余数据源是驱动器的制造商名称、其序列号或分区的 UID。

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

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

相关内容