2023年1月

在虚拟机管理程序上运行虚拟机(VM)时,可以创建一个或多个镜像。 作为虚拟机磁盘。 如果要在不启动VM的情况下修改VM镜像中的文件,可能通过挂载镜像文件。 然后,就可以修改磁盘镜像的内容了。

在Linux中,有一些方法挂载镜像,不同类型的镜像需要不同的方法。 如果您使用的是qcow2类型的镜像(QEMU / KVM使用),可以用方法可以在Linux上挂载。

方法是使用libguestfs,它提供一套用于访问和编辑镜像的工具。libguestfs支持几乎所有类型镜像,包括qcow2。 可以在Linux上安装libguestfs,如下所示。

Debian系统:

$ sudo apt-get install libguestfs-tools

Red Hat和Centos系统:

$ sudo yum install libguestfs-tools

安装libguestfs后,可以使用guestmount的工具挂载qcow2镜像,如下所示。 请注意,当VM正在运行时,必须使用只读模式挂载镜像。 否则,您将面临损坏镜像的风险。 因此,在挂载磁盘之前最好先关闭VM。

$ sudo guestmount -a /path/to/qcow2/image -m <device> /path/to/mount/point

“-m ”选项用于指定要挂载的镜像的分区(例如,/ dev / sda1)。 如果您不确定镜像中存在哪些分区,则可以提供任何错误的名称。 然后,guestmount将会显示可供选择的设备名称。

For example, to mount /dev/sda1 in the disk image 'xenserver.qcow2' at /mnt mount point, run the following.

$ sudo guestmount -a /var/lib/libvirt/images/xenserver.qcow2 -m /dev/sda1 /mnt

默认情况下,是以可读可写模式挂载镜像的。 因此,您可以在挂载镜像后修改 /mnt中的任何文件。

如果只想以只读模式挂载:

$ sudo guestmount -a /var/lib/libvirt/images/xenserver.qcow2 -m /dev/sda1 --ro /mnt

卸载:

$ sudo guestunmount /mnt

在现代的最新发行版,例如 Ubuntu Linux 以及 Fedora 都已经全面采用 NetworkManager 来管理网络配置。我在之前Ubuntu系统中实践的 NetworkManager ,现在也同样用于Fedora ( 移动云架构 )管理网络。

NetworkManager 管理采用命令行 nmcli 完成,可以实现复杂的管理功能。本文概述实践步骤,提供一个快速参考。

nmcli con 可以检查网络连接,对于 Fedora 虚拟机:
nmcli con查看网络连接

nmcli con

显示输出可以看到当前网络连接命令是 enp1s0 ,我们后面将使用这个命令来修订网络配置:

nmcli con查看网络连接输出信息

NAME    UUID                                  TYPE      DEVICE 
enp1s0  58edd196-e8df-35c9-902c-d97e37632259  ethernet  enp1s0

执行以下 nmcli con mod 命令来 connection modify 配置静态IP地址(针对 enp1s0 ):

nmcli con mod (connection modify) 修改网络配置(静态IP)
nmcli con mod "enp1s0" ipv4.method manual
nmcli con mod "enp1s0" ipv4.address 192.168.8.101/24
nmcli con mod "enp1s0" ipv4.gateway 192.168.8.1
nmcli con mod "enp1s0" ipv4.dns 192.168.8.1

nmcli con up id "enp1s0"

资料来源 https://cloud-atlas.readthedocs.io/zh_CN/latest/linux/redhat_linux/fedora/fedora_networkmanager.html

修改 grub 文档

使用编辑器打开/etc/default/grub文档;
按照如下修改

GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0 net.ifnames=0 biosdevname=0"
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200"

重新生成grub引导配置文件

grub-mkconfig -o /boot/grub/grub.cfg
或者使用
update-grub

增加硬件

在硬件中添加串行端口0

网络设定

注意,该修改后,可能会造成网卡名称更改 变成eth系列,生效的代码为 net.ifnames=0 biosdevname=0

重启虚拟机让其生效

建议是使用poweroff关闭计算机,然后再开启计算机。

镜像下载地址

CentOS: https://cloud.centos.org/centos/
Ubuntu: https://cloud-images.ubuntu.com/releases/
Debian: https://cloud.debian.org/images/cloud/
Fedora: https://alt.fedoraproject.org/cloud/
openSUSE: http://download.opensuse.org/repositories/Cloud:/Images:/
Rocky Linux : https://download.rockylinux.org/pub/rocky/9/

在PROXMOX中新建VM虚拟机

不需要任何ISO光盘;
SCSI 控制器 选择 VirtIO SCSI
新建时请删除原要新建的磁碟(硬盘);
其他的选择全部默认即可;

导入下载的镜像

qm disk import <vmid> <镜像名称绝对路径(如果当前就在该路径下,可以直接用文件名)> <存储位置(一般为local或local-lvm)> --format <qcow2 | raw | vmdk >

举例

qm disk import 101 /var/lib/images/Rocky-8-GenericCloud-Base-8.7-20221130.0.x86_64.qcow2 local --format  raw

一般来说 --format 可以不需要,默认导入后就是 raw 格式,如果需要其他格式再添加。

修改硬件部分

添加硬件 cloud-init 驱动器
添加硬件 串行端口 (这样就可以用 Xterm.js 控制台,而不是一定要用NoVNC访问了,);
把刚刚导入的硬盘链接到硬件中。

修改clout-init的用户名,密码,IP地址等等。

修改开机启动循序

刚刚导入的硬盘一定要记得选择,否则无法开机。
开机,等待1到2分钟,就可以愉快的玩耍了!