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:標識為串口設備