嵌入式設備網絡設置
嵌入式設備的網絡設置主要是靠一些命令進行處理的:
#MAC地址設置 ifconfig eth0 down ifconfig eth0 hw ether $MACADDR ifconfig eth0 up ifconfig eth0 $ip netmask $netmask #IP 和子網掩碼設置 route add default gw $gatewayip #網關設置 ifconfig lo $localhost #本機設置
通過一個腳本來實現設置功能。
其中需對輸入進行詳細的檢測,判斷是否為可用網絡配置。
檢查項有:
這裏涉及到一些網絡工程基礎知識,例如,子網,網關。
計算機在發送數據報的時候,由於數據鏈路層只負責MAC(Media Access Control 媒體訪問制)地址,而IP地址是網絡層負責的,因此需要ARP(Address Resolution Protocol)來維護,當需要發送一個數據報給某個IP時,本機會從建立的對照表中查詢對應的MAC地址來發送,此時如果本機IP和目標IP同網(兩個IP與子網掩碼的與(&)值相同),則直接發送數據報,而不同的話,則將數據報發往網關IP對應的主機,由路由代發。
首先IP是由4段8位二進制數表示,每一段為8位(每位是0或1),占一個字節,因此每一段大小從0到255.
子網掩碼由32位(每位可以是0或1,規則上,高位必須有連續的若幹個1,低位必須全為0)表示,分為網絡地址段和主機地址段。網絡地址段就是子網(Subnet),同一子網(Subnet)是使用相同的網關,32位中,前面全是1的部分即為子網覆蓋的區間,後面0的部分就代表主機部分。例如一個子網掩碼為255.255.192.0, 換成32位二進制表示:11111111 11111111 11000000 00000000, 即可容納的主機數就是後面0的個數表示的大小,2^14 - 1 = 16383。
因此 255.255.255.254 的子網掩碼就意味著只有一個主機數,這條規則也應用於檢測。
為什麽說同一網絡段使用相同的網關,是因為網關是由IP和子網掩碼的二進制與運算得來的。即在做網關可用性檢測時,就利用(IP & netmask)== (GW & netmask)來判斷。
IP沖突檢測可以用ping加arp指令:
## $conflict 為空則IP不沖突,否則會得到arp緩存中的信息。 conflict=`ping -c 2 -t 1 $TMP_IP_INPUT >/dev/null 2>&1 && arp -a $TMP_IP_INPUT`
有了上述約束條件,加上各種設置失敗的異常處理(還原現場),腳本就完成了。
shell 筆記:
腳本中對輸入參數的處理是多種多樣的,這裏使用了getopt來處理。
option=`getopt -l help -l init -- nhim: "$@"` 2> /dev/null eval set -- "$option" while true do case $1 in -h|--help) #usage usage_Func break; ;; -n) #設置完後系統不重啟 SYS_REBOOT_ENABLE=$SYS_REBOOT_OFF shift 1 ;; -m) #設置MAC地址,且接收MAC地址到變量MACADDR MAC_SET_ENABLE=$MAC_SET_ON MACADDR=$2 shift 2 ;; -i|--init) #此選項用於系統啟動時設置網絡配置。 INIT_CONFIG_NET_ENABLE=1 shift 1 ;; --) # usage_Func shift break; ;; *) # usage_Func shift break; ;; esac done
特殊變量列表
變量 含義
- $0 當前腳本的文件名
- $n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
- $# 傳遞給腳本或函數的參數個數。
- $* 傳遞給腳本或函數的所有參數。
- $@ 傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。
- $? 上個命令的退出狀態,或函數的返回值。一般情況下,大部分命令執行成功會返回 0,失敗返回 1。
- $$ 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。
- $* 和 $@ 的區別
- $* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
- 但是當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。
網絡配置由一個ini配置文件管理。INI文件由節、鍵、值組成。
例如:
[NETWORK]
ipaddr=172.16.0.xx
netmask=255.255.255.0
gateway=172.16.0.1
macaddr=xxxxxx
讀取INI配置文件中的值:
read_ini=`awk -F ‘=‘ ‘/\[‘$SECTION‘\]/{a=1}a==1&&$1~/‘$ITEM‘/{print $2;exit}‘ $INIFILE` #eg:ip=`awk -F ‘=‘ ‘/\[‘NETWORK‘\]/{a=1}a==1&&$1~/‘ipaddr‘/{print $2;exit}‘ $INIFILE`
更改INI配置文件中的值:
sed ‘/^‘"$ITEM"‘/{ s~^.*$~‘"$ITEM"‘=‘"$VALUE"‘~g }‘ -i "$INIFILE"
嵌入式設備網絡設置