加载kvm模块:
# grep -o -E ‘svm|vmx’ /proc/cpuinfo –color
vmx
# modprobe kvm_intel
# modprobe kvm
# lsmod | grep kvm
kvm_intel 170086 0
kvm 566340 1 kvm_intel
irqbypass 13503 1 kvm
创建netspace
# yum -y install qemu-kvm
# ip netns add r2
# ip netns add r1
# ip netns list
r1
r2
在namespace运行测试
# ip netns exec r1 ifconfig -a
lo: flags=8<LOOPBACK> mtu 65536
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# ip netns exec r1 ifconfig -a
lo: flags=8<LOOPBACK> mtu 65536
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.209.13 netmask 255.255.255.0 broadcast 192.168.209.255
inet6 fe80::20c:29ff:fe6c:1f58 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6c:1f:58 txqueuelen 1000 (Ethernet)
RX packets 2798 bytes 216063 (210.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3082 bytes 1433753 (1.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.207 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::dd90:75e0:5453:904d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6c:1f:62 txqueuelen 1000 (Ethernet)
RX packets 25931 bytes 36933919 (35.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8150 bytes 592338 (578.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens35: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::1fb8:11d:fd2d:f7d9 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6c:1f:6c txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 346 bytes 61308 (59.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
创建桥:
# yum -y install bridge-utils
# brctl addbr net-ex
# brctl show
bridge name bridge id STP enabled interfaces
net-ex 8000.000000000000 no
物理网卡拆除地址,桥添加ip:
# ip add del 10.0.0.207/24 dev ens34;brctl addif net-ex ens34; ifconfig net-ex 10.0.0.207/24 up;# ip route add default via 10.0.0.1;ip route add default via 10.0.0.1
# brctl show
bridge name bridge id STP enabled interfaces
net-ex 8000.000c296c1f62 no ens34
# ifconfig
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::dd90:75e0:5453:904d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6c:1f:62 txqueuelen 1000 (Ethernet)
RX packets 11601 bytes 10405655 (9.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3337 bytes 238642 (233.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
net-ex: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.207 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::20c:29ff:fe6c:1f62 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6c:1f:62 txqueuelen 1000 (Ethernet)
RX packets 2943 bytes 1075890 (1.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# brctl addbr net-in
# brctl show
bridge name bridge id STP enabled interfaces
net-ex 8000.000c296c1f62 no ens34
net-in 8000.000000000000 no
# ip link set net-in up;ip link set net-ex up;
打开核心转发:
# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
net.ipv4.ip_forward = 1
创建网卡对:
# ip link add veth0 type veth peer name veth0.1
# ip link show
6: veth0.1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 2a:b7:86:a4:e0:e7 brd ff:ff:ff:ff:ff:ff
7: veth0@veth0.1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 8e:7a:3b:66:28:27 brd ff:ff:ff:ff:ff:ff
添加接口进入桥:
# brctl addif net-in ens35
# brctl show
bridge name bridge id STP enabled interfaces
net-ex 8000.000c296c1f62 no ens34
net-in 8000.000c296c1f6c no ens35
# brctl addif net-ex veth0
给对网卡添加地址:
# ip netns exec r1 ifconfig veth0.1 10.0.0.222/24 up
# ip netns exec r1 ifconfig
veth0.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.222 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::28b7:86ff:fea4:e0e7 prefixlen 64 scopeid 0x20<link>
ether 2a:b7:86:a4:e0:e7 txqueuelen 1000 (Ethernet)
RX packets 456 bytes 100463 (98.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# ip link add veth1 type veth peer name veth1.1
# brctl show
bridge name bridge id STP enabled interfaces
net-ex 8000.000c296c1f62 no ens34
veth0
net-in 8000.000c296c1f6c no ens35
# brctl addif net-in veth1
# ip link set veth1 up
把网卡添加到namespace:
# ip link set veth1.1 netns r1
# ip netns exec r1 ip link set veth1.1 up
# ip netns exec r1 ifconfig
veth0.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.222 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::28b7:86ff:fea4:e0e7 prefixlen 64 scopeid 0x20<link>
ether 2a:b7:86:a4:e0:e7 txqueuelen 1000 (Ethernet)
RX packets 806 bytes 171737 (167.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1026 (1.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth1.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.0.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::b040:31ff:fed9:b3f7 prefixlen 64 scopeid 0x20<link>
ether b2:40:31:d9:b3:f7 txqueuelen 1000 (Ethernet)
RX packets 7 bytes 578 (578.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7 bytes 578 (578.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
启动虚拟机:
# mkdir -pv /images/cirros
# mv cirros-0.3.5-x86_64-disk.img /images/cirros/
# yum -y install qemu-kvm
# ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
# chmod +x /etc/qemu-kvm/qemu-if*
# bash -n /etc/qemu-kvm/qemu-ifup
# bash -n /etc/qemu-kvm/qemu-ifdown
虚拟机启动脚本:
# cat /etc/qemu-kvm/qemu-ifup
#!/bin/bash
#
bridgename=net-in
if [ -n $1 ] ; then
ip link set $1 up
sleep 1
brctl addif $bridgename $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo “Error:no interface specified!”
fi
[root@localhost ~]# cat /etc/qemu-kvm/qemu-ifdown
#!/bin/bash
#
bridgename=net-in
if [ -n $1] ;then
brctl delif $bridgename $1
sleep 1
ip link set $1 down
[ $? -eq 0 ] && exit 0 || exit 1
else
echo “Error:no interface specified!”
fi
启动虚拟机:
# qemu-kvm -m 128 -smp 2 -drive \
file=/images/cirros/cirros-0.3.5-x86_64-disk.img,media=disk,format=qcow2,if=virtio,cache=writeback \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E -net tap,vnet_hdr=on,vhost=on,script=/etc/qemu-kvm/qemu-ifup,downscript=/etc/qemu-kvm/qemu-ifdown \
-balloon virtio \
-nographic
启动nat模式:
# ip netns exec r1 iptables -t nat -A POSTROUTING -s 172.16.0.0/16 ! -d 172.16.0.0/16 -j SNAT –to 10.0.0.222
开启namespace dhcp:
# yum -y install dnsmasq
# dnsmasq –help
-F, –dhcp-range=<ipaddr>,… Enable DHCP in the range given with lease duration.
-a, –listen-address=<ipaddr> Specify local address(es) to listen on.
-O, –dhcp-option=<optspec> Specify options to be sent to DHCP clients.
启动netspace-dhcp功能:
# ip netns exec r1 dnsmasq –dhcp-range=172.16.0.10,172.16.0.20 –listen-address=172.16.0.1 –dhcp-option=option:router,172.16.0.1
启动第二台虚拟机测试:
# cp /images/cirros/cirros-0.3.5-x86_64-disk{.img,2.img} -av
‘/images/cirros/cirros-0.3.5-x86_64-disk.img’ -> ‘/images/cirros/cirros-0.3.5-x86_64-disk2.img’
# cp -av /etc/qemu-kvm/qemu-ifup{,2}
‘/etc/qemu-kvm/qemu-ifup’ -> ‘/etc/qemu-kvm/qemu-ifup2’
# cp -av /etc/qemu-kvm/qemu-ifdown{,2}
‘/etc/qemu-kvm/qemu-ifdown’ -> ‘/etc/qemu-kvm/qemu-ifdown2’
# qemu-kvm -m 128 -smp 2 \
> -nographic \
> -drive file=/images/cirros/cirros-0.3.5-x86_64-disk2.img,media=disk,if=virtio,cache=writeback,format=qcow2 \
> -net nic,macaddr=52:54:00:A5:41:2E,model=virtio -net tap,vnet_hdr=on,vhost=on,script=/etc/qemu-kvm/qemu-ifup2,downscript=/etc/qemu-kvm/qemu-ifdown2 \
> -balloon virtio
# udhcpc -R
udhcpc (v1.20.1) started
WARN: ‘/usr/share/udhcpc/default.script’ should not be used in cirros. Replaced by cirros-dhcpc.
Sending discover…
Sending select for 172.16.0.19…
Lease of 172.16.0.19 obtained, lease time 3600
WARN: ‘/usr/share/udhcpc/default.script’ should not be used in cirros. Replaced by cirros-dhcpc.
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0