服务迁移至QEMU记录
之前国补在狗东入手了Mac mini 万兆丐版,想着我那n2920的小主机也是时候该退休了。小主机是2019年买的,中途ssd坏过一次,万幸数据救回来了。虽然换了ssd,但是也不是新的ssd是从另一个设备上拆下来的。就怕二次出现故障,加上服役6年多了,配置也很低。所以索性就把服务全部都迁移到mac上。
CPU |
Intel N2920 |
Memry |
32G |
Disk |
西数1T(PMR的蓝盘,还算抗造) |
OS |
Ubuntu 24.04.2 LTS |
现在最大的问题莫过于架构问题了,n2920虽然性能拉跨,但是胜在x86_64的指令集,很多软件跑起来都没有问题。但是如果要转qemu虚拟化来跑的话,就要从x86_64过渡到arm64也就是aarch64了。我表示很担心兼容性问题。但是问了一下GPT,他表示问题不大,完全可以迁移,大部分软件都有aarch64版本,要是担心兼容性问题,可以用Rosetta 2转译运行,但是会有部分性能损失。我表示 不怕兼容性问题,就怕不能榨干M4的所有性能,那就直接装aarch64版本的系统吧!
安装qemu
这个很简单!直接用brew安装就完事了,并且qemu官网也是推荐的brew安装的。
Qemu创建虚拟化主机
创建磁盘
在创建虚拟主机之前,需要创建一块虚拟磁盘给虚拟机用,大小就30G吧,毕竟是丐版,磁盘给太大,对我这256G的磁盘来说就不礼貌了。
1
|
qemu-img create -f qcow2 ubuntu-arm64.qcow2 30G
|
下载Ubuntu iso镜像
可以去 Ubuntu for Arm 官网下载镜像。我一般是不用GUI的,就直接下载server版本了。如果要下载desktop版本的,还需要配置VNC,麻烦不说,页面可能会卡顿。还不如我ssh直接敲命令方便。
1
|
wget https://cdimage.ubuntu.com/releases/24.04/release/ubuntu-24.04.2-live-server-arm64.iso
|
下载Bootloader
虽然不知道为什么要这个Bootloader,但是不用就无法启动。按道理说qemu应该是自带引导的,不管了,不求甚解,能用就行。
1
|
wget https://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd
|
启动虚拟机安装系统
1
2
3
4
5
6
7
8
9
10
11
12
13
|
sudo qemu-system-aarch64 \
-M virt \ #通用虚拟化平台,支持加速
-accel hvf \ #虚拟化加速
-cpu host \ #直接使用本机CPU
-smp 2 \ #分配2核心
-m 2048 \ #2G内存足以
-drive if=virtio,file=./ubuntu-arm64.qcow2,format=qcow2 \ #使用刚刚创建的虚拟磁盘用作虚拟机的磁盘
-cdrom ./ubuntu-24.04.2-live-server-arm64.iso \ #下载的arm64的Ubuntu镜像
-boot d \ #从cdrom启动
-bios ./QEMU_EFI.fd \ #引导文件
-device virtio-gpu-pci \ #虽然不需要GUI,但是保不齐后续我想玩一下VNC呢
-nographic \ #无GUI模式,所有操作在terminal中完成
-nic vmnet-bridged,ifname=en0,model=virtio-net-pci #macos特有的桥接方式。ifname 为需要桥接的目的网络接入接口
|
安装系统
这个就没有什么好说的了,下一步,下一步,设置密码,装内核,重启就可以了。
配合 tmux 一键自动运行
其实也可以设置开机自动运行的,但是我没有设置,因为偶尔还会用mac和老婆玩玩星露谷和我的世界,那就需要运行的时候在手动启动一下吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#!/bin/bash
QEMU_CMD="sudo /opt/homebrew/bin/qemu-system-aarch64 \
-M virt \
-accel hvf \
-cpu host \
-smp 2 \
-m 2048 \
-drive if=virtio,file=/xxx/ubuntu-arm64.qcow2,format=qcow2 \
-boot d \
-bios /xxx/QEMU_EFI.fd \
-nographic \
-nic vmnet-bridged,ifname=en0,model=virtio-net-pci
"
TMUX_SESSION_NAME="qemu"
# 检查 tmux 会话是否已经在运行
if ! /opt/homebrew/bin/tmux has-session -t "$TMUX_SESSION_NAME" 2>/dev/null; then
echo "Starting new tmux session '$TMUX_SESSION_NAME' and running QEMU..."
# 启动 tmux 会话并在其中执行 QEMU 命令
# -d 确保 tmux 会话在创建后立即分离,不会阻塞启动进程
/opt/homebrew/bin/tmux new-session -s "$TMUX_SESSION_NAME" -d "$QEMU_CMD"
echo "QEMU started in tmux session '$TMUX_SESSION_NAME'."
else
echo "Tmux session '$TMUX_SESSION_NAME' already exists. QEMU might be running."
fi
|
服务迁移
大部分服务都可以正常迁移到arm64环境下,go,java,nodejs,python这些都么有问题,我需要的nginx,tailscale,docker还有aria2c等都正常!
总结
目前看来arm64用作生产力也不是不行。qemu虚拟化出来的性能也还可以。留待以后慢慢使用感受吧!