使用virsh搭建虚拟机管理环境
sudo apt install qemu-kvm libvirt-daemon-system virtinst libvirt-clients bridge-utils
sudo systemctl enable libvirtd
现在通过发出以下命令启动libvirtd:
sudo systemctl start libvirtd
将你的用户添加到KVM和Libvirt组
sudo usermod -aG kvm $USER
现在使用此命令将用户添加到libvirt组:
sudo usermod -aG libvirt $USER
下面列出环境需要的依赖库
1. 安装kvm
yum install kvm / apt-get install kvmapt-get install kvm / apt-get install kvm
2. 安装qemu
yum install qemu/ apt-get install qemu install qemu/ apt-get install qemu
3. 安装libguest
yum install libguestfs libguestfs-tools install libguestfs libguestfs-tools
说明:libguestfs-tools包含virt-cat virt-copy-in virt-copy-out等工具,此项是必须安装的,单独的libguestfs不包含以上内容
4. 安装libvirt
yum install libvirt / apt-get install libvirt
install libvirt / apt-get install libvirt
5. 安装libguestfs-winsupport
On Red Hat Enterprise Linux or CentOS, you have to install the libguestfs-winsupport package.
install the libguestfs-winsupport package.
下载地址:https://people.redhat.com/~rjones/libguestfs-winsupport/
如果不安装winsupport的话,镜像注入时会报错
virt-cat: no operating system was found on this disk
cat: no operating system was found on this disk
VM操作说明
libvirtVM管理工具
环境ubuntu:14:04
软件:
sudoapt-get install kvm
sudoapt-get install libvirt-bin
sudoapt-get install
1.制作基本镜像(windows2008)
1) qemu-img create -f qcow2 win2008_20G.img 20G
2) kvm -m 2024 -cpu Nehalem -hda win2008_20G.img -cdrom window2008.iso-boot d
2.创建VMdomain xml配置
test.xml
<domain type='kvm' id='1'>
<name>test7</name>
<uuid>d779256d-b82d-0ce6-520f-c4dda1596da9</uuid>
<memory>1024000</memory>
<vcpu>1</vcpu>
<os>
<type>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
</features>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/working/kvm/111111/win2008.img'/>
<target dev='hda' bus='ide'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/working/kvm/111111/expand.img'/>
<target dev='hdb' bus='virtio' type='virtio'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/home/working/kvm/111111/virtio-win-0.1-65.iso'/>
<target dev='hdc' bus='ide'/>
</disk>
<interface type = 'bridge'>//增加桥接的化使用virsh创建就可以正常上网
<source bridge = 'virbr0'/>
</interface>
<graphics type='vnc' passwd='' port='5907' keymap='en-us'/>
</devices>
</domain>
<interface type='bridge'> <source bridge='br0'/> <model type='virtio'/> <mac address='00:17:3E:64:01:00'/> //为虚拟机分配mac地址,务必唯一,否则dhcp获得同样ip,引起冲突 <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
3.VM操作
1)创建并启动
sudovirsh create test.xml //创建并启动
2)定义
sudovirsh define test.xml //定义虚拟机不启动
3)启动
sudovirsh start test7 //启动test7
4)关闭
sudovirsh shutdown test7 //关闭test7
5)重启
sudovirsh reboot test7 //重启
6)列表
sudovirsh list
7) monitor交互
sudovirsh qemu-monitor-command test7 --hmp "system_powerdown"
sudovirsh qemu-monitor-command test7 --hmp "set_password vnc 22222" //修改vnc密码
4.vnc链接VM
1) virt-viewer test7
2)通用vnc客户端
5.硬盘挂载
1)前提需要在镜像里面安装virtio驱动,安装virtio驱动后系统就可以直接识别virtio类
型的硬盘。
2)挂载盘配置信息我们也使用xml文件进行配置,配置文件里面只存放最基本的盘符信息, 将一下文件保存为attach.xml
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/tt/working/kvm/111111/expand.img'/>
<target dev='hdf' bus='virtio'/>
</disk>
disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/tt/working/kvm/111111/expand.img'/>
<target dev='hdf' bus='virtio'/>
</disk>
挂载盘符
sudo virsh attach-device test7 attach.xml
挂载后在系统中可以马上看到反映,如果为格式化的话需要在系统里面格式化创建分区。
7. 文件注入
1 ) 镜像文件列表查看
//查看文件列表
sudo virt-ls -a win2003_test.img /"Program Files/Cloudbase Solutions/Cloudbase-Init/conf" -l
2 ) 镜像文件内容查看
//查看cloudbase-init.conf的内容
sudo virt-cat -a win2003_test.img /"Program Files/Cloudbase Solutions/Cloudbase-
Init/conf/cloudbase-init.conf"
virsh attach-device test7 attach.xml
挂载后在系统中可以马上看到反映,如果为格式化的话需要在系统里面格式化创建分区。
7. 文件注入
1 ) 镜像文件列表查看
//查看文件列表
sudo virt-ls -a win2003_test.img /"Program Files/Cloudbase Solutions/Cloudbase-Init/conf" -l
2 ) 镜像文件内容查看
//查看cloudbase-init.conf的内容
sudo virt-cat -a win2003_test.img /"Program Files/Cloudbase Solutions/Cloudbase-
Init/conf/cloudbase-init.conf"
3)镜像文件拷贝
可以用来做镜像文件注入
//把当前目录下的test.xml拷贝到镜像win2003.img中的ProgramFiles/Cloudbase Solutions/Cloudbase-Init/conf目录下
sudo virt-copy-in -a win2003_test.img test.xml /"Program Files/Cloudbase Solutions/Cloudbase-Init/conf"
sudo virt-copy-in -a win2003_test.img test.xml /"Program Files/Cloudbase Solutions/Cloudbase-Init/conf"
8.密码注入
1 ) 密码注入使用CloudBaseInit进行注入
1 ) 密码注入使用CloudBaseInit进行注入
libvirt优点:
具有管理vm功能,若使用qemu的话,需要增加管理VM代码成本。
libvirt缺点:
创建VM,需要对应的XML配置。
virt-install --name ub-20-30 --ram 4096 --vcpu=2 --virt-type kvm --cdrom=/home/lin/kvm/ubu-20/ubuntu-20.04-desktop-amd64.iso --disk ubu-20.qcow2,size=30,bus=virtio --network bridge=virbr0 --graphics vnc,listen=0.0.0.0 --noautoconsole
<domain type='kvm' id='134'>
<name>test-254</name>
<uuid>4a4eed3c-d062-40ef-a6fb-17ea7e0218dc</uuid>
<memory unit='KiB'>8388608</memory>
<currentMemory unit='KiB'>8388608</currentMemory>
<vcpu placement='static'>8</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<cpu mode='custom' match='exact' check='full'>
<model fallback='forbid'>Skylake-Server-IBRS</model>
<feature policy='require' name='md-clear'/>
<feature policy='require' name='spec-ctrl'/>
<feature policy='require' name='ssbd'/>
<feature policy='require' name='hypervisor'/>
<feature policy='disable' name='arat'/>
</cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/test-254.qcow2'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu'/>
<target dev='hda' bus='ide'/>
<readonly/>
<alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<alias name='usb'/>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<alias name='usb'/>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<alias name='usb'/>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'>
<alias name='pci.0'/>
</controller>
<controller type='ide' index='0'>
<alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='virtio-serial' index='0'>
<alias name='virtio-serial0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:04:e4:c9'/>
<source bridge='br1'/>
<target dev='vnet5'/>
<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/4'/>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/4'>
<source path='/dev/pts/4'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/instance-000000a1.sock'/>
<target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0' state='disconnected'/>
<alias name='channel1'/>
<address type='virtio-serial' controller='0' bus='0' port='2'/>
</channel>
<input type='tablet' bus='usb'>
<alias name='input0'/>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'>
<alias name='input1'/>
</input>
<input type='keyboard' bus='ps2'>
<alias name='input2'/>
</input>
<graphics type='spice' port='5904' autoport='yes' listen='127.0.0.1'>
<listen type='address' address='127.0.0.1'/>
<image compression='off'/>
</graphics>
<graphics type='vnc' port='6010' autoport='no' listen='0.0.0.0' keymap='en-us'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<sound model='ich6'>
<alias name='sound0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<redirdev bus='usb' type='spicevmc'>
<alias name='redir0'/>
<address type='usb' bus='0' port='2'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<alias name='redir1'/>
<address type='usb' bus='0' port='3'/>
</redirdev>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</memballoon>
<rng model='virtio'>
<backend model='random'>/dev/urandom</backend>
<alias name='rng0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</rng>
</devices>
<seclabel type='dynamic' model='selinux' relabel='yes'>
<label>system_u:system_r:svirt_t:s0:c154,c744</label>
<imagelabel>system_u:object_r:svirt_image_t:s0:c154,c744</imagelabel>
</seclabel>
<seclabel type='dynamic' model='dac' relabel='yes'>
<label>+107:+107</label>
<ima
qcow2 格式的压缩
首先,需要对虚拟机系统对剩余空间写零操作:
$ dd if=/dev/zero of=/zero.dat
删除 zero.dat:
$ rm /zero.dat
关闭虚拟机,进入虚拟机镜像文件的目录,通过 qemu-img 的 convert 来操作:
$ qemu-img convert -c -O qcow2 /path/old.img.qcow2 /path/new.img.qcow2