出现 (initramfs) 提示符,说明内核已经成功加载并启动,但无法找到或挂载根文件系统(Root File System)。这通常是因为虚拟磁盘的设备名称发生改变(例如原先是 sda,现在在 KVM 中变成了 vda),或者引导参数中的 UUID 与实际不符。可以通过以下步骤在当前界面排查并定位问题:1.1. 检查内核是否识别到虚拟磁盘:查看块设备。在 (initramfs) 提示符下输入以下命令,查看系统当前挂载了哪些磁盘:Plaintextcat /proc/partitions
验证成功: 终端会列出设备列表,检查里面是否有 vda、sda 及其对应的主分区(如 vda1、sda1)。2.2. 获取正确的分区及文件系统信息:检查分区 UUID。输入以下命令查看磁盘的详细格式和 UUID:Plaintextblkid
验证成功: 能够看到类似于 /dev/vda1: UUID="..." BLOCK_SIZE="..." TYPE="ext4" 的输出信息。

既然 blkid 已经能够识别到 vda 及其分区,说明内核和驱动已经正常工作。之所以卡在 (initramfs) 界面,通常是因为系统找不到对应的根分区 UUID,或者文件系统由于异常关机导致损坏需要修复。1.1. 退出 initramfs 查看真实报错:获取崩溃日志。在 (initramfs) 提示符下输入:Plaintextexit
验证成功: 屏幕会向上滚动并打印出导致系统无法正常挂载根目录的具体错误日志(例如提示某个 UUID 不存在、超时或文件系统损坏)。2.2. 执行文件系统检查与修复:修复文件系统。如果刚才的报错提示文件系统损坏或未正常卸载,请对你的根分区(假设 blkid 显示根分区为 /dev/vda1,请按实际情况调整)执行强制修复:Plaintextfsck -y /dev/vda1
验证成功: fsck 运行结束并提示文件系统已清理修复(Clean / blocks fixed)。

将r730上的kvm虚拟机迁移到r710服务器上避坑:

一号坑:

Machine Type(机器类型)不兼容:
原系统的机器类型可能是特定定制的(例如 pc-i440fx-rhel7.x.x)。Ubuntu 24.04 的 QEMU 无法识别这种类型。

修改方法: 找到 标签下的 ,将其修改为 Ubuntu 支持的通用类型,例如默认的 pc 或者较新的 q35。我的改为了:pc-i440fx-2.12

降低 CPU 模型以适配老旧的 R710
R710 的 CPU 架构较老(Westmere 架构),需要将 CPU 模型改为兼容模式(如 Westmere 或 Penryn),删掉那些新 CPU 特性要求:

XML

<model fallback='allow'>Westmere</model>

二号坑

Emulator(模拟器)路径变更:
不同系统的 QEMU 执行文件路径可能不同(例如某些系统是 /usr/libexec/qemu-kvm)。

修改方法: 确保 标签的值为 Ubuntu 的正确路径,通常是 /usr/bin/qemu-system-x86_64。
修正虚拟磁盘路径
找到 这一段,将 修正为你当前在 Ubuntu 上存放该 .qcow2 文件的真实绝对路径(例如你之前提到的 /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2):

XML

<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2'/>
  <target dev='vda' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>

三号坑

Ubuntu 特有的 AppArmor 安全策略
这是迁移到 Ubuntu 时最容易踩坑的地方。Ubuntu 默认使用 AppArmor 保护系统。如果你的虚拟机磁盘镜像(如 .qcow2)放在了非默认路径(默认是 /var/lib/libvirt/images/,如果你挂载到了自定义的数据盘如 /data/vms/),AppArmor 会直接拦截 QEMU 的读取请求,日志里会显示 Permission denied。

排查方式: 运行 dmesg | grep -i apparmor | grep DENIED,看看是否有针对你虚拟机镜像路径的拦截记录。

