活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

Fedora Silverblue系统虚拟化支持现状全面分析用户如何在该不可变系统中高效部署和管理虚拟机以及解决常见问题

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-19 16:00:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 引言

Fedora Silverblue是Fedora项目推出的一款不可变桌面操作系统,它代表了Linux桌面系统的一种新范式。与传统Linux发行版不同,Silverblue采用了不可变的基础系统设计,其中根文件系统是只读的,通过rpm-ostree技术进行原子更新和回滚。这种设计提供了更高的系统稳定性、安全性和可预测性,但同时也给用户带来了一些新的挑战,特别是在虚拟化方面。

虚拟化技术在现代计算环境中扮演着至关重要的角色,无论是开发人员需要测试不同环境,还是系统管理员需要运行多个隔离的服务,虚拟机都提供了灵活的解决方案。然而,在Fedora Silverblue这样的不可变系统中,传统的虚拟化部署方法可能不再适用,需要采用新的策略和工具。

本文将全面分析Fedora Silverblue系统中的虚拟化支持现状,详细介绍用户如何在该不可变系统中高效部署和管理虚拟机,并提供解决常见问题的实用方案。

2. Fedora Silverblue中的虚拟化技术概述

Fedora Silverblue虽然是一个不可变系统,但它仍然支持多种虚拟化技术。这些技术可以分为以下几类:

2.1 容器化技术

容器化是Silverblue中首选的虚拟化方法,因为它与系统的不可变设计理念高度契合:

• Podman:一个无守护进程的容器引擎,与Docker兼容但更安全,是Silverblue中的默认容器工具。
• Docker:虽然不是默认安装,但可以通过Toolbox或其他方式在Silverblue中使用。
• Toolbox:一个专为Silverblue设计的工具,用于创建和管理临时的、可变的容器环境,用于开发和命令行工具。

2.2 传统虚拟化技术

尽管Silverblue是不可变系统,但它仍然支持传统的虚拟化技术:

• KVM/QEMU:Linux内核中的虚拟化基础设施,可以通过libvirt进行管理。
• libvirt:一个用于管理平台虚拟化的开源API、守护进程和工具集。
• VirtualBox:虽然不是默认支持,但可以通过一些方法在Silverblue中安装和使用。

2.3 应用级虚拟化

• Flatpak:Silverblue中默认支持的应用打包和分发系统,提供了一种沙盒化的应用运行环境。
• GNOME Boxes:一个简单的虚拟机管理工具,可以通过Flatpak安装。

这些虚拟化技术在Silverblue中的支持程度和易用性各不相同,用户需要根据自己的需求选择合适的方法。

3. 在Fedora Silverblue上部署虚拟机的方法

3.1 使用Toolbox

Toolbox是专为Fedora Silverblue设计的一个工具,它允许用户在容器中创建可变的环境,而不会影响基础系统的不可变性。这使得Toolbox成为在Silverblue中进行开发和运行命令行工具的理想选择。

在Fedora Silverblue中,Toolbox通常是预装的。如果没有,可以通过以下命令安装:
  1. rpm-ostree install toolbox
复制代码

安装完成后,需要重启系统以使更改生效。

创建一个新的Toolbox容器非常简单:
  1. toolbox create
复制代码

这将创建一个基于Fedora最新版本的容器。如果需要特定版本,可以指定:
  1. toolbox create --distro fedora --release 36
复制代码

进入Toolbox环境:
  1. toolbox enter
复制代码

在Toolbox容器中,可以安装和使用传统的虚拟化工具:
  1. # 安装libvirt和相关工具
  2. sudo dnf install libvirt virt-install virt-manager
  3. # 启动libvirtd服务
  4. sudo systemctl enable --now libvirtd
  5. # 将用户添加到libvirt组
  6. sudo usermod -aG libvirt $(whoami)
  7. # 退出并重新登录以使组更改生效
  8. exit
  9. toolbox enter
复制代码

现在,可以在Toolbox中使用virt-install或virt-manager来创建和管理虚拟机:
  1. # 使用virt-install创建虚拟机
  2. virt-install --name myvm --ram 2048 --disk size=20 --cdrom /path/to/iso
复制代码

优点:

• 不影响基础系统的不可变性
• 可以使用传统的虚拟化工具和流程
• 易于设置和使用

缺点:

• 性能可能略低于直接在主机系统上运行
• 需要额外的存储空间用于容器
• 网络和存储配置可能更复杂

3.2 使用Podman/Docker容器

Podman是Fedora Silverblue中的默认容器引擎,它提供了一种无需守护进程的容器运行方式,与Docker兼容但更安全。

虽然Podman主要用于运行应用容器,但也可以运行一些轻量级的虚拟化解决方案:
  1. # 拉取一个包含KVM工具的镜像
  2. podman pull quay.io/libvirt/libvirt
  3. # 运行libvirt容器
  4. podman run -d --name libvirt --privileged --network host \
  5.   -v /var/lib/libvirt:/var/lib/libvirt \
  6.   -v /var/run/libvirt:/var/run/libvirt \
  7.   quay.io/libvirt/libvirt
复制代码

