欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux-KVM虚拟化

程序员文章站 2022-07-07 11:33:40
kvm安装 1、在宿主机上准备好yum(只需要本地镜像yum就可以) 2、查看CPU是否支持inter或AMD的虚拟技术 3、安装kvm 4、确认是否有装在kvm模块,没有装载可以使用modprobe kvm来装载 5、启动并设置为开机自启动 kvm安装虚拟机 图形安装 第一步、 安装方式: --我 ......

kvm安装

1、在宿主机上准备好yum(只需要本地镜像yum就可以)

2、查看cpu是否支持inter或amd的虚拟技术

# cat /proc/cpuinfo |grep -e "vmx|svm"

3、安装kvm

# yum install qemu-kvm libvirt virt-install libvirt-python virt-manager virt-install libvirt-client virt-viewer

4、确认是否有装在kvm模块,没有装载可以使用modprobe kvm来装载

# lsmod |grep kvm
kvm_intel             170181  0 
kvm                   554609  1 kvm_intel
irqbypass              13503  1 kvm

5、启动并设置为开机自启动

# systemctl start libvirtd
# systemctl status libvirtd
# systemctl enable libvirtd

kvm安装虚拟机

图形安装

 --和xen一样的命令,打开虚拟机管理器
# virt-manager   

第一步、

安装方式:         --我这里选择第一个,使用iso直接安装

 

第二步、

安装路径:/data/centos-7-x86_64-dvd-1611.iso                  --写上iso的路径

 

第三步、

内存大小: 800m          -- 内存如果较小,安装时无法使用图形安装方式,只能使用文本安装方式

cpu个数:2                 --不能大于宿主机器的cpu核数

 

第四步、

硬盘大小:20g          --我这里定义20g大小;它的默认路径会在/var/lib/libvirt/images/kvm1.qcow2

 

第五步、

name:kvm1              --自定义一个虚拟机名称

网络现在只能选择default --这是一个nat网络(私有网络),桥接网络不能选,需要后面单独配置后才能选择

命令行安装

# virt-install --hvm --name "kvm1" --memory 800 --vcpus 2  --disk=/var/lib/libvirt/images/kvm1.qcow2,size=20 -l /share/centos-7-x86_64-dvd-1611.iso --network bridge=virbr0

--hvm 指使用全虚拟化

kvm主要的管理命令

virsh help  
virsh help domain
virsh help network
virsh help monitor   --因为参数很多,可以用象domain,network,monitor这种关键字,只查看与关键字有关的参数帮助
......
# virsh  list
 id    name                           state
----------------------------------------------------
 1     kvm1                           running

# virsh list --all
 id    name                           state
----------------------------------------------------
 1     kvm1                           running
 -     kvm2                           shut off

启动、关闭、重启相关

# virsh  start kvm1       --启动一个虚拟机
# virsh shutdown kvm1 --正常关闭一个虚拟机(把服务都停掉,再关电源)
# virsh reboot kvm1 --正常重启一个虚拟机,先shutdown再start
# virsh  destroy kvm1     --强制关闭一个虚拟机,类似断电,可以瞬间关闭虚拟机     

# virsh  reset kvm1       --相当于是先destroy,再start

保存、暂停相关

# virsh save kvm1 /etc/libvirt/qemu/kvm1.save      --把kvm1关闭,并把当前状态保存为一个文件    

# virsh restore /etc/libvirt/qemu/kvm1.save    --通过保存的文件,恢复当时save时的状态

# virsh suspend kvm1    --暂停kvm1的状态

# virsh resume kvm1    --由暂停切换为继续的状态

连接虚拟机相关

方法一:

# virt-manager 打开管理器,双击你要连接的虚拟机

方法二:

# virt-viewer  kvm1   --连接一个已经启动的虚拟机,并使用图形查看

方法三:

# ssh x.x.x.x   --非图形方式就可以连,但需要虚拟机配置好ip

方法四:

非图形方式也可以使用console连(此方法不需要虚拟机配置ip都可以连),但需要配置授权

# virsh console kvm1   --字符连接一个虚拟机,但是现在连接不了;因为需要一个串口的授权才可以;

授权做法:

