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

Debian/Ubuntu 上 KVM 虚拟化环境搭建全攻略:从源码到实战

Debian/Ubuntu 上 KVM 虚拟化环境搭建全攻略从源码到实战在当今云计算和容器化技术蓬勃发展的时代虚拟化技术依然是基础设施领域不可或缺的基石。KVMKernel-based Virtual Machine作为Linux内核原生支持的虚拟化解决方案以其高性能、低开销和开源特性成为众多开发者和企业构建虚拟化环境的首选。本文将带您深入探索在Debian/Ubuntu系统上搭建KVM虚拟化环境的完整过程不仅涵盖实用的命令行操作还将解析关键组件的源码架构帮助您真正理解KVM虚拟化技术的内在机理。1. 环境准备与硬件检查在开始搭建KVM环境之前确保您的系统满足基本要求至关重要。现代CPU通常都支持硬件虚拟化技术但需要确认这些功能已在BIOS中启用。首先检查CPU是否支持虚拟化扩展egrep -c (vmx|svm) /proc/cpuinfo输出结果大于0表示CPU支持虚拟化技术。Intel CPU显示vmxAMD CPU则显示svm。如果返回0可能需要进入BIOS设置启用虚拟化支持通常称为Intel VT-x或AMD-V。接下来验证内核是否加载了KVM模块lsmod | grep kvm典型的输出应包含kvm_intel或kvm_amd模块。如果未加载可以手动加载sudo modprobe kvm sudo modprobe kvm_intel # Intel处理器 # 或 sudo modprobe kvm_amd # AMD处理器为确保系统兼容性建议使用较新的Linux内核版本4.x或更高。检查当前内核版本uname -r2. 核心组件安装与配置KVM虚拟化环境由多个协同工作的组件构成每个组件都有其特定的职责。我们将通过APT包管理器安装这些组件并深入理解它们的功能和相互关系。2.1 安装基础软件包执行以下命令安装KVM及相关工具sudo apt update sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager这个命令安装了五个核心软件包qemu-kvm提供硬件模拟和虚拟化功能的核心组件libvirt-daemon-system虚拟化管理守护进程和系统配置libvirt-clients用于管理虚拟机的命令行工具bridge-utils配置网络桥接的工具集virt-manager图形化管理虚拟机的界面安装完成后将当前用户添加到libvirt组以便无需root权限即可管理虚拟机sudo usermod -aG libvirt $(whoami) sudo usermod -aG kvm $(whoami)2.2 验证安装安装完成后验证libvirtd服务是否正常运行sudo systemctl status libvirtd预期输出应显示服务为active (running)。如果服务未启动可以手动启动sudo systemctl enable --now libvirtd检查KVM是否可用virsh list --all如果一切正常这个命令将显示当前系统中的虚拟机列表初始应为空。3. 网络配置详解虚拟机的网络连接是实际使用中最关键的配置之一。KVM支持多种网络模式我们将重点介绍最常用的桥接网络配置。3.1 创建网络桥接桥接网络允许虚拟机像物理机一样直接连接到局域网。首先创建桥接接口配置文件sudo nano /etc/netplan/01-netcfg.yaml添加以下内容根据实际网络接口调整network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: no bridges: br0: interfaces: [enp3s0] dhcp4: yes parameters: stp: true forward-delay: 4应用网络配置sudo netplan apply验证桥接接口ip addr show br03.2 Libvirt默认网络配置Libvirt安装时会创建一个名为default的NAT网络。查看现有网络virsh net-list --all如果需要修改默认网络配置virsh net-edit default4. 创建和管理虚拟机有了基础环境后我们可以开始创建和管理虚拟机。这里介绍命令行和图形界面两种方式。4.1 使用virt-install创建虚拟机virt-install是创建虚拟机的强大命令行工具。以下命令创建一个典型虚拟机virt-install \ --name ubuntu-server \ --ram 2048 \ --disk path/var/lib/libvirt/images/ubuntu-server.qcow2,size20 \ --vcpus 2 \ --os-type linux \ --os-variant ubuntu20.04 \ --network bridgebr0 \ --graphics spice \ --location http://archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/ \ --extra-args consolettyS0,115200n8 serial各参数说明--name虚拟机名称--ram分配的内存大小(MB)--disk虚拟磁盘位置和大小(GB)--vcpus虚拟CPU数量--os-type/--os-variant操作系统类型和变体--network网络连接方式--graphics图形显示协议--location安装介质位置--extra-args传递给安装程序的额外参数4.2 使用virt-manager图形界面对于偏好图形界面的用户可以启动virt-managervirt-manager在virt-manager界面中点击创建新虚拟机按钮选择安装方式本地ISO、网络安装等配置内存、CPU和存储设置网络连接完成创建并启动安装过程5. 高级配置与优化基础虚拟机创建后可以通过多种方式优化性能和功能。5.1 CPU和内存优化在虚拟机XML配置中添加CPU优化参数cpu modehost-passthrough checknone/启用大页内存支持可以提高内存密集型应用的性能。首先配置主机的大页内存sudo sysctl vm.nr_hugepages1024然后在虚拟机配置中添加memoryBacking hugepages/ /memoryBacking5.2 存储优化使用qcow2格式的磁盘镜像支持快照和动态扩容。创建优化过的qcow2镜像qemu-img create -f qcow2 -o preallocationmetadata,cluster_size2M /var/lib/libvirt/images/optimized.qcow2 20G对于高性能需求可以考虑使用直接裸设备或LVM卷sudo lvcreate -L 20G -n vm-disk vg0 virsh attach-disk myvm /dev/vg0/vm-disk vda --persistent5.3 虚拟网络高级配置对于复杂的网络需求可以创建多个隔离的网络virsh net-define /path/to/network.xml virsh net-start my-private-network示例network.xml内容network namemy-private-network/name bridge namevirbr1 stpon delay0/ domain nameprivate.lan/ ip address192.168.100.1 netmask255.255.255.0 dhcp range start192.168.100.100 end192.168.100.200/ /dhcp /ip /network6. 源码解析与架构理解要真正掌握KVM虚拟化技术理解其核心组件的源码架构至关重要。我们将从源码层面分析关键组件的工作原理。6.1 QEMU-KVM源码架构QEMU是KVM虚拟化环境的核心模拟器其源码结构反映了它的功能划分qemu/ ├── accel/ # 加速器相关代码(KVM,Xen等) ├── audio/ # 音频设备模拟 ├── backends/ # 后端设备实现 ├── block/ # 块设备相关代码 ├── hw/ # 硬件设备模拟 │ ├── net/ # 网络设备 │ ├── usb/ # USB设备 │ └── ... # 其他设备 ├── linux-user/ # Linux用户模式模拟 ├── target/ # 目标架构代码 │ ├── i386/ # x86架构支持 │ └── ... # 其他架构 └── ui/ # 用户界面相关关键源码文件解析KVM加速器accel/kvm/kvm-all.c实现了QEMU与KVM内核模块的交互。CPU虚拟化target/i386/kvm/kvm.c包含x86架构特定的KVM实现。设备模拟hw/virtio/目录实现了VirtIO半虚拟化设备。6.2 Libvirt源码架构Libvirt提供了虚拟化管理的抽象层其源码结构如下libvirt/ ├── src/ # 核心源代码 │ ├── conf/ # 配置解析 │ ├── qemu/ # QEMU驱动实现 │ ├── remote/ # 远程协议 │ ├── util/ # 实用工具 │ └── ... # 其他组件 ├── tools/ # 命令行工具 │ └── virsh.c # virsh实现 └── include/ # 公共头文件关键设计模式驱动架构每个支持的虚拟化技术都有对应的驱动实现。XML配置虚拟机配置以XML格式定义便于解析和扩展。远程协议支持本地和远程管理通过RPC通信。6.3 核心组件交互流程当启动一个KVM虚拟机时各组件按以下顺序交互用户工具virsh/virt-manager通过Libvirt API发送启动请求Libvirt守护进程解析虚拟机XML配置QEMU驱动生成对应的QEMU命令行参数QEMU进程启动并加载KVM内核模块KVM内核模块处理CPU虚拟化和内存虚拟化QEMU设备模型处理I/O虚拟化7. 常见问题排查与解决在实际使用中可能会遇到各种问题。本节介绍常见问题的诊断和解决方法。7.1 虚拟机无法启动症状执行virsh start命令后虚拟机立即关闭。诊断步骤检查Libvirt日志sudo journalctl -u libvirtd -n 100查看虚拟机控制台输出virsh console vm-name检查QEMU命令行是否正确ps aux | grep qemu常见原因磁盘镜像路径错误缺少必要的CPU特性权限问题7.2 网络连接问题症状虚拟机无法访问外部网络或主机无法访问虚拟机。诊断步骤检查虚拟机网络接口virsh domiflist vm-name查看主机网络桥接状态brctl show检查防火墙规则sudo iptables -L -n -v解决方案确保虚拟机连接到正确的网络检查桥接接口是否包含物理网卡调整防火墙规则允许流量通过7.3 性能问题症状虚拟机运行缓慢响应延迟高。诊断工具监控虚拟机资源使用virt-top检查CPU节流grep -i throttle /proc/cpuinfo分析磁盘I/Oiostat -x 1优化建议启用CPU和内存的透传模式使用VirtIO驱动和半虚拟化设备考虑使用SR-IOV进行网络加速8. 实际应用场景与最佳实践KVM虚拟化技术在各种场景下都有广泛应用了解这些场景有助于更好地配置和使用。8.1 开发测试环境为开发团队提供隔离的测试环境是KVM的典型应用。建议配置使用快照功能保存干净状态配置共享存储便于团队协作自动化虚拟机部署和管理示例自动化脚本#!/bin/bash VM_NAMEdev-env-$1 OS_VARIANTcentos8 virt-install \ --name $VM_NAME \ --ram 4096 \ --disk path/var/lib/libvirt/images/$VM_NAME.qcow2,size40 \ --vcpus 4 \ --os-type linux \ --os-variant $OS_VARIANT \ --network bridgebr0 \ --graphics none \ --location http://mirror.centos.org/centos/8/BaseOS/x86_64/os/ \ --extra-args consolettyS0,115200n8 serial \ --noautoconsole8.2 持续集成/持续部署(CI/CD)在CI/CD流水线中使用KVM虚拟机可以确保构建环境的一致性。关键考虑使用轻量级基础镜像自动化创建和销毁虚拟机集成到Jenkins/GitLab CI等工具中Jenkins流水线示例pipeline { agent any stages { stage(Test) { steps { sh virsh start test-vm ssh test-vm cd /project make test virsh destroy test-vm } } } }8.3 生产环境部署在生产环境中使用KVM需要更多考虑高可用性配置实时迁移能力性能监控和告警配置实时迁移的步骤设置共享存储NFS/iSCSI等配置主机间SSH免密登录执行迁移命令virsh migrate --live vm-name qemussh://target-host/system9. 安全加固与权限管理虚拟化环境的安全至关重要本节介绍KVM环境的安全最佳实践。9.1 Libvirt访问控制Libvirt支持基于策略的访问控制。编辑配置文件sudo nano /etc/libvirt/libvirtd.conf启用以下选项auth_unix_ro polkit auth_unix_rw polkit然后配置Polkit规则例如限制普通用户只能管理自己的虚拟机。9.2 虚拟机隔离确保虚拟机之间的隔离为每个虚拟机配置独立的TAP设备使用不同的用户运行QEMU进程启用SELinux或AppArmor保护检查SELinux状态sestatus9.3 安全启动与TPM支持UEFI安全启动和虚拟TPM设备os loader readonlyyes typepflash/usr/share/OVMF/OVMF_CODE.fd/loader nvram template/usr/share/OVMF/OVMF_VARS.fd/var/lib/libvirt/qemu/nvram/myvm_VARS.fd/nvram /os tpm modeltpm-tis backend typeemulator version2.0/ /tpm10. 监控与性能分析有效的监控是维护健康虚拟化环境的关键。本节介绍KVM环境监控工具和技术。10.1 基础监控工具virsh命令提供基本的虚拟机状态监控virsh dominfo vm-name virsh domstats vm-namecollectd可以收集详细的性能数据sudo apt install collectd libvirt-collectd配置示例LoadPlugin virt Plugin virt Connection qemu:///system RefreshInterval 60 Domain name BlockDevice name:device InterfaceDevice name:device IgnoreSelected false /Plugin10.2 高级性能分析使用perf工具分析KVM性能sudo perf kvm --host stat -a分析QEMU事件sudo perf stat -e kvm:* -a10.3 图形化监控virt-top提供类似top的界面virt-topGrafana可以可视化监控数据配合Prometheus和libvirt-exporter使用。