如果更喜欢使用Docker,可以通过Toolbox安装它:
  1. toolbox enter
  2. sudo dnf install docker
  3. sudo systemctl enable --now docker
  4. exit
复制代码

然后可以使用Docker运行一些专门的虚拟化容器,如KVM镜像:
  1. # 在Toolbox中运行
  2. docker run -d --name kvm -v /var/run/libvirt:/var/run/libvirt \
  3.   -v /var/lib/libvirt:/var/lib/libvirt --device /dev/kvm \
  4.   --net host jess/kvm
复制代码

优点:

• 完全隔离,不影响主机系统
• 易于部署和迁移
• 资源利用率高

缺点:

• 性能开销较大
• 配置复杂,特别是网络和存储
• 不适合运行需要高性能的虚拟机

3.3 使用libvirt/KVM

对于需要更高性能和更完整功能的虚拟化需求,可以直接在Fedora Silverblue上使用libvirt和KVM。

首先,确保系统支持硬件虚拟化:
  1. grep -E 'vmx|svm' /proc/cpuinfo
复制代码

如果输出包含vmx(Intel)或svm(AMD),则系统支持硬件虚拟化。

在Fedora Silverblue中,可以使用rpm-ostree层叠安装虚拟化软件包:
  1. rpm-ostree install virt-install virt-manager libvirt-daemon-kvm qemu-kvm
复制代码

安装完成后,重启系统:
  1. systemctl reboot
复制代码

重启后,启用并启动libvirtd服务:
  1. sudo systemctl enable --now libvirtd
复制代码

将当前用户添加到libvirt组:
  1. sudo usermod -aG libvirt $(whoami)
复制代码

注销并重新登录以使组更改生效。

现在可以使用virt-install或virt-manager创建虚拟机:
  1. # 使用virt-install创建虚拟机
  2. virt-install --name fedora-vm --ram 4096 --disk size=50 \
  3.   --vcpus 2 --cdrom ~/Downloads/Fedora-Workstation-Live-x86_64-36-1.5.iso \
  4.   --os-variant fedora36
复制代码

或者使用图形化的virt-manager:
  1. virt-manager
复制代码

优点:

• 性能最佳,接近原生
• 功能完整,支持各种虚拟设备
• 成熟的生态系统和工具链

缺点:

• 需要修改基础系统(通过rpm-ostree层叠)
• 配置相对复杂
• 可能影响系统的稳定性

3.4 使用Flatpak应用

Flatpak是Fedora Silverblue中默认支持的应用打包和分发系统,提供了一种沙盒化的应用运行环境。一些虚拟化应用可以通过Flatpak安装。

GNOME Boxes是一个简单的虚拟机管理工具,适合初学者使用:
  1. flatpak install flathub org.gnome.Boxes
复制代码

启动GNOME Boxes:
  1. flatpak run org.gnome.Boxes
复制代码

在图形界面中,点击左上角的”+“按钮创建新的虚拟机,然后按照向导操作。

除了GNOME Boxes,还有一些其他的虚拟化应用可以通过Flatpak安装:
  1. # 安装VirtualBox(如果可用)
  2. flatpak install flathub org.virtualbox.VirtualBox
  3. # 安装QEMU系统模拟器
  4. flatpak install flathub org.qemu.qemu
复制代码

优点:

• 不影响基础系统的不可变性
• 沙盒化环境提供额外的安全性
• 易于安装和更新

缺点:

• 功能可能受限
• 性能不如直接使用KVM
• 存储和网络配置可能受限

4. 虚拟机管理工具的选择与配置

在Fedora Silverblue中,有多种虚拟机管理工具可供选择,每种工具都有其特点和适用场景。

4.1 virt-manager

virt-manager是一个功能强大的图形化虚拟机管理工具,它提供了完整的虚拟机生命周期管理功能。

可以通过rpm-ostree层叠安装:
  1. rpm-ostree install virt-manager
复制代码

安装完成后重启系统。

启动virt-manager:
  1. virt-manager
复制代码

首次启动时,它会尝试连接到本地libvirt守护进程。如果连接失败,确保libvirtd服务正在运行:
  1. sudo systemctl status libvirtd
复制代码

如果服务未运行,启动它:
  1. sudo systemctl start libvirtd
  2. sudo systemctl enable libvirtd
复制代码

在virt-manager中,可以:

• 创建新的虚拟机
• 编辑现有虚拟机的配置
• 启动、停止、暂停和恢复虚拟机
• 查看虚拟机控制台
• 管理虚拟机存储和网络

4.2 virsh和virt-install

virsh是一个命令行工具,用于管理虚拟机,而virt-install用于创建新的虚拟机。

列出所有虚拟机:
  1. virsh list --all
复制代码

创建新的虚拟机:
  1. virt-install --name ubuntu-vm --ram 2048 --disk size=20 \
  2.   --cdrom ~/Downloads/ubuntu-22.04-desktop-amd64.iso \
  3.   --os-variant ubuntu22.04
复制代码

启动虚拟机:
  1. virsh start ubuntu-vm
复制代码

关闭虚拟机:
  1. virsh shutdown ubuntu-vm
