前言

总想着如果外出只带着 SteamDeck,是不是可以用它的浏览器处理一些工作上的事情。但是我被 Chrome 的云同步养刁了,不想用内置的FireFox(当然也要点一下Install),那么就来装一下吧!

首先我们知道 SteamDeck 上的 SteamOS 是 KDE + Arch Linux 魔改而来的,那么用 pacman 就行了啊,结果踩了一路的坑。

shell 的初始化

首先,和其他发行版一样,我们想用 Sudo 需要先给自己一个 password。命令行执行 passwd 根据提示输入密码即可。

与众不同的一步来了,SteamDeck 默认是只读的,需要先解除只读模式,一定要先做这一步

sudo btrfs property set -ts / ro false

然后我们就可以走 pacman 的初始化流程了:

sudo pacman-key --init #initial pacman keyring
sudo pacman-key --populate archlinux

现在我们可以用 sudo pacman -S go 装个 golang 啥的,回车按 Y go-2:1.20.5-1 就装好了。(注意这个我随手的测试结果后面给我惹了不少麻烦)

Yay

Pacman 是没有 Chrome 的,我们可以用 Yay 来安装,但是首先我们要装 Yay。下意识的就打开了 Yay 的 git,无脑对着文档拍如下命令:

pacman -S --needed git base-devel
git clone https://aur.archlinux.org/yay-git.git
cd yay
makepkg -si

结果 makepkg 挂在了一个很奇怪的 error 上:unknown directive: toolchain

看了一下 yay 的安装脚本,这尼玛就是 go build 啊,那我先到代码里面执行 go build 试一下呗。结果一样提示 unknown directive: toolchain。简单搜了一下,似乎这是 golang 的向下兼容扔出来的错误,那么他用的是什么版本的?

结果发现是 1.21,而 pacman 最新只有 1.20,那么只能手动装最新的 go 了。(写文章的时候发现,其实问题出在我用的是 yay-git.git 是相当于 developer 分支,而不是 Stable 的 yay.git, stable 还是 1.19

go-1.21

手动装 go-1.21,就很简单了:

  1. 下载 https://go.dev/dl/go1.21.6.linux-amd64.tar.gz
  2. 解压后,扔去 /usr/local/go,设置一下,把 /usr/local/go/bin 扔进 PATH

我们就可以回到 yay 的目录,继续执行 makepkg -si,结果提示 go 不存在,需要 pacman -S go。

明明 go env 的环境变量正常,却报这个错,读了一下 yay 目录下的 PKGBUILD,发现有一行 makedepends=('go>=1.19'),直接注释掉,再执行 makepkg -si,就不再提示找不到 go 了,go mod 加载第三方依赖什么的都可以正常执行了。

然后就挂在了一个匪夷所思的 fatal 上:fatal error: 'stdlib.h' file not found

修复 /usr/include

我以为是 gcc 没有安装的原因,就执行了一下 gcc,发现是能正常运行的。然后又觉得是 golang 的配置有问题,那么先写个 c 程序,让 gcc 编译一下咯?

///test.c
#include <stdlib.h>
int main() {
 return EXIT_SUCCESS;
}

gcc test.c ,结果同样提示 fatal error: 'stdlib.h' file not found,那看来确实是头文件的问题了。

执行一下 find /usr -name stdlib.h,返回:

/usr/include/c++/13.1.1/stdlib.h
/usr/include/c++/13.1.1/tr1/stdlib.h

很奇怪,没有 /usr/include/stdlib.h,就开始在网上各种搜索资料,基本上都是在说 base-devel 的问题,重新执行 sudo pacman -S base-devel 并没有什么用。

找了半天,不知道该怎么办,被迫开始和 GPT-4 结对编程,在不断的问了好多次后,他回答我:

对不起,我之前的建议可能有误。在Arch Linux中,/usr/include/stdlib.h实际上是由glibc包提供的,而不是base-develglibc是GNU C库,包含了C语言的许多基本定义和系统调用,包括stdlib.h。 你可以使用以下命令来安装或者重新安装glibc: sudo pacman -S glibc

执行 sudo pacman -S glibc 后,再 ls /usr/include 发现补上了很多头文件。然后继续 makepkg -si,结果报错:

linux/errno.h: No such file or directory

继续让GPT提建议,我去测试,他让我试了好几种 header 的安装姿势,都没有生成 /usr/include/linux 目录,最后说:

对不起,我对此表示抱歉。让我们再尝试一种方法。 在Arch Linux中,linux-api-headers包提供了大部分标准的内核头文件,包括errno.h。你可以尝试安装此包: sudo pacman -S linux-api-headers 安装完成后,你应该能在/usr/include/linux/目录下找到errno.h文件。如果仍然找不到,你可能需要检查你的PATH环境变量,或者考虑使用其他的开发环境或发行版。

执行 sudo pacman -S linux-api-headers/usr/include/linux可以找到了,继续执行 makepkg -si,结果报错:

 <alpm.h>: No such file or directory

这个不常见,搜一下就可以知道是 pacman 的头文件没有。解决方法很有意思 sudo pacman -S pacman,我装我自己。继续执行:makepkg -si,结果报错:

archive.h: No such file or directory

这个我认识,libarchive 没有,sudo pacman -S libarchive即可。继续执行:makepkg -si,终于可以编译通过了。

安装 Chrome

这一步就非常简单了:yay -S google-chrome

后记

感觉补的这些头文件应该都是正常 ArchLinux 系统本来就有的吧,只是 SteamOS 阉割了而已,就导致根本搜不到相关内容,主要就是那个 /usr/include/stdlib.h 噪声太大了,搜到的全都是面向小白的解决方案。要不是疯狂追问 GPT-4,可能我也不知道是这么回事。

(不过,在写这篇文章的时候,随手看了看 yay 的 git,他其实是有 binary 可供下载的。不知道是不是直接用 binary 可以跳过我这些痛苦。但感觉缺失这么基础的头文件,早晚在哪天会掉坑里吧