[PATCH 1/3] Add ifname= argument for persistent netdev names

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
---
 dracut.8                               |    6 +++++
 modules.d/40network/ifname-genrules.sh |   21 ++++++++++++++++++
 modules.d/40network/install            |    2 +
 modules.d/40network/net-genrules.sh    |    2 +-
 modules.d/40network/parse-ifname.sh    |   37 ++++++++++++++++++++++++++++++++
 modules.d/95fcoe/fcoe-genrules.sh      |    2 +-
 modules.d/95fcoe/parse-fcoe.sh         |    2 +-
 7 files changed, 69 insertions(+), 3 deletions(-)
 create mode 100755 modules.d/40network/ifname-genrules.sh
 create mode 100755 modules.d/40network/parse-ifname.sh

diff --git a/dracut.8 b/dracut.8
index b0547d9..e9bd0d8 100644
--- a/dracut.8
+++ b/dracut.8
@@ -247,6 +247,12 @@ get ip from dhcp server on a specific interface
 .B ip=<client-IP-number>:[<server-id>]:<gateway-IP-number>:<netmask>:<client-hostname>:<interface>:{none|off}
 explicit network configuration
 
+.TP
+.B ifname=<interface>:<MAC>
+Assign network device name <interface> (ie eth0) to the NIC with MAC <MAC>.
+Note that if you use this option you \fBmust\fR specify an ifname= argument
+for all interfaces used in ip= or fcoe= arguments
+
 .SH Misc
 .TP
 .B rdblacklist=<drivername>
diff --git a/modules.d/40network/ifname-genrules.sh b/modules.d/40network/ifname-genrules.sh
new file mode 100755
index 0000000..547f230
--- /dev/null
+++ b/modules.d/40network/ifname-genrules.sh
@@ -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/install b/modules.d/40network/install
index 34aed93..ded70da 100755
--- a/modules.d/40network/install
+++ b/modules.d/40network/install
@@ -4,10 +4,12 @@ inst "$moddir/ifup" "/sbin/ifup"
 inst "$moddir/netroot" "/sbin/netroot"
 inst "$moddir/dhclient-script" "/sbin/dhclient-script"
 inst "$moddir/dhclient.conf" "/etc/dhclient.conf" 
+inst_hook pre-udev 50 "$moddir/ifname-genrules.sh"
 inst_hook pre-udev 60 "$moddir/net-genrules.sh"
 inst_hook cmdline 91 "$moddir/dhcp-root.sh"
 inst_hook cmdline 99 "$moddir/parse-ip-opts.sh"
 inst_hook cmdline 98 "$moddir/parse-bridge.sh"
+inst_hook cmdline 99 "$moddir/parse-ifname.sh"
 inst_hook pre-pivot 10 "$moddir/kill-dhclient.sh"
 
 # TODO ifcfg config style is redhat specific, this should probably
diff --git a/modules.d/40network/net-genrules.sh b/modules.d/40network/net-genrules.sh
index 04e0528..ba369cc 100755
--- a/modules.d/40network/net-genrules.sh
+++ b/modules.d/40network/net-genrules.sh
@@ -29,7 +29,7 @@ fix_bootif() {
     # If we have to handle multiple interfaces, handle only them.
     elif [ -n "$IFACES" ] ; then
 	for iface in $IFACES ; do
-	    printf 'ACTION=="add", SUBSYSTEM=="net", KERNEL=="%s", RUN+="/sbin/ifup $env{INTERFACE}"\n' "$iface"
+	    printf 'ACTION=="add", SUBSYSTEM=="net", NAME=="%s", RUN+="/sbin/ifup $env{INTERFACE}"\n' "$iface"
 	done
 
     # Default: We don't know the interface to use, handle all
diff --git a/modules.d/40network/parse-ifname.sh b/modules.d/40network/parse-ifname.sh
new file mode 100755
index 0000000..aba8475
--- /dev/null
+++ b/modules.d/40network/parse-ifname.sh
@@ -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
diff --git a/modules.d/95fcoe/fcoe-genrules.sh b/modules.d/95fcoe/fcoe-genrules.sh
index b5d6f07..e9d0157 100755
--- a/modules.d/95fcoe/fcoe-genrules.sh
+++ b/modules.d/95fcoe/fcoe-genrules.sh
@@ -9,6 +9,6 @@
     if [ -n "$fcoe_mac" ] ; then
 	printf 'ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="%s", RUN+="/sbin/fcoe-up $env{INTERFACE} %s"\n' "$fcoe_mac" "$fcoe_dcb"
     else
-	printf 'ACTION=="add", SUBSYSTEM=="net", KERNEL=="%s", RUN+="/sbin/fcoe-up $env{INTERFACE} %s"\n' "$fcoe_interface" "$fcoe_dcb"
+	printf 'ACTION=="add", SUBSYSTEM=="net", NAME=="%s", RUN+="/sbin/fcoe-up $env{INTERFACE} %s"\n' "$fcoe_interface" "$fcoe_dcb"
     fi
 } > /etc/udev/rules.d/60-fcoe.rules
diff --git a/modules.d/95fcoe/parse-fcoe.sh b/modules.d/95fcoe/parse-fcoe.sh
index 81ec760..b35680f 100755
--- a/modules.d/95fcoe/parse-fcoe.sh
+++ b/modules.d/95fcoe/parse-fcoe.sh
@@ -11,7 +11,7 @@
 #
 # Examples:
 # fcoe=eth0:nodcb
-# fcoe=4A:3F:4C:04:F8:D7:nodcb
+# fcoe=4a:3f:4c:04:f8:d7:nodcb
 
 [ -z "$fcoe" ] && fcoe=$(getarg fcoe=)
 
-- 
1.6.4.2

--
To unsubscribe from this list: send the line "unsubscribe initramfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux