zoukankan      html  css  js  c++  java
  • KVM入门

    KVM

    KVM(Kernel-based Virtual Machine)是众多虚拟化技术之一,它是Linux内核中的一个模块,该模块依赖于CPU,如果CPU支持虚拟化,那么该模块才可以被加载。KVM技术是硬件层面的虚拟化,它会为我们虚拟各种硬件设备,这样我们可以在已有操作系统上运行别的操作系统。

    检查CPU是否支持虚拟化

    sudo apt install cpu-checker -y
    sudo kvm-ok
    

    先安装cpu-checker工具,然后使用其带的kvm-ok命令检查kvm模块是否加载

    • 显示‘/dev/kvm does not exist’则表示kvm模块未被加载,执行sudo modprobe kvm_intel命令进行加载
    • 当然加载kvm模块需要开启CPU虚拟化技术,在BIOS中设置Intel Virtualization Technology为Enable

    注:lsmod | grep kvm也可以查看kvm模块是否加载

    安装软件包

    安装服务端软件包

    sudo apt install ubuntu-virt-server
    

    软件包ubuntu-virt-server依赖的两个主要的软件包是qemu-kvm和libvirt-bin。

    • qemu将内核中的虚拟功能暴露给用户,提供了用户空间的虚拟机环境
    • libvirt是一个工具库,通过它可以方便的管理各种虚拟机软件。Libvirt几乎支持所有常见的虚拟技术,包括KVM,Xen,LXC,VMware,VirtualBox等
    安装客户端软件包
    sudo apt-get install virtinst
    

    该软件包提供4个命令来管理虚拟机

    • virt-conver --------把一种格式的虚拟机转为另一种格式
    • virt-clone --------克隆虚拟机
    • virt-image -------创建虚拟机镜像
    • virt-install -------创建新的虚拟机

    创建虚拟机

    配置虚拟网卡

    默认情况下,KVM新创建的虚拟机使用NAT网络(虚拟机可以访问外面,外面看不到它)。这种NAT机制不通过网卡,只通过内核内部的IP转发来进行数据传输,所以外面的机器访问不到虚拟机。为了能让外面的机器访问虚拟机,需要创建虚拟网桥,把虚拟机的虚拟网卡与外部物理网卡通过网桥桥接起来。

    1. 启动IP转发

    编辑/etc/sysctl.conf文件

    # 去掉该行前面的#号,开启转发功能
    net.ipv4.ip_forward = 1
    

    执行sudo sysctl -p命令使配置生效

    2. 创建桥接设备

    在宿主机上安装bridge-utils软件包:

    sudo apt-get install bridge-utils
    

    编辑/etc/network/interfaces,然后添加虚拟网桥网桥br0,将物理网卡enp4s0f2添加到网桥。

    注:将物理网卡enp4s0f2添加到br0后,物理网卡的IP地址将失去作用,所以下面的配置文件中没有为enp4s0f2指定IP

    [...]
    auto enp4s0f2
    iface enp4s0f2 inet manual
    
    auto br0
    iface br0 inet dhcp
    	address 10.10.10.2          网桥IP地址
        netmask 255.255.255.0       掩码
        gateway 10.10.10.1
    	bridge_ports enp4s0f2           #将物理网卡添加到虚拟网桥中
    	bridge_stp off
    	bridge_maxwait 0
    	bridge_fd 0
    [...]
    

    重启网络

    #sudo  /etc/init.d/networking restart
    或
    #sudo service networking restart
    

    重启网络之后,执行brctl show查看网桥是否添加成功,下面显示我的机器已成功创建网桥,并将enp4s0f2网卡添加到网桥中

    11

    3. 创建虚拟机

    首先准备好镜像文件,我这里准备了ubuntu-server-adm64.iso镜像文件,然后通过前面提到的命令来创建虚拟机

    sudo virt-install 
    --name=myvps1 
    --ram=512 
    --network bridge:br0 
    --disk path=/var/lib/libvirt/images/myvps1.img,bus=virtio,size=10 
    --graphics vnc,listen=0.0.0.0
    --noautoconsole 
    --hvm 
    --cdrom ./ubuntu-server-adm64.iso
    

    下面解释一下各个参数的作用:

    • --name=myvps1 虚拟机名称为myvps1
    • --ram=512 虚拟机内存大小为512MB
    • --network bridge:br0 指定网络为网桥设备,后面具体解释
    • --disk 指定虚拟盘的位置,虚拟盘可以是一个文件,分区或者一个逻辑卷。例子指定为myvps1.img文件,空间为10G,总线使用virtio总线
    • --graphics 指定图形界面,例子中指定vnc远程桌面控制,即我们可以使用vnc客户端对虚拟机进行远程桌面控制
    • --noautoconsole 不要自动连接到虚拟机控制台,主要因为我们安装的服务器版虚拟机,它上面没有图形界面
    • --hvm 创建功能完整的虚拟机
    • --cdrom 指定安装镜像位置

    当然关于参数的详解使用man virt-install来查看

    如果虚拟机创建成功则会显示以下内容

    11

    4. 连接虚拟机

    我们使用VNC软件来连接虚拟机,VNC软件是一款开源的Linux远程桌面控制软件,和Windows下的Teamviewer或者是QQ自带的远程桌面控制一样。VNC分服务端和客户端,安装客户端的电脑可以远程控制安装服务端的电脑,刚才我们在创建虚拟机的时候,指定支持vnc远程控制,所以我们下载一个vnc客户端就可以了。下载地址

    下面是vnc软件的连接界面,VNS Server填写网桥的IP即可,Name可以随意命名。

    图片服务器挂了

    连接成功后就会开始装系统的步骤,这里就不介绍了。

    5. 遗留问题

    创建虚拟机的时候会自动创建两块虚拟网卡出来,虚拟机内部有一块(ens3),虚拟机外部也有一块(vnet0),这个下图有显示。在创建虚拟机的我们指定为网桥,意思是将来把外部那块网卡(vnet0)添加到网桥中。而物理机的网卡(enp4s0f2)已被添加的网桥中,这样外部就可以和虚拟机进行通信了(虚拟机内部那块网卡IP必须和网桥在一个IP段)。

    外部虚拟网卡

    图片服务器挂了

    网桥br0中添加了两块网卡(端口)

    图片服务器挂了

    管理虚拟机

    启动虚拟机

    使用下面的命令来启动刚创建的虚拟机

    # virsh start myvps1
    

    让虚拟机随物理机一起启动

    # virsh autostart myvps1
    

    列出正在运行的虚拟机,所有虚拟机,关闭的虚拟机

    # virsh list
    
    # virsh list --all
    
    # virsh list --inactive
    

    重启,关机

    重启

    # virsh reboot myvps1
    

    关机

    # virsh shutdown myvps1
    

    保存,恢复状态

    有时我们需要把某个虚拟机暂时关闭,而又想启动时恢复当时的状态,这是需要用到save命令

    # virsh save myvps1 myvps1-20171202.state
    

    执行上面的命令后,虚拟机的内存会被保存到一个文件中,然后虚拟机自动关闭

    # virsh restore myvps1-20171202.state
    

    恢复虚拟机

    挂起,恢复

    挂起

    # virsh suspend myvps1
    

    恢复

    # virsh resume myvps1
    

    空间扩容

    在虚拟机运行一段时间后可能会需要添加更多的磁盘空间。这里可以使用attach-disk命令对磁盘扩容。

    1. 生成文件

    我们使用dd命令来产生一个文件

    # sudo dd if=/dev/zero   of=/var/lib/libvirt/images/myvps1-disk2.image bs=1M count=4096
    

    该命令会为我们生成一个4GB大小的文件

    2. 把文件添加到虚拟机

    使用attach-disk命令,把刚刚创建的文件添加到myvps1虚拟机,作为其磁盘使用:

    # virsh attach-disk myvps1 
    /var/lib/libvirt/images/myvps1-disk2.img vdb 
    --live 
    --cache none
    

    这样一个名为vdb的虚拟磁盘就被添加到虚拟机中了

    3. 分区

    将硬盘添加到虚拟机后,需要在虚拟机中对新的硬盘进行格式化才能使用。下面的操作都是在虚拟机myvps1中进行的

    查看硬盘是否添加成功

    # sudo fdisk -l
    

    图片服务器挂了

    上图可以看到已经有磁盘/dev/vdb,但是未分区和格式化,关于Linux下如何对分区进行格式化请自行百度

    增加CPU核数

    查看主机cpu核数

    # virsh nodeinf0
    

    我的机器显示两个核,也就是每个虚拟机最多能有两个CPU核

    图片服务器挂了

    查看当前虚拟机(myvps1)虚拟机核数,显示只有一个核,vcpu 0表示第0个核,而不是核数为0

    # virsh vcpuinfo myvps1
    

    图片服务器挂了

    关闭虚拟机
    # virsh shutdown myvps1
    修改最大核数为2核,并设置到配置文件(/etc/libvirt/qemu下)
    # virsh setvcpus myvps1 2 --maximum --config
    设置核数为2到配置文件(/etc/libvirt/qemu下)
    # virsh setvcpu2 myvps1 2 --config
    重启虚拟机
    # virsh start myvps1
    

    图片服务器挂了

    上图显示出两个cpu核表示我们设置成功

    增加内存

    增加内存核增加CPU核数一样,先设置最大内存,在设置当前内存

    查看当前虚拟机信息,可以看到当前的内存设置
    # virsh dominfo myvps1
    设置最大内存为2G
    # virsh setmaxmem myvps1 2097152 --config
    设置当前内存为1G
    # virsh setmem myvps1 1048576 --config
    重启虚拟机
    # virsh shutdown myvps1
    # virsh start myvps1
    

    克隆虚拟机

    有时我们需要几台环境相同的虚拟机,这时,我们不需要从头创建,只需要克隆即可

    先关闭虚拟机
    # virsh shutdown myvps1
    克隆虚拟机
    # sudo virsh-clone 
    --original myvps1 
    --name myvps3 
    --file /var/lib/libvirt/images/myvps3.img
    启动克隆的虚拟机
    # virsh start myvps3
    

    虚拟机镜像管理

    虚拟机镜像做好后,我们可能需要修改虚拟机的IP地址,虚拟机内部的文件等。当然可以先启动虚拟机,然后通过VNC或者SSH进去修改。不过,方便的方法时使用virt-edit命令来直接编辑虚拟机镜像文件即可。virt-edit是libguestfs-tools包提供的命令。

    # sudo apt install libguestfs-tools
    

    这个软件包专门管理虚拟机的虚拟磁盘文件,提供的工具有:

    • virt-cat 显示虚拟机中文件的内容(相当于cat命令)
    • virt-edit 编辑虚拟机中的文件(相当于vi命令)
    • virt-inspector 显示虚拟机的操作系统等详细信息
    • virt-tar 在虚拟机和主机之间传递文件

    当然还有很多命令,这里就不一一列出了

    删除虚拟机

    # virsh undefine myvps1
    # virsh pool-refresh default
    

    在执行virsh undefine myvps1时,虚拟机的虚拟磁盘文件/var/lib/libvirt/images/myvps1.img文件不会被删除,需要手动删除。删除完毕后需要执行virsh pool-refresh default命令清楚虚拟机的缓存记录

  • 相关阅读:
    AMap公交线路查询
    AMap行政区查询服务
    使用JavaScript的Join方法
    获取layer.open弹出层的返回值
    MVC项目中WebViewPage的实战应用
    ASP.NET管道
    Android接收系统广播
    python字符串转换成数字
    mysql缓存
    两个矩阵对应位置的数据相加,并返回一个矩阵
  • 原文地址:https://www.cnblogs.com/xidongyu/p/7955202.html
Copyright © 2011-2022 走看看