相关文章:

Debian/Ubuntu 上 KVM 虚拟化环境搭建全攻略:从源码到实战

Debian/Ubuntu 上 KVM 虚拟化环境搭建全攻略:从源码到实战 在当今云计算和容器化技术蓬勃发展的时代,虚拟化技术依然是基础设施领域不可或缺的基石。KVM(Kernel-based Virtual Machine)作为Linux内核原生支持的虚拟化解决方案&…...

从协方差到相关系数:Python实战解析数据关联性

1. 协方差:理解变量间的协同变化 第一次接触协方差这个概念时,我盯着公式看了半天也没明白它到底在说什么。直到有一天我在超市看到薯片和可乐的促销数据,才突然开窍——原来协方差就是在告诉我们两个变量是如何一起变化的。 协方差的数学定义…...

从码农到冥府CTO:重建六道轮回系统的质量保障实践

第一章 职业跃迁:技术人的冥府晋升之路1.1 技术职级体系重构冥府技术团队沿用硅谷职级模型,但增设业力评估维度:L1 鬼卒程序员:执行生死簿数据录入(日均处理10万条因果记录)L3 无常高级工程师:负…...

OpenClaw关键词挖掘Agent配置(附SOP脚本,可直接复制使用)

OpenClaw关键词挖掘Agent全栈配置指南(附可执行SOP脚本)一、系统架构解析OpenClaw关键词挖掘系统采用分布式架构,核心由以下模块构成:数据采集层实时爬虫引擎:支持动态IP代理,突破反爬限制API集成模块&…...

