哪个硬盘是哪个?

我想知道哪个硬盘驱动器对应哪个设备路径。将硬盘统计信息(品牌、大小)与设备路径匹配是很简单的,但我想要更多。我想知道机箱内的每个驱动器是哪一个。有什么好方法可以获取这些信息吗?
限制条件:
- 我很懒。我不想拆开服务器把所有的硬盘都拿出来,然后逐个添加回去。 - 可以接受重新启动。 - 硬盘在机箱中被挤在一起,标签信息被隐藏起来。 - 机箱可以打开。大多数硬盘是SATA接口,理论上支持热插拔。拔掉连接线是可以的。
奖励:
我将奖励给最佳/最简单的图形界面或命令行界面答案,并给予另一种类型的次佳答案一份赏金。我更喜欢命令行界面的答案,但我知道很多其他人会喜欢一个好用的点-and-click方法。
10个回答

磁盘工具
这是一个图形用户界面应用程序,可以提供有关驱动器型号、大小、序列号和设备路径的信息。它在Ubuntu桌面版中默认安装。您可以按下Ubuntu Dash按钮并搜索“磁盘工具”来找到它,或者在终端中运行palimpsest命令。

Disk Utility


4而且您只需要用一只手和一根手指,这就是我所说的节能保护地球的方式:“使用磁盘工具”。 - Allan
4我认为这将是答案,其中“位置:SATA主机适配器的X端口”是杀手功能。不过,我也很想看到一些命令行界面的答案。Octavian和faustus提供了一些有趣的解决方案。 - djeikyb

hdparm -i /dev/sdX给出了硬盘的序列号,这是我知道的区分相同品牌和大小的硬盘最简单的方法。

序列号通常打印在硬盘上的标签上,所以虽然你需要打开机箱找到它,但无需拆下计算机。

例子:

$ sudo hdparm -i /dev/sdb | grep -i serial
 Model=SAMSUNG HD253GJ, FwRev=1AJ10001, SerialNo=S24JJ90Z505435

如果你想要更多信息,lshw -c storage -c disk 提供了最易读的输出。它基本上是与磁盘工具相同的数据,只是以命令行格式呈现。
以下是我能够访问的最复杂设置的一个带注释的示例,包括四个磁盘控制器、七个硬盘、一个DVD光驱和一个USB磁盘。
为了突出有趣的部分,输出已经被缩小了规模。
[server ~]$ sudo lshw -c storage -c disk
  *-storage   
  # a 2-port PCI-E SATA controller
       description: SATA controller
       product: 88SE9123 PCIe SATA 6.0 Gb/s controller
       vendor: Marvell Technology Group Ltd.
     *-disk
          description: ATA Disk
          product: WDC WD15EADS-00P
          vendor: Western Digital
  # 'physical id' corresponds to port number, first port is 0
          physical id: 0  
          logical name: /dev/sdg
          serial: WD-WMAVU0849124
          size: 1397GiB (1500GB)
     *-cdrom
          description: DVD reader
          product: BD-ROM BR-5100S
          vendor: Optiarc
          physical id: 1
          logical name: /dev/cdrom1
          logical name: /dev/dvd1
          logical name: /dev/scd0
          serial: [Optiarc BD-ROM BR-5100S 1.02 May20 ,2008
  *-storage
  # mobo controller for eSATA ports. Not used.
       description: SATA controller
       product: JMB362/JMB363 Serial ATA Controller
       vendor: JMicron Technology Corp.
  *-ide
  # mobo controller for IDE. Not used.
       description: IDE interface
       product: JMB362/JMB363 Serial ATA Controller
       vendor: JMicron Technology Corp.
  *-storage
  # the primary SATA controller, six ports
       description: SATA controller
       product: 82801JI (ICH10 Family) SATA AHCI Controller
       vendor: Intel Corporation
  # 'disk:0' means port 0, same as physical id
     *-disk:0
          description: ATA Disk
          product: WDC WD1600BEVS-0
          vendor: Western Digital
          physical id: 0
          logical name: /dev/sda
          serial: WD-WXEY08T58317
          size: 149GiB (160GB)
     *-disk:1
          description: ATA Disk
          product: ST32000542AS
          vendor: Seagate
          physical id: 1
          logical name: /dev/sdb
          serial: 5XW1RTDS
          size: 1863GiB (2TB)
     *-disk:2
          description: ATA Disk
          product: ST32000542AS
          vendor: Seagate
          physical id: 2
          logical name: /dev/sdc
          serial: 5XW23W0W
          size: 1863GiB (2TB)
     [...]
  *-scsi
  # the USB disk, as evidenced by the bus info 
       physical id: 1
       bus info: usb@1:1
       capabilities: emulated scsi-host
     *-disk
          description: SCSI Disk
          product: 10EAVS External
          vendor: WD
          physical id: 0.0.0
          logical name: /dev/sdh
          serial: WD-WCAU46029507
          size: 931GiB (1TB)

我认为磁盘工具读取速度更快;命令行版本的优势在于可以通过ssh和脚本使用。
而且我仍然认为序列号是最可靠的解决方案 :)
每个驱动器的“物理ID”对应着它连接到主板的位置,并以0开头。因此,物理ID为2意味着该驱动器连接到您的主板或其他适用设备的第三个SATA端口。