1,在kvm1虚拟机里操作(注意不是在宿主机上操作)
# grubby --update-kernel=all --args="console=ttys0"
# reboot
2,在宿主机virsh console kvm1连接使用 
3,退出的方式
exit只是退出登录的用户而已
要完全退出这个console连接,需要使用的是ctrl+ ] (也就是右中框号的这个键)

虚拟机相关的文件

以kvm1为例:

配置文件在:

/etc/libvirt/qemu/kvm1.xml

磁盘文件默认在:

/var/lib/libvirt/images/kvm1.qcow2

打开虚拟机配置文件的做法:

方法一:

# vim /etc/libvirt/qemu/kvm1.xml

方法二:

# virsh edit kvm1      --此方法默认是调用vi,所以没有颜色,你可以做个软链接,让访问vi实际链接到vim就可以了

命令删除一个虚拟机的做法(假设kvm3)

# virsh destroy kvm3

# virsh undefine kvm3

# rm -rf /var/lib/libvirt/images/kvm3.img

kvm的克隆

--注意:克隆都需要源虚拟机器是关闭或者暂停状态

图形克隆

  • 先关闭kvm1或 virsh suspend kvm1暂停kvm1(使用virsh resume kvm1恢复)
  • virt-manager--》右键点kvm1--》选择clone-->修改克隆后的名字或其它参数--》点clone

文本克隆

 1、拷贝配置文件和磁盘文件

# cp /etc/libvirt/qemu/kvm1.xml /etc/libvirt/qemu/kvm3.xml

# cp /var/lib/libvirt/images/kvm1.qcow2 /var/lib/libvirt/images/kvm3.qcow2

 2、修改拷贝的配置文件

# vim /etc/libvirt/qemu/kvm3.xml

<domain type='kvm'>
  <name>kvm3</name>        --名字改成kvm3
  <uuid>811d69e8-b1d8-cfbf-684a-69f2e0af6b88</uuid>    --uuid随便改几个数字
  <memory unit='kib'>1048576</memory>
  <currentmemory unit='kib'>1048576</currentmemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none'/>
      <source file='/var/lib/libvirt/images/kvm3.qcow2'/>   --磁盘路径改成kvm3.qcow2的路径
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:5c:3a:2d'/>   --网卡地址随便改下,只改后三位
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes'/>
    <sound model='ich6'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>

3、保存后,使用virsh list --all查看不到的,需要define一下

# virsh define /etc/libvirt/qemu/kvm3.xml
# virsh list --all        --再查就可以查看到kvm3
 id    name                           state
----------------------------------------------------
 -     kvm1                           shut off
 -     kvm1-clone                     shut off
 -     kvm2                           shut off
 -     kvm3                           shut off

4、再启动

# virsh start kvm3   --可以启动克隆的机器了

命令克隆

# virt-clone -o kvm1 -n kvm4 -f /var/lib/libvirt/images/kvm4.img 
allocating kvm4.img  7% [-          ]  34 mb/s | 957 mb     05:29 eta

--把kvm1克隆成kvm4,指定磁盘路径为/var/lib/libvirt/images/kvm4.img;如果kvm1有多个硬盘,那么克隆时也要对应的克隆成多个路径

kvm网络管理

只查看与网络有关的帮助参数

# virsh  help network
# virsh net-list --all
name                 state      autostart
-----------------------------------------
default              active     yes     --这是一个nat网络,私有网络
# virsh net-info default
name            default
uuid            704eb1b7-3feb-4a38-8642-9c3fe2f023bb
active:         yes
persistent:     yes
autostart:      yes
bridge:         virbr0

default网段的配置文件的路径为:

/etc/libvirt/qemu/networks/default.xml
# virsh net-destroy default        --停掉default网络,由virsh net-list --all去查看,状态变为inactive
# virsh net-start  default         --启动default网络,状态变为active

图形增加私有网络

virt-manager打开图形--》edit --》connections details --》 virtual networks--》点左下角的+号增加一个私有网络(选择名字,网络分配地址范围,dhcp的分配范围)

注意:这里最后一步有三种网络:

1、isolated 相当vmware的hostonly,没有nat,也没有网关(完全和vmware的hostonly类型一样)

2、nat 有网关,有nat,可以通过宿主上外网(和vmware的nat类型一样)

3、routed 也是相当于hostonly,在isolated的基础上就是加了一个网关(仍然是和vmware的hostonly一致,但多了一个网关)