如何在普通PC上低成本部署Qwen3?VLLM轻量化配置指南

如何在普通PC上低成本部署Qwen3?VLLM轻量化配置指南 对于大多数个人开发者和小型团队来说,高性能服务器和顶级显卡往往是可望而不可及的奢侈品。但别担心,即使你只有一台普通PC,也能通过合理的配置和优化手段成功部署Qwen3这样的大…...

LangGraph Platform本地部署实战:用Docker和CLI快速搭建你的第一个AI Agent微服务

LangGraph Platform本地部署实战:从开发到生产的AI Agent微服务架构 在AI应用开发领域,快速将原型转化为可部署的服务是每个开发者面临的挑战。LangGraph Platform作为LangChain生态中的工作流编排工具,其本地部署能力为开发者提供了从开发环…...

零代码玩转视觉定位:基于Qwen2.5-VL的Chord模型,Gradio界面快速上手

零代码玩转视觉定位:基于Qwen2.5-VL的Chord模型,Gradio界面快速上手 1. 视觉定位技术简介 视觉定位(Visual Grounding)是一项让计算机能够理解自然语言描述并在图像中精确定位目标对象的技术。想象一下,当你对计算机…...

深入解析UniApp中的package.json:从基础配置到高级技巧

1. 初识UniApp中的package.json 第一次接触UniApp项目时,我盯着package.json文件看了半天,心想这不就是个管理npm包依赖的配置文件吗?直到踩了几个坑才发现,UniApp对这个文件做了特殊扩展,让它成为了项目配置的中枢神经…...

