Во время какого перехвата dracut клиент PXE может переименовывать имена предсказуемых интерфейсов с помощью правила udev?
tl;dr: Во время загрузки initramfs (выполнение модулей dracut) на PXE-клиенте мне нужно переименовать имена интерфейсов, заданные ядром (предсказуемые) (сейчас это непредсказуемые имена ethX). Таким образом, клиент PXE всегда будет загружаться с интерфейса с предсказуемым именем. В настоящее время я читаю информацию об оборудовании с помощьюdmesg
во время перехвата dracut cmdline. Могу ли яcat
правило udev для/usr/lib/udev/rules.d/
здесь, чтобы система могла переименовывать интерфейсы, когда dracut позже запускает udev?
По сути, у меня есть это в крючке dracut cmdline:
# First read hardware provided
if dmesg | grep -q "SOME_BOARD_NAME"; then
root=$(echo "$root" | sed -e 's/PLACEHOLDER_FILE/SOME_ROOTFS.sqsh/')
# Additionally, some udev rules are needed specific to this board.
# mkdir -p /etc/udev/rules.d
# echo "install these boards' rules!\n"
# echo << EOF > /etc/udev/rules.d/70-persistent-net.rules
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*1c.0/0000:07:00.0/net/*", NAME="eth0"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*01.1/0000:05:00.0/net/*", NAME="eth1"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*01.1/0000:05:00.1/net/*", NAME="eth2"
#EOF
elif dmesg | grep -q "SOME_OTHER_BOARD_NAME"; then
root=$(echo "$root" | sed -e 's/PLACEHOLDER_FILE/SOME_OTHER_ROOTFS.sqsh/')
echo "install other board-specific rules!\n"
# mkdir -p /etc/udev/rules.d
# echo << EOF > /etc/udev/rules.d/70-persistent-net.rules
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*1c.5/0000:09:00.0/net/*", NAME="eth0"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*02.2/0000:02:00.0/net/*", NAME="eth1"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*02.2/0000:02:00.1/net/*", NAME="eth2"
#EOF
else
warn "Did not detect either board - defaulting to SOME_OTHER_ROOTFS.sqsh"
root=$(echo "$root" | sed -e 's/PLACEHOLDER_FILE/SOME_OTHER_ROOTFS.sqsh/')
fi
Дополнительная информация: у меня и моей команды есть одноплатный компьютер, который PXE загружается с внешнего сервера. Это следует за последовательностью:
- SBC извлекает initramfs и загружает его.
- Initramfs выполняет модуль dracut, который считывает информацию об оборудовании SBC (во время перехватчика dracut «cmdline»).
- SBC удаляет определенную корневую файловую систему в зависимости от ее оборудования.
К сожалению, старые имена интерфейсов ethX (непредсказуемые) иногда приводят к тому, что SBC отключает корневую файловую систему через неправильный сетевой интерфейс.
Мой план - удалитьnet.ifnames=0
иbiosdevname=0
из командной строки ядра, используемой для загрузки PXE (шаг 1). Затем, после того как ядро присвоило предсказуемые имена, я хочу расширить модуль dracut, добавив правила udev для переименования их в старые имена. Я надеюсь, что когда dracut запускает udev, SBC всегда будет перетаскивать корневую файловую систему через правильный интерфейс.
1 ответ
В конечном итоге мы сохранили, но установилиbiosdevname=1
. Во время установки dracut мы добавили модуль вsed
сценарии, связанные с сетевым интерфейсом (которые были следующими в процессе установки), чтобы обойтиnet.ifnames=0
логику и вместо этого использовать толькоbiosdevname
.
Это, конечно, казалось хакерским, но свою работу для этой системы он выполнил.