我看过http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/,它描述了一致/可预测设备命名的基本原理,然后是生成设备名称的规则:
* Two character prefixes based on the type of interface:
* en -- ethernet
* sl -- serial line IP (slip)
* wl -- wlan
* ww -- wwan
*
* Type of names:
* b<number> -- BCMA bus core number
* ccw<name> -- CCW bus group name
* o<index> -- on-board device index number
* s<slot>[f<function>][d<dev_port>] -- hotplug slot index number
* x<MAC> -- MAC address
* [P<domain>]p<bus>s<slot>[f<function>][d<dev_port>]
* -- PCI geographical location
* …Run Code Online (Sandbox Code Playgroud) 我最近刚刚将批量数据存储池(ZFS On Linux 0.6.2,Debian Wheezy)从单设备 vdev 配置迁移到双向镜像 vdev 配置。
之前的池配置是:
NAME STATE READ WRITE CKSUM
akita ONLINE 0 0 0
ST4000NM0033-Z1Z1A0LQ ONLINE 0 0 0
Run Code Online (Sandbox Code Playgroud)
resilver 完成后一切正常(我在 resilver 完成后启动了清理,只是为了让系统再次检查所有内容并确保一切正常):
pool: akita
state: ONLINE
scan: scrub repaired 0 in 6h26m with 0 errors on Sat May 17 06:16:06 2014
config:
NAME STATE READ WRITE CKSUM
akita ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ST4000NM0033-Z1Z1A0LQ ONLINE 0 0 0
ST4000NM0033-Z1Z333ZA ONLINE 0 0 0
errors: No known data errors
Run Code Online (Sandbox Code Playgroud)
然而,在重新启动后,我收到一封电子邮件,通知我游泳池不漂亮而且花花公子。我看了一下,这就是我看到的: …
我有一堆 USB 端口和集线器。当您连接 USB 拇指驱动器时,Linux 会按照先到先得的原则将它们分配给虚拟块设备。无论我将驱动器插入哪个端口,它都会创建 sdd、sde、sdf 等。我们将文件复制到这些驱动器上,当出现错误时,我无法判断错误发生在哪个驱动器上。
我想做的是配置 udev 以便它将物理硬件设备/端口映射到特定的虚拟设备。也就是说,端口 1 => sdd、端口 2 => sde、端口 3 => sdf 等。这可以让我知道错误发生在哪个拇指驱动器上。
我找到了一些资源(例如http://reactivated.net/writing_udev_rules.html),从中我可以看出这是可以做到的。但是我没有这种低级配置的经验。他们让我感到困惑。
有没有其他参考可以让事情更清楚?或者也许是一些为我做的软件?或者一个使它更容易的图书馆?
我有一个 Ubuntu 8.04 LTS(服务器版),我需要编写一个 udev 规则让它在插入 USB 拇指驱动器时起作用。但是,根据驱动器的文件系统,我需要不同的操作。我知道我可以使用 ID_FS_TYPE 环境变量来检查驱动器上的文件系统。
按照此处找到的说明,我尝试使用一个虚拟的 udev 规则:
KERNEL!="sd[a-z][0-9]", GOTO="my_udev_rule_end"
ACTION=="add", RUN+="/usr/bin/touch /tmp/test_udev_%E{ID_FS_TYPE}"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat", RUN+="/usr/bin/touch /tmp/test_udev_it_works"
LABEL="my_udev_rule_end"
Run Code Online (Sandbox Code Playgroud)
但是,当我插入带有 vfat 文件系统(应该触发两个规则)的拇指驱动器时,我最终得到一个名为 的文件/tmp/test_udev_vfat,这意味着第一个规则已成功触发,并且ID_FS_TYPE 环境变量是“vfat”,但是我没有其他文件,这意味着虽然我知道 ID_FS_TYPE env 变量是“vfat”,但我似乎无法检查它是否匹配。
我试着用谷歌搜索这个东西,但几乎每个结果似乎都假设ENV{ID_FS_TYPE}=="vfat"有效。我还在 Ubuntu 10.04 LTS 服务器上测试了完全相同的 udev 规则,结果相同。
我可能遗漏了一些非常简单的东西,但我就是不明白。有没有人看到我的 udev 规则有什么问题会阻止它在 ENV{ID_FS_TYPE} 上匹配?
谢谢。
我使用的是Ubuntu 12.04 LTS 服务器版本,我正在修改/etc/udev/rules.d/70-persistent-net.rules以定义我自己的以太网接口到 MAC 地址的映射;该文件最初是由/lib/udev/rules.d/75-persistent-net-generator.rules系统安装时的规则生成的(或在第一次启动时,我实际上不知道,这里也无关紧要)。
我如何确保我编辑过的版本永远不会被任何东西覆盖?
正如某些网站上所建议的那样,删除持久网络生成器并不是正确的做法™,正如文件本身中的注释所说:它会被udev包的任何更新覆盖。我正在寻找一种更正式的正确方法来禁用它。
仅仅确保它/etc/udev/rules.d/70-persistent-net.rules确实存在就足够了吗?也许还有其他事件可以触发它的再生?(例如,向系统添加或删除以太网接口?)
请给我一个线索,它位于哪里?
已经/etc/udev/rules.d不在了
# find / -name "*persistent-net.rules" 什么都没找到……
我正在尝试在已安装的驱动器上保留预读规则以与 mongodb 一起使用。
挂载被持久使用/etc/fstab并且按预期工作。
我添加了一个udev规则ACTION=="add", KERNEL=="sdb", ATTR{bdi/read_ahead_kb}="16"中/etc/udev/rules.d/85-mongod.rules,并确认它与udevadm test --action=add /sys/block/sdb。
重新启动时,磁盘已安装,但预读设置为默认值,而不是 udev 规则设置的值。
我centOS 7.1在谷歌云上运行并安装了一个永久性磁盘。
这是竞争条件还是其他时间问题?有什么解决方法吗?我不愿意使用,/etc/rc.local因为我不确定在执行时是否总是挂载磁盘,但不确定这是否真的是一个问题。
谢谢你的帮助!
我正在设置一个新服务器并安装了 Ubuntu Bionic,它使用可预测的网络接口名称。
安装程序在救援系统上运行,该系统仍然使用旧的接口名称,如eth0, eth1,但新安装的系统已将第一个网卡配置为enp8s0。
使用lshw,这张卡的公交信息是:
bus info: pci@0000:08:00.0
Run Code Online (Sandbox Code Playgroud)
我想设置其他网络接口而不启动到新安装的系统,但不知道如何确定其他卡的可预测网络接口名称。
使用lshw,我找到了另一个网卡,目前已禁用:
bus info: pci@0000:41:00.0
Run Code Online (Sandbox Code Playgroud)
是否可以由此确定可预测的网络接口名称?会是这样enp41s0吗?
我已经搜索了一段时间,但找不到任何可以简单地列出所有设备及其可预测名称的工具。
编辑:为什么我不想启动新系统来查找?因为这会在设置过程中增加一个额外的步骤。使用旧的接口命名,我可以运行一个脚本来从托管公司提供的救援系统中设置服务器,并且可以使用了。现在我必须先设置服务器减去额外的网络配置。然后我必须在新系统启动后手动设置网络,只是为了知道接口的名称。
了解多盘位设备中坏驱动器的位置非常重要,但是驱动器的默认命名(例如等/dev/sda)/dev/sdb并不能提供特定驱动器物理驻留位置的线索。
我有一个用于备份的 8 盘位外部 JBOD 机柜。它托管一个 ZFS 池并连接到 Arch Linux 盒子。在 Linux 系统上是否可以根据驱动器在机箱中的物理位置使用systemd/来命名驱动器,而不是?udev/dev/sd*
我希望名称能够反映驱动器在机箱中的物理位置 /dev/encl1,/dev/encl2...或类似的名称。我希望这些标签默认出现,而不是出现/dev/sd*在lsblk和中zpool status。
我确实知道机箱中每个驱动器的位置,并将这些信息保存在一个文件中,但最好
lsblk直接使用其他命令查看它。
我尝试创建/etc/udev/rules.d规则
SUBSYSTEM=="block" KERNEL=="sd*" ENV{ID_SERIAL_SHORT}=="ZR5CTR4V" SYMLINK+="encl1"
Run Code Online (Sandbox Code Playgroud)
我在运行后确实得到了这样的符号链接udevadm trigger,但它们并不等同/dev/sd*,而且我无法使用它们作为替代。
问题主要在标题中。
mdadm 和 /proc/mdstat 坚持按“传统”/dev/sdX 名称列出 md 成员。我想要的是让他们使用较新的 udev 设备名称(例如 /dev/disk/by-path 和 by-id)。
我已经将 /etc/mdadm/mdadm.conf 从
DEVICE partitions
Run Code Online (Sandbox Code Playgroud)
到
DEVICE /dev/disk/by-path/*
Run Code Online (Sandbox Code Playgroud)
但这似乎根本没有效果。
此外,阵列是使用旁路设备名称来创建的。
这是在 Ubuntu 11.10 上。
当前/proc/mdstat:
~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdi[4] sde[2] sdh[1] sdd[0]
2929651200 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_]
[=>...................] recovery = 7.0% (69242720/976550400) finish=632.8min speed=23893K/sec
md0 : active raid5 sdb[0] sdg[4] sdc[2] sdf[1]
2197228032 blocks super 1.2 …Run Code Online (Sandbox Code Playgroud)