复制代码

强制关闭虚拟机:
  1. virsh destroy ubuntu-vm
复制代码

编辑虚拟机配置:
  1. virsh edit ubuntu-vm
复制代码

这将打开一个XML编辑器,可以修改虚拟机的各种设置,如CPU、内存、磁盘和网络配置。

4.3 GNOME Boxes

GNOME Boxes是一个简化的虚拟机管理工具,适合初学者和简单场景。

通过Flatpak安装:
  1. flatpak install flathub org.gnome.Boxes
复制代码

启动GNOME Boxes:
  1. flatpak run org.gnome.Boxes
复制代码

在GNOME Boxes中,可以:

• 从ISO文件或URL创建新的虚拟机
• 启动、停止和重启虚拟机
• 查看虚拟机控制台
• 克隆虚拟机
• 导入和导出虚拟机

4.4 Web管理界面

对于需要远程管理虚拟机的场景,可以考虑使用Web管理界面,如Kimchi或Cockpit。

在Fedora Silverblue中,可以通过rpm-ostree安装Cockpit:
  1. rpm-ostree install cockpit cockpit-machines
复制代码

安装完成后重启系统。

启用并启动Cockpit服务:
  1. sudo systemctl enable --now cockpit.socket
复制代码

在Web浏览器中访问https://localhost:9090,使用系统用户名和密码登录。

在Cockpit界面中,导航到”虚拟机”部分,可以:

• 创建新的虚拟机
• 管理现有虚拟机
• 监控虚拟机资源使用情况
• 访问虚拟机控制台

5. 常见问题及解决方案

在Fedora Silverblue中使用虚拟化技术时,可能会遇到一些特定的问题。本节将介绍这些常见问题及其解决方案。

5.1 权限问题

问题:用户无法访问libvirt守护进程,收到”Permission denied”错误。

解决方案:

1. 确保用户属于libvirt组:
  1. sudo usermod -aG libvirt $(whoami)
复制代码

1. 注销并重新登录以使组更改生效。
2. 如果问题仍然存在,检查libvirtd服务状态:

注销并重新登录以使组更改生效。

如果问题仍然存在,检查libvirtd服务状态:
  1. sudo systemctl status libvirtd
复制代码

1. 如果服务未运行,启动它:
  1. sudo systemctl start libvirtd
  2. sudo systemctl enable libvirtd
复制代码

问题:用户无法访问/dev/kvm设备,虚拟机启动失败。

解决方案:

1. 确保用户属于kvm组:
  1. sudo usermod -aG kvm $(whoami)
复制代码

1. 注销并重新登录以使组更改生效。
2. 检查/dev/kvm设备权限:

注销并重新登录以使组更改生效。

检查/dev/kvm设备权限:
  1. ls -l /dev/kvm
复制代码

输出应显示该设备属于kvm组,并且组有读写权限。

1. 如果权限不正确,可以手动设置:
  1. sudo chown root:kvm /dev/kvm
  2. sudo chmod 660 /dev/kvm
复制代码

5.2 存储管理

问题:不确定在Fedora Silverblue中存储虚拟机磁盘的最佳位置。

解决方案:

1. 默认情况下,libvirt将虚拟机磁盘存储在/var/lib/libvirt/images目录中。
2. 在Silverblue中,由于根文件系统是只读的,可能需要将虚拟机磁盘存储在/home目录中:

默认情况下,libvirt将虚拟机磁盘存储在/var/lib/libvirt/images目录中。

在Silverblue中,由于根文件系统是只读的,可能需要将虚拟机磁盘存储在/home目录中:
  1. sudo mkdir -p /home/vm-images
  2. sudo chown $(whoami):$(whoami) /home/vm-images
  3. sudo chmod 755 /home/vm-images
复制代码

1. 在创建虚拟机时,指定磁盘位置:
  1. virt-install --name myvm --ram 2048 --disk path=/home/vm-images/myvm.qcow2,size=20 \
  2.   --cdrom /path/to/iso
复制代码

1. 或者,修改libvirt默认存储池:
  1. virsh pool-define-as --name vm-images --type dir --target /home/vm-images
  2. virsh pool-build vm-images
  3. virsh pool-start vm-images
  4. virsh pool-autostart vm-images
复制代码

问题:虚拟机磁盘空间不足,需要扩展。

解决方案:

1. 使用qemu-img工具扩展磁盘镜像:
  1. qemu-img resize /path/to/vm.qcow2 +10G
复制代码

1. 在虚拟机内部扩展文件系统:对于ext4文件系统:sudo resize2fs /dev/sda1对于XFS文件系统:sudo xfs_growfs /
2. 对于ext4文件系统:sudo resize2fs /dev/sda1
3. 对于XFS文件系统:sudo xfs_growfs /
4. 或者,添加新的磁盘到虚拟机:

在虚拟机内部扩展文件系统:

• 对于ext4文件系统:sudo resize2fs /dev/sda1
• 对于XFS文件系统:sudo xfs_growfs /
  1. sudo resize2fs /dev/sda1
复制代码
  1. sudo xfs_growfs /
复制代码