有趣。序列号/标签是很好的,但在我的情况下,硬盘被塞进一个支架里,挡住了贴纸的视线。我能做的最好的办法就是追踪电缆。我在hdparm -i中没有立即发现任何有用的信息,但我将不得不阅读手册,看看是否能从中获取更多信息。 - djeikyb
哈哈,这个串行确实是最可靠的,但它提供了Linux设备识别和物理连接的有用的地图...通过命令行界面。谢谢! - djeikyb

打开机箱,用卷起来的《Linux Journal》副本听一下硬盘的声音。然后依次对每个硬盘运行dd命令,产生一些磁盘噪音。

2听诊器赢在起跑线上 - Jeremy
2喜欢这个答案。我更喜欢palimpsestlshw的技术输出,但这个也是一个不错的选择。 - djeikyb
SSD不会产生噪音。此外,如果您有多个硬盘并且其他进程同时从两个硬盘读取数据,该解决方案将无法起作用。 - Sergiy Kolodyazhnyy
此外,如果您通过ssh或RDP与远程服务器进行工作,这也不会有所帮助。 - Sergiy Kolodyazhnyy
2那个“嗖嗖”的声音是什么呢? - jjg

你可以从/sys(或者说/dev)获取那些信息。
anthony@Zia:~$ ls -l /sys/block/ | grep sd.
lrwxrwxrwx 1 root root 0 Feb 25 13:30 sda -> ../devices/pci0000:00/0000:00:1f.2/host2/target2:0:0/2:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 Feb 25 13:30 sdb -> ../devices/pci0000:00/0000:00:1f.2/host3/target3:0:0/3:0:0:0/block/sdb
lrwxrwxrwx 1 root root 0 Feb 25 13:30 sdc -> ../devices/pci0000:00/0000:00:1f.2/host4/target4:0:0/4:0:0:0/block/sdc
lrwxrwxrwx 1 root root 0 Feb 25 13:30 sdd -> ../devices/pci0000:00/0000:00:1f.2/host5/target5:0:0/5:0:0:0/block/sdd

所以,你可以看到我的四个硬盘位于2至5号端口(主机/目标)。
你还可以在`/dev/disk/by-path`上执行`ls -l`命令,并在那里查看它。

2+1 是为了从 /sys 和 /dev 获取基本信息。我仍然更喜欢来自已接受解决方案的汇总信息,但是知道如何获取和阅读基本信息是非常宝贵的。这是 @j-g-faustus 和 @Allan 给出的较大答案中缺失的部分。 - djeikyb
实际上,如果你运行strace -e trace=open lsblkstrace -e trace=open lsblk,那就是被读取的确切数据。这个回答值得更多的赞同。 - Sergiy Kolodyazhnyy

我推荐使用hwinfo --disk
这将列出您硬盘的所有相关信息。如果您需要更多关于分区的信息,可以使用hwinfo --partition
您可以将上述两者结合起来,并使用--short选项以获得更简洁的表示形式。

这看起来非常有希望,特别是SysFS和Device Files这两行,但我不确定如何将它们翻译成英文。 - djeikyb

Hardinfo是一个图形用户界面,它允许您收集系统信息,其中可能包括但不限于物理连接的存储设备和文件系统,如下图所示:

enter image description here

enter image description here

Hardinfo网站:http://hardinfo.berlios.de/HomePage

cat /proc/partitions显示内核检测到的分区/磁盘,您可以通过大小来确定。

enter image description here

智能控制器 -i /dev/sda

enter image description here


最快最简单的方法

1. 打开 Gnome-Terminal

2. 输入 sudo blkid

3. 输入密码

4. 它会以易于阅读的格式告诉你哪个驱动器是哪个