Android蓝牙HFP连接实战:从SDK调用到底层状态机全解析(附避坑指南)

Android蓝牙HFP连接实战:从SDK调用到底层状态机全解析(附避坑指南) 在移动设备互联场景中,蓝牙免提协议(HFP)作为语音通话的核心传输通道,其连接稳定性直接影响用户体验。本文将深入Android蓝牙…...

RWKV7-1.5B-g1a参数避坑:top_p=0.9在中文任务中易引发事实性错误实测

RWKV7-1.5B-g1a参数避坑:top_p0.9在中文任务中易引发事实性错误实测 1. 模型简介与测试背景 rwkv7-1.5B-g1a是基于RWKV-7架构的多语言文本生成模型,特别适合中文场景下的基础问答、文案续写和简短总结任务。作为一款轻量级模型,它能在单卡2…...

基于Transformer架构解析:Nanbeige 4.1-3B 模型原理与性能调优

基于Transformer架构解析:Nanbeige 4.1-3B 模型原理与性能调优 最近在星图GPU平台上部署和测试Nanbeige 4.1-3B模型时,我发现很多朋友对Transformer架构的理解还停留在“听说过”的阶段,对模型参数、显存占用这些概念更是感到头疼。其实&…...

YOLOv8鹰眼检测效果展示:看AI如何从复杂场景中找出所有目标

