M1Mac 使用 qemu 配置 archlinux 虚拟机的完整c++开发环境与踩坑指南

本文主要是介绍M1Mac 使用 qemu 配置 archlinux 虚拟机的完整c++开发环境与踩坑指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


categories: [Tips]
tags: Linux MacOS

写在前面

之前写了关于 qemu 安装 archlinux 的文章, 但是还有一些内容没得到解决, 比如很多时候 ssh 连接不成功, 这时候用图形界面(默认选项)的优势就体现出来了, 并且如果需要传输文件或者需要使用对外的端口, 仅转发一个22端口是不够的, 最后就是 gdb 调试的整套环境的配置, 这些问题都要解决.

因为服务器太贵了, 也不想续费, 还是本地老老实实跑qemu虚拟机吧…

qemu 的配置-完善版

之前的配置

#!/usr/bin/env bashdiskfile="$HOME/Documents/archlinux-x86_64-cc.qcow2"# if [ $# -ne 1 ]; then
# 	echo "USAGE: $0 disk"
# 	echo " e.g.: $0 Archlinux.qcow2"
# 	exit 1
# fiif [ ! -f $1 ]; thenecho "could not open $1 : no such file"exit 1
finohup qemu-system-x86_64 \-m 2G \-smp cores=3,threads=1,sockets=1,maxcpus=3 \-display none \-nographic \-drive file=${diskfile},if=virtio,cache=none \-nic user,hostfwd=tcp::60024-:8000,hostfwd=tcp::60022-:22 \-accel tcg \-cpu qemu64 \-machine q35 \-monitor tcp:127.0.0.1:60023,server,nowait &# -D $HOME/Documents/archlinux-vm.log \

一些改动:

  • 去掉了日志记录(注释掉了, 放在 28 行), 因为一般来说不会记录日志, 目前还没遇到异常退出的情况
  • 用绝对路径导入虚拟机, 便于配置 alias
  • 如果遇到 ssh 连接不上的情况, 可以注释掉 19,20 行, 注意反斜杠的转义影响, 这样就会开启图形化终端了.
  • 端口转发, 下面 会讲

端口转发

这里比较恶心, 一开始我天真的以为多加入一行端口转发规则即可, 结果怎么也不行, 甚至 ssh 连接都出问题了. 后来发现应该是对指定网卡(nic)上做端口转发, 这在nc进入 monitor 之后使用info usernet 查看就明白了.

所以要加多个端口的转发规则, 只需要使用, 分隔的hostfwd键值对即可.

ssh相关

如果 ssh 连接失败, 可以先等一会, 虽然虚拟机开启来了, 但是 ssh 服务要等一段时间… 耐心等待即可, 推荐用:

ssh-copy-id -i ~/.ssh/id_rsa.pub -f arch@127.0.0.1

之后连接就不需要输入密码了.

测试

gdb 相关环境配置

事实上直接 pacman -Sy 即可, 这里列出需要安装的一些包:

sudo pacman -Sy clang gdb gcc git make cmake vim

性能

跟原生的 x86_64 肯定没法比, 这里给出阿里云的轻量应用服务器跑 sysbench 的对比:

核数都设置了一样的, 性能是阿里云的三分之一左右, 但是想到测试机器是 Mac 的第一款 M1 8+256Air, 感觉已经很不错了…

阿里云服务器

 ==> sysbench cpu --cpu-max-prime=20000000 --threads=2 run
sysbench 1.0.18 (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:                          42.3594stotal number of events:              2Latency (ms):min:                                40657.72avg:                                41508.45max:                                42359.1795th percentile:                    42134.07sum:                                83016.89Threads fairness:events (avg/stddev):           1.0000/0.00execution time (avg/stddev):   41.5084/0.85

archlinux 虚拟机(通过 qemu 在 arm Mac 上模拟)

===============================================================
#!/usr/bin/env bashqemu-system-x86_64 \-m 2G \-smp cores=2,threads=2,sockets=1,maxcpus=4 \-nographic \-drive file=Arch-Linux-x86_64-basic.qcow2,if=virtio,cache=none \-nic user,hostfwd=tcp::60022-:22 \-accel tcg \-monitor tcp:127.0.0.1:60023,server,nowait
====================================================================[arch@archlinux ~]$ sysbench cpu --cpu-max-prime=20000000 --threads=4 run
sysbench 1.0.20 (using system LuaJIT 2.0.5)Running the test with following options:
Number of threads: 4
Initializing random number generator from current timePrime numbers limit: 20000000Initializing worker threads...Threads started!CPU speed:events per second:     0.03General statistics:total time:                          138.9636stotal number of events:              4Latency (ms):min:                               138146.60avg:                               138423.84max:                               138962.0095th percentile:                   100000.00sum:                               553695.34Threads fairness:events (avg/stddev):           1.0000/0.00execution time (avg/stddev):   138.4238/0.32

改动核数对性能影响不大, 可能多核模拟导致的吧…

这篇关于M1Mac 使用 qemu 配置 archlinux 虚拟机的完整c++开发环境与踩坑指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/348855

相关文章

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造