基于 Alpine Linux 的纯 Moonlight 串流方案

前言

故事的背景是,我的笔记本在宿舍放着,接着两个显示器和一堆音响键鼠等 USB 线和扩展坞等等。所以我平常不会将这个笔记本拿走,而是使用 Pad 进行公网串流使用(见之前公网串流的坑那一篇文章)。

但毕竟 Pad 不是电脑,键盘不好用,鼠标延迟也比较大,屏幕小且比例不一样,更重点的是 Wireguard 总自动断开,烦死了。总之我还是希望有一台便携的笔记本电脑进行串流。

于是我掏出了尘封已久的古早 Thinkpad。考虑到 Windows 电池使用太快了,决定通过高度精简的 Linux 系统进行串流。

当然了,真正推动我做这个的是高数复习的时候需要 Pad 写题,电脑看 AI 讲解,之前总需要切换,有了这个方案就方便多了。

配置

安装 Alpine Linux

先从官网上下载 iso 镜像然后用 Rufus 做到 U 盘里。但是 AI 让我关闭 Secure Boot 和 CSM,只通过 UEFI 启动。

启动安装环境后用 root 无密码登录。然后运行setup-alpine

后续按提示设置即可,但是有几个坑。 第一,mirror 建议自己去网上找一下阿里云、清华等源,不要自动检测,不然后面下载有可能会卡死。 第二,disk 要选择 sys 模式,但重点是回车之后就会直接清空磁盘,没有二次确认。

安装完之后reboot并拔掉 U 盘即可。

基本系统配置

# 更新并安装必要工具
apk update && apk upgrade
apk add doas pciutils usbutils lm-sensors
echo "permit persist :wheel" >> /etc/doas.conf

图形化

首先确认mkinitfs中启用了KMS功能。

编辑/etc/mkinitfs/mkinmitfs.conf,确保features=中包含kms。此处可以按需删除部分无用内容以提升开机速度。

该文件修改后记得重新构建 initramfs。

mkinitfs -c /etc/makinitfs/mkinitfs.conf $(ls /lib/modules)

编辑/etc/default/grub,确保modules=中有i915。修改后依旧需要重建 grub。

接下来安装 Intel 图形驱动。

apk add mesa-dri-gallium mesa-va-gallium mesa-vulkan-intel linux-firmware-i915 intel-media-driver libva-intel-driver

安装 Sway

# 安装基础包
apk add sway foot wmenu swaylock swaylockd swaybg swayidle grim wl-clipboard
# 座椅管理
apk add seatd
rc-update add seatd
rc-service seatd start
adduser $USER seat

我们还需要配置SCG_RUNTIME_DIR,在~/.profile中手动添加如下内容。

if test -z "${XDG_RUNTIME_DIR}"; then
    export XDG_RUNTIME_DIR=/tmp/$(id -u)-runtime-dir
    if ! test -d "${XDG_RUNTIME_DIR}"; then
        mkdir -m 0700 -p "${XDG_RUNTIME_DIR}"
    fi
fi

接下来是 Sway 的配置。创建并编辑~/.config/sway/config文件。下面是我的配置。

(下次电脑开机再粘贴过来吧)

并配置若非 SSH 连接则自动启动 Sway,在~/.profile加入如下内容。

(依旧下次再说)

音频

# 安装基础包
apk add pipewire wireplumber pipewire-pulse pipewire-alsa pipewire-spa-bluez alsa-utils alsaconf
# 将用户加入 audio 组
adduser $USER audio
# 音频服务都在Sway配置中启动,不在开机过程中进行。
# 但此时无法识别声卡,下面是修复
apk add udev
rc-update del mdev sysinit
rc-update add udev sysinit
rc-update add udev-trigger sysinit
# 记得重启来刷新 mdev 和 udev 服务

可以通过alsamixer调节音量。

创建/etc/asound.conf设定默认声卡。(卡号通过cat /proc/asound/cards查看)

defaults.ctl.card 0
defaults.pcm.card 0

网络

apk add wpa-supplicant

编辑/etc/network/interfaces,确认wlan0是如下配置。

auto wlan0
iface wlan0 inet dhcp
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

按如下格式编辑/etc/wpa_supplicant/wpa_supplicant.conf

network={
      ssid="家庭WiFi"
      psk="密码1"
      priority=10
  }

  network={
      ssid="手机热点"
      psk="密码2"
      priority=5
  }

  network={
      ssid="公司WiFi"
      psk="密码3"
      priority=1
  }

Wireguard 和 Moonlight 配置

apk add moonlight-qt wireguard-tools font-dejavu font-noto font-noto-cjk
# 编辑 /etc/eireguard/wg0.conf
rc-update add wg-quick.wg0
rc-service wg-quick.wg0 start

优化

OpenRC 并行启动

sed -i 's/#rc_parallel="NO"/rc_parallel="YES"/' /etc/rc.conf

精简 initramfs

这一条在上面 mkinitfs 中已经说过了,不再赘述。

精简系统服务

通过rc-update show查看现有服务状态,可以将不必要的服务(例如cron等)关闭。

省电

apk add tlp brightnessctl
rc-update add tlp
rc-service tlp start
rc-update add brightnessctl
brightnessctl --help

总体成果

现在电脑开机 15 秒进串流界面,关机 5 秒关掉。实测续航可以达到将近 10 小时,这个续航能力已经赶超 Pad 的串流了,舒服了。

AI 助手
AI
你好!我可以根据当前文章内容回答你的问题。