如何用Alpine一步一步搭建一个完整的Linux桌面系统

如何用 Alpine 一步一步搭建一个完整的 Linux 桌面系统

0. 初衷

现代的 Linux 桌面系统,其实已经非常复杂了。不光要处理简单的用户应用程序间的协作,更要处理各种用户设备。举个简单的例子,设备的声音输出,就可能有多种途径:通过电脑有线音响输出,或者通过 HDMI 显示器的自带音响输出,还有可能通过连接的蓝牙输出。

我一直对于 Linux 是如何一步一步发展到如此完善感到好奇,也对诸如 Ubuntu 等操作系统动辄一张 DVD 大小的安装程序感到沮丧。因为在我的印象中,Linux 不该是 Windows 这样,而是几百兆大小才对

Alpine Linux,一个最简单的 Linux 系统,安装介质不到 200M,它是否可以定制成一个完善的桌面系统呢?之前是不行的,它使用的是 musl libc 而不是传统的 glibc,所以很多程序都没有现成的包而需要自己从源码编译。你可以想象编译一个 WPS 的难度。输入法也是一个问题,在 Alpine 上,始终没有中文输入法。

但这个情况最近改变了。首先是 Alpine 的 testing 源里有了 fcitx5 和 fcitx5-chinese-addons,所以中文输入已经不成问题。另外 WPS 的问题,已经可以通过 flatpak 解决了。

所以这次尝试用 Alpine Linux 从零开始搭建一个完整的 Linux 桌面系统。说是从零打造,其实也不完全是,毕竟 Linux 系统像搭积木一般了。但如果使用 Alpine Linux,至少就不是开箱即用而是完全定制。

1. 初始化三步走

通常我会使用 Ventoy 进行 iso 安装介质的引导。Alpine 真是太不一样了,引导完成后直接进入命令行界面。这时候要运行三个组装命令来完成基本的系统搭建:

setup-alpine // 安装系统到硬盘
setup-xorg-base // 初始化 wayland 和 x11 系统
setup-desktop // 选择桌面环境,包括 plasma、gnome 和 xfce
React JSX

做完这三个命令,基本上就能进入桌面系统了。有人会说,啥呀,还一步一步搭建。不不不,一步一步都在于后续的填坑过程。

2. 能直接用了吗

💡 能,也不能。

能的是,如果你没有追求,它当然已经开始工作了。网络是好的,浏览器可以浏览,但是好像也没有其他工具了。

不能的是,仔细看看:

  • 没有声音图标,意味者没有声音
  • 没有网络图标,意味着你想切换个网络,不知道哪里去做
  • 没有蓝牙设备
  • 输入法没有
  • 没有文件浏览器(可能你也不用)
  • USB 打印机无法添加
  • 命令行没有 sudo
  • 显卡没有硬件加速(可能这个暂时体验不到)
  • 还有很多坑……你还没发现而已

💡 所以,它其实不能用。让我们一步一步解决吧。

3. 先利其器

我喜欢用 fish,这个不难

su - root // 切换 root 用户
apk add fish // 安装 fish
vi /etc/passwd // 更改你想使用 fish 的账户
React JSX

安装 sudo

apk add sudo // 安装 sudo
NEWUSER='yourUserName' // 设置一个你要加入 sudo 的用户
echo "$NEWUSER ALL=(ALL) ALL" > /etc/sudoers.d/$NEWUSER && chmod 0440 /etc/sudoers.d/$NEWUSER // 开启用户的 sudo 功能
React JSX

安装 yakuake,一个下拉式的终端程序,好过任何平台的任何终端程序

sudo apk add yakuake // 安装程序,打开后编辑快捷键和通过 profile 开启半透明
React JSX

💡 Firefox 有个坑,打开 firefox 发现没有关闭按钮。这个问题后来发现是 firefox 自动主题导致,可能是个 bug,只需要切换 firefox 主题为 light 或者 dark 即可

4. 解决网络问题

Alpine Linux 默认使用 network 框架管理网络,但是我选择的 KDE,右下角的网络管理是需要配套 NetworkManager 来管理的。大多数现代化的 Linux 操作系统,其实都是使用 NetworkManager 来管理网络了。

