Linux 内核调试3-UML网络配置
UML支持多种方式的网络,一般使用tap/tun模拟UML虚拟机中的eth0驱动,仅仅这种方式也能分为桥接和NAT等等,手工配置网络也有助于理解网络的运行方式。根据官方文档 Simple UML Networking 下载 uml_utilities ,其实也就使用了一个工具 tunctl,这个工具很简单,就是启动 tun 驱动,首先得先查看是否加载tun 驱动,当然首先需要有roo
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
更多推荐
所有评论(0)