我可以标记磁盘设备而不是分区吗?


24

我知道将标签附加到磁盘分区的e2label and friends程序,例如

e2label /dev/sda1 bla

我要做的事情有所不同:我想为硬盘创建标签,即/ dev / sda,而不是分区。

那可能吗?如果可以,怎么办?

编辑:背景:在具有多个HD托架的情况下,我想在物理托架的门上贴上(纸)标签,并在逻辑上将相同的标签贴在我放入的磁盘上。

EDIT2:这是关于Ubuntu Linux 12.04服务器。

EDIT3:在GPT分区上,还有partlabel,可以使用例如parted来设置。参见/server//q/681088/76442


1
这是一个很好的问题,因为您是最合适的人,知道了正确的概念。标签的主要目的是即使在下次重新启动后枚举不同的驱动器时也唯一地标识分区。但是,尽管驱动器可能会重新排序,但分区仍固定在其驱动器上。因此,为驱动器提供UUID /标签而不是分区会更正确。这意味着分区将被命名为UUID / 1,UUID / 2等。向分区添加标签没有错,但是默认情况下应该是对每个驱动器而不是对每个分区使用UUID。
PatrickHäcker2013年

谢谢,但是我怀疑我真的是第一个。这个问题困扰了我很久了。
dummzeuch 2013年

1
如果将磁盘格式化为GUID分区表(GPT)而不是MSDOS或UNIX(使用gnu parted)。您的驱动器将具有一个uuid,分区将具有一个uuid,而ext2 / 3/4驱动器可以具有自己的uuid。我通常可以使用/ dev / disk / by-uuid和/ dev / disk / by-partuuid找到分区
Rahly 2013年

Answers:


9

您的第一个问题已经有了一些很好的答案,因此,我将重点关注您问题的背景,给磁盘加上标签。

我使用驱动器的序列号来打印热插拔托架的标签-这是唯一且一致地标识驱动器的最佳方法。无论插入哪个托架或哪个控制器,它都不会改变。

您没有提到使用的是Linux还是其他Unix,但是在Linux中,您可以通过/来获得磁盘(及其分区,我们要排除的分区)及其品牌,型号和序列号的列表。 dev / disk / by-id /目录。我发现以下bash别名对此有用:

alias list_disks='find /dev/disk/by-id/ -iname 'scsi-*' | grep -v -- -part | while read disk ; do echo $(readlink $disk | sed -e s:../../:: ) $(basename $disk); done'

(匹配scsi-*查找所有“ scsi类”驱动器,包括SATA和SAS驱动器。在只有SATA驱动器的系统上ata-*也可以工作)

例如,在我的ZFS服务器系统之一上,它会产生如下输出:

#list_disks | 分类
sdb scsi-SATA_WDC_WD10EACS-00Z_WD-WCASJ2195141
固态硬盘scsi-SATA_WDC_WD10EACS-00Z_WD-WCASJ2114122
sdd scsi-SATA_ST31000528AS_9VP4P4LN
sde scsi-SATA_ST31000528AS_6VP3FWAG
sdf scsi-SATA_ST31000528AS_9VP509T5
固态硬盘scsi-SATA_ST31000528AS_9VP4RPXK
固态硬盘scsi-SATA_OCZ-VECTOR_OCZ-0974C023I4P2G1B8
sdi scsi SATA_OCZ-VECTOR_OCZ-8RL5XW08536INH7R
sdj scsi-SATA_ST31000528AS_9VP18CCV
固态硬盘scsi-SATA_WDC_WD10EARS-00Y_WD-WMAV50933036

如您所见,/ dev / disk / by-id列表包括每个驱动器的品牌和型号以及序列号。它们都是插入LSI SAS-2008控制器上的SATA端口或SAS端口的SATA驱动器。

如果我连接了标签打印机,则根据的输出来打印标签将很容易list_disks。我改用了旧的手动标签书写器,因为那是我的手。打印的标签仅包含序列号,而没有品牌/型号(这足以让我在需要时识别驱动器)。当驱动器发生故障并需要更换时,这些标签非常方便。


我认为这是解决我的实际问题的最佳方法,但是我不能接受它作为答案,因为它不能回答问题。除非我修改这个问题,否则可能不是一个好主意。谢谢。
dummzeuch

