Bruce Dubbs wrote:
> Armin K. wrote:
>> Bruce, some guy came on the irc saying that network rules creation
>> does not work in systemd extracted udev.
>> 
>> <Zenther> working my way through the cvs book and get to 7.2.1.
>> Creating stable names for network interfaces and I am getting a
>> cat: /etc/udev/rules.d/70-persistent-net.rules: No such file or
>> directory. Above that I see it list out my eth0 and wlan0.
>> 
>> Can you check and/or confirm that?
> 
> 
> I can confirm that in chroot.  I think he is referring to section
> 7.5. That needs to be changed.  The 'udevadm test' command no longer
> runs aux programs, e.g. /lib/udev/write_net_rules.
> 
> However, the first time the system is booted, udevd will run the
> rules and the 70-persistent-net.rules file will be written at that
> time.

Well, they finally killed it.

ARRRRG.

Unfortunately for the case where pregenerating the rules files is
required, "at first boot" is way too late to generate the file.  The NIC
needs to have a stable name assigned before the networking stuff gets
configured, so that at first boot, the NICs are configured correctly.

Obviously it only matters on a multi-NIC machine, and only really when
the configuration is different per NIC.

Since the Debian-package udev maintainer is the one who said he'd be
continuing this (since Debian has exactly the same problem on users'
server installations), I wonder if Debian has added patches to fix it
up, or is generating the config in some other way.

...doing a bunch of thinking here...

Do we want to just bite the bullet and change the networking config to
use MAC- or path-based IDs instead of NIC names?  E.g. change the
/etc/sysconfig/ifconfig.eth0 filename (and directory, if a directory is
used) to either /etc/sysconfig/ifconfig.mac.xx:xx:xx:xx:xx:xx, or
/etc/sysconfig/ifconfig.path.pci-foo-bar-usb-baz-whatever (whatever
path_id prints out), then use udevadm to find the NIC device's name?

With a couple changes to the udev rules (add an IMPORT{builtin}=path_id,
and copy attrs{address} off to some environment variable), all the
required info should be in the udev database, meaning something like
this might work:

<read file or directory name into $NIC_ID or whatever>
TYPE=`echo $NIC_ID | cut -d. -f2`  # either mac or path
ID=`echo $NIC_ID | cut -d. -f2-`
if [ "$TYPE" = "path" ] ; then
  for i in /sys/class/net/* ; do
    if [ "$(udevadm info --query env --path $i \
            | grep ID_PATH)" = "$ID" ] ; then
      INTERFACE=${i##/sys/class/net/}
    fi
  done
  if [ -z "$INTERFACE" ] ; then
    # whatever error handling
  fi
else
  for i in /sys/class/net/* ; do
    if [ "$(udevadm info --query env --path $i \
            | grep ID_MAC)" = "$ID" ] ; then
      INTERFACE=${i##/sys/class/net/}
    fi
  done
  if [ -z "$INTERFACE" ] ; then
    # whatever error handling
  fi
fi

Then run the script as before, since $INTERFACE is set.

Alternately, that's a weird N-squared algorithm.  Maybe it'd work better
to do something like:

<read file or directory name into $NIC_ID or whatever>
TYPE=`echo $NIC_ID | cut -d. -f2`  # either mac or path
ID=`echo $NIC_ID | cut -d. -f2-`
cd /sys/class/net
for i in * ; do
  udevadm info --query env --path /sys/class/net/$i \
    --export --export-prefix="${i}_"
done
# optionally fix up cwd
if [ "$TYPE" = "path" ] ; then
  INTERFACE=$(set | grep "_ID_PATH=$ID" | cut -d_ -f1)
  if [ -z "$INTERFACE" ] ; then
    # whatever error handling
  fi
else
  INTERFACE=$(set | grep "_ID_MAC=$ID" | cut -d_ -f1)
  if [ -z "$INTERFACE" ] ; then
    # whatever error handling
  fi
fi

We could just remove the persistent rules entirely at that point, since
the interface ID would be dereferenced on every boot, so if it changes,
nobody cares.

Attachment: signature.asc
Description: OpenPGP digital signature

-- 
http://linuxfromscratch.org/mailman/listinfo/lfs-dev
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to