在 MacOS 上假造化 x86Linux 的最佳方法(通过 Rosetta)

打印 上一主题 下一主题

主题 626|帖子 626|积分 1878


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

搞个镜像

  1. 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 系列直接安装:
  1. sudo apt install binfmt-support
  2. sudo apt install spice-vdagent #剪贴板共享
复制代码
然后挂载
  1. sudo mkdir /media/rosetta
  2. sudo mount -t virtiofs rosetta /media/rosetta
复制代码
写入/etc/fstab:
  1. rosetta        /media/rosetta        virtiofs        ro,nofail        0        0
复制代码
安装
  1. sudo /usr/sbin/update-binfmts --install rosetta /media/rosetta/rosetta \
  2.      --magic "\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00" \
  3.      --mask "\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \
  4.      --credentials yes --preserve no --fix-binary yes
复制代码
看看情况:
  1. $ cat /proc/sys/fs/binfmt_misc/rosetta
  2. enabled
  3. interpreter /mnt/lima-rosetta/rosetta
  4. flags: OCF
  5. offset 0
  6. magic 7f454c4602010100000000000000000002003e00
  7. mask fffffffffffefe00fffffffffffffffffeffffff
复制代码
换源

  1. # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
  2. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
  3. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
  4. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
  5. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
  6. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
  7. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
  8. deb http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
  9. # deb-src http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
  10. # 预发布软件源,不建议启用
  11. # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse
  12. # # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse
复制代码
跑代码

起首安装一下 multilib 版的 gcc, 即:
  1. sudo apt install gcc-multilib-x86-64-linux-gnu g++-multilib-x86-64-linux-gnu
复制代码
这样只是搞定了交织编译的工具链, 对于一个 Intel 的步伐, 还必要 Intel 的 ld-linux so 库支持, 从阿里云服务器里面 cp 一个, 之后又提示 libc 找不到, 接着 cp, 这样的示例步伐就跑起来了.
  1. #include <iostream>
  2. int main() {
  3.     std::cout << "hello rosetta\n";
  4.     return 0;
  5. }
复制代码
如果要 Rosetta 实行就这样来:
  1. x86_64-gnu-linux-g++ a.cpp #交叉编译工具链, 通过apt 安装 gcc-multilib
  2. /media/rosetta/rosetta ./a.out
复制代码
  缺啥动态库就补上
  lima 方案: 快速配置最小化 Linux

这里参考了下面的文章.
   在 Apple Silicon macOS 上跑 Linux 假造机 + Rosetta - 杰哥的{运维,编程,调板子}小笔记;
  前面通过 UTM 的方法配置了假造化, 而且得到了不错的效果, 下面看看更快速的方法
主要通过 lima 来做, lima 之前安装 docker 时候大家应该不生疏, 因为 docker 的 daemon 用到了colima , 本质上就是一个 Ubuntu 的 arm 版, 但是用 docker 还是有点不惬意, 为什么直接来一个完善的 Intel Linux 呢?
安装配置 lima

  1. brew install lima
  2. limactl start template://debian --rosetta --vm-type=vz
  3. limactl shell debian # 进入 Debian arm
复制代码
查看 Rosetta 支持情况:
  1. $ cat /proc/sys/fs/binfmt_misc/rosetta
复制代码
在 lime-debian 中安装 Intel centos7

其实 nerdctl 跟 docker 差不多, 熟悉一下下令行的操作就好了.
运行
  1. nerdctl run -it --platform amd64 centos:centos7
复制代码
退出之后就关闭了, 必要 start一下再进去
  1. nerdctl start centos-f32d1
  2. nerdctl exec -it centos-f32d1 /bin/bash
复制代码
不用了就关闭
  1. nerdctl stop centos-f32d1
复制代码
查看容器情况
  1. $ nerdctl ps -a
  2. CONTAINER ID    IMAGE                               COMMAND        CREATED         STATUS     PORTS    NAMES
  3. f32d106b5240    docker.io/library/centos:centos7    "/bin/bash"    21 hours ago    Created             centos-f32d1
复制代码
安装其他软件
  1. yum -y install epel-release
  2. yum repolist
  3. curl -o /etc/yum.repos.d/konimex-neofetch-epel-7.repo https://copr.fedorainfracloud.org/coprs/konimex/neofetch/repo/epel-7/konimex-neofetch-epel-7.repo
  4. yum install neofetch
复制代码
  Installation · dylanaraps/neofetch Wiki;
  neofetch

benchmark

  
  1. yum install sysbench
复制代码
可喜可贺! M3Pro 加持, 终于跑过阿里云服务器了
先来看看 阿里云的 Server, 两核拉满
  1. $ sysbench cpu --cpu-max-prime=20000000 --threads=2 run
  2. sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)
  3. Running the test with following options:
  4. Number of threads: 2
  5. Initializing random number generator from current time
  6. Prime numbers limit: 20000000
  7. Initializing worker threads...
  8. Threads started!
  9. CPU speed:
  10.     events per second:     0.05
  11. General statistics:
  12.     total time:                          38.8369s
  13.     total number of events:              2
  14. Latency (ms):
  15.          min:                                37191.83
  16.          avg:                                38014.32
  17.          max:                                38836.81
  18.          95th percentile:                    38506.38
  19.          sum:                                76028.64
  20. Threads fairness:
  21.     events (avg/stddev):           1.0000/0.00
  22.     execution time (avg/stddev):   38.0143/0.82
复制代码
再来看 lima 的 Debian(arm64) 假造机下的 centos7 (x86_64)的情况怎样
  1. # sysbench cpu --cpu-max-prime=20000000 --threads=2 run
  2. sysbench 1.0.17 (using system LuaJIT 2.0.4)
  3. Running the test with following options:
  4. Number of threads: 2
  5. Initializing random number generator from current time
  6. Prime numbers limit: 20000000
  7. Initializing worker threads...
  8. Threads started!
  9. CPU speed:
  10.     events per second:     0.39
  11. General statistics:
  12.     total time:                          10.1988s
  13.     total number of events:              4
  14. Latency (ms):
  15.          min:                                 4981.69
  16.          avg:                                 5097.66
  17.          max:                                 5216.57
  18.          95th percentile:                     5217.92
  19.          sum:                                20390.63
  20. Threads fairness:
  21.     events (avg/stddev):           2.0000/0.00
  22.     execution time (avg/stddev):   10.1953/0.00
复制代码
虽然层层嵌套, 但是得益于 Apple 的假造化以及 Rosetta 的转译实行, 其服从还是很高的!!!
   转头看 qemu 模仿出的 x86_64, 实在是不忍直视.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表