记录使用libvirt创建虚拟机、自定义qcow2镜像
环境:debian12虚拟机
文章目录
- 检查是否支持虚拟化
- 检查cpu是否支持虚拟化
- 检查是否支持嵌套虚拟化
- 自定义qcow2镜像
- 下载qcow2镜像
- 调整qcow2磁盘大小和文件系统
- 自定义系统(root密码、时区、软件源等)
- 创建虚拟机
- 安装libvirt
- 配置libvirt
- 定义xml文件
- 启动虚拟机
- 连接虚拟机
- 注意
检查是否支持虚拟化
检查cpu是否支持虚拟化
egrep --color 'vmx|svm' /proc/cpuinfo
# 结果高亮显示vmx或svm则支持
检查是否支持嵌套虚拟化
因为我是在pve的虚拟机中使用libvirt,因此需要检查此项
# intel处理器,结果为Y表示已启用
cat /sys/module/kvm_intel/parameters/nested
# amd处理器,结果为1表示已启用
cat /sys/module/kvm_amd/parameters/nested
自定义qcow2镜像
下载qcow2镜像
我这里下载了debian12的qcow2镜像
mkdir /data && cd /data
wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
cp debian-12-genericcloud-amd64.qcow2 vm1.qcow2
调整qcow2磁盘大小和文件系统
# 这里设置为20G
qemu-img resize /data/vm1.qcow2 20G
# 加载 nbd 模块
modprobe nbd max_part=16
# 挂载磁盘到/dev/nbd0
qemu-nbd -c /dev/nbd0 /data/vm1.qcow2
# 安装growpart工具(redhat系安装cloud-utils-growpart)
apt install -y cloud-guest-utils
# 查看系统盘分区是第几个,我这里是第1个
fdisk -l
# 扩容系统盘分区
LC_ALL=en_US.UTF-8 growpart /dev/nbd0 1
# 断开磁盘挂载
qemu-nbd -d /dev/nbd0
# 卸载nbd模块
rmmod nbd
自定义系统(root密码、时区、软件源等)
# 先使用openssl生成个root用户的密码,备用
openssl passwd -1 123456
# 安装guestfish工具
apt install guestfish
# 使用guestfish编辑qcow2镜像内的文件
guestfish --rw -a /data/vm1.qcow2
进入guestfish执行
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: ‘help’ for help on commands
‘man’ to read the manual
‘quit’ to quit the shell
# 执行run
><fs> run
# 列出文件系统
><fs> list-filesystems
/dev/sda1: ext4
/dev/sda14: unknown
/dev/sda15: vfat
# 挂载系统分区,我这里是第一个sda1
><fs> mount /dev/sda1 /
# 修改root密码, 把第一行root:*:19724:0:99999:7:::中的星号*(可能是其他字符)改为上面openssl生成的密码
><fs> vi /etc/shadow
# 修改sshd配置开启密码登录,把PasswordAuthentication值改为yes
><fs> vi /etc/ssh/sshd_config
# 添加dhcp网络配置(这个debian镜像默认用systemd-networkd来管理网络,其他镜像要看用的哪个网络管理工具,也可以进入虚机后修改)
><fs> vi /etc/systemd/network/20-dhcp.network
# 内容如下
[Match]
Name=enp*
[Network]
DHCP=yes
# 修改时区为Shanghai
><fs> rm /etc/localtime
><fs> ln /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 修改apt软件源,不同debian版本的配置路径可能不一样,这里忽略
><fs> vi /etc/apt/mirrors/****
# 退出编辑qcow2文件
><fs> quit
创建虚拟机
安装libvirt
# 安装包
apt install libvirt-daemon-system qemu-kvm
# 启动默认的虚拟网卡
virsh net-start default
virsh net-autostart default
# 查看默认网卡信息,我这里bridge名称是virbr0
virsh net-info default
配置libvirt
定义xml文件
新建文件/data/vm1.xml
,内容如下:
<domain type='kvm'>
<name>vm1</name>
<memory unit='GiB'>1</memory> <!-- 1G内存-->
<vcpu>1</vcpu> <!-- 1个CPU -->
<os>
<type arch='x86_64' machine='pc-i440fx-2.9'>hvm</type>
<boot dev='hd'/>
</os>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/data/vm1.qcow2'/> <!-- qcow2镜像文件路径 -->
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<mac address='11:11:11:11:11:11'/> <!-- 定义一个mac地址,不要重复,可以删除这行,自动会生成 -->
<source bridge='virbr0'/> <!-- default网卡的bridge名称 -->
<model type='virtio'/>
</interface>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' passwd='123456'>
<listen type='address' address='0.0.0.0'/>
</graphics>
</devices>
</domain>
启动虚拟机
# 定义虚拟机vm1
virsh define vm1.xml
# 查看所有
virsh list --all
# 启动vm1
virsh start vm1
连接虚拟机
- virsh console连接
# 连接后敲回车,会提示输入root和密码
virsh console vm1
- vnc连接,先查看自动分配的vnc端口号,然后使用vnc工具连接
宿主机ip:vnc端口号
virsh dumpxml vm1
输出内容中看到端口号为5900
...
<graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
...
- ssh连接,获取ip后,可执行ssh命令连接
ssh root@x.x.x.x
注意
因为我在pve的虚拟机中创建子虚拟机,虚拟机的cpu类型要设置为host,否则不支持嵌套虚拟化