如果CPU支持,还需要在BIOS打开虚拟化支持。通常,主板默认关闭这个选项。
kvm-ok # 或 grep -E "vmx|svm" /proc/cpuinfo # Intel CPU:vmx # AMD CPU:svm
使用libvirt负责虚拟化的创建及管理。
# Ubuntu sudo apt-get -y install qemu-kvm qemu-utils libvirt-bin pm-utils virtinst sudo apt-get -y install virt-viewer virt-manager # CentOS yum install -y qemu-kvm qemu-kvm-tools libvirt libvirt-devel libvirt-client pm-utils yum install -y virt-viewer virt-manager
# Ubuntu中解依编译信赖关系 sudo apt-get build-dep qemu-kvm tar -xzvf qemu-kvm-1.2.0.tar.gz cd qemu-kvm-1.2.0 /configure --prefix=/usr/local/kvm make sudo make install # 安装后加载KVM模块 # 注意:系统重启后要重新加载kvm内核模块,从源安装时会有qemu-kvm服务来自动加载该模块。 sudo modprobe kvm sudo modprobe kvm-intel #INTEL处理器就用这个 sudo modprobe kvm-amd #AMD处理器就用这个
start_libvirtd="yes" libvirtd_opts="-d -l"
listen_tls = 0 # 禁用tls listen_tcp = 1 # 启用tcp侦听 tcp_port = "16509" # tcp端口 listen_addr = "0.0.0.0" # tcp侦听IP auth_unix_ro = "none" auth_unix_rw = "none" auth_tcp = "sasl" # tcp登录认证方式,"none"为不使用认证 log_level = 3 log_outputs="3:syslog:libvirtd" max_clients = 1024 # 最大总的连接客户数1024 min_workers = 50 # libvirtd启动时,初始的工作线程数目 max_workers = 200 # 同上,最大数目 max_requests = 1000 # 最大同时支持的RPC调用,必须大于等于max_workers max_client_requests = 200 # 每个客户端支持的最大连接数
apt-get install sasl2-bin sed -i ‘s/\(^START\)=.*$/\1=yes/g‘ /etc/default/saslauthd
# 添加用户 saslpasswd2 -a libvirt yuanxing #列出用户 sasldblistusers2 -f /etc/libvirt/passwd.db # yuanxing@kvmsrv: userPassword,注意:登录时用户名要包含@kvmsrv #删除用户 saslpasswd2 -a libvirt -d yuanxing
sed -i -e ‘/^vnc_listen/d‘ i-e ‘/^vnc_password/d‘ /etc/libvirt/qemu.conf echo ‘vnc_listen = "0.0.0.0"‘ >> /etc/libvirt/qemu.conf echo ‘vnc_password = "XYZ12345"‘ >> /etc/libvirt/qemu.conf
service libvirt-bin start|restart|stop|status|reload|force-reload service qemu-kvm start|restart|stop|status|reload|force-reload
sudo apt-get -y install bridge-utils
使用ifplugd方便向桌面发送状态通知、通过异步处理加快启动速度(dhcp浪费时间)。
使用vde2使用可能是方便以普通用户身份来管理(UserModeLinux,涉及到uml工具)?
auto lo iface lo inet loopback auto virbr1 iface virbr1 inet static address 172.17.20.20 network 172.17.20.0 netmask 255.255.255.0 broadcast 172.17.20.255 gateway 172.17.20.1 dns-nameservers 8.8.8.8 4.4.4.4 bridge_ports eth0 bridge_stp on bridge_maxwait 0
sudo stop network-manager # Create an override file for the upstart job: echo "manual" | sudo tee /etc/init/network-manager.override
net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0
sysctl -p /etc/sysctl.conf
<network> <name>default</name> <uuid>3be6d4fa-72c4-667b-64ae-85f954f1b2bf</uuid> <forward mode=‘nat‘/> <bridge name=‘virbr0‘ stp=‘on‘ delay=‘0‘ /> <mac address=‘52:54:00:D6:A2:9B‘/> <ip address=‘192.168.122.1‘ netmask=‘255.255.255.0‘> <dhcp> <range start=‘192.168.122.2‘ end=‘192.168.122.254‘ /> </dhcp> </ip> </network>
<network> <name>network-host-bridge</name> <uuid>3b8bf95c-6971-8794-1c63-bc2b8c551979</uuid> <forward mode=‘bridge‘/> <bridge name=‘virbr1‘ /> </network>
virsh net-list --all #virsh net-define default.xml virsh net-define network-host-bridge.xml virsh net-start network-host-bridge virsh net-autostart network-host-bridge # virsh net-dumpxml network-host-bridge > /etc/libvirt/qemu/network/network-host-bridge.xml
<interface type=‘network‘> <mac address=‘52:54:00:6c:07:87‘/> <source network=‘network-host-bridge‘/> <target dev=‘vnet0‘/> <model type=‘virtio‘/> <alias name=‘net0‘/> <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/> </interface>
<interface type=‘bridge‘> <mac address=‘52:54:00:6c:07:87‘/> <source bridge=‘virbr1‘/> <target dev=‘vnet0‘/> <model type=‘virtio‘/> <alias name=‘net0‘/> <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/> </interface>
# Generated by iptables-save v1.4.12 on Sat Dec 14 01:24:40 2013 *nat :PREROUTING ACCEPT [310:34187] :INPUT ACCEPT [41:4149] :OUTPUT ACCEPT [471:31957] :POSTROUTING ACCEPT [711:59731] -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE COMMIT # Completed on Sat Dec 14 01:24:40 2013 # Generated by iptables-save v1.4.12 on Sat Dec 14 01:24:40 2013 *mangle :PREROUTING ACCEPT [789078:428240757] :INPUT ACCEPT [381196:51105050] :FORWARD ACCEPT [407928:377150708] :OUTPUT ACCEPT [399811:110095092] :POSTROUTING ACCEPT [807739:487245800] -A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill COMMIT # Completed on Sat Dec 14 01:24:40 2013 # Generated by iptables-save v1.4.12 on Sat Dec 14 01:24:40 2013 *filter :INPUT ACCEPT [381157:51098101] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [399811:110095092] -A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT -A INPUT -i virbr1 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -i virbr1 -p tcp -m tcp --dport 53 -j ACCEPT -A INPUT -i virbr1 -p udp -m udp --dport 67 -j ACCEPT -A INPUT -i virbr1 -p tcp -m tcp --dport 67 -j ACCEPT -A FORWARD -d 192.168.122.0/24 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT -A FORWARD -i virbr0 -o virbr0 -j ACCEPT -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr1 -o virbr1 -j ACCEPT -A FORWARD -o virbr1 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr1 -j REJECT --reject-with icmp-port-unreachable COMMIT # Completed on Sat Dec 14 01:24:40 2013
/usr/sbin/dnsmasq -u libvirt-dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interface lo --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override
virsh virt-install virt-manager virt-clone virt-convert virt-image qeum-img
virsh -c qemu:///system # 本地登录libvirt控制台 virsh -c qemu+ssh://root@172.17.20.20/system # ssh远程登录libvirt控制台 virsh -c qemu+tcp://172.17.20.20:16509/system # tcp远程登录libvirt控制台 virt-manager -c qemu+tcp://172.17.20.20:16509/system # 运行libvirt图形管理界面 virt-manager -c qemu+ssh://root@172.17.20.20/system
<pool type=‘dir‘> <name>data</name> <uuid>117251c7-3444-a5e3-3174-1947c4933321</uuid> <capacity>446342758400</capacity> <allocation>7004667904</allocation> <available>439338090496</available> <source> </source> <target> <path>/data/libvirt/images</path> <permissions> <mode>0700</mode> <owner>-1</owner> <group>-1</group> </permissions> </target> </pool>
<pool type=‘dir‘> <name>ISOs</name> <uuid>e77d9811-5497-521d-0d50-e5104c7e66b1</uuid> <capacity>446342758400</capacity> <allocation>7004667904</allocation> <available>439338090496</available> <source> </source> <target> <path>/data/ISOs</path> <permissions> <mode>0700</mode> <owner>-1</owner> <group>-1</group> </permissions> </target> </pool>
virsh pool-list Name State Autostart ----------------------------------------- data active yes ISOs active yes
使用 virt-manager -c qemu+ssh:///system
远程连接libvirtd后,在图形界面中创建了第一个虚拟机Ubuntu,并安装了操作系统。
<domain type=‘kvm‘ id=‘2‘> <name>Ubuntu</name> <uuid>d2a37ea8-d343-c4bd-c6d0-fb6bd1943f91</uuid> <memory>1048576</memory> <currentMemory>1048576</currentMemory> <vcpu>2</vcpu> <os> <type arch=‘x86_64‘ machine=‘pc-1.0‘>hvm</type> <boot dev=‘cdrom‘/> <boot dev=‘hd‘/> </os> <features> <acpi/> <apic/> <pae/> </features> <clock offset=‘utc‘/> <on_poweroff>destroy</on_poweroff> <on_reboot>destroy</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/kvm</emulator> <disk type=‘file‘ device=‘disk‘> <driver name=‘qemu‘ type=‘qcow2‘/> <source file=‘/data/libvirt/images/Ubuntu.img‘/> <target dev=‘vda‘ bus=‘virtio‘/> <alias name=‘virtio-disk0‘/> <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x04‘ function=‘0x0‘/> </disk> <disk type=‘file‘ device=‘cdrom‘> <driver name=‘qemu‘ type=‘raw‘/> <source file=‘/data/ISOs/ubuntu-12.04.3-server-amd64.iso‘/> <target dev=‘hdc‘ bus=‘ide‘/> <readonly/> <alias name=‘ide0-1-0‘/> <address type=‘drive‘ controller=‘0‘ bus=‘1‘ unit=‘0‘/> </disk> <controller type=‘ide‘ index=‘0‘> <alias name=‘ide0‘/> <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x01‘ function=‘0x1‘/> </controller> <interface type=‘bridge‘> <mac address=‘52:54:00:6c:07:87‘/> <source bridge=‘virbr1‘/> <target dev=‘vnet0‘/> <model type=‘virtio‘/> <alias name=‘net0‘/> <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/> </interface> <serial type=‘pty‘> <source path=‘/dev/pts/1‘/> <target port=‘0‘/> <alias name=‘serial0‘/> </serial> <console type=‘pty‘ tty=‘/dev/pts/1‘> <source path=‘/dev/pts/1‘/> <target type=‘serial‘ port=‘0‘/> <alias name=‘serial0‘/> </console> <input type=‘mouse‘ bus=‘ps2‘/> <graphics type=‘vnc‘ port=‘5900‘ autoport=‘yes‘/> <video> <model type=‘cirrus‘ vram=‘9216‘ heads=‘1‘/> <alias name=‘video0‘/> <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x02‘ function=‘0x0‘/> </video> <memballoon model=‘virtio‘> <alias name=‘balloon0‘/> <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x05‘ function=‘0x0‘/> </memballoon> </devices> <seclabel type=‘dynamic‘ model=‘apparmor‘ relabel=‘yes‘> <label>libvirt-d2a37ea8-d343-c4bd-c6d0-fb6bd1943f91</label> <imagelabel>libvirt-d2a37ea8-d343-c4bd-c6d0-fb6bd1943f91</imagelabel> </seclabel> </domain>
# 进程以libvirt-qemu用户身份运行 /usr/bin/kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 2,sockets=2,cores=1,threads=1 -name Ubuntu -uuid d2a37ea8-d343-c4bd-c6d0-fb6bd1943f91 -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/Ubuntu.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-reboot -no-shutdown -drive file=/data/libvirt/images/Ubuntu.img,if=none,id=drive-virtio-disk0,format=qcow2 -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=2 -drive file=/data/ISOs/ubuntu-12.04.3-server-amd64.iso,if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=1 -netdev tap,fd=19,id=hostnet0,vhost=on,vhostfd=20 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:6c:07:87,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -usb -vnc 127.0.0.1:0 -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5
sh -c if nc -q 2>&1 | grep "requires an argument" >/dev/null 2>&1; then ARG=-q0;else ARG=;fi;nc $ARG -U /var/run/libvirt/libvirt-sock nc -q0 -U /var/run/libvirt/libvirt-sock nc -q 0 127.0.0.1 5900
使用vmbuilder创建Ubuntu JeOS虚拟服务器,包括虚拟机创建、系统安装、包安装,以及系统设置定制均可一步完成。
apt-get instal python-vm-builder
vmbuilder --help
vmbuilder kvm ubuntu --help
Vmbuilder缺省对网卡启用了virtio特性,但虚拟磁盘未启用virtio特性,可修改其配置档解决:
vim /etc/vmbuilder/libvirt/libvirtxml.tmpl <target dev=‘hd$disk.devletters()‘ /> # to <target dev=‘vd$disk.devletters()‘ bus=‘virtio‘ />
Since my virtual machines require a pointopoint entry in /etc/network/interfaces I also edit /etc/vmbuilder/ubuntu/interfaces.tmpl and add an additional line pointopoint underneath gateway. This will set pointopoint to the gateway address that I specify with vmbuilder.
pointopoint $gw
As a last ugly rather hack I edit /usr/share/pyshared/VMBuilder/plugins/kvm/vm.py and change the default file image type from qcow2 to raw to improve the disk throughput.
filetype = ‘raw‘
Instead of editing vm.py you could also use the qemu-img command after running vmbuilder to convert the qcow2 image to raw (or just keep qcow2 if you are fine with it).
[DEFAULT] arch=amd64 mem=512 cpus=2 ip=172.17.20.31 gw=172.17.20.1 mask=255.255.255.0 dns=8.8.8.8 user=yuanxing name=YuanXing pass=123456 tmpfs=- firstboot=/data/libvirt/JeOStemplate/firstboot.sh #firstlogin=/data/libvirt/JeOStemplate/firstlogin.sh #bridge=virbr1 network=network-host-bridge [ubuntu] mirror=http://mirrors.163.com/ubuntu iso=/data/ISOs/ubuntu-12.04.3-server-amd64.iso suite=precise flavour=virtual hostname=JeOS addpkg=openssh-server,acpid,vim,at,bc,byobu,tmux,screen,iptables [kvm] libvirt = qemu:///system
# This script will run the first time the virtual machine boots # It is ran as root. echo "Expire the user account" passwd -e user echo "Regenerate ssh keys" rm -f /etc/ssh/ssh_host*key* dpkg-reconfigure -fnoninteractive -pcritical openssh-server
# This script is ran the first time a user logs in echo "Your appliance is about to be finished to be set up." echo "In order to do it, we‘ll need to ask you a few questions," echo "starting by setting you keyboard and other console informations."
# ubuntu 12.04中vmbuilder的cli.py中对part的处理存在bug,不能正确按man中的格式处理设备名和文件名,因为只能使用如下简单格式 root 8000 swap 4000 --- /data 20000
vim +391 /usr/lib/python2.7/dist-packages/VMBuilder/contrib/cli.py
sudo vmbuilder kvm ubuntu -c MyJeOS.cfg --part vmbuilder.partition --timezone=CST -d /data/libvirt/images/JeOS # 或者直接在命令行中指定参数 sudo vmbuilder kvm ubuntu --suite precise --flavour virtual --arch amd64 --libvirt qemu:///system --hostname gonzo --ip 192.0.32.9 --net 192.0.32.9 --mask 255.255.255.255 --bcast 192.0.32.9 --gw 213.103.105.1 --domain example.com --user john --name john --pass 12345 --verbose --rootsize=20480 --swapsize=2048 --mem 1024 --cpus 1 --addpkg=openssh-server --addpkg=vim --addpkg=acpid --dest=/var/lib/libvirt/images/gonzo/
virt-install --name=Ubuntu2 --ram 1024 --vcpus=2 --disk pool=data,size=8,bus=virtio,format=qcow2,sparse=false,cache=writeback --cdrom /data/ISOs/ubuntu-12.04.3-server-amd64.iso --vnc --network bridge=virbr1,model=virtio --noautoconsole --connect=qemu:///system # 或用网络名称: # --network network=network-host-bridge
说明:在linux系统安装开始就要注意添加提高性能的一些参数,后面就不需要做一些调整了。
参数说明:
--name 指定虚拟机名称 --ram 分配内存大小 --vcpus 分配CPU核心数,最大与实体机CPU核心数相同 --disk 指定虚拟机镜像,size 指定分配大小单位为G。 --network 网络类型,此处用的是默认,一般用的应该是 bridge 桥接。 --cdrom 指定安装镜像iso --vnc 启用VNC远程管理,一般安装系统都要启用。 --vncport 指定VNC 监控端口,默认端口为5900,端口不能重复。 --vnclisten 指定VNC 绑定IP,默认绑定127.0.0.1,这里改为 0.0.0.0。 --noautoconsole Don‘t automatically try to connect to the guest console
virsh -c qemu:///system vol-clone --pool data tmpiEMBDQ.qcow2 JeOS_2.qcow2
--connect=CONNECT -o ORIGINAL_GUEST , --original=ORIGINAL_GUEST 被克隆的原始Guest名称 -m MAC , --mac=MAC MAC地址 --auto-clone, Generate a new guest name, and paths for new storage. -n NAME , --name=NAME 新虚拟机Guest的名称 -u UUID , --uuid=UUID 指定UUID -f DISKFILE , --file=DISKFILE
# 将JeOS克隆为指定NAME,按--file指定路径Clone虚拟磁盘。 NAME=JeOS1; mkdir /data/libvirt/images/$NAME && virt-clone --connect qemu:///system --original JeOS --name $NAME --file /data/libvirt/images/$NAME/$NAME.qcow2 --file /data/libvirt/images/$NAME/${NAME}_data.qcow2
[转载]XStar's Libvirt+KVM部署记录 目录
原文:https://www.cnblogs.com/xuanbjut/p/10994592.html