YOLOv8鹰眼检测效果展示:看AI如何从复杂场景中找出所有目标 1. 引言:当AI拥有“鹰眼” 想象一下,在一张熙熙攘攘的街景照片里,你能一眼就数清有多少行人、多少车辆、多少交通标志吗?或者,在一张布满微小电…...

用Python处理SEED-VIG脑电数据:从PERCLOS标签到EEG特征提取的完整流程

用Python处理SEED-VIG脑电数据:从PERCLOS标签到EEG特征提取的完整流程 在神经工程和驾驶安全研究中,SEED-VIG数据集因其高质量的多模态生理信号采集而备受关注。这个包含EEG、EOG和眼动追踪数据的资源,为疲劳检测算法开发提供了宝贵素材。本文…...

SDMatte镜像轻量化:去除冗余依赖、多阶段构建、镜像体积压缩至3.2GB

SDMatte镜像轻量化:去除冗余依赖、多阶段构建、镜像体积压缩至3.2GB 1. 项目背景与挑战 SDMatte是一款面向高质量图像抠图的AI模型,特别擅长处理复杂边缘和半透明物体的抠图任务。在电商、设计、内容创作等领域有着广泛的应用场景。然而,原…...

清音刻墨Qwen3快速上手:拖拽上传,自动生成,一键下载

清音刻墨Qwen3快速上手:拖拽上传,自动生成,一键下载 1. 为什么选择清音刻墨Qwen3? 视频字幕制作一直是内容创作者的痛点。传统方法要么需要逐字听写,要么使用普通语音识别工具生成文字后,还得手动调整时间…...

MusePublic低配适配教程:16G显存降级方案与效果妥协平衡点

MusePublic低配适配教程:16G显存降级方案与效果妥协平衡点 1. 项目简介 MusePublic是一款专门为艺术感时尚人像创作设计的轻量化文本生成图像系统。这个项目的核心基于MusePublic专属大模型,采用安全高效的safetensors格式封装,针对艺术人像…...

c++ 20 有什么新的功能

C20 是继 C11 之后最具革命性的 C 标准更新之一,引入了许多强大的新特性,旨在提高代码的表达力、类型安全性、编译效率和开发体验。以下是 C20 的主要新功能分类总结:一、四大核心语言特性1. 模块(Modules)目的&#x…...

计算机毕业设计springboot基于的养老平台的设计与实现 SpringBoot架构下智慧养老综合服务系统的设计与实现 基于Java的社区养老数字化管理平台开发