sudo apk add networkmanager // 安装网络框架
sudo apk add networkmanager-cli // 安装 nmcli 命令,如果你喜欢用 cli 查看的话
sudo apk add networkmanager-wifi // 如果你要用右下角图标管理 wifi, 那不是废话么
sudo rc-service networkmanager start // 启动 nm 的服务
sudo rc-update add networkmanager default // 让 nm 开机启动
sudo adduser $USER plugdev // 把你的用户加入 plugdev 组,否则哪里有权限管理硬件设备
React JSX

到这里还是不够的,因为在 Linux 中,真正管理 wifi 连接的一般都是 wpa_supplicant 程序,需要告诉 nm 框架你用哪个管理程序:

Contents of /etc/NetworkManager/NetworkManager.conf
[main] 
dhcp=internal
plugins=ifupdown,keyfile

[ifupdown]
managed=true

[device]
wifi.scan-rand-mac-address=yes
wifi.backend=wpa_supplicant
React JSX

停止原有的 network 框架

sudo rc-service networking stop // 停止 network 框架
sudo rc-service wpa_supplicant stop // 停止 wpa_supplicant 服务,因为我们需要让 nm 去管理
sudo rm /etc/wpa_supplicant/wpa_supplicant.conf // 一个可能的坑,如果在安装 alpine 时联 wifi 了,这个配置文件可能导致 nm 无法连接 wifi,先干掉
sudo rc-update del networking boot // 禁止 network 框架开机启动
sudo rc-update del wpa_supplicant boot // 禁止 wpa_supplicant 开机启动
React JSX

💡 重启一下电脑,网络图标应该回来了,应该可以正常切换网络了。

5. 解决声卡问题

声卡在 linux 中真是一个玄学般的存在,我真的不是很懂 pulseaudio 和 pipewire 和 alsa 之间的关系,所以就按照解决问题的思路说吧

用 lspci 查看硬件信息,可以看到我的声卡应该是 intel 的

sudo apk add pciutils // 安装 pci 查看命令
lspci
00:00.0 Host bridge: Intel Corporation Gemini Lake Host Bridge (rev 06)
00:00.1 Signal processing controller: Intel Corporation Celeron/Pentium Silver Processor Dynamic Platform and Thermal Framework Processor Participant (rev 06)
00:02.0 VGA compatible controller: Intel Corporation GeminiLake [UHD Graphics 600] (rev 06)
**00:0e.0 Multimedia audio controller: Intel Corporation Celeron/Pentium Silver Processor High Definition Audio (rev 06)**
00:0f.0 Communication controller: Intel Corporation Celeron/Pentium Silver Processor Trusted Execution Engine Interface (rev 06)
00:12.0 SATA controller: Intel Corporation Celeron/Pentium Silver Processor SATA Controller (rev 06)
00:13.0 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6)
00:13.1 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6)
00:13.2 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6)
00:14.0 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6)
00:14.1 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6)
00:15.0 USB controller: Intel Corporation Celeron/Pentium Silver Processor USB 3.0 xHCI Controller (rev 06)
00:16.0 Signal processing controller: Intel Corporation Celeron/Pentium Silver Processor I2C 0 (rev 06)
00:16.3 Signal processing controller: Intel Corporation Celeron/Pentium Silver Processor I2C 3 (rev 06)
00:1c.0 SD Host controller: Intel Corporation Celeron/Pentium Silver Processor SDA Standard Compliant SD Host Controller (rev 06)
00:1f.0 ISA bridge: Intel Corporation Celeron/Pentium Silver Processor LPC Controller (rev 06)
00:1f.1 SMBus: Intel Corporation Celeron/Pentium Silver Processor Gaussian Mixture Model (rev 06)
01:00.0 Network controller: Qualcomm Atheros QCA9377 802.11ac Wireless Network Adapter (rev 31)
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
React JSX

先安装驱动看看

sudo apk add sof-bin sof-firmware // 安装驱动
sudo reboot // 重启
React JSX

重启之后声音的图标出现了,但是点进去后仔细一看不对。显示的是 stereo 设备,但是我是用 HDMI 显示器的音响的,所以等于依然不工作。这里有一个巨大的坑,不是靠软件能解决的,而是要调整内核参数,原因未知,有人说是驱动 bug