或者,添加新的磁盘到虚拟机:
  1. virsh attach-disk myvm /path/to/new-disk.qcow2 vdb --persistent
复制代码

5.3 网络配置

问题:虚拟机启动后无法访问网络。

解决方案:

1. 检查虚拟机网络配置:
  1. virsh domiflist myvm
复制代码

1. 确保默认网络已启动:
  1. virsh net-list --all
复制代码

如果default网络未启动,启动它:
  1. virsh net-start default
  2. virsh net-autostart default
复制代码

1. 在虚拟机内部检查网络配置:确保网络接口已启用:ip link show确保DHCP客户端正在运行:systemctl status dhcpcd如果使用静态IP,确保配置正确:cat /etc/sysconfig/network-scripts/ifcfg-eth0
2. 确保网络接口已启用:ip link show
3. 确保DHCP客户端正在运行:systemctl status dhcpcd
4. 如果使用静态IP,确保配置正确:cat /etc/sysconfig/network-scripts/ifcfg-eth0

• 确保网络接口已启用:ip link show
• 确保DHCP客户端正在运行:systemctl status dhcpcd
• 如果使用静态IP,确保配置正确:cat /etc/sysconfig/network-scripts/ifcfg-eth0
  1. ip link show
复制代码
  1. systemctl status dhcpcd
复制代码
  1. cat /etc/sysconfig/network-scripts/ifcfg-eth0
复制代码

问题:需要从主机访问虚拟机中的服务,或从虚拟机访问主机中的服务。

解决方案:

1.
  1. 使用端口转发:编辑虚拟机XML配置:virsh edit myvm添加端口转发规则:<qemu:commandline>
  2. <qemu:arg value='-redir'/>
  3. <qemu:arg value='tcp:2222::22'/>
  4. </qemu:commandline>这将把主机的2222端口转发到虚拟机的22端口。
复制代码
2. 编辑虚拟机XML配置:virsh edit myvm
3.
  1. 添加端口转发规则:<qemu:commandline>
  2. <qemu:arg value='-redir'/>
  3. <qemu:arg value='tcp:2222::22'/>
  4. </qemu:commandline>这将把主机的2222端口转发到虚拟机的22端口。
复制代码
4. 使用桥接网络:创建桥接接口:sudo nmcli con add type bridge ifname br0
sudo nmcli con modify br0 ipv4.method auto
sudo nmcli con up br0将物理接口添加到桥接:sudo nmcli con add type bridge-slave ifname eth0 master br0
sudo nmcli con up bridge-slave-eth0修改虚拟机使用桥接网络:virsh attach-interface myvm bridge br0 --persistent
5. 创建桥接接口:sudo nmcli con add type bridge ifname br0
sudo nmcli con modify br0 ipv4.method auto
sudo nmcli con up br0
6. 将物理接口添加到桥接:sudo nmcli con add type bridge-slave ifname eth0 master br0
sudo nmcli con up bridge-slave-eth0
7. 修改虚拟机使用桥接网络:virsh attach-interface myvm bridge br0 --persistent
8.
  1. 使用主机网络:修改虚拟机XML配置:virsh edit myvm更改网络类型为hostdev:<interface type='hostdev' managed='yes'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <driver name='vfio'/>
  4. <source>
  5. <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x0'/>
  6. </source>
  7. <model type='virtio'/>
  8. <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
  9. </interface>
复制代码
9. 修改虚拟机XML配置:virsh edit myvm
10.
  1. 更改网络类型为hostdev:<interface type='hostdev' managed='yes'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <driver name='vfio'/>
  4. <source>
  5. <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x0'/>
  6. </source>
  7. <model type='virtio'/>
  8. <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
  9. </interface>
复制代码

使用端口转发:

• 编辑虚拟机XML配置:virsh edit myvm
  1. 添加端口转发规则:<qemu:commandline>
  2. <qemu:arg value='-redir'/>
  3. <qemu:arg value='tcp:2222::22'/>
  4. </qemu:commandline>这将把主机的2222端口转发到虚拟机的22端口。
复制代码
  1. virsh edit myvm
复制代码
  1. <qemu:commandline>
  2. <qemu:arg value='-redir'/>
  3. <qemu:arg value='tcp:2222::22'/>
  4. </qemu:commandline>
复制代码

使用桥接网络:

• 创建桥接接口:sudo nmcli con add type bridge ifname br0
sudo nmcli con modify br0 ipv4.method auto
sudo nmcli con up br0
• 将物理接口添加到桥接:sudo nmcli con add type bridge-slave ifname eth0 master br0
sudo nmcli con up bridge-slave-eth0
• 修改虚拟机使用桥接网络:virsh attach-interface myvm bridge br0 --persistent
  1. sudo nmcli con add type bridge ifname br0
  2. sudo nmcli con modify br0 ipv4.method auto
  3. sudo nmcli con up br0
复制代码
  1. sudo nmcli con add type bridge-slave ifname eth0 master br0
  2. sudo nmcli con up bridge-slave-eth0
复制代码
  1. virsh attach-interface myvm bridge br0 --persistent
复制代码

使用主机网络:

