在 MacOS 上虚拟化 x86Linux 的最佳方法(通过 Rosetta)


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 官方的消息

  1. 苹果M系列处理器上的Linux虚拟机内Rosetta转译初体验 - wvbCommunity;(感觉写的比较详细的博客, 还附了图就很棒)
  2. Running Intel Binaries in Linux VMs with Rosetta | Apple Developer Documentation;
  3. 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 multiversedeb 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 <iostream>int main() {std::cout << "hello rosetta\n";return 0;
}

如果要 Rosetta 执行就这样来:

x86_64-gnu-linux-g++ a.cpp #交叉编译工具链, 通过apt 安装 gcc-multilib
/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

brew install lima
limactl start template://debian --rosetta --vm-type=vz
limactl shell debian # 进入 Debian arm

查看 Rosetta 支持情况:

$ cat /proc/sys/fs/binfmt_misc/rosetta

在 lime-debian 中安装 Intel centos7

其实 nerdctl 跟 docker 差不多, 熟悉一下命令行的操作就好了.

运行

nerdctl run -it --platform amd64 centos:centos7

退出之后就关闭了, 需要 start一下再进去

nerdctl start centos-f32d1
nerdctl exec -it centos-f32d1 /bin/bash

不用了就关闭

nerdctl stop centos-f32d1

查看容器情况

$ nerdctl ps -a
CONTAINER ID    IMAGE                               COMMAND        CREATED         STATUS     PORTS    NAMES
f32d106b5240    docker.io/library/centos:centos7    "/bin/bash"    21 hours ago    Created             centos-f32d1

安装其他软件

yum -y install epel-release
yum repolist
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
yum install neofetch

Installation · dylanaraps/neofetch Wiki;

neofetch
在这里插入图片描述

benchmark

yum install sysbench

可喜可贺! M3Pro 加持, 终于跑过阿里云服务器了

先来看看 阿里云的 Server, 两核拉满

$ sysbench cpu --cpu-max-prime=20000000 --threads=2 run
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)Running the test with following options:
Number of threads: 2
Initializing random number generator from current timePrime numbers limit: 20000000Initializing worker threads...Threads started!CPU speed:events per second:     0.05General statistics:total time:                          38.8369stotal number of events:              2Latency (ms):min:                                37191.83avg:                                38014.32max:                                38836.8195th percentile:                    38506.38sum:                                76028.64Threads fairness:events (avg/stddev):           1.0000/0.00execution time (avg/stddev):   38.0143/0.82

再来看 lima 的 Debian(arm64) 虚拟机下的 centos7 (x86_64)的情况如何

# sysbench cpu --cpu-max-prime=20000000 --threads=2 run
sysbench 1.0.17 (using system LuaJIT 2.0.4)Running the test with following options:
Number of threads: 2
Initializing random number generator from current timePrime numbers limit: 20000000Initializing worker threads...Threads started!CPU speed:events per second:     0.39General statistics:total time:                          10.1988stotal number of events:              4Latency (ms):min:                                 4981.69avg:                                 5097.66max:                                 5216.5795th percentile:                     5217.92sum:                                20390.63Threads fairness:events (avg/stddev):           2.0000/0.00execution time (avg/stddev):   10.1953/0.00

虽然层层嵌套, 但是得益于 Apple 的虚拟化以及 Rosetta 的转译执行, 其效率还是很高的!!!

回头看 qemu 模拟出的 x86_64, 实在是不忍直视.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/455104.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正点原子-STM32定时器学习笔记(1)未完待续

1. 通用定时器简介&#xff08;F1为例&#xff09; F1系列通用定时器有4个&#xff0c;TIM2/TIM3/TIM4/TIM5 主要特性&#xff1a; 16位递增、递减、中心对齐计数器&#xff08;计数值&#xff1a;0~65535&#xff09;&#xff1b; 16位预分频器&#xff08;分频系数&#xff…

Mybatis中的sql-xml延迟加载机制

