Ubuntu 下 KVM 虚拟机创建

记上周末折腾 KVM 搭建好环境以后,这周终于有时间尝试创建虚拟机试试,我用的系统是ubuntu-16.04-server-amd64,所以安装途中的坑都以这个为准。

我的新书《LangChain编程从入门到实践》 已经开售!推荐正在学习AI应用开发的朋友购买阅读!
LangChain编程从入门到实践

虚拟机创建

设置权限

为了让非 root 用户可以直接使用 virsh 命令管理虚拟机,需要将普通用户加入到 kvm 和 libvirt 用户组中,重新登录就会使新的用户组成员生效了:

1
2
$ sudo adduser <youruser> kvm
$ sudo adduser <youruser> libvirtd

注意: 添加到 libvirtd 用户组可能遇到错误 error : virPidFileAcquirePath:422 : Failed to acquire pid file '/var/run/libvirtd.pid': Resource temporarily unavailable
解决:

1
2
3
mv /var/run/libvirtd.pid /var/run/libvirtd.pid.old
systemctl stop libvirt-bin
systemctl start libvirt-bin

使用 virt-install 创建虚拟机

新手第一次推荐使用图形化界面创建虚拟机,建议使用 MobaXterm 连接服务器,原生支持x11,所以直接在shell中运行virt-manager就可以了。(我是直接在宿主机操作的,然后销毁,用 virsh-install 又尝试了一遍,毕竟 CLI 才是常态😂)
注意:

  • 选择英文系统,后面安装阶段会出现一个只有中文系统才存在的bug,没有找到解决的方案
  • 分区磁盘选项:选择向导-使用整个磁盘并设置LVM(这里开个坑,另起一篇详解LVM

其他步骤按照提示就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ virt-install \
# virt-type=kvm: 使用KVM作为虚拟机监视器
--virt-type=kvm \
# name:虚拟机实例的名字
--name=ubuntvm1 \
# ram: 指定虚拟机内存大小,单位是Mb
--ram=512 \
# vcpus: 为虚拟机指定分配的虚拟CPU核数
--vcpus=1 \
# os-variant: 指定虚拟机系统所属系列以优化虚拟机参数,可以通过命令osinfo-query os 来显示所有支持的系统列表,osinfo-query在包libosinfo-bin中 sudo apt-get install libosinfo-bin
--os-variant=ubuntu16.04 \
# hvm: 启用全虚拟化,KVM虚拟机支持全虚拟化,属于优化性参数
--hvm \
# cdrom: 指定作为虚拟机光驱内容的设备或文件,可以是主机的CDROM或者iso文件。
--cdrom=/tmp/ubuntu-16.04-server-amd64.iso \
# 将虚拟机连接到主机网络,此处连接到一个名为defalut的虚拟网络(默认让虚拟机使用NAT模式上网),网卡模式设置为virtio。如果使用桥接模式,则改为network=bridge=br0,model=virtio即可
--network=default,model=virtio \
# 设置虚拟机的console并将其输出到VNC,这样就可以通过VNC来连接虚拟机了,可以指定vnc的端口和监听范围以及密码
--graphics vnc \
# 指定虚拟机所使用的存储路径,大小为5G,disk bus类型为virtio,如果不指定fortmat,磁盘默认格式即为raw
--disk path=/var/lib/libvirt/images/ubuntuvm1.qcow2,size=5,bus=virtio,format=qcow2
# 网络和磁盘建议都设置为virtio,virtio即启动优化的虚拟机专用IO驱动,性能更好。磁盘格式使用qcow2更好,因为qcow2格式即QEMU支持的QEMU Copy On Write磁盘格式,是优化后的磁盘格式,支持快照,并且是使用多少占用多少空间。这两种格式可以使用qemu-img进行转换,qemu-img在包qemu-utils中。

常用操作

1
2
3
4
5
6
7
8
9
10
# 查看虚拟机描述文进(xml文件)
ls /etc/libvirt/qemu
# 查看磁盘镜像文件
ls /var/lib/libvirt/images
# 列出虚拟机
virsh list --all
# 查看指定虚拟机详细信息
virsh dominfo vm-name
# 查看virt-install所支持的OS参数列表
osinfo-query os

更改虚拟机名

1
2
3
4
5
6
7
8
9
# 关闭虚拟机
virsh shutdown vm-name
# 导出域,并编辑replacename.xml文件,将里面的vmname全部替换成replacename
virsh dumpxml /etc/libvirt/qemu/vm-name > replace-name.xml 
# 通过虚拟机配置文件重新定义虚拟机
virsh undefine vm-name
virsh define replace-name.xml
# 编辑虚拟机xml文件
virsh edit vm-name

虚拟机生命周期管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 虚拟机开机/关机
virsh start/shutdown vm-name
# 挂起虚拟机
virsh suspend vm-name
# 软重启(安全重启,相当于在虚拟机内部点击重启选项)虚拟机
virsh reboot vm-name
# 硬重启虚拟机(不安全,有可能数据丢失,相当于强制按主机上的重启按钮)
virsh reset vm-name
# 强制关机
virsh destroy vm-name
# 移除虚拟机定义,即从虚拟机列表中移除虚拟机 该命令只是删除/etc/libvirt/qemu/目录下名为vm-name.xml的配置文件,并不会删除虚拟机磁盘文件
virsh undefine vm-name
# 设置/取消虚拟机随宿主机启动
virsh autostart [--disable] vm-name
# 登录虚拟机
virsh console vm-name

启用 virsh console 终端访问

使用 ssh 登录到 KVM 里的某个 ubuntu 16.04 虚机 ssh [email protected]
在 ubuntu 虚机里配置串口信息,执行下面的两个命令来启用虚机里的串口访问,这样就可以使用virsh console来创建出一个新的连接

1
2
$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

virt-clone 虚机克隆工具

Options(一些基本的选项):
–version:查看版本
-h,–help:查看帮助信息
–connect=URI:连接到虚拟机管理程序 libvirt 的URI
General Option(一般选项):
-o ORIGINAL_GUEST, –original=ORIGINAL_GUEST:原来的虚拟机名称
-n NEW_NAME, –name=NEW_NAME:新的虚拟机名称
–auto-clone:从原来的虚拟机配置自动生成克隆名称和存储路径。
-u NEW_UUID, –uuid=NEW_UUID:克隆虚拟机的新的UUID,默认值是一个随机生成的UUID
Storage Configuration(存储配置):
-f NEW_DISKFILE, –file=NEW_DISKFILE:指定新的虚拟机磁盘文件
–force-copy=TARGET:强制复制设备
–nonsparse:不使用稀疏文件复制磁盘映像
Networking Configuration:(网络配置)
-m NEW_MAC, –mac=NEW_MAC:设置一个新的mac地址,默认是一个随机的mac

1
virt-clone --connect=qemu:///system -o ubuntuvm1 -n ubuntuvm2 -f /var/lib/libvirt/images/ubuntuvm2.img

查看确认

1
2
3
4
5
$ virsh list --all
Id 名称 状态
----------------------------------------------------
2 ubuntuvm2 running
3 ubuntuvm1 running

MAC 地址

1
2
3
sudo grep "mac address" /etc/libvirt/qemu/ubuntuvm*
/etc/libvirt/qemu/ubuntuvm1.xml: <mac address='52:54:00:c7:fa:c0'/>
/etc/libvirt/qemu/ubuntuvm2.xml: <mac address='52:54:00:45:c8:a6'/>

其他工具

virt-v2v

virt-v2v是虚机格式迁移工具,将外部虚拟化平台上的虚拟机转化到KVM平台上运行,它可以读取在VMware、Xen和其他虚拟机管理程序上运行的Windows和Linux虚拟机。

virt-top

类似于linux系统下的top命令,可以显示所有虚拟机CPU、内存等使用情况,该工具需要单独安装sudo apt-get install virt-top

安全工具sVirt

参考链接

How to create and manage KVM virtual machines from CLI

Ubuntu 下 KVM 虚拟机创建

https://liduos.com/kvm-create-vm.html

作者

莫尔索

发布于

2020-04-02

更新于

2024-05-19

许可协议

评论