如何用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

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

2.能直接用了吗

💡 能,也不能。

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

不能的是,仔细看看:

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

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

3.先利其器

我喜欢用fish,这个不难

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

安装sudo

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

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

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

💡 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组,否则哪里有权限管理硬件设备

到这里还是不够的,因为在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

停止原有的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开机启动

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

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)

先安装驱动看看

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

重启之后声音的图标出现了,但是点进去后仔细一看不对。显示的是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

重启电脑后,点击下角的声音图标,看到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

💡 重启一下真的好的,有时候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组件

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

/usr/libexec/pipewire-launcher

💡 竟然工作了,把它加入.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

如果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 |                                                              ||                                                              ||                                                              ||                                                              |

看看输出,其中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

再观察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 //开机启动

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

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

9.结语

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

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