1. 安装相关软件
yum install qemu edk2* libvirt -y
启动libvirt服务
systemctl start libvirtd
systemctl status libvirtd
2. 创建虚拟机
2.1. qemu启动命令示例
/usr/bin/qemu-system-loongarch64 \-machine virt,accel=kvm \-nodefaults \-m 2048 \-smp 2,maxcpus=4,cores=2,threads=1,sockets=2 \-cpu 'la464-loongarch-cpu' \-bios /usr/share/edk2/loongarch64/QEMU_EFI.fd \-drive file=/home/OpenCloudOS-9.4.qcow2,if=virtio \-nographic \-serial stdio \-monitor telnet:localhost:4444,server,nowait \-msg timestamp=on
2.2. 各参数的详细解析
参数 | 作用 |
---|---|
-machine virt,accel=kvm | 使用虚拟化机器类型并启用KVM加速 |
-nodefaults | 禁用默认设备 |
-m 2048 | 分配内存2048M,即2GB |
-smp 2,maxcpus=4,cores=2,threads=1,sockets=2 | CPU拓扑:2个激活vCPU,最多4个,2核心/插槽,无超线程 |
-cpu ‘la464-loongarch-cpu’ | 模拟龙芯LA464 CPU |
-bios /usr/share/edk2/loongarch64/QEMU_EFI.fd | 指定UEFI固件 |
-drive file=/home/OpenCloudOS-9.4.qcow2,if=virtio | 使用VirtIO半虚拟化磁盘 |
-nographic | 禁用图形界面 |
-serial stdio | 将串口重定向到终端 |
-monitor telnet:localhost:4444,server,nowait | 启用QEMU Monitor的Telnet接口 |
-msg timestamp=on | 日志添加时间戳 |
3. 启动虚拟机
问题:直接使用2.1章节的命令,发现无法正常进入到操作系统中
解惑:内核的启动日志和登录串口一般显示在图形界面,qemu启动参数使用的是串口启动
3.1. 在grub中添加内核启动参数
在grub里面添加内核启动参数 “console=ttyS0,115200 earlycon=uart,mmio,0x1fe001e0
”
注释:
uart,mmio指定UTRA类型为mmio(内存映射I/O)
0x1fe001e0为龙芯3A5000的UART0地址
3.2. 直接打开图形界面
修改qemu启动参数
删除 -nographic
增加 -device virtio-gpu-pci \ -device qemu-xhci \ -device usb-kbd \ -device usb-tablet \
4. 举一反三
4.1. console和earlycon对比
核心功能对比
特性 | console | earlycon |
---|---|---|
作用阶段 | 内核初始化完成后(驱动加载后) | 内核极早期(解压、硬件初始化阶段) |
依赖条件 | 需要完整的串口/TTY驱动 | 直接操作硬件寄存器,无需完整驱动 |
输出内容 | 系统启动后的全部日志和交互控制台 | 仅内核解压、内存初始化等早期日志 |
典型配置 | console=ttyS0,115200 | earlycon=uart,mmio,0x1fe001e0 |
调试用途 | 常规系统操作和故障排查 | 解决内核卡死在启动前期的严重问题 |
4.2. earlycon参数分析
参数结构分析
earlycon=<接口类型>,<寄存器类型>,<物理地址>[,选项]
部分 | 值 | 说明 |
---|---|---|
earlycon= | - | 声明启用早期控制台 |
uart | 串口设备类型 | 指定使用UART(Universal Asynchronous Receiver/Transmitter)协议 |
mmio | 内存映射I/O | 表示UART通过内存映射寄存器访问 |
0x1fe001e0 | 物理地址 | 龙芯3A5000的UART0寄存器基地址(不同芯片需要调整) |
4.3. 查看芯片的寄存器基地址
在linux系统中查看
## 在已运行系统中:
sudo cat /proc/iomem |grep -i "serial"## 输出示例:
1fe001e0-1fe001e7 : serial
1fe001e0-1fe001e7:UART0寄存器占用的物理地址范围
serial:标识为串口设备