• 修改虚拟机XML配置:virsh edit myvm
  1. 更改网络类型为hostdev:<interface type='hostdev' managed='yes'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <driver name='vfio'/>
  4. <source>
  5. <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x0'/>
  6. </source>
  7. <model type='virtio'/>
  8. <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
  9. </interface>
复制代码
  1. virsh edit myvm
复制代码
  1. <interface type='hostdev' managed='yes'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <driver name='vfio'/>
  4. <source>
  5. <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x0'/>
  6. </source>
  7. <model type='virtio'/>
  8. <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
  9. </interface>
复制代码

5.4 性能优化

问题:虚拟机运行缓慢,响应时间长。

解决方案:

1. 启用KVM硬件加速:确保虚拟机配置使用KVM:virsh edit myvm检查domain元素中的type属性是否为’kvm’:<domain type='kvm'>
2. 确保虚拟机配置使用KVM:virsh edit myvm
3. 检查domain元素中的type属性是否为’kvm’:<domain type='kvm'>
4.
  1. 使用virtio驱动:为磁盘设备使用virtio驱动:<disk type='file' device='disk'>
  2. <driver name='qemu' type='qcow2' cache='none' io='native'/>
  3. <source file='/path/to/disk.qcow2'/>
  4. <target dev='vda' bus='virtio'/>
  5. </disk>为网络设备使用virtio驱动:<interface type='network'>
  6. <mac address='52:54:00:71:b1:b6'/>
  7. <source network='default'/>
  8. <model type='virtio'/>
  9. </interface>
复制代码
5. 为磁盘设备使用virtio驱动:<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none' io='native'/>
<source file='/path/to/disk.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
6.
  1. 为网络设备使用virtio驱动:<interface type='network'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <source network='default'/>
  4. <model type='virtio'/>
  5. </interface>
复制代码
7. 分配足够的资源:增加虚拟机CPU和内存:virsh setvcpus myvm 4 --config
virsh setmaxmem myvm 8G --config
virsh setmem myvm 4G --config
8. 增加虚拟机CPU和内存:virsh setvcpus myvm 4 --config
virsh setmaxmem myvm 8G --config
virsh setmem myvm 4G --config
9. 优化I/O性能:使用IO原生模式:<driver name='qemu' type='qcow2' cache='none' io='native'/>考虑使用直接I/O或SSD存储。
10. 使用IO原生模式:<driver name='qemu' type='qcow2' cache='none' io='native'/>
11. 考虑使用直接I/O或SSD存储。
12. 启用嵌套虚拟化(如果需要):检查是否支持嵌套虚拟化:cat /sys/module/kvm_intel/parameters/nested如果输出为”N”,启用它:sudo modprobe -r kvm_intel
sudo modprobe kvm_intel nested=1
echo "options kvm-intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf
13. 检查是否支持嵌套虚拟化:cat /sys/module/kvm_intel/parameters/nested如果输出为”N”,启用它:sudo modprobe -r kvm_intel
sudo modprobe kvm_intel nested=1
echo "options kvm-intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf

启用KVM硬件加速:

• 确保虚拟机配置使用KVM:virsh edit myvm
• 检查domain元素中的type属性是否为’kvm’:<domain type='kvm'>
  1. virsh edit myvm
复制代码
  1. <domain type='kvm'>
复制代码

使用virtio驱动:

• 为磁盘设备使用virtio驱动:<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none' io='native'/>
<source file='/path/to/disk.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
  1. 为网络设备使用virtio驱动:<interface type='network'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <source network='default'/>
  4. <model type='virtio'/>
  5. </interface>
复制代码
  1. <disk type='file' device='disk'>
  2. <driver name='qemu' type='qcow2' cache='none' io='native'/>
  3. <source file='/path/to/disk.qcow2'/>
  4. <target dev='vda' bus='virtio'/>
  5. </disk>
复制代码
  1. <interface type='network'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <source network='default'/>
  4. <model type='virtio'/>
  5. </interface>
复制代码

分配足够的资源:

• 增加虚拟机CPU和内存:virsh setvcpus myvm 4 --config
virsh setmaxmem myvm 8G --config
virsh setmem myvm 4G --config
  1. virsh setvcpus myvm 4 --config
  2. virsh setmaxmem myvm 8G --config
  3. virsh setmem myvm 4G --config
复制代码

优化I/O性能:

• 使用IO原生模式:<driver name='qemu' type='qcow2' cache='none' io='native'/>
• 考虑使用直接I/O或SSD存储。
  1. <driver name='qemu' type='qcow2' cache='none' io='native'/>
复制代码

启用嵌套虚拟化(如果需要):

• 检查是否支持嵌套虚拟化:cat /sys/module/kvm_intel/parameters/nested如果输出为”N”,启用它:sudo modprobe -r kvm_intel
sudo modprobe kvm_intel nested=1
echo "options kvm-intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf
  1. cat /sys/module/kvm_intel/parameters/nested
复制代码
  1. sudo modprobe -r kvm_intel
  2. sudo modprobe kvm_intel nested=1
  3. echo "options kvm-intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf
复制代码

问题:运行虚拟机后,主机系统性能下降。

