上課作業有一個腳本,是批量添加ip別名,批量刪除ip別名,腳本如下
[root@loadblance scripts]# cat ip.sh #!/bin/bash function up { for i in `seq 1 16`;do if [ $i -eq 10 ];then continue fi ifconfig eth0:$i 10.0.2.$i netmask 255.255.255.0 up done } function down { for i in `seq 1 16`;do if [ $i -eq 10 ];then continue fi ifconfig eth0:$i down done } case $1 in up)up #ifconfig eth0:0 down ;; down)down;; esac
腳本執行批量添加沒有什麼問題,但在執行批量刪除時出現如下報錯
[root@loadblance scripts]# bash ip.sh down SIOCSIFFLAGS: Cannot assign requested address SIOCSIFFLAGS: Cannot assign requested address SIOCSIFFLAGS: Cannot assign requested address SIOCSIFFLAGS: Cannot assign requested address SIOCSIFFLAGS: Cannot assign requested address
後來分析發現是在批量刪除的for循環執行第一次循環 ifconfig eth0:1 down的時候,就把所有的ip別名給刪除了,導致後面的循環都會報錯。
但是爲什麼執行ifconfig eth0:1 down就會把所有的別名ip都給down掉了呢,後來查了一下,翻到了redhat的bugzilla裏面有篇記錄,大體翻譯如下:
新添加的ip地址如果是和原有的ip的子網相同,那麼新添加的ip都將成爲原有ip的secondary ,原有的ip稱爲primary address。當primary被刪除後,secondary都會被刪除。而如果只刪除某個secondary,不會影響其他的ip地址。查看這些信息,建議用ip addr命令。
再看看我們的環境(如下),由於新添加的eth0:1和eth0並不是同一個子網,所以新添加的eth0:1是一個新的primary address,其他的eth0:2-eth0:16是eth0:1的secondary,正因爲如此,按照上面理論,當刪除eth0:1時,其他ip別名都會自動被幹掉。
[root@loadblance scripts]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 00:0c:29:29:3f:fd brd ff:ff:ff:ff:ff:ff inet 192.168.1.9/24 brd 192.168.1.255 scope global eth0 inet 10.0.2.1/24 brd 10.0.2.255 scope global eth0:1 inet 10.0.2.2/24 brd 10.0.2.255 scope global secondary eth0:2 inet 10.0.2.3/24 brd 10.0.2.255 scope global secondary eth0:3 inet 10.0.2.4/24 brd 10.0.2.255 scope global secondary eth0:4 inet 10.0.2.5/24 brd 10.0.2.255 scope global secondary eth0:5 inet 10.0.2.6/24 brd 10.0.2.255 scope global secondary eth0:6 inet 10.0.2.7/24 brd 10.0.2.255 scope global secondary eth0:7 inet 10.0.2.8/24 brd 10.0.2.255 scope global secondary eth0:8 inet 10.0.2.9/24 brd 10.0.2.255 scope global secondary eth0:9 inet 10.0.2.11/24 brd 10.0.2.255 scope global secondary eth0:11 inet 10.0.2.12/24 brd 10.0.2.255 scope global secondary eth0:12 inet 10.0.2.13/24 brd 10.0.2.255 scope global secondary eth0:13 inet 10.0.2.14/24 brd 10.0.2.255 scope global secondary eth0:14 inet 10.0.2.15/24 brd 10.0.2.255 scope global secondary eth0:15 inet 10.0.2.16/24 brd 10.0.2.255 scope global secondary eth0:16
解決方法:修改腳本,把所有新添加的ip別名的都設成和eth0一個網段的,這樣所有新加ip別名都是eth0的secondary了,任意刪除一個secondary不會影響其他的ip別名。