虚拟环境配置

Ubuntu环境

对于Mac平台, 可以通过multipass创建一个Ubuntu虚拟机, 然后在虚拟机内安装和测试一些软件. 这一操作类似于Docker的容器, 如果玩坏了可以快速重新创建镜像. 虽然绝大部分项目也可以在Mac上编译和运行, 但Ubuntu具有更好的通用性. 而且在虚拟机内操作无需考虑依赖冲突问题, 可确保mac本身更稳定.

注意: 实际上, 由于multipass不支持创建镜像, 因此不建议在虚拟机内执行太多初始化指令. 可考虑把大部分操作在宿主机完成, 然后将项目挂载到虚拟机之中. 例如直接在宿主机执行Git操作, 从而在虚拟机内不需要再配置ssh.

基于docker或者podman的方案属于虚拟机套虚拟机, 配置过于复杂, 不推荐使用该方案.

依赖安装

  1. 能手动安装的全部手动安装. 下载安装包只需要浏览器能正常访问即可, 依赖最小.
  2. 能直接代理搞定的就直接代理搞定, 配置代理通常无需复杂配置, 要么成功要么失败, 能够快速获得结果. 而基于镜像的模式可能由于某些请求不走镜像导致失败.
  3. 对于依赖不是很复杂的项目, 可以尝试源码编译. 通常情况下如果文档提供了编译指引, 那么编译成功的概率还比较大.
  4. 不到最后, 不要尝试使用brew. brew可能由于某些模块强制依赖github或者某些无法访问的网站, 导致进行到最后一步执行失败. 解决这类问题非常困难, 有这折腾的时间, 从源码编译都搞完了,

必备优化软件

调整分辨率

使用Mac外接2K显示器后发现原生的2K分辨率字体太小, 看书写代码都很费劲. 但是如果调整分辨率, 只要不是整数倍分辨率, 都会导致字体模糊. 针对这一问题, 可以安装BetterDisplay.

Mac默认的分辨率调整算法是先渲染到2K, 然后插值到指定的分辨率. 当物理像素和渲染像素无法对齐时只能进行插值. 对于文字这种边缘锐利的场景会产生明显的模糊效果. BetterDisplay则会让Mac原生渲染制定的分辨率, 因此通过该软件调整分辨率后文字显示会变大, 但不会模糊.

对于这个问题Windows还是领先的, 默认的缩放功能在绝大部分常见都不会有任何问题. 反而是Mac直接一刀切, 必须要第三方软件才能解决

此外, BetterDisplay还有很多有用的功能, 例如可以和显示器通信, 直接调节显示器亮度的物理值.

翻转鼠标滚轮

Mac默认的鼠标滚轮逻辑与Windows相反. 如果使用内置的反转功能, 又会导致触摸板的逻辑反过来. 可以安装Scroll Reverser单独翻转鼠标滚轮.

也有一些鼠标原生支持识别操作系统, 并在Mac上自动反转, 不过这些鼠标都比普通鼠标贵很多. 这样比较下来, 使用软件解决就很香了.

常用软件

图片编辑

在Mac平台并没有类似Paint.net这样好用的工具, 但存在GIMP这样对标Photoshop的软件. 操作逻辑与Paint.net略有一些差别

  1. 保存为图片并不是选保存, 而是选导出. 导出时可以选择图片格式.
  2. 调整图片大小不是调整画布, 而是缩放图片

反正这名字也合理吧, 习惯就好. 只能说.net提供的能力太强了, 所以Paint.net也很强

视频播放

Mac自带的视频播放器支持的格式比较少, 许多已经算常见的视频格式还是不支持播放. 可以下载IINA作为默认的视频播放器, 这个软件比较有苹果的风格.

对于各类视频格式的文件, 可以右键选择默认打开方式, 选择IINA并应用所有相似的格式.

台式机与Mac串流方案

家里有一个台式机和一台Mac笔记本, 但是只有一个显示器. 并不想在台式机和Mac之间来回插拔显示器的HDMI线, 因此考虑日常显示器接Mac, 在需要时通过Mac连接到台式机, 而台式机以无显示器的模式启动. 日常工作使用Mac完成, 比较省电, 也能够启动台式机执行必须使用Windows系统的事情.

