Vandee's Blog

09 Dec 2025

Native Linux on Apple Silicon Mac

TL;DR

几个月之前我在 MacBook M1 Pro 上安装了 Linux (不是虚拟机),处理照片的时候切换到 macOS,平常就 Linux,使用下来挺稳定的。

这几个月 Windows 持续的一些负面新闻,让 Linux 有一波小热度。整理了一下我在 Mac 上安装 Linux 的过程,分享给想入坑 Linux 的轻度玩家。

大佬请直接关闭页面。

Why Linux

买这个 MacBook 的初衷主要是处理摄影照片,M1 系列出来的时候一直垂涎它遥遥领先的性能。整体使用下来 Mac 的体验也挺舒适,Mac 在数码影像处理这个生态还是吊的。

使用 Mac 的普通用户大多数都是因为精致设计感的 UI,苹果的品牌效应,我也是如此。但是这几年苹果的发展实在是让我很没有期待,今年更是大便一坨。

苹果的品牌效应 90% 来自乔帮主的个人魅力,我觉得一点也不为过。如今苹果的老本快被吃完了,创新的东西有,但是灵魂我觉得早已不在。

之前都是在虚拟机上使用 Linux,最初也没有想完全入坑 Linux。转折点就是 Linus 的自传《Just For Fun》,我有太多想法和 Linus 不谋而合。在苹果没有了乔布斯的个人魅力之后,它能吸引我的越来越少,Linux 对我的吸引越来越大。

当个人电脑 PC 对我来说不再只是一个工具,而是一个伙伴的时候,Linux 就是现在最适合我的操作系统,Linux 太自由了

Asahi Alarm

最开始我尝试的是 Asahi Linux,按照这个视频很快就搞定了: 「黑貓」Asahi Linux!M1 Mac 原生運行 Linux 雙系統,簡單流暢! - YouTube

Asahi Linux 预装的是 Fedora,初始化安装到进入图形界面都没问题,但是当我执行更新,安装了一些包之后,再重启,总是会遇到各种系统崩溃问题,尝试了数次之后,就没有再折腾了。

也是巧了,正在我发愁的时候:Omarchy — Beautiful, Modern & Opinionated Linux by DHH 出现了。

Omarchy 是 Ruby 的联合创始人 DHH 推的一个能在 Mac 上运行的 基于 Arch Linux 的 Linux 发行版。

但是我不太喜欢它默认的主题,默认快捷键设置也和我的习惯很不一样,还有许多我不需要的预安装。尝试了几天之后也否定了这个方案。

然后发现宝藏:Asahi Alarm , https://github.com/basecamp/omarchy/discussions/155

完成度相当高啊!除了耗电量略高一点,和原生分辨率不太兼容,其他的相当完美了。

初始化安装

它就是一个裸的 Arch Linux。

在 Mac 上打开 terminal,运行 curl https://asahi-alarm.org/installer-bootstrap.sh | sh ,基本就全自动安装了,具体的安装过程和 Asahi Linux 是一样的。

需要科学上网。

安装完成之后,就可以进入到 Asahi Alarm 了,这个时候还没有图形界面,可以命令行安装一些基础的包。

Pacman 是 Arch Linux 默认的包管理器 ,Morganamilo/paru 是 Rust 版本的 yay AUR 包管理器。

WM & DM

接下来就是安装显示器协议(display server protocol)和 WM(window managers),我选择的是 Wayland + Sway ,极简就完事了。Hyprland 也很不错,但是我目前对折腾 Linux 的界面没有太大兴趣,也不需要它多美观。

创建好 Linux 用户之后 sudo pacman -S wayland sway 安装。

输入 sway 就可以进入到图形界面了。想自动进入图形界面,Linux 里可以安装 DM(display managers)

DM 我选择的是 Lemurs 也是因为它足够简单。

保险起见,在 /etc/lemurs/config.toml 里加上 include_tty_shell = true ,这样有时候 Wayland 出现问题方便直接调试。

App launcher

dnkl/fuzzel

因为之前在 i3 里使用 dmenu,fuzzel 也足够简洁,和 sway 的匹配度也很高。

Vicinae 也挺好用,和 raycast 挺像: https://github.com/vicinaehq/vicinae/

还有 Rofi:https://github.com/davatorium/rofi

Theme

vinceliuice/Qogir-theme: Qogir is a flat Design theme for GTK

theme 文件可以在 ~/.themes/, 或者 /usr/share/themes

  • 统一 gtk 和 qt 主题:sudo pacman -S –noconfirm lxappearance qt5ct qt6ct kvantum
  • lxappearance 来配置主题,可能需要安装:sudo pacman -S gtk-engine-murrine gnome-themes-extra gtk-engines

    wayland 里用 nwg-look