sudo vi /etc/default/grub // 编辑引导文件的预设

Contents of /etc/default/grub // 注意加粗的 **snd_hda_intel.dmic_detect=0,增加之 **
GRUB_TIMEOUT=2
GRUB_DISABLE_SUBMENU=y
GRUB_DISABLE_RECOVERY=true
GRUB_CMDLINE_LINUX_DEFAULT="modules=sd-mod,usb-storage,ext4 quiet rootfstype=ext4 **snd_hda_intel.dmic_detect=0**"

sudo grub-mkconfig -o /boot/grub/grub.cfg // 重新生成 grub 引导配置
sudo reboot
React JSX

重启电脑后,点击下角的声音图标,看到 hdmi 字样,以为大功告成……结果随便打开一个视频网页,发现视频没有声音且三秒后必然卡住。研究了半天 alsa 和 pulseaudio,以我之前的经验,只要碰到这两货出问题,靠补充组件或者改配置没有效果的。

💡 我知道 linux 已经开始使用新的声音方案了,pipewire,没办法只能硬着头皮试试了。

sudo addgroup $USER audio // 将用户加入 audio 组
sudo addgroup $USER video // 将用户加入 video 组
sudo apk add pipewire // 增加 pipewire
sudo apk add wireplumber // 一个声音会话管理器,不是很懂
sudo apk add pipewire-pulse // 给使用 pulseaudio 库的软件一个机会
sudo apk add pipewire-jack // 不是很懂,耳机吗
sudo apk add pipewire-alsa // 对 alse 的支持
sudo reboot
React JSX

💡 重启一下真的好的,有时候 linux 就是要瞎折腾

6. 配置蓝牙

蓝牙也是 linux 系统一个头疼的问题,之前使用 manjaro 的时候,也是时不时就有问题的。这次从零装蓝牙组件,也是试一试的态度了:

sudo setup-devd udev // 设置 udev, 不懂
sudo apk add bluez // 安装 linux 蓝牙驱动
sudo apk add bluez-deprecated // 安装 bluze 相关,不懂
sudo adduser $USER lp // 将用户加入 lp 组,以便可以控制蓝牙
sudo rc-service bluetooth start // 启动蓝牙服务
sudo rc-update add bluetooth default // 设置开机自启
sudo apk add bluedevil // 安装 kde 的 ui 组件
React JSX

这时候右下角蓝牙图标是有了,以为可以正常使用了,但是在配对后显示无法使用,一声叹息啊。使用 bluetoothctl 命令进行调试,发现在 connect 时报错:br-connection-profile-unavailable。查了各种资料,依然无解。最终还是在 alpine 的 wiki 中,看到 pipwire 后面还有一个命令,试试看:

/usr/libexec/pipewire-launcher
React JSX

💡 竟然工作了,把它加入 .xinitrc 文件

7. 视频加速

这个问题,对于普通轻办公的人,不那么重要,但是对于我这种使用性能孱弱的 j4125 机器的人来说,就比较重要了:

sudo apk add intel-media-driver // 安装 intel 驱动
sudo apk add libva-utils // 安装 vainfo 查看 vaapi 是否正常工作

vainfo
Trying display: wayland
libva info: VA-API version 1.18.0
libva info: Trying to open /usr/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_18
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.18 (libva 2.18.2)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 23.2.3 ()
vainfo: Supported profile and entrypoints
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileNone                   : VAEntrypointStats
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointFEI
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointFEI
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointFEI
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointFEI
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSlice
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile2            : VAEntrypointVLD
React JSX

如果 vainfo 能够正常输出,说明在视频驱动上面是没有问题了。vainfo 可以看到显卡支持哪些编码的编解码。其中 Slice 是支持硬件编码。

接下来调试 Firefox,首先需要安装 intel 显卡 top 工具,才可以知道是否真的进行了硬件解码:

sudo apk add igt-gpu-tools // 安装 intel 调试工具
sudo intel_gpu_top

