Gentoo经验总结

在长达19年的Linux使用时间中,我个人有关发行版的经验之一就是:Gentoo虽然初始使用起来最耗时,但是无疑在熟悉之后使用最稳定的一个发行版。在年初换机后这段最新款多显卡+最新CPU的时间里,我终于忍受不了Arch/Manjaro缓慢的响应速度、时不时崩溃的打包质量以及没有在默认内核中包含最新硬件的驱动的奇葩行为,把我的两台办公电脑换到多年前曾经长期使用的Gentoo上了。(服务器上用Gentoo?个人觉得如果你只有1两台服务器,还是算了吧,fedora/ubuntu/debian都是不错的选择。如果你有一堆服务器,可以考虑用一台机动的服务器作打包的机器,其它服务器直接从你的打包服务器emerge二进制文件)

记得2004年左右我第一次使用Gentoo的时候,还曾经打印完整的Gentoo Handbook一页页读,那时的文档很完善,我在我的联想笔记本上安装的gentoo一直用到机器被淘汰。(曾经还自制过一个基于Gentoo的定制live光盘版系统,还能多重启动到PE,那时真是闲的蛋疼阿)但是据说之后Gentoo的Wiki有一次大的数据丢失,说实话随着硬件的更新,现有的Gentoo文档已经变得不完整了,可能因为Gentoo的用户不怎么重装,现在按照Handbook一步一步安装EFI引导,居然不能顺利完成,所以有了本文。

总的原则

安装光盘的选择

官方的安装光盘有时内核版本过低,可以考虑使用SystemRescueCd,因为这个也是基于Gentoo构建的。尝试使用过archlinux,不兼容。

EFI启动

使用grub安装EFI引导时,如果提示文件系统只读,使用

mount -o remount,rw /sys/firmware/efi/efivars

重新加载文件系统,重新安装efi。

LLVM的编译

$cat /etc/portage/env/makeopts-j8.conf
MAKEOPTS="-j4"
$ cat /etc/portage/package.env
sys-devel/llvm makeopts-j8.conf

LLVM 的编译过于消耗资源,应降低同时运行的线程数量。

Matlab on Linux

安装之后,可以尝试进入设置页面设置一下字体,多试几种字体,比如noto系列,会发现不能预览,然后在command windows下就会提示

MATLAB/R2017b/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: version
`CXXABI_1.3.9' not found (required by /usr/lib64/libGLU.so.1)

之类的信息,使用系统的自身的libstdc++.so.6文件,比如libstdc++.so.6.22替换原符号连接指向的文件即可。

CPU flag 的选择

依靠 app-portage/cpuid2cpuflags 的输出

Intel-microcode

Intel 最近的史上最大bug,导致需要时常更新microcode。

emerge --ask --noreplace sys-firmware/intel-microcode sys-apps/iucode_tool
iucode_tool -S --write-earlyfw=/boot/early_ucode.cpio /lib/firmware/intel-ucode/*

Add user patch

将用户patch加入类似如下目录中

具体可参考gentoo wiki

Gnome 下的屏保

Gnome 3.8以后不再包括gnome-screensaver,而是把功能分散到gnome-shell, gnome-session, & GDM中了。在gentoo下往往不使用gdm,屏保就变成了麻烦事。 当然你还是可以使用xlock-more.通过如下设置使用win+L

~ $ cat /etc/xdg/autostart/gscreenlock.py
#!/usr/bin/python3

import dbus
import dbus.service
import dbus.glib
#import gobject
from gi.repository import GObject
import os
class ScreenDbusObj(dbus.service.Object):
    def __init__(self):
            session_bus = dbus.SessionBus()
            bus_name=dbus.service.BusName("org.gnome.ScreenSaver",bus=session_bus)
            dbus.service.Object.__init__(self,bus_name, '/org/gnome/ScreenSaver')

    @dbus.service.method("org.gnome.ScreenSaver")
    def Lock(self):
            os.system( "xscreensaver-command -lock" )
if __name__ == '__main__':
    object=ScreenDbusObj()
    GObject.MainLoop().run()

desktop文件

~ $ cat /etc/xdg/autostart/gscreenlock.desktop
[Desktop Entry]
Type=Application
Encoding=UTF-8
Name=gscreenlock
TryExec=/etc/xdg/autostart/gscreenlock.py
Exec=/etc/xdg/autostart/gscreenlock.py
NoDisplay=true
NotShowIn=XFCE;KDE;
Comment=Allows screen locking in gnome

Gonme图形界面下锁屏,下载LightDM Lock Screen 修改 ~/.local/share/gnome-shell/extensions/lockscreen@dev.antergos.com/extension.js中

function _LockScreenActivate () {
        //Util.spawn(['/usr/bin/xscreensaver-command', '-lock']);
        Util.spawnCommandLine('xscreensaver-command -lock');
}