有没有办法更改 /dev/disk/by-id 中的设备 ID?

Nic*_*629 4 linux sata usb-drive

我有一个 S2 SAMSUNG 320GB USB-HDD,我在 Ubuntu 13.10(内核 3.11.0-17-generic)和 Fedora 17 中使用它。

它工作正常;我可以从/向他们读/写。虽然,我遇到了处理笔式驱动器和其他 USB 设备的软件的问题。该程序尝试通过运行以下命令来列出可用设备:

ls -l /dev/disk/by-id/usb*
Run Code Online (Sandbox Code Playgroud)

并且什么都不返回。

所以,我在终端运行:ls -l /dev/disk/by-id/*并得到了这个:

ata-hp_DVDRAM_GT30L_KZEA6810820
ata-SAMSUNG_HM321HX_C5733G82AB0BPW
ata-WDC_WD3200BEKT-60V5T1_WD-WX81A50J4370
wwn-0x50000f00ab0b000b
wwn-0x50014ee20495cc9f
Run Code Online (Sandbox Code Playgroud)

/dev/disk/by-uuid,我的 UBS-HDD 是:19ED-1878 ->../../sdb

因此,我的外置 HD 被列为“ata-SAMSUNG....”,但找不到“usb*...”。

我在谷歌上搜索了很多。研究发现,编辑/etc/fstab/boot/grub/grub.conf将帮助我(没有找到与我的USB开发任何东西grub.conf,也没有fstab)。或者像 ZFS、zpool 之类的东西,甚至是一个(仅?)处理 UUID 的工具,tune2fs。

那么,是否可以更改/dev/disk/by-id/ata-SAMSUNG...../../by-id/usb-SAMSUNG...?如果是这样,如何?

Gra*_*eme 7

好的,我猜这是一个udev问题(大多数 Linux 发行版默认使用它),这就是创建符号链接的原因。您可以通过添加新规则来解决此问题。我将提供一些关于此的信息,但它主要基于我自己的发行版 - Debian。

首先,你需要找到你的规则在哪里。Debian 将它们放在两个位置 -/lib/udev/rules.d/etc/udev/rules.d. 如果是这种情况,您应该只添加/更改下面的那些,/etc因为更改另一个位置更有可能导致被更新覆盖。

转到规则目录,看看您是否可以找到包含创建链接规则的文件disk/by-id。该命令grep -r disk/by-id/将在这里提供帮助(尽管只在规则目录中运行它以避免搜索其他地方)。对我来说,文件是/var/lib/rules.d/60-persistent-storage.rules. 以下是为我创建``disk/by-id/usb-*` 链接的行:

ENV{DEVTYPE}=="disk",   ENV{ID_BUS}=="?*", ENV{ID_SERIAL}=="?*", \
  SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"

ENV{DEVTYPE}=="partition",  ENV{ID_BUS}=="?*", ENV{ID_SERIAL}=="?*", \
  SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}-part%n"
Run Code Online (Sandbox Code Playgroud)

这里有两种可能性(除了您的系统根本不使用的一种udev):

  1. 您没有与此类似的行,您需要创建一个。
  2. 你这样做,但它对你的磁盘不起作用。

这些行可能看起来像胡言乱语,但基本上前两条(实际上是一条,因为这\只是拆分长行的一种方式)用于与磁盘本身相关的链接,另外两条用于其分区。

希望运行此命令可以让事情变得不那么混乱:

udevadm info --name=/dev/sdb --query=property
Run Code Online (Sandbox Code Playgroud)

这会显示您设备的所有属性的名称/值。基本上所有规则所做的就是遍历每个设备的所有属性,并将它们与行的第一部分进行匹配(例如,首先查找带有DEVTYPE=disk、非空ID_BUS和 的设备ID_SERIAL)。下一部分创建一个符号链接,其名称包含ID_BUSID_SERIAL

无论如何,这归结为如果您有ID_BUS=usb,您可以继续添加上述规则。如果没有,您可能需要为您的设备添加特定规则。就像是:

ENV{ID_SERIAL}=="SAMSUNG_HM321HX_C5733G82AB0BPW", \
  SYMLINK+="disk/by-id/usb-$env{ID_SERIAL}"

ENV{ID_SERIAL}=="SAMSUNG_HM321HX_C5733G82AB0BPW", \
  SYMLINK+="disk/by-id/usb-$env{ID_SERIAL}-part%n"
Run Code Online (Sandbox Code Playgroud)

我已经ID_SERIAL从问题中猜到了你的问题,如果它错了,请输入正确的。

规则可能最好放在它们自己的文件中,例如s2-samsung-usb.rules在您开始时找到的目录中。

更新:以下可能不是必需的,只需拔下并再次插入设备 -如何在不重启的情况下重新加载 udev 规则?

完成后,您可以重新加载规则(先拔掉设备):

udevadm control --reload-rules
Run Code Online (Sandbox Code Playgroud)

然后再次插入您的设备。如果这不起作用,您可以随时尝试重新启动(实际上这可能更安全)。