系統重啟後恢復OpenStack網路設定-tips
眼看著今天就要過去了,一個月就要過去了,馬上一年也就要過去了,可你又能怎樣? 昨天在焦慮,今天還在焦慮,明天將繼續焦慮,何時能停止? 既然無力掙扎,那就閉著眼睛過吧,時間最終會給我們答案,塵過塵,土歸土,看談一些就好,看空一些就好。
不管OpenStack是不是還有些把玩的價值,但終歸割捨不下,我一直把它看作一本書,一本可以提升自己的書,至於它能帶給你什麼? Who knows? Who cares?
所以,當實驗室裡每次斷電之後,虛擬網路都將無法工作,我還是會繼續去stack一下,終於有一天我無法再次忍受,我要去看個究竟,當愚鈍的翻過一行一行指令碼之後,我好像找到了答案。
先看看lib/neutron_plugins/services/l3
function _configure_neutron_l3_agent {
cp $NEUTRON_DIR/etc/l3_agent.ini.sample $Q_L3_CONF_FILE
iniset $Q_L3_CONF_FILE DEFAULT debug $ENABLE_DEBUG_LOG_LEVEL
iniset $Q_L3_CONF_FILE AGENT root_helper "$Q_RR_COMMAND"
if [[ "$Q_USE_ROOTWRAP_DAEMON" == "True" ]]; then
iniset $Q_L3_CONF_FILE AGENT root_helper_daemon "$Q_RR_DAEMON_COMMAND"
fi
_neutron_setup_interface_driver $Q_L3_CONF_FILE
neutron_plugin_configure_l3_agent $Q_L3_CONF_FILE
# If we've given a PUBLIC_INTERFACE to take over, then we assume
# that we can own the whole thing, and privot it into the OVS
# bridge. If we are not, we're probably on a single interface
# machine, and we just setup NAT so that fixed guests can get out.
if [[ -n "$PUBLIC_INTERFACE" ]]; then # *看這裡!*
_move_neutron_addresses_route "$PUBLIC_INTERFACE" "$OVS_PHYSICAL_BRIDGE" True False "inet"
if [[ $(ip -f inet6 a s dev "$PUBLIC_INTERFACE" | grep -c 'global') != 0 ]]; then
_move_neutron_addresses_route "$PUBLIC_INTERFACE" "$OVS_PHYSICAL_BRIDGE" False False "inet6"
fi
else
for d in $default_v4_route_devs; do
sudo iptables -t nat -A POSTROUTING -o $d -s $FLOATING_RANGE -j MASQUERADE
done
fi
}
從這個函式可以看出,如果綁定了某一個物理網絡卡(例如在localrc中配置了"PUBLIC_INTERFACE"),那麼將會呼叫"_move_neutron_addresses_route"來做進一步處理,否則就做一個源地址偽裝(MASQUERADE)就算完了。
核心就是這段程式碼了,
_move_neutron_addresses_route "$PUBLIC_INTERFACE" "$OVS_PHYSICAL_BRIDGE" True False "inet"
來重點看下繫結物理網絡卡的處理方式,函式有點長,我們調重點的看一下部分核心程式碼,
# lib/neutron-legacy
# _move_neutron_addresses_route() - Move the primary IP to the OVS bridge
# on startup, or back to the public interface on cleanup. If no IP is
# configured on the interface, just add it as a port to the OVS bridge.
function _move_neutron_addresses_route {
...
if [[ -n "$from_intf" && -n "$to_intf" ]]; then
...
DEFAULT_ROUTE_GW=$(ip -f $af r | awk "/default.+$from_intf\s/ { print \$3; exit }")
IP_BRD=$(ip -f $af a s dev $from_intf scope global primary | grep inet | awk '{ print $2, $3, $4; exit }') #①
if [ "$DEFAULT_ROUTE_GW" != "" ]; then
ADD_DEFAULT_ROUTE="sudo ip -f $af r replace default via $DEFAULT_ROUTE_GW dev $to_intf" # ②
fi
if [[ "$add_ovs_port" == "True" ]]; then
ADD_OVS_PORT="sudo ovs-vsctl --may-exist add-port $to_intf $from_intf" # ③
fi
...
if [[ "$IP_BRD" != "" ]]; then
IP_DEL="sudo ip addr del $IP_BRD dev $from_intf" # ④
IP_REPLACE="sudo ip addr replace $IP_BRD dev $to_intf" # ⑤
IP_UP="sudo ip link set $to_intf up" # ⑥
if [[ "$af" == "inet" ]]; then
IP=$(echo $IP_BRD | awk '{ print $1; exit }' | grep -o -E '(.*)/' | cut -d "/" -f1)
ARP_CMD="arping -A -c 3 -w 4.5 -I $to_intf $IP " # ⑦
fi
fi
...
$DEL_OVS_PORT; $IP_DEL; $IP_REPLACE; $IP_UP; $ADD_OVS_PORT; $ADD_DEFAULT_ROUTE; $ARP_CMD
先來看下網路的路由配置情況,eno2將會作為PUBLIC_INTERFACE被繫結到br-ex上。
$ ip route
default via 192.168.18.1 dev eno2 proto static metric 100
169.254.0.0/16 dev docker0 scope link metric 1000 linkdown
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.16.0/21 dev eno2 proto kernel scope link src 192.168.18.24 metric 100
- 這兩句是獲取系統當前的一些網路配置,DEFAULT_ROUTE_GW是物理機的預設路由,IP_BRD得到的是物理網絡卡上的主IP地址配置。
$ ip -f inet r | awk "/default.+eno2\s/ { print \$3; exit }"
192.168.18.1
$ ip -f inet a s dev eno2 scope global primary | grep inet | awk '{ print $2, $3, $4; exit }'
192.168.18.24/21 brd 192.168.23.255
- 將預設路由替換為目標網絡卡,這裡當然是替換為OVS的bridge br-ex,這一步之後預設的路由的IP地址雖然沒變,但是device已經改為br-ex了。
$ sudo ip -f inet r replace default via 192.168.18.1 dev br-ex
- 將物理網絡卡繫結到br-ex上。
$ sudo ovs-vsctl --may-exist add-port br-ex eno2
- 這一步將物理網絡卡上的主IP地址刪除,之後該地址將配置到br-ex上。
$ sudo ip addr del 192.168.18.24/21 brd 192.168.23.255 dev eno2
- 將物理網絡卡上的主IP地址配置到br-ex上。
$ sudo ip addr replace 192.168.18.24/21 brd 192.168.23.255 dev br-ex
- 不解釋
$ sudo ip link set br-ex up
- 設定ARP請求的一些引數,arping沒用過,具體在幹什麼,還是不太瞭解。
$ arping -A -c 3 -w 4.5 -I br-ex 192.168.18.24
之後就是順序執行這幾個命令了,一句話來解釋這段程式碼乾的事情就是這段註釋:
Move the primary IP to the OVS bridge on startup, or back to the public interface on cleanup. If no IP is configured on the interface, just add it as a port to the OVS bridge.
如果系統reboot了,網路掛了,不行就順序再來一便吧,但問題是為什麼網路不能自動恢復?這是個大問題啊?!
希望國慶節之後能對DVR來做個了結吧。
p.s. 天又晚了,碼字確實費時間。