]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
Add ifname= argument for persistent netdev names
authorHans de Goede <hdegoede@redhat.com>
Wed, 16 Sep 2009 13:01:08 +0000 (15:01 +0200)
committerHarald Hoyer <harald@redhat.com>
Wed, 16 Sep 2009 13:01:08 +0000 (15:01 +0200)
ifname=<interface>:<MAC>
Assign network device name <interface> (ie eth0) to the NIC
with MAC <MAC>.
Note that if you use this option you *must* specify an ifname=
argument for all interfaces used in ip= or fcoe= arguments

modules.d/40network/ifname-genrules.sh [new file with mode: 0644]
modules.d/40network/parse-ifname.sh [new file with mode: 0644]

diff --git a/modules.d/40network/ifname-genrules.sh b/modules.d/40network/ifname-genrules.sh
new file mode 100644 (file)
index 0000000..547f230
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# if there are no ifname parameters, just use NAME=KERNEL
+if ! getarg ifname= >/dev/null ; then
+    echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="?*", ATTR{type}=="1", NAME="%k"' \
+        > /etc/udev/rules.d/50-ifname.rules
+    return
+fi
+
+{
+    for p in $(getargs ifname=); do
+        parse_ifname_opts $p
+       printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%s", ATTR{type}=="1", NAME="%s"\n' "$ifname_mac" "$ifname_if"
+    done
+
+    # Rename non named interfaces out of the way for named ones.
+    for p in $(getargs ifname=); do
+        parse_ifname_opts $p
+       printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="?*", ATTR{type}=="1", NAME!="?*", KERNEL=="%s", NAME="%%k-renamed"\n' "$ifname_if"
+    done
+} > /etc/udev/rules.d/50-ifname.rules
diff --git a/modules.d/40network/parse-ifname.sh b/modules.d/40network/parse-ifname.sh
new file mode 100644 (file)
index 0000000..aba8475
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# Format:
+#      ifname=<interface>:<mac>
+#
+# Note letters in the macaddress must be lowercase!
+#
+# Examples:
+# ifname=eth0:4a:3f:4c:04:f8:d7
+#
+# Note when using ifname= to get persistent interface names, you must specify
+# an ifname= argument for each interface used in an ip= or fcoe= argument
+
+# check if there are any ifname parameters
+if ! getarg ifname= >/dev/null ; then
+    return
+fi
+
+parse_ifname_opts() {
+    local IFS=:
+    set $1
+
+    case $# in
+        7)
+            ifname_if=$1
+            ifname_mac=$2:$3:$4:$5:$6:$7
+            ;;
+        *)
+            die "Invalid arguments for ifname="
+            ;;
+    esac
+}
+
+# Check ifname= lines
+for p in $(getargs ifname=); do
+    parse_ifname_opts $p
+done