KVM 虚拟机常用管理命令
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
}
start
virsh 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 -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 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/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 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.qcow2
Name 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,11
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 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
磁盘扩容或缩小
更多推荐
所有评论(0)