解决方式: 你需要修改 AppArmor 的 libvirt 配置,将你的自定义目录加入白名单。编辑 /etc/apparmor.d/local/usr.lib.libvirt.virt-aa-helper,添加你的镜像路径(例如加上一行 /data/vms/** rwk,),然后重启 AppArmor 服务。
sudo systemctl reload apparmor

四号坑

镜像文件权限与属主
在 Ubuntu 24.04 上,QEMU 进程通常以 libvirt-qemu 用户(属于 kvm 用户组)运行。
迁移过来的镜像文件可能还保留着 root 或原系统特定用户的权限,导致 QEMU 无法读取。

解决方式: 手动将镜像文件的属主改过来:
保留在家目录,修改目录穿透权限
如果你必须把镜像放在这个位置(例如这块硬盘空间很大),你需要逐级赋予外来用户“进入”目录的权限(即执行权限 x),并修改镜像文件的属主。

逐级开放目录的进入权限(o+x):
注意,这会让系统上其他用户也能通过已知路径访问你的家目录文件,请确保安全。

Bash
chmod o+x /home/qianlong
chmod o+x /home/qianlong/kvm
chmod o+x /home/qianlong/kvm/vdisks
将镜像文件的属主改为 QEMU 进程账户:

Bash
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2

五号坑

网络接口 (Bridge/NAT) 缺失
检查 XML 中的 部分。
如果你的虚拟机原来使用的是桥接网络(如 并指定了 br0),那么在新的 Ubuntu 24.04 宿主机上,必须提前配置好同名的网桥。如果宿主机的网桥不存在,虚拟机在初始化网卡设备时就会直接报错退出。

六号坑

在 KVM 虚拟化中,经常会使用模板克隆来节省空间。你的 kali2026.1kvm8901.qcow2 并不是一个包含完整系统数据的独立镜像,而是一个增量镜像(Differential Image)。

它在底层强烈依赖于一个基础模板文件:/home/disk/nvme1/kvm/vdisks/kali2026.1_template.raw。
在迁移到这台新的宿主机时,底层的 QEMU 进程按照这个写死的旧路径去寻找基础模板,但没有找到。这通常是因为该文件没有被拷贝过来,或者新服务器的目录结构不同(例如缺少 nvme1 这个挂载点)。

解决方法
你需要找到那个基础模板文件,并修正 .qcow2 文件中的路径指向。

步骤 1:定位基础模板文件
请先在当前的 Ubuntu 系统中找到 kali2026.1_template.raw 文件。假设你已经将它和现在的 .qcow2 文件放在了同一个目录下,即 /home/qianlong/kvm/vdisks/。

步骤 2:重置基础镜像路径(Rebase)
使用 qemu-img rebase 命令来修改 .qcow2 内部记录的基础镜像路径:

Bash

请将 -b 后面的路径替换为模板文件在你当前系统上的真实绝对路径

qemu-img rebase -u -b /home/qianlong/kvm/vdisks/kali2026.1_template.raw -F raw /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2
提示:-u 参数表示不安全模式(Unsafe mode),它的作用是强行改写路径指针而不去校验旧路径的数据,由于你的旧路径已经不存在了,必须加上这个参数。

步骤 3:验证路径修改
运行以下命令检查镜像信息:

Bash
qemu-img info /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2
在输出的内容中,确认 backing file 这一项已经成功变更为你刚刚设置的新路径。

步骤 4:赋予基础镜像权限
因为虚拟机启动时不仅需要读取 .qcow2,还需要读取底层的 .raw 模板。请确保 libvirt-qemu 账户对基础模板文件同样具有权限:

Bash
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1_template.raw
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2

七号坑:既然修改完配置后,虚拟机依然提示 No bootable device(找不到引导设备)

既然修改完配置后,虚拟机依然提示 No bootable device(找不到引导设备),说明虚拟机的虚拟硬盘(即那条增量链)虽然能被 QEMU 打开,但系统在里面依然找不到有效的引导扇区(MBR/GPT)或内核。

1、可以通过以下步骤排查磁盘镜像的实际状态:1.1. 查看 qcow2 镜像状态:检查镜像基本信息。在宿主机终端运行以下命令,检查该虚拟磁盘的大小和格式:Bashqemu-img info /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2
验证成功: 终端正常输出镜像的虚拟大小、实际占用空间及文件格式。

2.检查底层模板文件自分区表:验证 raw 模板完整性。运行以下命令直接检查 .raw 模板的分区结构,看看它在 R710 上是否能被正常读取:Bashsudo fdisk -l /home/qianlong/kvm/vdisks/kali2026.1_template.raw
验证成功: 终端能够正常打印出类似 Linux 分区(如 /dev/loopXp1 或分区表详情)即说明模板完好;若报错则说明该文件在跨服务器拷贝时损坏或不完整。

3.检查模板镜像元数据:核对虚拟大小。运行以下命令查看 .raw 文件的基本属性:Bashqemu-img info /home/qianlong/kvm/vdisks/kali2026.1_template.raw

问题的原因已经找到了:从 qemu-img info 的输出可以看出,这个文件的后缀虽然叫 .raw,但它实际的文件格式是 qcow2。

因为 fdisk 只能直接读取纯 Raw 格式的绝对物理偏移,无法解析 qcow2 内部的封装结构,所以刚才直接用 fdisk 无法正确读取分区。

4、 修正文件后缀名避免误导:规范化命名(可选)。为了避免以后混淆,建议将模板文件的后缀名从 .raw 改为 .qcow2:Bashmv /home/qianlong/kvm/vdisks/kali2026.1_template.raw /home/qianlong/kvm/vdisks/kali2026.1_template.qcow2
(注意:改名后,需要同步修改子镜像 kali2026.1kvm8901.qcow2 内部的 backing file 指向路径,或者重新指定底层模板)。验证成功: 再次运行 qemu-img info 确认基础链条指向正常。

5、重新更新重置基础镜像路径(Rebase)
qemu-img rebase -u -b /home/qianlong/kvm/vdisks/kali2026.1_template.qcow2 -F qcow2 /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2

6、赋予基础镜像权限
因为虚拟机启动时不仅需要读取 .qcow2,还需要读取底层的 .raw 模板。请确保 libvirt-qemu 账户对基础模板文件同样具有权限:

Bash
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1_template.qcow2
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2
重新启动虚拟机,可以启动了

具体我的操作修改项如下:

1、virsh edit kali2026.1kvm8902
修改内容如下:

<domain type='kvm'>
  <name>kali2026.1kvm8901</name>
  <uuid>921fd605-7601-4052-87bd-7ada46849e74</uuid>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>4</vcpu>
  <os>
    **<type arch='x86_64' machine='pc-i440fx-2.12'>hvm</type>**
    <boot dev='hd'/>
    <boot dev='cdrom'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    **<model fallback='allow'>Westmere</model>**
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    **<emulator>/usr/bin/qemu-system-x86_64</emulator>**
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      **<source file='/home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2'/>**
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
     <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' >
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:28:45:98'/>
      **<source bridge='br0'/>**
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='8901' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <audio id='1' type='none'/>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primar>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>

2、使kvm可以访问/home目录
编辑 /etc/apparmor.d/local/usr.lib.libvirt.virt-aa-helper,添加你的镜像路径
加上一行
/home/qianlong/kvm/vdisks/** rwk,
然后重启 AppArmor 服务。
sudo systemctl reload apparmor

3、修改镜像文件权限与属主
chmod o+x /home/qianlong
chmod o+x /home/qianlong/kvm
chmod o+x /home/qianlong/kvm/vdisks
将镜像文件的属主改为 QEMU 进程账户:

Bash
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1kvm8902.qcow2

4、重置基础镜像路径(Rebase)
使用 qemu-img rebase 命令来修改 .qcow2 内部记录的基础镜像路径
qemu-img rebase -u -b /home/qianlong/kvm/vdisks/kali2026.1_template.qcow2 -F qcow2 /home/qianlong/kvm/vdisks/kali2026.1kvm8902.qcow2

5、赋予基础镜像权限
因为虚拟机启动时不仅需要读取 .qcow2,还需要读取底层的 .raw 模板。请确保 libvirt-qemu 账户对基础模板文件同样具有权限:

Bash
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1_template.qcow2
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1kvm8902.qcow2

6、重启kvm虚拟机
virsh start kali2026.1kvm8902

如果你已经在 Windows 上安装好了 WSL2 + Ubuntu,进入 Ubuntu 有几种方法。

方法 1:CMD / PowerShell 进入

打开 Windows 的 PowerShell 或 CMD,执行:

wsl

如果默认发行版就是 Ubuntu,会直接进入:

username@computer:~$

这就已经进入 Ubuntu 了。

方法 2:明确进入 Ubuntu

如果你安装了多个 Linux 发行版,先查看:

wsl -l -v

例如:

NAME STATE VERSION

  • Ubuntu-22.04 Stopped 2
    Ubuntu Stopped 2

然后指定:

wsl -d Ubuntu-22.04

或者:

wsl -d Ubuntu
方法 3:开始菜单直接进入

Windows 开始菜单搜索:

Ubuntu

如果安装的是 Ubuntu 22.04,就可能显示:

Ubuntu 22.04 LTS

点击即可进入。

方法 4:设置 Ubuntu 为默认发行版

如果你希望以后只输入:

wsl

就进入 Ubuntu,可以先查看:

wsl -l -v

然后:

wsl --set-default Ubuntu

如果你的名称是 Ubuntu-22.04:

wsl --set-default Ubuntu-22.04

之后:

wsl

就会直接进入 Ubuntu。

如果 wsl 报错

可以执行:

wsl --status

以及:

wsl -l -v

把输出贴给我,我可以判断你的 WSL2 / Ubuntu 是否安装正常。

另外,你现在是准备在这个 WSL2 Ubuntu 里面部署前面说的 CosyVoice 的话,我建议下一步先检查 Ubuntu 版本、NVIDIA GPU 是否已经被 WSL 识别、CUDA/PyTorch 环境,不要急着安装 CosyVoice。

在 Windows 本地部署 CosyVoice 语音合成服务,建议不要直接装 Windows 原生 Python 环境,因为 CosyVoice 依赖较多(PyTorch、CUDA、sox、模型文件等),官方主要按 Linux + Conda 环境设计。Windows 最稳定方案是:

Windows + NVIDIA GPU + WSL2 Ubuntu + Conda + CosyVoice Web/API 服务

CosyVoice 官方提供推理代码、WebUI,以及 FastAPI/gRPC 服务部署方式

1、安装 WSL2

wsl --install

2、选择启动ubuntu,由于系统安装了多个Linux 发行版,先查看:

wsl -l -v

3、指定打开ubuntu

wsl -d Ubuntu

4、切换到home目录

cd ~

5、安装 Conda

下载 Miniconda:

https://docs.conda.io/en/latest/miniconda.html

Linux 安装:

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

bash Miniconda3-latest-Linux-x86_64.sh

重新打开终端。

检查:

conda --version

6、四、下载 CosyVoice

官方仓库:

git clone --recursive https://github.com/FunAudioLLM/CosyVoice.git

cd CosyVoice

如果子模块失败:

git submodule update --init --recursive

五、创建 Python 环境

官方推荐 Python 3.10:

conda create -n cosyvoice python=3.10 -y

conda activate cosyvoice

安装依赖:

pip install -r requirements.txt

六、安装 PyTorch CUDA

例如 RTX 30/40 系列:

pip install torch torchaudio torchvision \
--index-url https://download.pytorch.org/whl/cu121

测试:

python

输入:

import torch

print(torch.cuda.is_available())

print(torch.cuda.get_device_name())

输出:

True
NVIDIA GeForce RTX xxxx

说明 GPU 正常。

七、下载模型

推荐 CosyVoice2:

例如:

pip install modelscope

创建:

mkdir pretrained_models

下载:

from modelscope import snapshot_download

snapshot_download(

'iic/CosyVoice2-0.5B',
local_dir='pretrained_models/CosyVoice2-0.5B'

)

官方提供多个模型:

CosyVoice2-0.5B
CosyVoice-300M
CosyVoice-300M-SFT
CosyVoice-300M-Instruct

八、测试语音合成

进入:

cd CosyVoice

运行:

python example.py

成功后会生成 wav 文件。

九、启动 Web 页面

官方提供 webui:

python webui.py \
--port 50000 \
--model_dir pretrained_models/CosyVoice2-0.5B

浏览器打开:

http://localhost:50000

即可:

输入文字
选择声音
克隆声音
生成音频

十、部署成 API 服务(推荐)

如果你想给自己的程序调用:

例如:

你的程序

|
|

HTTP API

|

CosyVoice

使用官方 FastAPI:

进入:

cd runtime/python/fastapi

启动:

python server.py \
--port 50000 \
--model_dir ../../pretrained_models/CosyVoice2-0.5B

然后:

POST http://127.0.0.1:50000

即可调用。

官方也提供 FastAPI / gRPC 服务部署方式。

十一、Windows 开机自动启动

可以创建:

start_cosyvoice.bat

内容:

wsl -d Ubuntu bash -c "
source ~/miniconda3/bin/activate cosyvoice &&
cd ~/CosyVoice &&
python webui.py --port 50000
"

以后双击即可启动。

一、人工部分
1、每天由人工到外网下载相关的外语视频

2、人工截取为短视频

3、调用本地的fastwhisper的api将下载的英文短视频,提取出带时间轴的英文字幕文件。自动以当天的日期为文件名在远程samba服务器上创建文件夹,并将源视频文件和生成的字幕文件上传到该文件夹中。

4、调用video-auto-translator自动完成配音和中文字幕翻译工作。生成的最后视频文件,保存到192.168.222.16的相关文件夹中。