把上面的步骤做完后,直接在宿主机用ifconfig或virsh net-list --all,就可以看到新加的网络了

手动增加私有网络

1、拷贝一个网络配置文件并编辑

# cp /etc/libvirt/qemu/networks/default1.xml /etc/libvirt/qemu/networks/default2.xml
# vim /etc/libvirt/qemu/networks/default2.xml
<network> <name>default2</name> --修改名字为default2 <uuid>243166ddb-e2fd-9983-1997-5e8efdc06c42</uuid> --uuid随便修改一下 <bridge name='virbr2' stp='on' delay='0' /> --virbr1改成virbr2 <mac address='52:54:00:af:27:25'/> --mac地址改一下,只改后面三位 <ip address='192.168.101.1' netmask='255.255.255.0'> --ip改为101 <dhcp> <range start='192.168.101.128' end='192.168.101.254' /> --dhcp地址范围也改成101的 </dhcp> </ip> </network>

2、定义一下,然后就可以使用virsh  net-list --all去查看,状态为inactive,autostart的状态为no

# virsh net-define /etc/libvirt/qemu/networks/default2.xml

3、启动

# virsh net-start default2

4、查看

# ifconfig virbr2 |head -2    --查看就有了    
virbr2    link encap:ethernet  hwaddr 52:54:00:af:27:25  
          inet addr:192.168.101.1  bcast:192.168.101.255  mask:255.255.255.0
# ls /etc/libvirt/qemu/networks/autostart/
default1.xml   default.xml

5、设置为开机自动启动

# virsh net-autostart default2

# ls /etc/libvirt/qemu/networks/autostart/    --这里就会多了default2.xml了,其实都是网络配置文件的软链接
default1.xml  default2.xml   default.xml

刚加的网络配置文件都在下面的目录

# ls /etc/libvirt/qemu/networks
autostart  default1.xml  default2.xml  default.xml

修改一个网络

1、编辑配置文件

# vim /etc/libvirt/qemu/networks/default2.xml    


<network>
  <name>default2</name>
  <uuid>243166ddb-e2fd-9982-1996-5e8efdc06c42</uuid>
  <forward dev='eth0' mode='route'>
    <interface dev='eth0'/>
  </forward>
  <bridge name='virbr2' stp='on' delay='0' />
  <mac address='52:54:00:af:166:45'/>
  <ip address='192.168.102.1' netmask='255.255.255.0'>    --我这里把以前的192.168.101.0的ip范围都改成了192.168.102.0
    <dhcp>
      <range start='192.168.102.128' end='192.168.102.254' />
    </dhcp>
  </ip>
</network>

保存后,使用ifconfig virbr1 查看,还是192.168.102.1, 没有改变

需要做下面三步:

2、定义一个网络,使你的修改被他知道

# virsh net-define /etc/libvirt/qemu/networks/default2.xml  --定义一个网络,使你的修改被他知道
network default2 defined from /etc/libvirt/qemu/networks/default3.xml

3、停一下这个网络

# virsh net-destroy default2    --停一下这个网络
network default2 destroyed

4、再启动这个网络

# virsh net-start default2    --再启这个网络
network default2 started

ifconfig virbr2查看,成功修改成192.168.102.1

上面的第一步和第二步可以统一成一步来做:

# virsh  net-edit default2   --使用这个命令打开,修改,然后就直接net-destroy和net-start,不需要去net-define

删除一个网络

图形删除一个网络

virt-manager打开图形--》edit --》connections details --》 virtual networks--》选择你要删除的网络,然后左下角,先停,再删除就可以了

命令删除一个网络

# virsh net-destroy default2    --停掉要删除的网络,用virsh net-list --all命令去查就变成了inactive状态

# virsh net-undefine default2  --这下就删除了这个网络定义了,并且物理上的配置文件也没了

增加一个桥接网络

把物理网卡enp2s0桥接到br0(这个名字是自己定义的)

1、在宿主机上创建一个桥接网络

# systemctl stop networkmanager
# systemctl status networkmanager
# systemctl disable networkmanager
# vim /etc/sysconfig/network-scripts/ifcfg-br0  --此文件不存在,br0这个名字是自定义的
device=br0        --名字对应好
type=bridge        --这里的birdge,b要大写,后面的irdge要小写
bootproto=static
ipaddr=172.16.13.x
netmask=255.255.255.0
gateway=172.16.13.254
dns1=114.114.114.114
onboot=yes

