如何用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是比较大的,所以安装介质才越来越大。