intel-gpu-top: Intel Geminilake (Gen9) @ /dev/dri/card1 -   11/  11 MHz;  92% RC6;  0.08/ 5.39 W;       50 irqs/s

         ENGINES     BUSY                                                                                                                                                                                                                                                  MI_SEMA MI_WAIT
       Render/3D    6.13% |██████████████▋                                                                                                                                                                                                                               |      0%      0%
         Blitter    0.00% |                                                                                                                                                                                                                                              |      0%      0%
           Video    0.00% |                                                                                                                                                                                                                                              |      0%      0%
    VideoEnhance    0.00% |                                                                                                                                                                                                                                              |      0%      0%

   PID              NAME                            Render/3D                                                        Blitter                                                          Video                                                        VideoEnhance                            
   874      kwin_wayland |███▋                                                          ||                                                              ||                                                              ||                                                              |
  1040       plasmashell |||                                                              ||                                                              ||                                                              |
   801              Xorg |                                                              ||                                                              ||                                                              ||                                                              |
   817      sddm-greeter |                                                              ||                                                              ||                                                              ||                                                              |
   886         klauncher |                                                              ||                                                              ||                                                              ||                                                              |
   914   xdg-desktop-por |                                                              ||                                                              ||                                                              ||                                                              |
   933          Xwayland |                                                              ||                                                              ||                                                              ||                                                              |
   982             kded5 |                                                              ||                                                              ||                                                              ||                                                              |
   994         ksmserver |                                                              ||                                                              ||                                                              ||                                                              |
  1035           kaccess |                                                              ||                                                              ||                                                              ||                                                              |
  1046   polkit-kde-auth |                                                              ||                                                              ||                                                              ||                                                              |
  1056   DiscoverNotifie |                                                              ||                                                              ||                                                              ||                                                              |
  1061           yakuake |                                                              ||                                                              ||                                                              ||                                                              |
  1062         spectacle |                                                              ||                                                              ||                                                              ||                                                              |
  1804           krunner |                                                              ||                                                              ||                                                              ||                                                              |
  1841       baloorunner |                                                              ||                                                              ||                                                              ||                                                              |
  5823         kwalletd5 |                                                              ||                                                              ||                                                              ||                                                              |
  9939           firefox |                                                              ||                                                              ||                                                              ||                                                              |
 10164   plasma-browser- |                                                              ||                                                              ||                                                              ||                                                              |
 10617       RDD Process |                                                              ||                                                              ||                                                              ||                                                              |
React JSX

看看输出,其中 video 部分,就是是否在进行视频解码。这时候如果你打开 firefox 播放视频,并关闭 av1 输出(j4125 不支持 av1 硬解),通常来说,video 部分都是没有百分比的。说明 firefox 并没有调用 vaapi。

为 firefox 开启 vaapi:

在 firefox 的地址栏输入 about:config
media.ffmpeg.vaapi.enabled set to true
media.ffvpx.enabled set to false.
media.rdd-vpx.enabled set to false.
media.navigator.mediadatadecoder_vpx_enabled set to true.

尝试使用以下命令启动 firefox
MOZ_DISABLE_RDD_SANDBOX=1 firefox
React JSX

再观察 intel_gpu_top 输出,发现 vaapi 工作了

💡 BRAVO

8. 配置打印机和网络打印共享服务

打印机相对简单:

sudo apk add cups cups-libs cups-pdf cups-client cups-filters hplip // 安装打印服务

// 将用户加入相关组
sudo adduser root lp
sudo adduser root lpadmin
sudo adduser $USER lp
sudo adduser $USER lpadmin
sudo rc-service cupsd start // 启动打印服务
sudo rc-update add cupsd boot // 开机启动
React JSX

为了让网络能够发现打印机,需要加入 avahi

sudo apk add avahi // 安装 avahi
sudo rc-service avahi-daemon start // 启动服务
sudo rc-update add // 开机启动
React JSX

9. 结语

基本上,这样一台用 alpine 搭建的 linux 桌面系统就可用了,而且性能还不错。安装完所有组件,发现其实大小也要到 1.5G 了。看来 linux 的 DE 是比较大的,所以安装介质才越来越大。
如何用Alpine一步一步搭建一个完整的Linux桌面系统1

如何用 Alpine 一步一步搭建一个完整的 Linux 桌面系统 1