0%

Hello Gentoo, My Old Friend

引子

听说不少人一放假就喜欢装黑苹果,然而手上并没有Hackintosh-friendly的机器的我,只能用重装Gentoo的方式来祭奠一下逝去的青春啦(悲)。

这里随便记录一些安装和配置过程中的琐事,便于日后查询。

持续更新中。

Major Changes (since 2019?)

Portage

  • 由portage管理的源(?)的默认位置统一移到了/var/db/repos,官方源(原/usr/portage)现在在/var/db/repos/gentoo
  • emerge现在不会再默认帮你选择一个作为依赖安装的不稳定包的版本了,如果需要的话要加上参数--autounmask=y

Non-Portage

  • 本来安装流程里/etc/timezone是个符号链接,现在它变成了一个文本文件,里面直接写时区,比如Asia/Tokyo

配置

全盘加密(LUKS)

这里有一个Handbook里没有明确指出的地方:如果你使用systemd,需要启用cryptsetup这个USE。

否则你是没有systemd-cryptsetup-generator来帮你生成[email protected]的,这样你的分区就没有办法在启动时被解密。

Overlay

  • 以前overlay一般交给layman管理,缺点是layman -S需要在eix-sync之前单独执行。(还是我的用法不对?)
    这次读wiki的时候发现了eselect repositoryapp-eselect/eselect-repository)这个新玩意,用法很简单:

    • eselect repository list列出所有repo;
    • eselect repository enable/disable启用或禁用某个repo。注意这并不会把该repo的内容同步下来,所以你还要运行一次eix-sync

    这样启用的repo的配置可以在/etc/portage/repos.conf/eselect-repo.conf里找到。

    • FYI:在repos.gentoo.org可以看到一个现存repo的列表,并且区分了官方和非官方源。
  • 一个overlay里常常有一大堆的包,而你一般只需要其中的少数几个。为了防止这种“命名空间污染”和可能带来的依赖问题,可以每添加一个overlay就在package.mask里加上:

    1
    */*::name-of-the-overlay

    然后只把需要的包unmask掉即可。

    • :实际上这种做法可能不小心unmask掉该overlay在profiles里面mask掉的包。当然你也可以只unmask掉你需要的版本,但这样比较麻烦,而且包不会被自动更新。
    • 为了同样的目的有时还需要设置不同源的优先级。注意overlay默认优先级是比gentoo要高的。

蓝牙

按照wiki上操作即可,但要记得启用bluetooth.service(systemd)。

NVIDIA Optimus

已经有有热心人士为Gentoo打包了Optimus Manager(见gpo.zugaina.org),直接用上面的方法添加jorgicio这个源并安装optimus-manageroptimus-manager-qt即可。

安装完以后做以下两件事:

  • /usr/bin/prime-switch-boot这个脚本需要Python ≥ 3.7,如果执行python3启动的是较低的版本,需要在eselect python里切换到3.7以上。
  • 创建/etc/X11/xorg.conf.d目录,optimus-manager需要在那里生成配置文件。

然后让optimus-manager.serviceoptimus-manager-qt自动启动即可。如果显示Hybrid模式并能启动nvidia-settings说明成功了。

软件

Haskell

建议添加haskell这个overlay(同样由官方维护),里面有最新的GHC。

想省下编译GHC的时间,启用binary这个USE即可。

另外,建议全部相关的包都使用haskell源里的版本而非gentoo里的版本,否则可能产生循环依赖等问题。

npm

直接安装net-libs/nodejs即可。但官方不推荐越过portage安装全局包,作为workaround可以在~/.npmrc里加上这么一行:

1
prefix=/home/<USER>/.node

然后把相应路径添加到$PATH里。

Wine

官方源里现在有四个版本的Wine本体:virtual/wineapp-emulation/wine-{vanilla,staging,any}。官方推荐直接安装virtual/wine即可,它会按照你的USE flag自动选择合适的wine版本(有staging时优先选择wine-staging,否则优先选择wine-vanilla)。

但我明明在package.use里加了staging啊,为什么还是自动选择了wine-vanilla

emerge表示staging并没有启用并且画了个括号((-staging))。百度了一下发现大概是这个USE flag被禁用的意思。原来在我的profile(/var/db/repos/gentoo/profiles/arch/amd64/package.use.stable.mask)里面有这么一行:

1
virtual/wine staging

解决方案也很简单,在package.accept_keywords里加上virtual/wine ~amd64就行了。

Firefox

字体fallback不正确

如果Firefox会在某些时候选择错误的字体——比如,用sans-serif显示一段中文,当font-weight400500600的时候用的字体各不相同(!),试着在about:config里把gfx.font_rendering.fontconfig.max_generic_substitutions调成一个较大的值。

杂项

fsck.f2fs

装完系统以后发现启动异常地快(本来fsck.f2fs在内核版本变更的时候会花很长时间来进行检查),看日志(journalctl -u systemd-fsck-root.service)发现根文件系统的检查直接被跳过了:

fsck.f2fs doesn't exist, not checking file system.

原来其他的fsck们都在/sbin里,而fsck.f2fs/usr/sbin下面(为啥呢……),所以没有被默认包含在initramfs里面。所以我们只需要在dracut.conf里加上(详见dracut.conf (5)

1
fscks="umount mount /usr/sbin/fsck* /sbin/fsck* xfs_db xfs_check xfs_repair e2fsck jfs_fsck reiserfsck btrfsck"

然后dracut --force重新构建initramfs即可。

保存编译进度

FEATURES="keepwork",用完以后记得关上,不然编译产生的临时文件会一直积累。

这个功能好像存在很久很久了,为什么我之前都不知道(悲)。

KDE Application Menu Button Does Not Work for Electron Apps

解决方案在这里:安装dev-libs/libdbusmenu即可(我启用了gtk和gtk3两个USE flag)。

这是KDE的一个小功能,可以把窗口的菜单栏变成titlebar上的一个按钮。你可以在System Settings的Application Style->Window Decorations->Titlebar Buttons里找到它。

一些有趣的包

cppman (app-doc/cppman

C++文档from cpluscplus.com & cppreference.com,详见https://github.com/aitjcize/cppman

碎碎念

  • 虽然很多官方源里缺少的包在overlay里可以找到,但比较分散,而且找overlay还要借助gpo.zugaina.org,总体确实不如AUR方便。
  • 编译耗时太长了 都用Gentoo了还在意编译时长
  • 拿到静态库比Arch容易太多了(虽然主要是交作业需要),启用static-libs即可。
    • 题外话:由于Arch坚持只ship动态库的做法,官方源里一个叫haskell-yesod-default的包在本文写作时间点的版本号达到了惊人的1.2.0-**732**,真是活久见。
  • eix打起来比pacman -Ss快多了——这一点当然很重要,要知道有个函数叫creat……
  • media-fonts下面那一堆~amd64的keyword有点让人疑惑(尤其是{un,}stable共存的):一个unstable的字体是啥样的啊……

后续计划

LFS(逃)