解决方案:

1. 限制虚拟机资源使用:设置CPU份额:virsh schedinfo myvm --set cpu_shares=512限制CPU使用:virsh blkiotune myvm --weight 100
2. 设置CPU份额:virsh schedinfo myvm --set cpu_shares=512
3. 限制CPU使用:virsh blkiotune myvm --weight 100
4.
  1. 使用cgroups控制资源分配:创建cgroup:sudo cgcreate -g cpu,memory:/vms设置限制:sudo cgset -r cpu.cfs_quota_us=50000 vms
  2. sudo cgset -r memory.limit_in_bytes=4G vms将虚拟机进程移动到cgroup:sudo cgclassify -g cpu,memory:vms $(pidof qemu-system-x86_64)
复制代码
5. 创建cgroup:sudo cgcreate -g cpu,memory:/vms
6. 设置限制:sudo cgset -r cpu.cfs_quota_us=50000 vms
sudo cgset -r memory.limit_in_bytes=4G vms
7. 将虚拟机进程移动到cgroup:sudo cgclassify -g cpu,memory:vms $(pidof qemu-system-x86_64)
8. 监控资源使用:使用top或htop监控CPU和内存使用:top使用iotop监控I/O使用:sudo iotop使用virt-top监控虚拟机资源使用:sudo virt-top
9. 使用top或htop监控CPU和内存使用:top
10. 使用iotop监控I/O使用:sudo iotop
11. 使用virt-top监控虚拟机资源使用:sudo virt-top

限制虚拟机资源使用:

• 设置CPU份额:virsh schedinfo myvm --set cpu_shares=512
• 限制CPU使用:virsh blkiotune myvm --weight 100
  1. virsh schedinfo myvm --set cpu_shares=512
复制代码
  1. virsh blkiotune myvm --weight 100
复制代码

使用cgroups控制资源分配:

• 创建cgroup:sudo cgcreate -g cpu,memory:/vms
• 设置限制:sudo cgset -r cpu.cfs_quota_us=50000 vms
sudo cgset -r memory.limit_in_bytes=4G vms
• 将虚拟机进程移动到cgroup:sudo cgclassify -g cpu,memory:vms $(pidof qemu-system-x86_64)
  1. sudo cgcreate -g cpu,memory:/vms
复制代码
  1. sudo cgset -r cpu.cfs_quota_us=50000 vms
  2. sudo cgset -r memory.limit_in_bytes=4G vms
复制代码
  1. sudo cgclassify -g cpu,memory:vms $(pidof qemu-system-x86_64)
复制代码

监控资源使用:

• 使用top或htop监控CPU和内存使用:top
• 使用iotop监控I/O使用:sudo iotop
• 使用virt-top监控虚拟机资源使用:sudo virt-top
  1. top
复制代码
  1. sudo iotop
复制代码
  1. sudo virt-top
复制代码

6. 最佳实践和建议

在Fedora Silverblue中使用虚拟化技术时,遵循一些最佳实践可以帮助提高效率和可靠性。

6.1 选择合适的虚拟化方法

根据使用场景选择最合适的虚拟化方法:

• 开发和测试:使用Toolbox创建隔离的开发环境,或使用Podman运行容器化应用。
• 桌面应用虚拟化:使用Flatpak安装GNOME Boxes或其他虚拟化应用。
• 服务器虚拟化:使用libvirt/KVM直接在主机系统上运行虚拟机。
• 轻量级隔离:使用Podman或Docker容器。

6.2 系统维护和更新

在Fedora Silverblue中,系统更新是通过rpm-ostree进行的原子操作:

1. 检查可用更新:
  1. rpm-ostree update --check
复制代码

1. 应用更新:
  1. rpm-ostree update
复制代码

1. 如果更新后出现问题,可以回滚到之前的版本:
  1. rpm-ostree rollback
复制代码

1. 定期清理旧的部署:
  1. rpm-ostree cleanup
复制代码

6.3 备份和恢复

在Fedora Silverblue中,备份和恢复策略需要考虑系统的不可变性:

1. 备份虚拟机磁盘:关闭虚拟机:virsh shutdown myvm复制磁盘镜像:cp /path/to/vm.qcow2 /backup/location/
2. 关闭虚拟机:virsh shutdown myvm
3. 复制磁盘镜像:cp /path/to/vm.qcow2 /backup/location/
4. 备份虚拟机配置:导出虚拟机XML配置:virsh dumpxml myvm > /backup/location/myvm.xml
5. 导出虚拟机XML配置:virsh dumpxml myvm > /backup/location/myvm.xml
6. 恢复虚拟机:重新定义虚拟机:virsh define /backup/location/myvm.xml确保磁盘镜像位置正确
7. 重新定义虚拟机:virsh define /backup/location/myvm.xml
8. 确保磁盘镜像位置正确
9. 使用快照:创建外部快照:virsh snapshot-create-as myvm --name "before-upgrade" --description "Snapshot before system upgrade"恢复快照:virsh snapshot-revert myvm --snapshotname "before-upgrade"
10. 创建外部快照:virsh snapshot-create-as myvm --name "before-upgrade" --description "Snapshot before system upgrade"
11. 恢复快照:virsh snapshot-revert myvm --snapshotname "before-upgrade"

