假设我插入了多个未自动安装的 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 sdb
或listusbdisks /dev/sdb
或listusbdisks 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 可用)。