Mybatis中的sql-xml延迟加载机制 hi&#xff0c;我是阿昌&#xff0c;今天记录一下关于Mybatis中的sql-xml延迟加载机制 一、前言 首先mybatis技术本身就不多介绍&#xff0c;说延迟加载机制之前&#xff0c;那要先知道2个概念&#xff1a; 主查询对象关联对象 假设咱们现…

架构整洁之道-软件架构-展示器和谦卑对象、不完全边界、层次与边界、Main组件、服务

6 软件架构 6.9 展示器和谦卑对象 在《架构整洁之道-软件架构-策略与层次、业务逻辑、尖叫的软件架构、整洁架构》有我们提到了展示器&#xff08;presenter&#xff09;&#xff0c;展示器实际上是采用谦卑对象&#xff08;humble object&#xff09;模式的一种形式&#xff…

Spring Boot整合MyBatis Plus实现基本CRUD与高级功能

文章目录 1. 引言2. 项目搭建与依赖配置2.1 添加MyBatis Plus依赖2.2 配置数据源与MyBatis Plus 3. 实现基本CRUD功能3.1 创建实体类3.2 创建Mapper接口3.3 实现Service层3.4 控制器实现 4. 高级功能实现4.1 自动填充功能4.2 乐观锁功能4.3 逻辑删除功能 5. 拓展&#xff1a;My…

数据结构高级算法

目录 最小生成树 Kruskal(克鲁斯卡尔)(以边为核心) 9) 不相交集合(并查集合) 基础 Union By Size 图-相关题目 4.2 Greedy Algorithm 1) 贪心例子 Dijkstra Prim Kruskal 最优解(零钱兑换)- 穷举法 Leetcode 322 最优解(零钱兑换)- 贪心法 Leetcode 322 3)…

在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(三)开发和发布自己开发的maven插件

系列文章目录 在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(二)发布自己开发的jar包 文章目录 系列文章目录在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(二)发布自己开发的jar包 前言一、插件需求二、maven自定…

neo4j查询id为null

今天在neo4j里执行一条查询语句时&#xff0c;发现id属性查询不出来显示为null 后来了解到&#xff0c;Neo4j 默认情况下并不提供一个名为 id 的属性。通常情况下&#xff0c;Neo4j 中的节点都有一个内部的唯一标识符&#xff0c;但是这个标识符并不以 id 的形式暴露给用户。 …

LLMs之miqu-1-70b:miqu-1-70b的简介、安装和使用方法、案例应用之详细攻略

LLMs之miqu-1-70b&#xff1a;miqu-1-70b的简介、安装和使用方法、案例应用之详细攻略 目录 miqu-1-70b的简介 miqu-1-70b的安装和使用方法 1、安装 2、使用方法 miqu-1-70b的案例应用 miqu-1-70b的简介 2024年1月28日&#xff0c;发布了miqu 70b&#xff0c;潜在系列中的…

Google MobileDiffusion: 移动端设备上的快速文字到图片生成技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

多线程生命周期与通信(二)通信

线程自启动时&#xff0c;就拥有了自己的栈空间。然后会一直运行直到结束。多线程的目的是多条线程执行不同的逻辑业务从而能够提升业务整体的响应速度&#xff0c;如果线程仅仅是孤零零的执行&#xff0c;不同的逻辑业务就不能最终汇聚成一个完整的业务那么多线程也就失去了意…

02-Web应用_架构构建_漏洞_HTTP数据包_代理服务器

Web应用_架构构建_漏洞_HTTP数据包_代理服务器 一、网站搭建前置知识1.1 域名1.2、子域名1.3、DNS二、web应用环境架构类三、web应用安全漏洞分类四、web请求返回过程数据包 五、演示案例5.1、架构-Web应用搭建-域名源码解析5.2、请求包-新闻回帖点赞-重放数据包5.3、请求包-移…

2024.2.4 awd总结

防御阶段 感觉打了几次awd&#xff0c;前面阶段还算比较熟练 1.ssh连接 靶机登录 修改密码 [root8 ~]# passwd Changing password for user root. New password: Retype new password: 2.xftp连接 备份网站源码 我觉得这步还是非常重要的&#xff0c;万一后面被删站。。…