备份虚拟机磁盘:

• 关闭虚拟机:virsh shutdown myvm
• 复制磁盘镜像:cp /path/to/vm.qcow2 /backup/location/
  1. virsh shutdown myvm
复制代码
  1. cp /path/to/vm.qcow2 /backup/location/
复制代码

备份虚拟机配置:

• 导出虚拟机XML配置:virsh dumpxml myvm > /backup/location/myvm.xml
  1. virsh dumpxml myvm > /backup/location/myvm.xml
复制代码

恢复虚拟机:

• 重新定义虚拟机:virsh define /backup/location/myvm.xml
• 确保磁盘镜像位置正确
  1. virsh define /backup/location/myvm.xml
复制代码

使用快照:

• 创建外部快照:virsh snapshot-create-as myvm --name "before-upgrade" --description "Snapshot before system upgrade"
• 恢复快照:virsh snapshot-revert myvm --snapshotname "before-upgrade"
  1. virsh snapshot-create-as myvm --name "before-upgrade" --description "Snapshot before system upgrade"
复制代码
  1. virsh snapshot-revert myvm --snapshotname "before-upgrade"
复制代码

6.4 安全考虑

在Fedora Silverblue中使用虚拟化时,安全性是一个重要考虑因素:

1. 隔离虚拟机网络:创建专用网络:virsh net-define-as isolated-network bridge
virsh net-start isolated-network
virsh net-autostart isolated-network将虚拟机连接到隔离网络:virsh attach-interface myvm network isolated-network --persistent
2. 创建专用网络:virsh net-define-as isolated-network bridge
virsh net-start isolated-network
virsh net-autostart isolated-network
3. 将虚拟机连接到隔离网络:virsh attach-interface myvm network isolated-network --persistent
4. 使用SELinux:确保SELinux处于 enforcing 模式:sudo setenforce 1检查虚拟机相关文件的SELinux上下文:ls -Z /var/lib/libvirt/images如果需要,恢复正确的上下文:sudo restorecon -R /var/lib/libvirt/images
5. 确保SELinux处于 enforcing 模式:sudo setenforce 1
6. 检查虚拟机相关文件的SELinux上下文:ls -Z /var/lib/libvirt/images
7. 如果需要,恢复正确的上下文:sudo restorecon -R /var/lib/libvirt/images
8.
  1. 限制资源访问:使用cgroups限制虚拟机资源使用:sudo cgcreate -g cpu,memory:/vms/myvm
  2. sudo cgset -r cpu.cfs_quota_us=50000 vms/myvm
  3. sudo cgset -r memory.limit_in_bytes=4G vms/myvm
复制代码
9.
  1. 使用cgroups限制虚拟机资源使用:sudo cgcreate -g cpu,memory:/vms/myvm
  2. sudo cgset -r cpu.cfs_quota_us=50000 vms/myvm
  3. sudo cgset -r memory.limit_in_bytes=4G vms/myvm
复制代码
10. 定期更新:保持系统和虚拟机更新:rpm-ostree update在虚拟机内定期更新操作系统和软件包
11. 保持系统和虚拟机更新:rpm-ostree update
12. 在虚拟机内定期更新操作系统和软件包

隔离虚拟机网络:

• 创建专用网络:virsh net-define-as isolated-network bridge
virsh net-start isolated-network
virsh net-autostart isolated-network
• 将虚拟机连接到隔离网络:virsh attach-interface myvm network isolated-network --persistent
  1. virsh net-define-as isolated-network bridge
  2. virsh net-start isolated-network
  3. virsh net-autostart isolated-network
复制代码
  1. virsh attach-interface myvm network isolated-network --persistent
复制代码

使用SELinux:

• 确保SELinux处于 enforcing 模式:sudo setenforce 1
• 检查虚拟机相关文件的SELinux上下文:ls -Z /var/lib/libvirt/images
• 如果需要,恢复正确的上下文:sudo restorecon -R /var/lib/libvirt/images
  1. sudo setenforce 1
复制代码
  1. ls -Z /var/lib/libvirt/images
复制代码
  1. sudo restorecon -R /var/lib/libvirt/images
复制代码

限制资源访问:

  1. 使用cgroups限制虚拟机资源使用:sudo cgcreate -g cpu,memory:/vms/myvm
  2. sudo cgset -r cpu.cfs_quota_us=50000 vms/myvm
  3. sudo cgset -r memory.limit_in_bytes=4G vms/myvm
复制代码
  1. sudo cgcreate -g cpu,memory:/vms/myvm
  2. sudo cgset -r cpu.cfs_quota_us=50000 vms/myvm
  3. sudo cgset -r memory.limit_in_bytes=4G vms/myvm
复制代码

定期更新:

• 保持系统和虚拟机更新:rpm-ostree update
• 在虚拟机内定期更新操作系统和软件包
  1. rpm-ostree update
复制代码

6.5 性能优化

优化Fedora Silverblue中的虚拟化性能:

