1. 程式人生 > >嵌入式設備網絡設置

嵌入式設備網絡設置

section 一段 spa shift 網絡工程 break while config 6.0

嵌入式設備的網絡設置主要是靠一些命令進行處理的:

#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

特殊變量列表

變量 含義

  1. $0 當前腳本的文件名
  2. $n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
  3. $# 傳遞給腳本或函數的參數個數。
  4. $* 傳遞給腳本或函數的所有參數。
  5. $@ 傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。
  6. $? 上個命令的退出狀態,或函數的返回值。一般情況下,大部分命令執行成功會返回 0,失敗返回 1。
  7. $$ 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。
  8. $* 和 $@ 的區別
  9. $* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
  10. 但是當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體,以"$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" 

嵌入式設備網絡設置