当前位置: 首页 > article >正文

记录使用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,否则不支持嵌套虚拟化


http://www.kler.cn/a/534543.html

相关文章:

  • Deno vs Node.js:性能对比深度解析
  • 【MySQL】centos 7 忘记数据库密码
  • [创业之路-276]:从燃油汽车到智能汽车:工业革命下的价值变迁
  • Ubuntu x64下交叉编译ffmpeg、sdl2到目标架构为aarch64架构的系统(生成ffmpeg、ffprobe、ffplay)
  • 自指学习:AGI的元认知突破
  • Hugging Face 的研究人员正致力于打造 OpenAI 深度研究工具的“开源版
  • 图像分割中根据mask的ROI,去除mask和image中没有勾画ROI层数以外的图像
  • 数据库技术基础
  • Certum OV企业型通配符SSL
  • 常用工具类——Collections集合框架
  • c++ 基础 计算机的内存和寻址机制
  • Redis面试题总结(题目来源JavaGuide)
  • LeetCode 3442.奇偶频次间的最大差值 I
  • ASP.NET Core筛选器Filter
  • Vue3.5常用特性整理
  • 一、tsp学习笔记——开发环境搭建
  • 计算机网络笔记再战——理解几个经典的协议6——TCP与UDP
  • Mysql-增删改查(知识点总结)
  • WPS的word文档加密
  • module ‘matplotlib.cm‘ has no attribute ‘get_cmap‘
  • 在https下引用IC卡读卡器web插件
  • LeetCode 257.二叉树的所有路径
  • BUU10 [极客大挑战 2019]LoveSQL1
  • RK3576——USB3.2 OTG无法识别到USB设备
  • docker容器编排工具 docker compose
  • 【Elasticsearch】 邻接矩阵聚合(Adjacency Matrix Aggregation)