Bluetooth && Wi-Fi

Fcitx && Rime 输入法

参考:Fcitx 最佳配置实践 2025-08-31

Rime + 双拼实在是太巴适了。

Rime 推荐使用:rime/plum: 東風破 安装。

输入法:iDvel/rime-ice: Rime 配置:雾凇拼音 | 长期维护的简体词库

Obs Studio

Asahi Alarm 里, sudo pacman -S obs-studio 显示没有这个包。

安装 CMake 自己手动编译:

下载源代码:

git clone --depth 1 --recurse --shallow-submodules https://github.com/obsproject/obs-studio.git

我在编译的时候提示缺少头文件,因此:

sudo pacman -S qt6-xcb-private-headers

然后成功编译:

cmake -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_BROWSER=OFF -DENABLE_VLC=ON -DENABLE_AJA=OFF..

如果 PipeWire 选项缺失: wlrobs 是一个 OBS 插件,专为 Wayland 提供屏幕捕获支持,尤其在 Hyprland 或 River 等合成器下有效。paru -S wlrobs-hg。

Settings

其他的初始化安装,我让 LLM 写了一个简单的小脚本来安装一些我需要的软件,字体,rime 输入法等。

下面列举的是一些困扰过我的地方,其他细小的设置 Claude CLI 基本都可以解决。

Sway

Sway 会初始化一个配置文件在 ~/.config/sway/config ,在配置文件里修改就好了。

分辨率设置:如果不放大,字就跟蚂蚁一样小

Asahi Alarm 由于苹果硬件的限制,只能缩放,更改不了分辨率,也可能是我没有找对方法。常规设置分辨率的方法不管用。

exec --no-startup-id xrandr --output eDP-1 --scale 1.5x1.5

截图:

使用 grim + swappy ,由于之前缩放的原因,flameshot 在截图的时候调用 grim 截图也是放大的,而且有兼容性问题。

bindsym $mod+s exec --no-startup-id sh -c 'grim -g "$(slurp)" -s 1 - | swappy -f -'

加上了 -s 1 参数,就可以解决截图放大的问题了。

OCR: 需要安装 tesseract-ocr/tesseract 并下载相应语言的包

bindsym $mod+Shift+s exec --no-startup-id ~/MyScripts/screenshot_ocr.sh

这个脚本就是一个很简单的创建 tmp 截图文件,用 tesseract 识别保存到系统剪贴板。

设置系统音量:我耳朵被炸了好几次。。。

exec --no-startup-id pactl set-sink-volume \@DEFAULT_SINK@ 55%

设置系统显示器亮度:

exec --no-startup-id brightnessctl set 20%

和音量一样,如果不设置它会有一个默认的值,每次重启就需要重新设置。

设置壁纸:

output * bg /home/vandee/Pictures/create.jpg fill

剪贴板: exec wl-paste --watch cliphist store

充电提示音

Asahi Linux 判断电池是通过 /sys/class/power_supply/macsmc-ac

udev 的方式在我的电脑上不管用,所以用了一个笨办法。

用 systemd 监控它的状态,处于充电状态的时候播放提示音,把这个 script 设置为 systemd service:

#!/bin/bash

# Charger plug/unplug sound effect script
# Monitors /sys/class/power_supply/macsmc-ac/online and plays appropriate sounds

POWER_SUPPLY_PATH="/sys/class/power_supply/macsmc-ac/online"
POWER_PLUG_SOUND="/usr/share/sounds/freedesktop/stereo/power-plug.oga"
POWER_UNPLUG_SOUND="/usr/share/sounds/freedesktop/stereo/power-unplug.oga"

# Check if required files exist
if [[ ! -f "$POWER_SUPPLY_PATH" ]]; then
    echo "Error: Power supply path not found: $POWER_SUPPLY_PATH"
    exit 1
fi

if [[ ! -f "$POWER_PLUG_SOUND" ]] || [[ ! -f "$POWER_UNPLUG_SOUND" ]]; then
    echo "Error: Sound files not found"
    exit 1
fi

# Function to play sound
play_sound() {
    local sound_file="$1"
    # Try different audio players
    if command -v paplay >/dev/null 2>&1; then
        paplay --volume=78643 "$sound_file" >/dev/null 2>&1 &
    elif command -v aplay >/dev/null 2>&1; then
        aplay -v 15 "$sound_file" >/dev/null 2>&1 &
    elif command -v mplayer >/dev/null 2>&1; then
        mplayer -really-quiet -volume 150 "$sound_file" >/dev/null 2>&1 &
    else
        echo "Error: No suitable audio player found (paplay, aplay, or mplayer)"
        exit 1
    fi
}

