categories: [VM]
tags: MacOS VM
写在前面
买了 ARM 的 mac, 就注定了要折腾一下虚拟机了…
之前写过一篇文章是通过 utm 虚拟化archlinux, 其实本质上还是调用了 qemu-system-x86_64, 所以速度并不快, 后来想着能不能借用 Rosetta 的优势即原生转译, 来虚拟化 Intel 的 Linux.
看了一些文章, 提到过用lima 管理虚拟机, 然后配置, 应该是最便捷的方法了, 不过这里先以 utm 的最新版设置为例讲讲, 之后再说 lima.
环境支持:
MacOS13+ (为了使用 apple 的虚拟化, 这个虚拟化支持在ARM 架构的 Linux 上使用 Rosetta跑 Intel 架构的程序)
m系列芯片
一些看过的博客
算是一个引子, 可以看看 Apple 官方的消息
- 苹果M系列处理器上的Linux虚拟机内Rosetta转译初体验 - wvbCommunity;(感觉写的比较详细的博客, 还附了图就很棒)
- Running Intel Binaries in Linux VMs with Rosetta | Apple Developer Documentation;
- Rosetta | UTM Documentation; 这篇算是 utm 支持, 其实很多内容在 Apple 官方的文档有写了
开始折腾…
UTM 方案: 支持桌面 UI
搞个镜像
wget https://cdimage.ubuntu.com/releases/22.04/release/ubuntu-22.04.3-live-server-arm64.iso
注意一定要下载 arm 的 Linux 镜像, 然后在这里面安装 Rosetta, 通过 Linux 内的 Rosetta 来转译运行 Intel 的程序.
这里就用比较广泛使用的 Ubuntu 了, 注意如果用 rpm 系列的 Linux 发行版的话安装后面要用到的包就比较麻烦了, 先能用再说.
打开 utm
勾选虚拟化, 勾选 Apple 虚拟化, 和启用 Rosetta.
此外就是选上上面下载好的 ISO 镜像
开启之后按照安装步骤一点一点来走安装, 如果 utm 显示不好的话可以用 iterm 连接ssh, help 界面给出了秘钥.
安装之后 poweroff, 然后清除掉 iso, 进入系统.
配置Rosetta
Debian 系列直接安装:
sudo apt install binfmt-support sudo apt install spice-vdagent #剪贴板共享
然后挂载
sudo mkdir /media/rosetta sudo mount -t virtiofs rosetta /media/rosetta
写入/etc/fstab:
rosetta /media/rosetta virtiofs ro,nofail 0 0
安装
sudo /usr/sbin/update-binfmts --install rosetta /media/rosetta/rosetta \ --magic "\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00" \ --mask "\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \ --credentials yes --preserve no --fix-binary yes
看看情况:
$ cat /proc/sys/fs/binfmt_misc/rosetta enabled interpreter /mnt/lima-rosetta/rosetta flags: OCF offset 0 magic 7f454c4602010100000000000000000002003e00 mask fffffffffffefe00fffffffffffffffffeffffff
换源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse deb http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse # deb-src http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse # 预发布软件源,不建议启用 # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse # # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse
跑代码
首先安装一下 multilib 版的 gcc, 即:
sudo apt install gcc-multilib-x86-64-linux-gnu g++-multilib-x86-64-linux-gnu
这样只是搞定了交叉编译的工具链, 对于一个 Intel 的程序, 还需要 Intel 的 ld-linux so 库支持, 从阿里云服务器里面 cp 一个, 之后又提示 libc 找不到, 接着 cp, 这样的示例程序就跑起来了.
#include int main() { std::cout