没问题,正如您所说,它并没有直接回答问题。但是它很有用,希望其他人将来会发现它有用。顺便说一句,这是别名的改进版本:alias list_disks='find /dev/disk/by-id/ -iname scsi-* -o -iname usb-* | grep -v -- -part | while read disk ; do echo $(basename $(readlink $disk)) $(basename $disk); done | sed -re "s/(usb|scsi)-// ; s/(SATA|Generic)_//" | sort'。它还会找到USB磁盘,并清除输出中的无关数据。
cas

7

如果我们正在谈论的是Linux,那么我认为您可以实现udev创建与设备的符号链接所需要的功能。如果您查看/etc/udev/rules.d,则有一个名为70-persistent-cd.rules的文件,其内容包含以下行:

SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:1f.2-scsi-:0:0:0", SYMLINK+="cdrom", ENV{GENERATED}="1"

这样做是为了创建/dev/cdrom到由其PCI总线地址标识的设备的符号链接。您应该能够通过使用HDD(托架号?对不起,没有经验)识别HDD,并使用与上述类似的语法添加符号链接/dev/bay1(例如)来完成所需的操作。以下有关编写udev规则的文章可能会有所帮助:

编写udev规则

注意

由于slm的回答,请注意,此解决方案使标签专门针对HDD托架而不是其内部的磁盘。因此,如果您使用标签/dev/bay1/dev/bay2并且在托架1中有硬盘A,在托架2中有硬盘B,则/dev/bay1指的是磁盘A,也/dev/bay2指的是磁盘B。如果出于某种原因交换了A和B磁盘,您会/dev/bay1提到磁盘B和/dev/bay2磁盘A。从您的问题来看,我认为这是您的意图。如果我错了,请纠正我。


1
我建议使用型号和序列号进行此类匹配。它仍然带有slm提到的警告,但可以确保磁盘“标签”保持一致,无论它或系统中任何其他磁盘发生了什么。
2013年

最好还是选择保证唯一的WWN。看到这个答案
汤姆·黑尔

6

您没有e2label分区,而是e2label文件系统。这些文件系统可以位于文件分区上,整个磁盘上,网络块设备上……都没关系。

因此,是的,如果直接存在一个ext2 / 3/4文件系统/dev/sda,则可以将其标记为与on相同/dev/sda1

现在,如果没有直接在其中的文件系统,/dev/sda但是例如/dev/sda将其分区(使用GPT,MBR,LVM ...)分成几个分区,那么显然不能使用e2label /dev/sda

在GPT分区中,您可以为分区指定名称,因此可以创建一个具有一个扇区的大分区,该分区的名称可以帮助您识别磁盘。您可以使用中的c命令来执行此操作gdisk


3

要回答您的问题,是否可以标记磁盘而不是分区的磁盘,答案是否定的。我不知道这样做的任何方法。

您可以使用@JosephR概述的方法,但是要意识到此设置取决于系统,因此,如果要将该HDD带到另一个系统,则他建议的“标签”将丢失。它没有以任何有意义的方式绑定到磁盘。

顺便说一句,您可以使用该blkid命令查看不同驱动器的标签和UUID集。

$ blkid
/dev/sda1: LABEL="SYSTEM_DRV" UUID="XXXXXX" TYPE="ntfs" 
/dev/sda2: LABEL="Windows7_OS" UUID="XXXXXX" TYPE="ntfs" 
/dev/sda3: LABEL="Lenovo_Recovery" UUID="XXXX" TYPE="ntfs" 
/dev/sda5: UUID="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" TYPE="ext4" 
/dev/sda6: UUID="XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXfG93LA" TYPE="LVM2_member" 
/dev/mapper/vg_grinchy-lv_root: UUID="XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXX" TYPE="ext4" 
/dev/mapper/vg_grinchy-lv_swap: UUID="XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXX" TYPE="swap" 
/dev/mapper/vg_grinchy-lv_home: UUID="XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXX" TYPE="ext4" 

关于该设置取决于系统的要点。从这个问题来看,我认为OP意识到了这一点:他们想标记HDD托架而不是内部的实际硬盘驱动器。我将其添加为我的答案的注释,以防万一。
Joseph R.

