KVM虚拟机常用管理命令

基于内核的虚拟机 Kernel-based Virtual Machine(KVM)是一种内建于 Linux® 中的开源虚拟化技术。具体而言,KVM 可帮助您将 Linux 转变为虚拟机监控程序,使主机计算机能够运行多个隔离的虚拟环境,即虚拟客户机或虚拟机(VM)。

KVM 是 Linux 的一部分。Linux 2.6.20 或更新版本包括 KVM。KVM 于 2006 年首次公布,并在一年后合并到主流 Linux 内核版本中。由于 KVM 属于现有的 Linux 代码,因此它能立即享受每一项新的 Linux 功能、修复和发展,无需进行额外工程。

1. 准备

 

2. 常用管理命令

2.1 创建/还原

~$ virt-install --name ubuntu-vm-01 --memory 8192 --vcpus=4 --os-type linux --os-variant ubuntu20.04 --graphics vnc,password=000000,listen=::,port=5911 --network bridge=br0 --disk path=/home/ubuntu/kvm/images/ubuntu-vm-01.qcow2,size=50 --cdrom /home/ubuntu/kvm/iso/ubuntu-20.04.2-live-server-amd64.iso --debug

以上方式启动后,需要使用 VNC 客户端(如:VNC Viewer)连接到服务器的 5911 端口安装系统。下面是 console 模式安装。

virt-install \--name ubuntu-vm-02 \--memory 8192 \--disk pool=default,size=50,bus=virtio,format=qcow2 \--vcpus 4 \--os-type linux \--os-variant ubuntu20.04 \--network bridge=br0 \--graphics none \--console pty,target_type=serial \--location 'http://gb.archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/' \--extra-args 'console=ttyS0,115200n8 serial' \ --force --debug

复制代码

参数说明:

–name          #指定虚拟机名称–memory        #分配内存大小MB–vcpus         #分配CPU核心数,最大与实体机CPU核心数相同–disk          #指定虚拟机镜像,size指定分配大小单位为G。–network       #网络类型,此处用的是默认,一般用的应该是bridge桥接。–accelerate    #加速–cdrom         #指定安装镜像iso--graphics     #显示形式

复制代码

通过已存在qcow2镜像文件创建:

$ virt-install --name vm-ubuntu-06 --memory 8192 --vcpus=4 --os-type linux --graphics vnc,password=000000,listen=::,port=5912 --network bridge=br0 --disk path=/home/ubuntu/kvm/images/vm-ubuntu-06.qcow2,size=50 --force --import --autostart --debug

通过xml配置文件创建,此方法不包含 qcow2 镜像文件,你需要拷贝一份镜像文件。

$cp k8s-node1.qcow2 k8s-node2.qcow2

$ virsh define vm-ubuntu.xml

记得需要先修改 xml 配置相应的参数

domain type='kvm'>  <name>k8s-node2</name>                                   # 修改主机名  <uuid>f80fc0c8-33ca-f3ce-0b3d-068eac67737e</uuid>        # 修改uuid,必须唯一  <metadata>    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">      <libosinfo:os id="http://ubuntu.com/ubuntu/20.04"/>    </libosinfo:libosinfo>  </metadata>  <memory unit='KiB'>8204288</memory>                      # 修改内存  <currentMemory unit='KiB'>8204288</currentMemory>        # 修改内存  <vcpu placement='static'>4</vcpu>                        # 修改CPU数  <os>    <type arch='x86_64' machine='pc-q35-4.2'>hvm</type>    <boot dev='hd'/>  </os>    ...    <interface type='bridge'>      <mac address='52:54:00:87:ce:12'/>                   # mac地址一定要不一样      <source bridge='br0'/>      <model type='virtio'/>      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>    </interface>        ...      <input type='mouse' bus='ps2'/>    <input type='keyboard' bus='ps2'/>    <graphics type='vnc' port='5914' autoport='no' listen='::'> # 修改VNC连接端口      <listen type='address' address='::'/>    </graphics>

复制代码

通过已有虚拟机克隆,克隆虚拟机时需要确保被克隆的虚拟机处于关闭或者挂起状态。

$ newname=new-vm

$ virt-clone --original=k8s-master --name=${newname} --file=/home/ubuntu/kvm/images/${newname}.qcow2

克隆参数:

–original      被克隆的虚拟机名–name          克隆的虚拟机名–file          克隆虚拟机的磁盘映像需要存放的位置
可以使用-o,-n,-f来简写当原虚拟机有多个硬盘文件时,后面需要跟多个–file。注意virt-clone无法指定静态网络参数。virt-clone还可以指定uuid,mac等信息,省略的信息表示由virt自动生成。virt-clone后面也可以只接–original参数,然后再接个–auto-clone参数进行动进行克隆。

复制代码

克隆脚本clone.sh

function clone_kvm {  clear    read -p "Please input the name of the new virtual machine:" newname  if [ -z $newname ];then    echo "Nothing input."    exit 1  fi
  virt-clone --original=k8s-master --name=${newname}  --file=/home/ubuntu/kvm/images/${newname}.qcow2}
clone_kvm

复制代码

2.2 备份

使用virsh dumpxml导出配置文件,并复制相应的.qcow2 镜像文件。

$ virsh dumpxml vm-ubuntu-01 > ../images/vm-ubuntu-01.xml

使用virsh snapshot-create-as创建快照:

$ virsh snapshot-create-as --domain vm-ubuntu-01 --name snap-vm-ubuntu-01 --description "vm-ubuntu-01"

快照存放路径在用户目录下:$USER/.config/libvirt/qemu/snapshot/

$ cd ~/.config/libvirt/qemu/snapshot

2.3 基本管理

使用virsh list查看当前运行的虚拟机

~$ virsh list

Id Name State

---------------------------

3 ubuntu-vm running

查看所有的虚拟机

~$ virsh list --all

开启和关闭虚拟机

~$ virsh start ubuntu-vm #ubuntu-vm 是虚拟机名字

~$ virsh shutdown ubuntu-vm

启动所有虚拟机脚本

