一、前言
在進行ARM Linux開發的時候經常會遇到這樣的問題,在虛擬機上安裝一個Ubuntu,開發時將Ubuntu和開發板都設置為靜態IP,將二者用網線連接,可以用NFS掛載。但有時Ubuntu需要連接互聯網,這時就要將Ubuntu的IP設置為動態IP,並將Ubuntu的網絡連接模式設置為NAT模式,使用完之后又設置為橋接模式和靜態IP,這樣改來改去比較麻煩,而且有時希望開發板也能連接到互聯網中去,這樣就需要一種比較完美的解決辦法。
二、修改虛擬機配置
首先,vmware一定要用管理員方式打開。
在虛擬機的菜單欄中點擊“編輯”->“虛擬網絡編輯器”,如下圖:
在彈出的界面中,會有3張網卡,其中VMnet0一定是橋接模式,並且將其橋接到windows的物理網卡,如下圖:
其中物理網卡的名字在控制面板的網絡連接里可以看到,如下圖:
如果沒有出現VMnet0,首先檢查是否用管理員方式打開,如果確認了是用管理員方式打開的,但依然沒有出現VMnet0,則點擊“還原默認設置”,若還是沒出現VMnet0,那么點擊“添加網絡”,將VMnet0手動添加進去,在彈出的界面中要選擇某個文件,否則即便添加了VMnet0,但VMnet0不能設置為橋接模式(由於缺少素材,這里沒有配圖)。
之后重啟vmware。
在虛擬機的菜單欄中點擊“虛擬機”->“設置”,如下圖:
在彈出的界面中點擊“添加”,如下圖:
點擊“網絡適配器”,然后點擊“下一步”,如下圖:
選擇“NAT 模式”,然后點擊“完成”,如下圖:
這時虛擬機的硬件設備里就有兩個網絡適配器了,需要保證第一個網絡適配器為橋接模式,第二個網絡適配器為NAT模式,如下圖:
點擊“確定”之后等待下圖所示進度條走完:
三、修改Ubuntu配置
3.1 修改配置文件
在終端執行命令:sudo vim /etc/network/interfaces
將文件修改為:
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.1.3 netmask 255.255.255.0 gateway 192.168.1.1 auto eth1 iface eth1 inet dhcp
然后保存退出,這個文件指定了網卡eth0的IP為靜態IP,IP地址為192.168.1.3,子網掩碼為255.255.255.0,網關為192.168.1.1。網卡eth1的IP為動態獲取。
設置完成之后重啟虛擬機。
之后在終端中使用ifconfig命令就可以發現,已經有三張網卡了,如下圖:
其中eth0是靜態網卡,IP地址與/etc/network/interfaces文件中寫入的address一致,eth1是動態網卡, 其IP地址是通過DHCP動態獲取的,lo是回環網卡。
3.2 使用iptables設置轉發規則
在Ubuntu中執行下面兩條命令:
sudo modprobe ip_tables
sudo modprobe ip_nat_ftp
3.3 修改網卡地址轉發的配置文件
修改/etc/sysctl.conf文件(需要用sudo),默認情況下這個文件里所有的內容都是用#注釋掉的,將有net.ipv4.ip_forward = 1的這行(大概在第28行)最前面的“#”去掉,然后保存退出。
執行下面4條命令:
sudo sysctl -p sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT
3.4 設置網絡
使用ifconfig命令查看eth0和eth1的IP地址,如下圖:
記住這兩個IP,然后執行命令:
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 192.168.237.129
上面這條命令包含兩個IP地址,第一個IP地址由eth0的IP地址決定,但是把最后一位設置為0,第二個IP地址與eth1的IP地址相同
3.5 添加默認路由
執行命令:sudo route可以查看路由表
執行下面2條命令:
sudo route del default sudo route add default gw 192.168.237.2
上述命令中的“192.168.237.2”的前三個數與eth1的IP地址相同。執行sudo route命令查看路由表,如下圖:
此時執行ping www.baidu.com是可以成功的,如果成功不了就試一下ping百度的IP:ping 104.193.88.123
如果ping域名通不了,但是ping IP能通,則是DNS設置的有問題,如果IP都ping不通,那再檢查之前的步驟有沒有做錯。
四、修改開發板配置
4.1 修改配置文件
執行命令:vi /etc/eth0-setting
寫入如下內容:
IP=192.168.1.90 Mask=255.255.255.0 Gateway=192.168.1.3 DNS=114.114.114.114 MAC=08:90:90:90:90:90
其中,IP為開發板的IP地址,Gateway為Ubuntu網卡eth0的IP地址。
執行命令:vi /etc/resolv.conf
寫入如下內容:
nameserver 114.114.114.114
4.2 重設路由表
執行如下命令,重新設置路由表:
route del default route add default gw 192.168.1.3
五、聯網測試
在開發板端執行命令:
ping www.baidu.com
能夠ping通,說明開發板已經可以連接互聯網了,如下圖:
六、問題分析與注意事項
1) 有些板子每次重啟都需要重新修改/etc/resolv.conf文件,如tiny4412。
2)每次開發板重啟都需要重新設置路由表,即執行4.2節中的命令。否則開發板能ping通網關,即192.168.1.3,但無法ping通外網。
3)每次Ubuntu重啟都需要重新執行3.2~3.5節中的命令,為了方便,可以將這些命令寫成一個腳本,如下:
#!/bin/bash sudo modprobe ip_tables sudo modprobe ip_nat_ftp sudo sysctl -p sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 192.168.237.129 sudo route del default sudo route add default gw 192.168.237.2
將其命名為net.sh,並執行命令:chmod +x net.sh為其添加可執行權限,每次Ubuntu重啟時運行這個文件(用超級用戶權限)。
特別注意:如果將上述命令添加為一個腳本,那么這個腳本一定要在Ubuntu下編輯,不能在windows上編輯好后再拷貝到Ubuntu中,因為windows中的換行符為"\r\n"而linux中的換行符為“\n”,當腳本執行成功時,會打印出“net.ipv4.ip_forward = 1”,如下圖,如果沒打印出“net.ipv4.ip_forward = 1”,則表明沒有執行成功。
4)如果配置沒有問題,但板子依然無法聯網,則確認一下windows的防火牆是否關閉,沒關閉的話將其關閉。
5)虛擬網絡編輯器里只有兩張網卡,沒有VMnet0,如下圖:
首先確認虛擬機是否用管理員方式打開的,如果是,則點擊“虛擬網絡編輯器”對話框左下角的“還原默認設置”,這樣VMnet0就出來了。之后還要將VMnet0橋接到電腦的網卡上,通常叫PCIe什么什么的,不同電腦不一樣,上述內容中有說怎么看網卡名。