2、把一个物理网卡加到一个桥接网络里,这里是把enp2s0加到br0

# vim /etc/sysconfig/network-scripts/ifcfg-enp2s0     --原物理网卡enp2s0里的配置只留下这三句就可以了
device="enp2s0"
onboot="yes"
bridge=br0

3、重启网络

/etc/init.d/network restart 或者 systemctl restart network

在宿主机上ifconfig 查看就会有br0这个网卡,有ip;而原enp2s0网卡没有ip;这是正常的

修改虚拟机的网卡连接

图形修改

virt-manager打开图形,双击你要修改的虚拟机--》点击左上的一个!号(centos7里看到的是一个像灯泡一样的符号)按钮show virtual hardware detail-->>找个网卡,修改成你想要改的网络

命令修改

# virsh edit kvm3

    <interface type='network'>
      <mac address='52:54:00:07:8d:e5'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

改成下面的样子

    <interface type='bridge'>        --network改成了bridge
      <mac address='52:54:00:07:8d:e5'/>
      <source bridge='br0'/>        --network改成了bridge;default改成了br0
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
# virsh shutdown kvm1

# virsh start kvm1    --重启后,虚拟机就是桥接网络

kvm磁盘管理

图形添加硬盘设备

virt-manager--》 双击打开kvm4--》点左上角的灯泡符号show virtual hardware details --》点左下角add devices 直接添加,并写上相关参数就可以(注意参数,device type都选择virtio,不需要重启虚拟机,可以直接生效,并且磁盘名叫vda,vdb,vdc...;如果你第一次加硬盘选择ide disk,需要重启,并且磁盘名叫sda,sdb,sdc...)

注意:用图形方式在线删除磁盘后,还要去物理上把它的磁盘xxx.qcow2文件给rm掉

命令添加硬盘设备

1、使用dd命令创建一个磁盘文件

# dd if=/dev/zero of=/var/lib/libvirt/images/kvm4-2.img bs=1m count=1 seek=4000000
--seek是指跳过多少个bs块,这里就是产生一个4t大小的文件(实际大小只1m)
# qemu-img info /var/lib/libvirt/images/kvm4-2.img
image: /var/lib/libvirt/images/kvm4-2.img
file format: raw                --格式为raw(这是老版本的默认格式,新版本是qcow2格式)
virtual size: 3.8t (4194305048576 bytes)
disk size: 1.0m
# cd /var/lib/libvirt/images/
# qemu-img convert -f raw -o qcow2 kvm4-2.img kvm4-2.qcow2    --把kvm4-2.img文件转换成一个新文件kvm4-2.qcow2(格式也转换成qcow2)
# rm kvm4-2.img -rf    --原来的这个文件不用了就可以删除掉了
# qemu-img info /var/lib/libvirt/images/kvm4-2.qcow2 
image: /var/lib/libvirt/images/kvm4-2.qcow2
file format: qcow2                 --转化后的新文件格式就为qcow2格式了
virtual size: 3.8t (4194305048576 bytes)
disk size: 256k
cluster_size: 65536
format specific information:
    compat: 1.1
    lazy refcounts: false

2、编辑虚拟机的配置文件

# virsh edit kvm4
<devices>与</devices>之间加上下面的一段,也可以把其它磁盘的配置定义拷贝一段进行修改


    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' />       --格式为qcow2
      <source file='/var/lib/libvirt/images/kvm4-2.qcow2'/>  --路径名称改成kvm4-2.qcow2
      <target dev='vdb' bus='virtio'/>    --新加的硬盘,就叫vdb
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>    --slot也改一下,我这里是把0x07改成0x09(只要这个编号没有被重复占用就可以)    
    </disk>

3、重启虚拟机后(有可能reboot还不行,需要force off再启动),登录使用fdisk就能查看到这个4t大小的硬盘了

迁移磁盘目录

比如宿主机的/var目录空间不够,想把磁盘文件改到气他目录(如/data/kvm/目录)

# virsh destroy kvm1  --先停掉kvm1

# mv /var/lib/libvirt/images/kvm1.qcow2 /data/kvm/


# virsh edit kvm1
......
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' />
      <source file='/data/kvm/kvm1.qcow2'/>    --把这个路径改成mv后的新路径
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
......


# virsh start kvm1