UML支持多種方式的網絡,一般使用tap/tun模擬UML虛擬機中的eth0驅動,僅僅這種方式也能分為橋接和NAT等等,手工配置網絡也有助於理解網絡的運行方式。
根據官方文檔 Simple UML Networking 下載 uml_utilities ,其實也就使用了一個工具 tunctl,這個工具很簡單,就是啟動 tun 驅動,首先得先查看是否加載 tun 驅動,當然首先需要有root權限:
# 查看用戶 ID (tunctl 使用)
[cpp@dark tunctl]$ id
uid=500(cpp) gid=500(cpp) groups=500(cpp) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# 切換管理員權限
[cpp@dark tunctl]$ su
Password:
# 查看tun驅動是否加載
[root@dark tunctl]# lsmod | grep tun
# 沒有則加載tun驅動
[root@dark tunctl]# modprobe tun
# 再次查看
[root@dark tunctl]# lsmod | grep tun
tun 13014 0
# 查看普通用戶是否有讀寫tun設備權限
[root@dark tunctl]# ls /dev/net/tun -l
crw-rw-rw-. 1 root root 10, 200 Dec 8 11:19 /dev/net/tun
# 啟動tun,設置用戶ID
# 隨後驅動以tap模式啟動,設備為 tap0
[root@dark tunctl]# ./tunctl -u 500
Set 'tap0' persistent and owned by uid 500
# 查看所有網卡狀態,可以看到已經有tap0接口
[root@dark tunctl]#ifconfig -a
eth1 Link encap:Ethernet HWaddr 08:00:27:54:D1:F5
inet addr:10.33.33.34 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::a00:27ff:fe54:d1f5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:555523 errors:13 dropped:0 overruns:0 frame:0
TX packets:70630 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:424000963 (404.3 MiB) TX bytes:4827144 (4.6 MiB)
Interrupt:19 Base address:0xd020
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:102 errors:0 dropped:0 overruns:0 frame:0
TX packets:102 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:13444 (13.1 KiB) TX bytes:13444 (13.1 KiB)
tap0 Link encap:Ethernet HWaddr DA:47:96:23:59:AA
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
# 激活tap網卡並設置IP地址
[root@dark cpp]# ifconfig tap0 192.168.33.33 up
# 完畢後刪除網卡可使用命令
[root@dark tunctl]# ./tunctl -d tap0
到這裡已經設置好tun/tap網卡,接下來啟動UML虛擬機並且配置網絡:
# 啟動UML虛擬機,設置網卡為tap
[cpp@dark linux-2.6.36]$ ./linux eth0=tuntap,tap0 ubda=Gentoo-10.0-AMD64-root_fs
# 啟動過程中出現
eth0: broadcasting for a lease
eth0: timed out
# 說明並沒有連通網絡
# 啟動虛擬機後檢測網卡配置
eth0: broadcasting for a lease
eth0: timed out
eth0: trying to use old lease in `/var/lib/dhcpcd/dhcpcd-eth0.lease'
localhost ~ # ifconfig
eth0 Link encap:Ethernet HWaddr b2:9d:a5:12:b9:45
inet addr:169.254.186.160 Bcast:169.254.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:1578 (1.5 KiB)
Interrupt:5
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
可以看到UML虛擬機已經有網卡配置,但是並無法連通網絡。連通網絡有幾種方式,像virtualbox等虛擬機的NAT和橋接等等,按照UML這種設計方式,應該可以配置出來任意類型,這裡嘗試配置橋接模式:
# 設置IP路由轉發
[root@dark linux-2.6.36]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@dark linux-2.6.36]# echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp
# 創建網橋 (brctl 位於 bridge-utils 軟件包)
[root@dark linux-2.6.36]# brctl addbr br0
# 把 eth1 和 tap0 加入網橋
[root@dark linux-2.6.36]# brctl addif br0 eth1
[root@dark linux-2.6.36]# brctl addif br0 tap0
# 修改br0網橋的網絡配置並激活
[root@dark linux-2.6.36]# ifconfig eth1 10.33.33.35 up
[root@dark linux-2.6.36]# ifconfig tap0 10.33.33.36 up
[root@dark linux-2.6.36]# ifconfig br0 10.33.33.34 up
# 啟動UML虛擬機,設置網卡為tap
[cpp@dark linux-2.6.36]$ ./linux eth0=tuntap,tap0 ubda=Gentoo-10.0-AMD64-root_fs
# 設置UML虛擬機網絡配置
localhost ~ # ifconfig eth0 10.33.33.36 netmask 255.255.255.0
經過設置網橋後發現仍然無法連通本地10.33.33.35,卻可以ping通遠程機器地址,真是抓狂,抓包發現tap0網卡arp解 析有問題,進一步查看發現tap0網卡的mac地址與虛擬機內eth0網卡mac地址不同,也就是UML內部重新創建一個網卡而並沒有直接使用tap0, 只是通過tap0收發數據,但為什麼遠程機器可以接受但是本地地址無法接受呢?本地網卡把10.33.33.36當成了本機tap0,而外網地址把 10.33.33.36當成了UML虛擬機,故能連通,也就是UML虛擬機跟主機tap0並不相同,是兩個獨立的機器,把UML虛擬機設置為 10.33.33.37,發現所有機器都可以連通。這樣就把UML虛擬機橋接到網絡上了。
現在設置NAT網絡,把系統網絡狀態恢復到開始, 重新設置tap驅動,地址為192.168.33.33,啟動虛擬機,設置ip地址為 192.168.33.34,這樣 192.168.33.* 就相當於一個小局域網,192.168.33.34 通過 192.168.33.33 轉發,設置完畢以後二者便可通信,也省去了橋接的麻煩,只是需要操縱 iptables。
# 在 UML 虛擬機內設置默認路由
localhost ~ # route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.33.33
# 查看路由表,看到已經添加了 default 網關為 192.168.33.33
localhost ~ # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.33.0 * 255.255.255.0 U 0 0 0 eth0
loopback * 255.0.0.0 U 0 0 0 lo
default 192.168.33.33 0.0.0.0 UG 0 0 0 eth0
# 設置IP路由轉發
[root@dark linux-2.6.36]# echo 1 > /proc/sys/net/ipv4/ip_forward
# 設置SNAT源地址轉換 10.33.33.34 為eth1地址
[root@dark linux-2.6.36]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.33.33.34
# 如果此時不通,可檢查iptables的其他規則和UML與主機的路由表配置
這樣便可做成NAT的效果,比橋接方式簡單的多,只是需要知道iptables的用法。當然以上配置每次重啟將會消失,可以寫到配置開機自動設置。
相關系列文章:
Linux 內核調試1-UML http://www.linuxidc.com/Linux/2012-07/66410.htm
Linux 內核調試2-UML調試內核 http://www.linuxidc.com/Linux/2012-07/66411.htm
Linux 內核調試3-UML網絡配置 http://www.linuxidc.com/Linux/2012-07/66412.htm
Linux 內核調試4-Qemu調試Linux內核 http://www.linuxidc.com/Linux/2012-07/66413.htm
Linux 內核調試5-UML和Qemu調試模塊 http://www.linuxidc.com/Linux/2012-07/66414.htm
Linux 內核調試6-使用KGDB雙機調試 http://www.linuxidc.com/Linux/2012-07/66415.htm