首先需要安装parsec.app, 在台式机和Mac上均安装此软件后注册一个账号并登录. 默认情况下同一账号下的设备自动可以相互连接. Windows平台需要配置无密码登录, 具体配置路径可查询任意AI.

有文章指出需要安装额外的虚拟显示器驱动才能保证串流正常. 实测parsec会顺便解决此问题, 无需额外安装驱动. (额外安装驱动甚至可能触发其他BUG)

参考资料

效果评价

parsec实际上已经做的比较好了, 但是在我的局域网里面, 网速还是不够快, 画面相较于直接插显示器, 还是模糊不少. 另外由于通信原因产生了10ms左右的延迟, 这个延迟虽然不是很大, 但是可以感知到, 导致体验不佳.

最终的解决方案是购买一条DP线, 台式机使用DP线连接显示器, Mac使用HDMI线连接显示器. 当只有一台设备使用时, 显示器会自动切换信号源, 因此使用上也还算方便.

注意: DP线和HDMI线不一样, DP线接口有卡扣, 需要用力插入确保卡扣卡住才算插入到位.

为了使用一套输入设备在两台机器上使用, 需要购买一套多模的鼠标和键盘. 之前parsec会自动映射mac和window的键位(例如修改Ctrl和Cmd的位置), 但是如果使用同一套键盘, 那就没这能力了. 虽然可以修改windows的键位强行匹配Mac的逻辑, 但我感觉没必要, 用多了就习惯了. 交换一下Ctrl和Win键就可以了, 否则按错的概率还是太大了, 强行习惯得不偿失.

此外, 如果鼠标和键盘均使用无线接收器, 那么需要将两个接收器分开. 否则可能存在信号干扰, 导致鼠标出现明显的卡顿. 建议将键盘的无线接收器插入机箱后端的接口, 将鼠标的无线接收器插入机箱前端的接口.

编程相关配置

tldr

这个工具可以用brew安装(在配置了镜像的情况下). 更新tldr数据库有点慢, 也可能会失败. 多重试几次可以成功更新.

Python SSL配置

在Mac安装官网的Python后, 默认不会使用系统的SSL配置, 导致使用网络库访问HTTPS网站时, 可能出现证书校验不通过的问题, 可以在.zshrc中配置如下环境变量

1
2
3
# Python SSL Config
export SSL_CERT_FILE=/etc/ssl/cert.pem
export REQUESTS_CA_BUNDLE=/etc/ssl/cert.pem

系统相关知识

macOS签名校验与SIP机制

macOS拥有内核级强制分页实时代码签名校验机制,这也是修改二进制文件后程序常被Killed:9的核心原因。该机制并非在程序启动时对全文件进行校验,而是在程序运行过程中,按需将内存页加载到内存时,实时校验该页哈希与二进制签名中记录的哈希是否一致,一旦发现不一致,内核会直接发送SIGKILL信号终止进程。

这一签名校验机制在Go与C程序上的表现差异显著。Go程序从1.14+版本开始,编译时会通过自带的链接器自动为二进制文件打上ad-hoc签名,且其字符串常量会存放在代码签名的强校验段中,因此修改Go程序的二进制内容后,极易触发校验失败,导致程序运行中被终止;而在Mac上使用clang/gcc编译的C程序,默认不会添加任何代码签名,即便修改其二进制内容,也不会触发内核的签名校验,可直接正常运行。

此外,macOS的SIP(系统完整性保护)作为内核级安全锁,进一步强化了系统安全。它的核心作用是限制即使是root用户,也无法修改/System、/usr等系统目录、注入系统进程,同时还会限制未签名内核驱动的加载。SIP与代码签名机制相互配合形成双重防护,且二者是独立的安全机制,即便关闭SIP,代码签名的校验机制依然会正常生效。

最后更新: 2026年09月08日 16:28

版权声明:本文为原创文章,转载请注明出处

原始链接: https://lizec.top/2023/09/07/MacOS%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95/