# Get initial state
previous_state=$(cat "$POWER_SUPPLY_PATH")
echo "Initial charger state: $previous_state"

# Monitor for changes
while true; do
    current_state=$(cat "$POWER_SUPPLY_PATH")

    if [[ "$current_state" != "$previous_state" ]]; then
        if [[ "$current_state" == "1" ]]; then
            echo "Charger plugged in"
            play_sound "$POWER_PLUG_SOUND"
        else
            echo "Charger unplugged"
            play_sound "$POWER_UNPLUG_SOUND"
        fi
        previous_state="$current_state"
    fi

    sleep 1
done

Others

  • 调整对比度(X11)

    sudo pacman -S xorg-xgamma

    xgamma -gamma 0.8

  • 设置屏幕亮度

    brightnessctl set 20%

  • 解决 macbooks 无法播放音频的问题:

    sudo pacman -S asahi-audio

  • opensnatch 因为 eBPF 报错

    修改 /etc/opensnitchd/default-config.json

    把 procmonitormethod 更改成 proc

  • 音量控制:sudo pacman -S pavucontrol

    更轻量化的:sudo pacman -S volumeicon

Tips

最近老 x86 电脑更新到 Linux 最新的 kernel,不出意外的出意外了,我又忘记手动 paru 更新 nvidia-580xx-dkms nvidia-580xx-utils nvidia-580xx-settings lib32-nvidia-580xx-utils 了,导致驱动无法适配。

Arch Linux 还是搞一个 LTS 内核作为兜底比较保险。

sudo pacman -S linux-lts linux-lts-headers 安装 Linux LTS

sudo dkms autoinstall 编译 NVIDIA

dkms status | grep nvidia 确定是否 Linux-lts 和当前 Linux kernel 的 NVIDIA 模块都编译成功

sudo grub-mkconfig -o /boot/grub/grub.cfg 重新生成 grub 配置

这样在开机的时候就可以选 LTS 了。

默认情况下,Linux-lts 会排在前面,如果想更改默认的 grub 为最新的 Linux 版本,官方推荐在 /etc/default/grub 里修改:

GRUB_DEFAULT='Advanced options for Arch Linux>Arch Linux, with Linux linux'

Grub 修复

如果你和我一样瞎折腾把 grub 弄坏了,可以 Arch Linux Live USB 引导修复。

lsblk 查看分区,找到 EFI 的分区,

# /etc/default/grub 里找到下面,临时开启
# Uncomment to enable booting from LUKS encrypted devices
GRUB_ENABLE_CRYPTODISK=y

cryptsetup open /dev/sda2 root #解锁,如果设置了 LUKS
mount /dev/mapper/root /mnt
mount /dev/sda1 /mnt/boot  #我的是 sda1 的固态
arch-chroot /mnt

重新配置 GRUB:

pacman -S grub efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --recheck
grub-mkconfig -o /boot/grub/grub.cfg

如果 grub 没有读到配置,我的特例,让新的 GRUB 配置走 /boot/grub/grub.cfg

cat > /boot/EFI/GRUB/grub.cfg <<'EOF'
search --no-floppy --fs-uuid --set=root {/boot 的 UUID,blkid /dev/sda1 获取}
set prefix=($root)/grub
configfile $prefix/grub.cfg
EOF

NVIDIA 配置

我另外一个 x86 电脑的 NVIDIA 显卡很老了,下面的方法管用

  1. 禁用开源的 Nouveau 驱动

Nouveau 是一个开源的 NVIDIA 驱动,它会与闭源驱动冲突。

创建一个新的 modprobe 配置文件:

sudo vim /etc/modprobe.d/blacklist-nouveau.conf

在文件中添加:blacklist nouveau

  1. 配置 Initramfs (初始 RAM 文件系统)

将 NVIDIA 模块添加到 initramfs 中,以确保它们在启动早期被加载。编辑 /etc/mkinitcpio.conf 文件:

找到 MODULES= 这一行,并添加以下模块:

MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)

在 HOOKS= 这一行中,如果存在 kms,将其移除。

完成修改后,重新生成 initramfs: sudo mkinitcpio -P

  1. 设置内核参数

为了启用 DRM (Direct Rendering Manager) 内核模式设置 (KMS),需要向引导加载程序添加一个内核参数。这对于 Wayland 的正常工作是必需的,并且从较新版本的驱动开始默认启用。

编辑 /etc/default/grub 文件:

GRUB_CMDLINE_LINUX_DEFAULT 这一行中,添加 nvidia_drm.modeset=1

然后,更新 GRUB 配置: sudo grub-mkconfig -o /boot/grub/grub.cfg

Tags: Linux