1. 使用适当的存储后端:对于高性能需求,考虑使用SSD或NVMe存储使用raw格式而不是qcow2格式以获得更好的性能:qemu-img create -f raw /path/to/disk.img 20G
2. 对于高性能需求,考虑使用SSD或NVMe存储
3. 使用raw格式而不是qcow2格式以获得更好的性能:qemu-img create -f raw /path/to/disk.img 20G
4. 优化CPU配置:使用主机CPU模型:<cpu mode='host-passthrough'/>启用CPU热插拔:<vcpu placement='auto' current='2'>4</vcpu>
5. 使用主机CPU模型:<cpu mode='host-passthrough'/>
6. 启用CPU热插拔:<vcpu placement='auto' current='2'>4</vcpu>
7. 优化内存配置:使用内存气球驱动:<memballoon model='virtio'/>考虑使用大页内存:sudo sysctl vm.nr_hugepages=1024然后在虚拟机配置中指定:<memoryBacking>
<hugepages>
<page size='2048' unit='KiB'/>
</hugepages>
</memoryBacking>
8. 使用内存气球驱动:<memballoon model='virtio'/>
9. 考虑使用大页内存:sudo sysctl vm.nr_hugepages=1024然后在虚拟机配置中指定:<memoryBacking>
<hugepages>
<page size='2048' unit='KiB'/>
</hugepages>
</memoryBacking>
10.
  1. 优化网络配置:使用virtio网络驱动:<interface type='network'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <source network='default'/>
  4. <model type='virtio'/>
  5. </interface>考虑使用SR-IOV或DPDK以获得更高的网络性能
复制代码
11.
  1. 使用virtio网络驱动:<interface type='network'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <source network='default'/>
  4. <model type='virtio'/>
  5. </interface>
复制代码
12. 考虑使用SR-IOV或DPDK以获得更高的网络性能

使用适当的存储后端:

• 对于高性能需求,考虑使用SSD或NVMe存储
• 使用raw格式而不是qcow2格式以获得更好的性能:qemu-img create -f raw /path/to/disk.img 20G
  1. qemu-img create -f raw /path/to/disk.img 20G
复制代码

优化CPU配置:

• 使用主机CPU模型:<cpu mode='host-passthrough'/>
• 启用CPU热插拔:<vcpu placement='auto' current='2'>4</vcpu>
  1. <cpu mode='host-passthrough'/>
复制代码
  1. <vcpu placement='auto' current='2'>4</vcpu>
复制代码

优化内存配置:

• 使用内存气球驱动:<memballoon model='virtio'/>
• 考虑使用大页内存:sudo sysctl vm.nr_hugepages=1024然后在虚拟机配置中指定:<memoryBacking>
<hugepages>
<page size='2048' unit='KiB'/>
</hugepages>
</memoryBacking>
  1. <memballoon model='virtio'/>
复制代码
  1. sudo sysctl vm.nr_hugepages=1024
复制代码
  1. <memoryBacking>
  2. <hugepages>
  3. <page size='2048' unit='KiB'/>
  4. </hugepages>
  5. </memoryBacking>
复制代码

优化网络配置:

  1. 使用virtio网络驱动:<interface type='network'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <source network='default'/>
  4. <model type='virtio'/>
  5. </interface>
复制代码
• 考虑使用SR-IOV或DPDK以获得更高的网络性能
  1. <interface type='network'>
  2. <mac address='52:54:00:71:b1:b6'/>
  3. <source network='default'/>
  4. <model type='virtio'/>
  5. </interface>
复制代码

7. 结论

Fedora Silverblue作为一个不可变的桌面操作系统,为虚拟化技术提供了多种支持方案。从容器化技术如Podman和Toolbox,到传统的KVM/libvirt虚拟化,再到Flatpak应用如GNOME Boxes,用户可以根据自己的需求选择最合适的方法。

在Fedora Silverblue中部署和管理虚拟机虽然有一些独特的挑战,但通过本文介绍的各种方法和最佳实践,用户可以高效地在这个不可变系统中运行虚拟机。关键是要理解Silverblue的不可变特性,并选择适合这种特性的虚拟化方法。

对于大多数用户,Toolbox和Podman提供了与Silverblue设计理念最契合的虚拟化解决方案,它们允许在容器中运行可变环境,而不影响基础系统的不可变性。对于需要更高性能和更完整功能的场景,直接使用libvirt/KVM是一个不错的选择,尽管这需要通过rpm-ostree层叠安装额外的软件包。

随着Fedora Silverblue和不可变操作系统概念的不断发展,我们可以期待虚拟化支持将会变得更加完善和集成。无论如何,Fedora Silverblue已经证明了不可变系统与虚拟化技术可以和谐共存,为用户提供了一个既稳定又灵活的计算环境。

通过遵循本文提供的指导,用户应该能够在Fedora Silverblue中成功部署和管理虚拟机,并解决可能遇到的常见问题。无论是开发人员、系统管理员还是普通用户,都可以从Fedora Silverblue的虚拟化支持中受益,享受不可变系统带来的稳定性和安全性,同时保持虚拟化技术提供的灵活性和功能性。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则