计算机毕业设计springboot基于的养老平台的设计与实现(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。我国正加速步入老龄化社会,老年人口规模持续扩大,传…...

SDMatte在跨境电商中的提效实践:多语言商品图批量生成透明底素材

SDMatte在跨境电商中的提效实践:多语言商品图批量生成透明底素材 1. 跨境电商的图片处理痛点 跨境电商运营每天面临的最大挑战之一,就是为不同语言市场的商品生成高质量的透明底素材。传统处理方式存在三大痛点: 人工成本高:设…...

vLLM推理服务搭建指南:从环境配置到模型上线,一步不漏

vLLM推理服务搭建指南:从环境配置到模型上线,一步不漏 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,以其出色的吞吐量和易用性在AI社区广受欢迎。这个最初由加州大学伯克利分校开发的框架,如今已…...

HiDream_E1_1:全新AI绘图GGUFS模型来袭

HiDream_E1_1:全新AI绘图GGUFS模型来袭 【免费下载链接】HiDream_E1_1_bf16_ggufs 项目地址: https://ai.gitcode.com/hf_mirrors/ND911/HiDream_E1_1_bf16_ggufs 导语:AI图像生成领域再添新成员,HiDream_E1_1_bf16_ggufs模型正式发布…...

LaTeX参考文献报错全解析:从\citation到\bibdata的避坑指南

LaTeX参考文献报错全解析:从\citation到\bibdata的避坑指南 当你熬夜赶论文时,突然在编译LaTeX文档时看到一串红色报错:"I found no \bibstyle command"、"I found no \bibdata command"、"I found no \citation co…...

Wan2.2-I2V-A14B企业级落地:API服务压测报告(QPS 3.2,延迟<1.8s)

Wan2.2-I2V-A14B企业级落地&#xff1a;API服务压测报告&#xff08;QPS 3.2&#xff0c;延迟<1.8s&#xff09; 1. 测试环境与配置 1.1 硬件配置 GPU&#xff1a;RTX 4090D 24GB显存&#xff08;专用优化版&#xff09;CPU&#xff1a;10核心处理器内存&#xff1a;120G…...

别再只用命令行!Pycharm内置Database工具连接SQLite3的5个高效技巧(含文件路径避坑)

别再只用命令行&#xff01;Pycharm内置Database工具连接SQLite3的5个高效技巧&#xff08;含文件路径避坑&#xff09; 作为一名长期与SQLite3打交道的Python开发者&#xff0c;你是否还在反复切换终端和代码编辑器&#xff0c;用命令行执行sqlite3 test.db&#xff1f;或是为…...

无障碍辅助工具:OpenClaw+GLM-4-7-Flash语音控制电脑操作

无障碍辅助工具&#xff1a;OpenClawGLM-4-7-Flash语音控制电脑操作 1. 为什么需要本地化的语音控制方案 去年夏天&#xff0c;我帮一位因车祸导致手臂骨折的朋友临时搭建了一套语音控制系统。当时市面上主流的语音助手要么需要联网&#xff0c;要么对中文指令的理解能力有限…...

MedGemma 1.5效果对比:在线大模型vs本地MedGemma在医学术语解释准确性评测

MedGemma 1.5效果对比&#xff1a;在线大模型vs本地MedGemma在医学术语解释准确性评测 1. 引言&#xff1a;为什么需要本地医疗AI助手&#xff1f; 想象一下&#xff0c;你或者家人身体不舒服&#xff0c;想在网上查查症状&#xff0c;结果搜出来一堆广告、营销号文章&#x…...

深入解析Bluetooth AVDTP协议:音频/视频传输的核心机制

1. 蓝牙AVDTP协议初探&#xff1a;音频视频传输的幕后英雄 每次用蓝牙耳机听音乐或看视频时&#xff0c;你可能没意识到背后有个"隐形交通警察"在指挥数据流动。这个默默工作的角色就是AVDTP协议&#xff08;Audio/Video Distribution Transport Protocol&#xff09…...

运维实战:Z-Image-Turbo_Sugar脸部Lora模型在Linux生产环境的持续部署与监控

运维实战&#xff1a;Z-Image-Turbo_Sugar脸部Lora模型在Linux生产环境的持续部署与监控 作为一名在AI和智能硬件领域摸爬滚打了十多年的工程师&#xff0c;我见过太多“模型跑得欢&#xff0c;运维跑断腿”的场景。一个模型在开发者的笔记本上可能表现完美&#xff0c;但一旦…...

保姆级教程:用InVEST 3.14.0中文版搞定毕业论文碳储量计算(附数据预处理避坑指南)

零基础科研实战&#xff1a;InVEST碳储量计算全流程精解与避坑指南 刚接触InVEST模型的新手研究者&#xff0c;往往会在碳储量计算的第一步就陷入数据沼泽——为什么我的土地利用数据无法加载&#xff1f;为什么运行结果出现负值&#xff1f;这些看似简单的操作背后&#xff0c…...

OpenClaw浏览器自动化:Qwen3-32B-Chat智能爬虫实战

OpenClaw浏览器自动化&#xff1a;Qwen3-32B-Chat智能爬虫实战 1. 为什么选择OpenClaw做浏览器自动化&#xff1f; 去年我接手了一个市场调研项目&#xff0c;需要从200多个电商页面抓取商品信息和用户评价。传统爬虫遇到动态加载、反爬机制时频繁报错&#xff0c;手动操作又…...