Я хотел бы настроить наши серверы на загрузку с корнем NFS с двумя связанными интерфейсами.
Мне удалось успешно настроить NFS-root с одним сетевым интерфейсом, используя initrd с включенным NFS-root и следующие параметры ядра
root=/dev/nfs nfsroot=192.168.1.1:/nfsroot/ubuntu ip=dhcp initrd=initrd.img
Я нашел информацию о том, как настроить бондинг с NFS-root в сообщении в блоге.
Поскольку я использую Ubuntu, мне пришлось добавить модуль связывания в конец /etc/initramfs-tools/modules
. Я собираю новый initrd и использую параметры ядра
root=/dev/nfs nfsroot=192.168.1.1:/nfsroot/ubuntu biosdevname=0 bond=bond0:eth0,eth1:mode=4:miimon=100:lacp-rate=1:slaves=none:xmit_hash_policy=layer3+4 ip=bond0:dhcp initrd=initrd.img
Когда я загружаю сервер, я получаю панику ядра, которая отображается сразу после сообщения
ipconfig: can't parse IP address 'bond0'
Может ли кто-нибудь помочь мне решить эту проблему?
Соответствующую часть журнала загрузки можно найти в это суть.
Обновить:
После глубокого погружения в процесс загрузки Ubuntu я понял, что в настоящее время существует два разных подхода к созданию начальных RAM-дисков. Ubuntu использует инструменты initramfs, а RedHat - новый инструмент dracut. Сообщение в блоге, на которое я ссылался, написано для Fedora, и параметры загрузки, указанные для dracut, не подходят для Ubuntu. Поскольку я не мог понять, как обрабатывать связанные интерфейсы с помощью initramfs-tools, я использовал dracut на Ubuntu и опубликовал свои выводы в сообщении в блоге. Установка и настройка dracut для загрузки Ubuntu 12.10 из корня NFS по сети с тегами VLAN с использованием связанных интерфейсов.
После небольшого написания сценариев я смог заставить его работать с initramfs-tools, используя динамические подчиненные интерфейсы, указанные через командную строку ядра.
Добавьте модуль соединения и ваш Ethernet-модуль в /etc/initramfs-tools/modules
igb
bonding
Затем создайте /etc/initramfs-tools/scripts/nfs-top/00_bonding_init
с перманентом 0755 и заполните его следующим:
#!/bin/sh -e
PREREQS=""
case $1 in
prereqs) echo "${PREREQS}"; exit 0;;
esac
echo "Network interfaces loaded: "
echo `ls /sys/class/net`
for x in $cmdline; do
case $x in
bondslaves=*)
bondslaves="${x#bondslaves=}"
;;
esac
done
IFS=","
for x in $bondslaves; do
echo "+$x" > /sys/class/net/bond0/bonding/slaves
done
После этого вы сможете использовать параметр bondlaves = kernel cmdline для указания ваших подчиненных интерфейсов, например: boot=nfs root=/dev/nfs initrd=ubuntu/initrd.img-3.13.0-44-generic ip=:::::bond0:dhcp aufs=tmpfs console=ttyS1,115200 console=tty0 bondslaves=p1p1,p1p2
Попробуйте изменить ip=bond0:dhcp
к ip=:::::bond0:dhcp
заменить
ip = bond0: dhcp
с участием
ip = bootp