@Marco但blkid似乎只列表分区而不是设备,这也不是什么OP是感兴趣的
约瑟夫·

不,我实际上想标记磁盘,而不是托架。但是我会考虑这个选项。
dummzeuch

可能的标记磁盘,Linux本身做这/dev/disk/by-id,你可以做到这一点udev风格,如图这个答案
汤姆·黑尔

@TomHale-你错过了我的意思。该标签不应用于HDD本身,而是在Linux系统自身中维护。如果要从系统中删除该HDD,则该标签在将要安装HDD的其他系统上不再可用。它取决于系统,因此我的建议是正确的。请颠倒您的DV。
slm

3

我认为您的主要目标是明确标识物理磁盘。不幸的是,我不认为有一种标准的方法可以像标记文件系统一样标记磁盘。

一种方法是使用磁盘的型号和序列号。在Linux中,您可以使用检索这些标识符hdparm -i /dev/sdX。关于序列号的好处是它可能已经印在制造商的标签上。(由于您e2label在问题中提到,我认为您最关心Linux 。如果是,请编辑您的问题并添加标签。)

如果您使用的是硬件RAID控制器,则hdparm可能对您不起作用,在这种情况下,您将不得不咨询RAID控制器的命令行工具。

如果要通过磁盘内容中的某些内容来标识它,则可以使用磁盘GUID,该磁盘存储在GPT分区表标头(LBA 1的字节56-71)中。它是一个任意的随机字符串,而不是您选择的标签,但是它就像一个标签,因为它是持久的,直到您决定破坏分区表为止。在Linux中,您可以使用查看磁盘GUID gdisk -l /dev/sdX


1

根据我得到的答案(谢谢大家!),似乎没有办法实际标记磁盘,而只能标记分区。因此答案可能是“否”。

我将接受@cas和@ 200_success提出的建议:我将在磁盘上粘贴带有序列号的磁盘序列号。

也可以选择在每个磁盘上创建一个小的分区以标记该分区(如@Stephane Chazelas所建议的那样),但我认为这对于其他人可能在以后维护系统时会造成混乱。 。


1

udev使用磁盘保证的唯一WWN(如果有)创建规则,否则使用合并的供应商和序列ID:

  1. 获取所需的值:

    udevadm info -q all /dev/<YOUR-DEVICE-HERE> | egrep "(WWN|SERIAL|VENDOR_ID)="
    
  2. 将这些值按摩 udev rules为:

    ENV{DEVTYPE}=="disk", ENV{ID_WWN}=="0x5000c1cd31d48c87", SYMLINK+="4TBseagate"
    
    ENV{DEVTYPE}=="disk", ENV{ID_VENDOR_ID}=="0781", ENV{ID_SERIAL}=="SanDisk_Cruzer_Blade_4C530263101009    121490-0:0", SYMLINK+="8GBsandisk"
    
  3. udevadm trigger

要使用给出的值自动命名符号链接udevadm info -q all /dev/<YOUR-DEVICE>,可以使用:

SYMLINK+="disk-$env{ID_VENDOR}-$env{ID_SERIAL_SHORT}"

也可以ENV根据ATTRS值创建变量,以获得较短的唯一ID。


0

如果你ls /dev/disk-by-path/pci*...

您肯定会看到每个驱动器托架的PCI路径。您只需要使用1个已知磁盘来确保正确放置标签。

使用blkid /dev/disk-by-path/pci*查看分区的PCI路径上的磁盘。

您也可以使用该路径进行挂载。


0

我喜欢@cas解决方案,但这是我的2美分

for i in /dev/sd?
do
  echo "$i"
  /usr/sbin/smartctl -a "$i" | grep Serial
  /usr/sbin/smartctl -a "$i" | grep "Device Model"
  echo
done

-1

该盘已经标记为sdasdbsdc...将分区标记然后例如在sdasda1sda2...

您可以使用以下命令列出磁盘和分区的所有标签 ls /dev/sd*


4
不幸的是,如果我将磁盘从一台计算机移动到另一台计算机或从一个控制器移动到另一台控制器,这些设备名称会更改。
dummzeuch
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.