#!/bin/bash
function start {  clear    list=$(virsh -q list --all|awk '{print $2","$3}'|sort)  for string in $list;do     arr=(${string//,/ })     if [ "${arr[1]}" = "shut" ];then       virsh start ${arr[0]}       sleep 3     else       printf "\033[01;32m%.20s\033[00m\n" "$string";     fi  done  }
startvirsh list

复制代码

查看 VNC 自动端口

~$ virsh vncdisplay ubuntu-vm

自动端口需要虚拟机关机使用virsh edit命令修改配置文件
<graphics type='vnc' port='-1' autoport='yes' listen='::' passwd='000000'>      <listen type='address' address='::'/></graphics>

复制代码

进入查看虚拟机

~$ virt-viewer ubuntu-vm #ubuntu-vm 是虚拟机名字

libvirtd 启动时自动启动虚拟机

~$ virsh autostart ubuntu-vm #ubuntu-vm 是虚拟机名字

挂起/恢复虚拟机

~$ virsh suspend ubuntu-vm # 挂起虚拟机

~$ virsh resume ubuntu-vm # 恢复挂起的虚拟机

销毁虚拟机

~$ virsh undefine ubuntu-vm # 销毁拟机,会删除虚拟机配置文件,但不会删除虚拟磁盘

查看虚拟机信息

~$ virsh dominfo ubuntu-vm

软重启虚拟机

~$ virsh reboot ubuntu-vm

硬重启虚拟机

~$ virsh reset ubuntu-vm

设置虚拟机随着宿主主机开机自动启动

~$ virsh autostart ubuntu-vm

#开机自动启动的虚拟机配置文件会自动在目录/etc/libvirt/qemu/autostart/目录

禁止虚拟机开机启动

~$ virsh autostart --disable ubuntu-vm

编辑虚拟机配置文件

~$ virsh edit ubuntu-vm

#系统会提示选用哪个编辑器

2.4 快照

创建快照

$ virsh snapshot-create-as --domain vm-ubuntu --name snap-vm-ubuntu --description "vm-ubuntu snapshot" #不写 name 自动按时间生成

查看快照

$ virsh snapshot-list vm-ubuntu

回滚快照

$ virsh snapshot-revert --domain vm-ubuntu snap-vm-ubuntu #回滚名称位 snap-vm-ubuntu 的快照

$ virsh snapshot-revert --domain vm-ubuntu --current #回滚最新版快照

删除快照

$ virsh snapshot-delete --domain vm-ubuntu --snapshotname snap-vm-ubuntu

$ virsh snapshot-delete vm-ubuntu snap-vm-ubuntu

2.5 磁盘管理

2.5.1 给虚拟机添加硬盘

首先给虚拟机创建一块硬盘

$ qemu-img create -f qcow2 vm-win-04-d.qcow2 100G #创建一块 100G 的硬盘

其次关闭要添加的虚拟机

$ virsh shutdown vm-win-04

最后编辑虚拟机磁盘信息,找到 disk 节点把刚才磁盘添加进去。

$ virsh edit vm-win-04

<disk type='file' device='disk'>      <driver name='qemu' type='qcow2'/>      <source file='/home/ubuntu/kvm/images/vm-win-04-d.qcow2'/>      <target dev='hdb' bus='ide'/>      <address type='driver' controller='0' bus='0' target='0' unit='1'/></disk><!--unit字段为磁盘的顺序,C盘是0,所以这里是1--><!--dev字段为磁盘,C盘是hda,所以这里是hdb-->

复制代码

2.5.2 给虚拟机添加光驱

编辑虚拟机磁盘信息,找到 disk 节点把光驱 ISO 文件添加进去。

$ virsh edit vm-win-04

<disk type='file' device='cdrom'>      <driver name='qemu' type='raw'/>      <source file='/home/ubuntu/kvm/iso/cn_windows_server_2019x64.iso' index='1'/>      <backingStore/>      <target dev='hdb' bus='ide'/>      <readonly/>      <alias name='ide0-0-1'/>      <address type='drive' controller='0' bus='0' target='0' unit='1'/>    </disk>

复制代码

2.5.3 给虚拟机扩容

这里以 Ubuntu 20.04 为例。

安装扩展工具

$ sudo apt install -y libguestfs-tools

进入虚拟机查看系统容量

$ df -hT

$ df -hTFilesystem                        Type      Size  Used Avail Use% Mounted onudev                              devtmpfs  3.9G     0  3.9G   0% /devtmpfs                             tmpfs     797M  2.8M  794M   1% /run/dev/mapper/ubuntu--vg-ubuntu--lv ext4       24G   13G   11G  55% /tmpfs                             tmpfs     3.9G     0  3.9G   0% /dev/shmtmpfs                             tmpfs     5.0M     0  5.0M   0% /run/locktmpfs                             tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup/dev/vda2                         ext4      976M  203M  707M  23% /boot/dev/loop1                        squashfs   56M   56M     0 100% /snap/core18/2128/dev/loop2                        squashfs   68M   68M     0 100% /snap/lxd/20326/dev/loop0                        squashfs   56M   56M     0 100% /snap/core18/2074/dev/loop3                        squashfs   71M   71M     0 100% /snap/lxd/21029/dev/loop5                        squashfs   33M   33M     0 100% /snap/snapd/12883/dev/loop4                        squashfs   33M   33M     0 100% /snap/snapd/12704

复制代码

这里根目录LV(如上:/dev/mapper/ubuntu--vg-ubuntu--lv )容量是 24G,已经使用了 13G 了。

在物理机上查看虚拟机镜像所在位置

$ virsh edit vm-ubuntu-01

xml配置文件如下,在/home/ubuntu/kvm/images/vm-ubuntu-01.qcow2位置:

<disk type='file' device='disk'>      <driver name='qemu' type='qcow2'/>      <source file='/home/ubuntu/kvm/images/vm-ubuntu-01.qcow2'/>      <target dev='vda' bus='virtio'/>      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>    </disk>

复制代码

查看虚拟机磁盘信息

$ sudo virt-filesystems --partitions --long -a ~/kvm/images/vm-ubuntu-01.qcow2

$ sudo virt-filesystems --partitions --long -a ~/kvm/images/vm-ubuntu-01.qcow2Name       Type       MBR  Size          Parent/dev/sda1  partition  -    1048576       /dev/sda/dev/sda2  partition  -    1073741824    /dev/sda/dev/sda3  partition  -    106297294848  /dev/sda

复制代码

为虚拟机创建一块新磁盘

$ qemu-img create -f qcow2 ~/kvm/images/new.qcow2 100G

将旧磁盘合并到新磁盘

$ sudo virt-resize --expand /dev/sda3 ~/kvm/images/vm-ubuntu-01.qcow2 ~/kvm/images/new.qcow2

删除旧磁盘,用合并后的磁盘替换掉原来的磁盘

$ mv -f ~/kvm/images/new.qcow2 ~/kvm/images/vm-ubuntu-01.qcow2

重启虚拟机

$ virsh start vm-ubuntu-01

进入虚拟机查看磁盘信息

$ lsblk -e 7,11

$ lsblk -e 7,11NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTvda                       252:0    0   50G  0 disk ├─vda1                    252:1    0    1M  0 part ├─vda2                    252:2    0    1G  0 part /boot└─vda3                    252:3    0   49G  0 part   └─ubuntu--vg-ubuntu--lv 253:0    0 24.5G  0 lvm  /

复制代码

这里我们要将根目录挂载点扩容ubuntu--vg-ubuntu--lv,VG 名称为:ubuntu-vg,LV 名称为:ubuntu-lv,所以查看详情命令如下:

$ sudo lvdisplay ubuntu-vg/ubuntu-lv

$ sudo lvdisplay ubuntu-vg/ubuntu-lv  --- Logical volume ---  LV Path                /dev/ubuntu-vg/ubuntu-lv  LV Name                ubuntu-lv  VG Name                ubuntu-vg  LV UUID                LHaX2y-qyxA-TyFi-fwEx-AyBl-mDjv-pojCtR  LV Write Access        read/write  LV Creation host, time ubuntu-server, 2021-07-07 14:57:16 +0800  LV Status              available  # open                 1  LV Size                24.50 GiB  Current LE             6272  Segments               1  Allocation             inherit  Read ahead sectors     auto  - currently set to     256  Block device           253:0

复制代码

继续查看 VG 信息

$ sudo vgdisplay ubuntu-vg

$ sudo vgdisplay ubuntu-vg  --- Volume group ---  VG Name               ubuntu-vg  System ID               Format                lvm2  Metadata Areas        1  Metadata Sequence No  2  VG Access             read/write  VG Status             resizable  MAX LV                0  Cur LV                1  Open LV               1  Max PV                0  Cur PV                1  Act PV                1  VG Size               <49.00 GiB  PE Size               4.00 MiB  Total PE              12543  Alloc PE / Size       6272 / 24.50 GiB  Free  PE / Size       12271 / 50.50 GiB  VG UUID               PWhZ0p-Mvkl-GYBO-qTgB-EM6E-FP37-MjvCV5

复制代码

通过 pvs 可以查看 pv 与 vg 的组成关系:

$ sudo pvs

 $ sudo pvs  PV         VG        Fmt  Attr PSize   PFree    /dev/vda3  ubuntu-vg lvm2 a--  100.00g 50.50g

复制代码

查看 PV 信息

sudo pvdisplay /dev/vda3

 $  sudo pvdisplay /dev/vda3  --- Physical volume ---  PV Name               /dev/vda3  VG Name               ubuntu-vg  ...

复制代码

扩展逻辑卷,这里的100G为扩展到100G,而不是在原有基础上加100G

$ sudo lvextend -L 100G /dev/ubuntu-vg/ubuntu-lv

如果出现磁盘不足,可使用以下命令扩展所有空余空间。

$ sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv

扩展文件系统

$ sudo resize2fs /dev/ubuntu-vg/ubuntu-lv

2.5.4 压缩磁盘空间

进入虚拟机对磁盘剩余空间写零操作到一个大文件。磁盘越大时间越长!

$ sudo dd if=/dev/zero of=/zero.dat

然后删除它

$ sudo rm /zero.dat

然后在物理机上操作关闭虚拟机

$ virsh shutdown k8s-master

在将压缩后的文件写到一个新的 qcow2 镜像文件。

$ qemu-img convert -c -O qcow2 k8s-master.qcow2 k8s-master-new.qcow2

删除旧的磁盘用新镜像替换,或者直接使用mv -f命令。

$ rm k8s-master.new.qcow2

$ mv k8s-master-new.qcow2 k8s-master.qcow2

3. 其他管理工具

安装其他管理工具

$ sudo apt install libguestfs-tools libguestfs-xfs virt-top

virt-top 查看资源占用情况

virt-df查看磁盘信息

virt-cat cat 查看虚拟机中某个文件

virt-edit 编辑虚拟机中某个文件

guestmount为虚拟机挂在磁盘

virt-ls ls 虚拟机中的目录列表

virt-resize 磁盘扩容或缩小

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