如果你想找一种方法,而不需要看到标签,据我所知其他回答都没有这个功能。我建议卸载所有的驱动器(如果可能的话,你可能需要从光盘启动来完成这个操作)。所有的驱动器现在应该停止旋转。然后你可以逐个挂载每一个驱动器,并听或感受哪一个开始旋转。这样你只需要打开机箱盖子,但不需要看到标签,这对于它们都纠缠在一起的情况很方便。
简单吧。

核心问题:
我想知道哪个硬盘驱动器对应哪个设备路径。
命令行方法:
  1. 基本且更实用的方法是通过检查/dev/文件系统。在/dev/disk/目录下有几个包含设备文件符号链接的目录,这些目录按照UUID、id、路径在/sys文件系统中进行组织,并且还有标签(如果设备/分区有标签)。例如,如果我知道要查找的驱动器的UUID,我可以像这样操作:

    $ find /dev/disk/by-uuid/ -mindepth 1 -printf "%p >>> %l\n"
    /dev/disk/by-uuid/8e344ab1-5eb5-4e20-becd-4147fffd439f >>> ../../sdb6
    /dev/disk/by-uuid/483CDA9D3CDA84FA >>> ../../sdb5
    /dev/disk/by-uuid/32AE5766AE5721A1 >>> ../../sdb4
    /dev/disk/by-uuid/7852-5217 >>> ../../sdb2
    /dev/disk/by-uuid/D668510B6850EC2D >>> ../../sdb1
    /dev/disk/by-uuid/B8E453D4E453940A >>> ../../sdb3
    /dev/disk/by-uuid/86df21bf-d95f-435c-9292-273bdbcba056 >>> ../../sda1
    
  2. Ubuntu默认配备了UDisks磁盘管理器。它有几个实用工具供用户使用。方法#1的信息已经被解析以方便用户使用。例如,要简单地找出哪个设备对应于哪个硬盘型号,我们可以这样做:

    $ udisksctl  status
    MODEL                     REVISION  SERIAL               DEVICE
    --------------------------------------------------------------------------
    Radeon R7                 1.01      A22MD061520000172    sda     
    TOSHIBA MQ01ABF050        AM0P3M    Z4GRCSXAT            sdb     
    

    通过udisksctl info -b /dev/sda1命令可以获取特定设备的高级信息,通过udisksctl dump命令可以获取所有设备的信息。udisksctl monitor命令可用于连接/断开物理驱动器。

如果你想将UUID与特定驱动器匹配,你可以使用grep来过滤udisksctl info的结果。
    $ udisksctl info -b /dev/sda1 | grep 'IdUUID:\|Id:'                                                   
    Id:                         by-id-ata-Radeon_R7_A22MD061520000172-part1
    IdUUID:                     86df21bf-d95f-435c-9292-273bdbcba056

GUI方法:

利用UDisks在进程间通信总线dbus上发布的信息,我为Ubuntu Unity桌面写了一个指示器(尽管它也可以在其他桌面环境中使用)。最初它是为文件系统使用指示器编写的(请参阅链接获取安装说明)。它可以方便地显示所有已挂载驱动器的信息,还有一些其他功能,比如点击分区/设备并在文件管理器中打开相应的目录。

enter image description here


这里有很多好的信息。但是你关于开发/系统文件系统的建议引出了一个问题:“我如何知道哪个物理硬盘具有带有此 UUID 的分区”。这正是我一开始问的。 - djeikyb
@djeikyb 那实际上是我在解决我提到的指示器时遇到的问题之一,udisksctl可能是最简单的方法-你可以使用grep过滤设备+UUID行。我将编辑到我的问题中。至于定制解决方案,当然可以用Perl、Python甚至Shell脚本编写,其中你遍历/dev/disk/by-id并将其与/dev/disk/by-uuid中的符号链接进行匹配。 - Sergiy Kolodyazhnyy
@djeikyb 所以,你基本上想知道哪些连接器被哪个驱动器使用,对吗?而且不知道型号或硬盘是什么? - Sergiy Kolodyazhnyy
@djeikyb 我已经阅读了那篇文章,他们关注的是每个磁盘的序列号...这也是我在udisksctl status部分提供的信息。 - Sergiy Kolodyazhnyy
@djeikyb 有趣。默认的磁盘工具palimpset已经被改名为gnome-disks-utility,但是它不再拥有"位置"选项了。至少在我使用的16.04版本上是这样的。 - Sergiy Kolodyazhnyy
让我们在聊天中继续这个讨论。 - djeikyb