Portál AbcLinuxu, 1. května 2025 05:33

Nfsroot přes rozhraní síťového bridge

27.4.2012 23:52 | Přečteno: 1030× | Linux | Výběrový blog | poslední úprava: 28.4.2012 00:05

Je tak trochu šílenost, uznávám. Ale přesto je to věc, pro kterou mám svůj use case.

Situace: bootujete z eth0 a chcete tuto síť dále poskytovat na eth1. Používání jiného rozsahu pro eth1 se vám nelíbí.

Hlavním problémem je to, že není dobře možné dát rozhraní eth0 a eth1 do bridge br0 s přesunem síťové adresy z eth0 na br0, aniž by tam byl nějaký krátký moment, kdy nebude kořenový (síťový) souborový systém dostupný. Pokud si myslíte, jako já, že to přece musí dát, tak věřte, že si to vždycky někam sáhne a umře to :-)

ebtables

Po troše googlení jsem nalezl jedno řešení. Bylo jím ebtables. Pomocí ebtables je možné pozměnit routovací pravidla bridge tak, aby vznikl most mezi eth0 a eth1, ale pakety na IP adresu patřící eth0 se nesměrovaly skrz bridge.

Zde je skript, který jsem nakonec dal do kupy, i když teď si nejsem stoprocentně jist, že toto funguje:

#!/bin/sh
NFSIF="eth0"
SECIF="eth1"
BRIF="br0"

set -e

nfsmac=$(ip link show "$NFSIF" | awk 'NR==2 { print $2 }')
nfsip=$(ip addr show dev "$NFSIF" | awk '$1=="inet" { print gensub(/\/.+/, "", "g", $2) }')

for ip in "$nfsip"; do
        ebtables -t broute -A BROUTING -p ipv4 -i "$NFSIF" --ip-dst "$ip" -j DROP
        ebtables -t broute -A BROUTING -p arp -i "$NFSIF" --arp-ip-dst "$ip" -j DROP
done

ebtables -t broute -A BROUTING -p arp -i "$NFSIF" -d "$nfsmac" -j DROP

brctl addbr "$BRIF"
brctl addif "$BRIF" "$SECIF"
ip link set "$BRIF" up
brctl addif "$BRIF" "$NFSIF"

Funguje to, až na jeden defekt. IP adresa na rozhraní eth0 není dostupná z druhé strany bridge, tedy z eth1. A celé je to takový hnusný hack, takže jsem hledal řešení jiné.

initrd

Nejelegantnějším řešením je nakonec initrd. Vytvořil jsem si dostatečně velký prázdný soubor, naformátoval jsem jej na ext2 a po připojení jsem vytvořil adresáře /bin a /dev. Do /dev jsem umístil null a console. Emergnul jsem si statický busybox a ten jsem strčil do /bin. Tam jsem na něj udělal symlinky sh, ip, brctl. Pak jsem napsal skript /linuxrc:

#!/bin/sh

PATH="/bin"

MYADDR="10.10.10.2/24"
GW="10.10.10.3"

#ip addr flush dev eth0
ip link set eth0 up
ip link set eth1 up

brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1

ip addr add $MYADDR dev br0
ip link set br0 up
ip route add default via $GW

Na závěr jsem image odpojil a zkomprimoval. A funguje to. Z hlediska nastavení PXE stačilo přidat jádru argument initrd=/tftp-cesta-k-souboru/initrd.img.gz a bylo.

Třeba se to někomu bude hodit :-)

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

19.9.2020 23:10 frr | skóre: 34
Rozbalit Rozbalit vše Re: Nfsroot přes rozhraní síťového bridge
Odpovědět | Sbalit | Link | Blokovat | Admin
Omluva za exhumaci... for the record: během posledního asi roku jsem se pokusil o něco velmi podobného na bázi Debianu 9 a rozpracoval jsem to myslím do větších podrobností :-D
[:wq]

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.