Gentoo Linux安装笔记2020版
@ wgjak47 | 星期三,一月 15 日,2020 年 | 20 分钟阅读 | 更新于 星期三,一月 15 日,2020 年

Gentoo安装笔记2020版

在国内混不下去之后,辗转来到了坡县,跑到shopee工作。由于国内的台式机带不过来,所以只能转让给在国内的朋友。过了一个月,忍不住了,动用自己的积蓄,又攒了一台Ryzen 3950x PC。 32个框框,不用来跑Gentoo可惜了XD。 PC

Gentoo安装准备

首先你要根据你的网络情况选择安装介质,如果你有有线网络环境,而且不用企业验证,推荐使用Gentoo的安装光盘,有一些Gentoo安装可以用到的工具,以及可以减少一些不必要的调整。 否则建议选择其他Linux发行版带图形界面的LiveCD,方便配置WIFI,企业认证之类的上网手段。比如我就选择了Ubuntu18.04的LiveCD作为安装工具。

写入安装介质到U盘

Linux

推荐直接使用dd安装:

# if 为你的安装镜像介质,of为输出设备,即你的U盘,可以使用lsblk等命令查看
dd bs=4M if=path/to/install.iso of=/dev/sdx status=progress oflag=sync

Windows

推荐使用Rufus

Mac

推荐使用diskutil list来查看设备编号,然后跟Linux一样使用dd,不过Mac上的dd有些许差异,根据Arch的Wiki:

dd if=path/to/arch.iso of=/dev/rdiskX bs=1m # 这里要加r,因为是raw模式,会快很多。

进入LiveCD并分区

插上U盘,重启,狂摁F12进入BIOS,进入启动菜单,选择U盘。这里的操作可能会由于主板品牌的不同而不同,请参阅自己的主板说明书。 关于分区,可以使用partedfdisk,但这里我推荐使用gparted,简单易用,傻瓜化: gparted

UEFI

现在绝大部分的新硬件都是UEFI启动的,而这玩意一般需要一个FAT32/16分区作为启动分区。所以如果你打算上LVM、BTRFS、ZFS之类的技术,最好还是不要全盘,先留下一小块分区 格式化成FAT32作为启动分区。这次我除了启动分区,其余的上了LVM + XFS,关于LVM,参见Gentoo Wiki,这里不详细展开,新手可以不用lvm,直接使用gparted进行分区就好。分区格式我推荐XFS。 最终所有的分区设置都要写在fstab里,关于fstab我会在之后介绍,现在我以fstab内容来表示我的分区方案:

# 这个是UUID,可以使用blkid等命令查看
UUID=C202-4C65 /boot vfat defaults 0 2
/dev/mapper/main-main_root / xfs defaults 0 1
# 不推荐使用systemd的情况下单独/var分区,可能会丢日志
# 但我因为经常会瞎折腾,把var目录搞的非常大
/dev/mapper/main-main_var /var xfs  defaults 0 2
/dev/mapper/main-main_opt /opt xfs defaults 0 2
/dev/mapper/main-main_home /home xfs defaults 0 2
# 用于备份和存放番剧视频
/dev/mapper/extra-extra_video /data xfs defaults 0 2
# swapfile 我发现32G内存在开32个线程编译的时候还是不够用
/swapfile none swap sw 0 0
# 拯救一下SSD的寿命,把编译的工作目录放到内存里
tmpfs           /var/tmp/portage                tmpfs   uid=portage,gid=portage,mode=775,noatime        0 0

下载stage3

关于网路,你可以很容易的通过ubuntu的图形界面配置Wifi和企业认证之类的东西,所以不要担心网络问题。 打开浏览器,访问Download Page去下载Gentoo的Stage3,也就是包含emerge和gcc,python等基础编译构建工具的最小系统。里面不包含内核 和BootLoader。个人PC一般选择amd64架构,这里amd64架构下也有几个分支选项:

  • Stage3 默认,使用openrc
  • Stage3 (no multilib) 仅包含64位支持
  • Stage3 (uclibc) 使用uclibc替换了glibc,一般用于嵌入式
  • Hardened Stage3 安全强化版本
  • Hardened Stage3 (no multilib) 仅包含64位支持的安全强化版本
  • Hardened Stage3 (uclibc) 使用uclibc替换了glibc的安全强化版本
  • Stage3 (X32) 支持X32架构,这个基本没啥使用场景了
  • Stage3 (systemd) 使用Systemd代替openrc,我选了这个版本,对于个人桌面而言,systemd更方便一点。

注1: 如果你的下载速度比较慢,可以选择最近的下载镜像,例如163开源镜像 注2: 如果你的网络不幸容易遭到各种运营商缓存骚扰,建议先使用sha512sum来验证一下镜像:sha512sum stage3-amd64-<release>.tar.?(bz2|xz),然后把结果并与镜像里面的.DIGEST文件内容比较。

挂载分区

执行一下命令,挂载分区,准备chroot:

# 新建文件夹
mkdir /mnt/gentoo
mkdir /mnt/gentoo/var
mkdir /mnt/gentoo/opt
mkdir /mnt/gentoo/home
mkdir /mnt/gentoo/boot

# 挂载分区到/mnt下
mount /dev/mapper/main-main_root /mnt/gentoo
mount /dev/mapper/main-main_var /mnt/gentoo/var
mount /dev/mapper/main-main_home /mnt/gentoo/home
mount /dev/mapper/main-main_opt /mnt/gentoo/opt
# /dev/nvme0n1p1是你的boot分区,可以使用lsblk查看具体的名字
mount /dev/nvme0n1p1 /mnt/gentoo/boot

# 解压stage3
cp ~/Downloads/stage3-amd64-20200101T214502Z.tar.xz /mnt/gentoo
cd /mnt/gentoo
# 这里注意填好选项,否则会造成奇怪的权限问题,例如不能su切root,创建用户没有家目录等等
tar xpvf stage3-*.tar.bz2 --xattrs-include='*.*' --numeric-owner

# 挂载Linux的虚拟文件系统,用于chroot
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev

# 对于ubuntu之类的系统,还需要设置一下/dev/shm
test -L /dev/shm && rm /dev/shm && mkdir /dev/shm
mount --types tmpfs --options nosuid,nodev,noexec shm /dev/shm
chmod 1777 /dev/shm

Chroot前的准备工作

DNS配置

# 要在chroot环境中连接互联网,首先要配置/etc/resolv.conf,这个文件一般会由各种网络工具自动生成,可以把已经连接网络的live环境
# 的resolv.conf拷贝到chroot环境中。 注意这里一定要加上--dereference参数,如果/etc/resolv.conf是一个软链接,
# 该参数会确保复制的是源文件,而不是软链接,否则重启时候就会失效。
cp --dereference /etc/resolv.conf /mnt/gentoo/etc/

portage配置

portage是一个非常强大又复杂的包管理器,这里仅仅介绍安装的配置,后续我会专门写一下这个包管理器的blog。

编译优化

Gentoo作为一个编译发行版,不开编译优化选项会失去灵魂。今天绝大多数的软件底层构建于C/C++之上,而Gentoo或者说绝大部分的Linux发行版都依赖于GCC构建, 因此设置GCC的CFLAGS和CXXFLAGS是十分重要的,你要做的就是修改/mnt/gentoo/etc/portage/make.conf中的相应参数。HandBook的推荐如下:

# Compiler flags to set for all languages
COMMON_FLAGS="-march=native -O2 -pipe"
# Use the same settings for both variables
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"

其中-march=native表示自动检测使用的CPU类型,进行优化编译,-O2表示优化等级, -pipe表示在编译过程中使用UNIX管道而不是临时文件来通讯(保护SSD,但是内存不够会被kill掉) 关于GCC更多的编译参数,可以参考: https://wiki.gentoo.org/wiki/GCC_optimization#Introduction

此外,为了充分利用CPU的性能,加快编译速度,建议修改MAKEOPTS="-jX",X推荐为你的CPU线程数,当然我经常会减去一两个线程,后台编译的时候,留给前台应用。 注意,如果你的线程数足够多,那么并发编译某些大型软件,如qtwebengine的时候内存占用会非常高,32G也不够用,记得开启swap或者去掉-pipe参数。

mirrors

由于网络速度问题,下载源码包最好从镜像源下载,修改/mnt/gentoo/etc/portage/make.conf中的GENTOO_MIRRORS为适合你网络环境的镜像站点。中国大陆我推荐https://mirrors.163.com/gentoo/https://mirrors.tuna.tsinghua.edu.cn/gentoo/。你也可以使用官方livecd中提供的mirrorselect工具: mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf,但是因为我用的是ubuntu的livecd,所以没有这个工具。

使用Git Repo

虽然Gentoo的默认的portage同步方式还是rsync,但是支持git同步,后者在同步的速度上会快非常多,但是缺点是会更占硬盘。我实际使用下来,portage的repo并没有非常大。因此推荐直接使用git repo方式同步portage。但是stage3是默认没有git的,需要在livecd安装git,并手动clone到对应目录中。

# in ubuntu live cd
sudo apt-get install git
rm -rf /mnt/gentoo/var/db/repos/gentoo
git clone https://github.com/gentoo-mirror/gentoo /mnt/gentoo/var/db/repos/gentoo

编辑/mnt/gentoo/etc/portage/repos.conf/gentoo.conf:

[DEFAULT]
main-repo = gentoo

[gentoo]
location = /usr/portage
sync-type = git
sync-uri = https://github.com/gentoo-mirror/gentoo
auto-sync = yes

这样暂时就可用了,记得chroot进去之后安装git,否则无法更新portage。

Chroot

在各种准备工作完成之后,就可以进行chroot,正式开始安装Gentoo了。

chroot /mnt/gentoo /bin/bash
source /etc/profile

为了防止混淆,你可以更改一下你的终端提示符:

export PS1="(chroot) ${PS1}"

安装各种必备软件,方便接下来的配置

emerge -av git vim eix gentoolkit

首先是git,这个用来同步portage,然后是vim,用来编辑配置文件,后面两个是portage增强工具,推荐安装。

emerge的基础使用

emerge是Gentoo的包管理器,相比与其他发行版,因为功能强大,所以更加复杂。这里简单介绍一下使用方式,更详细的使用方式可以man emerge或者Gentoo Wiki

一、 安装/更新软件包

emerge -av xxx # -a表示询问用户, -v表示详细展示构建过程

二、 更新系统

emerge -avuDN @world # -u 表示更新到可用的最新版本, -N表示扫描已经安装的软件包,如果有use flag变更,也一起更新, -D表示检查完整的依赖树 @world表示用户选择的所有软件包

三、 Unmask软件包 有的时候我们需要安装一些还在测试状态的软件包,而这种测试状态的软件包一般处于mask状态,无法安装,要安装测试状态的包,需要对portage的文件进行变更,emerge提供了一套流程来简化相关操作:

# 以minikube为例
$ emerge -av minikube
These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N     ] dev-go/go-bindata-1.0.0:0/1.0.0::gentoo  18 KiB
[ebuild  N     ] sys-cluster/kubectl-1.14.9::gentoo  27,441 KiB
[ebuild  N    ~] sys-cluster/minikube-1.6.2::gentoo  USE="-hardened -libvirt" 169,437 KiB

Total: 3 packages (3 new), Size of downloads: 196,895 KiB

The following keyword changes are necessary to proceed:
(see "package.accept_keywords" in the portage(5) man page for more details)
# required by minikube (argument)
=sys-cluster/minikube-1.6.2 ~amd64

Would you like to add these changes to your config files? [Yes/No]

这里输入yes/y,相关配置就会写入相应的配置文件中,但是emerge只是写入了一个临时文件,我们需要使用dispatch-conf工具来合并配置,Gentoo通过这种机制来防止软件包的新配置破坏用户的老配置:

$ dispatch-conf
--- /etc/portage/package.accept_keywords        2020-02-15 23:36:03.673499649 +0800
+++ /etc/portage/._cfg0000_package.accept_keywords      2020-02-16 00:38:49.220307509 +0800
@@ -77,3 +77,5 @@
# required by @world (argument)
media-libs/libtgvoip::gentoo ~amd64

+# required by minikube (argument)
+=sys-cluster/minikube-1.6.2 ~amd64

>> (1 of 1) -- /etc/portage/package.accept_keywords
>> q quit, h help, n next, e edit-new, z zap-new, u use-new
m merge, t toggle-merge, l look-merge:

关于dispatch-conf的更多用法,可以参考man dispatch-conf

注意 : emerge新版去掉了默认的--autounmask选项,如果你在emerge某些还在测试的包(~amd64)时遇到类似All ebuilds that could satisfy "xxx/xxx" have been masked. 的错误提示,请手动加上--autounmask选项

选择Profile

Gentoo的强大之处在于use flag系统,但是use数量众多,普通用户难以管理,因此官方推出了固定的use配置集,名为profile,用户可以很方便的配置自己想要的环境:

root # eselect profile list
[1]   default/linux/amd64/17.0 (stable)
[2]   default/linux/amd64/17.0/selinux (stable)
[3]   default/linux/amd64/17.0/hardened (stable)
[4]   default/linux/amd64/17.0/hardened/selinux (stable)
[5]   default/linux/amd64/17.0/desktop (stable)
[6]   default/linux/amd64/17.0/desktop/gnome (stable)
[7]   default/linux/amd64/17.0/desktop/gnome/systemd (stable)
[8]   default/linux/amd64/17.0/desktop/plasma (stable)
[9]   default/linux/amd64/17.0/desktop/plasma/systemd (stable)
[10]  default/linux/amd64/17.0/developer (stable)
[11]  default/linux/amd64/17.0/no-multilib (stable)
[12]  default/linux/amd64/17.0/no-multilib/hardened (stable)
[13]  default/linux/amd64/17.0/no-multilib/hardened/selinux (stable)
[14]  default/linux/amd64/17.0/systemd (stable)
[15]  default/linux/amd64/17.0/x32 (dev)
[16]  default/linux/amd64/17.1 (stable)
[17]  default/linux/amd64/17.1/selinux (stable)
[18]  default/linux/amd64/17.1/hardened (stable)
[19]  default/linux/amd64/17.1/hardened/selinux (stable)
[20]  default/linux/amd64/17.1/desktop (stable)
[21]  default/linux/amd64/17.1/desktop/gnome (stable)
[22]  default/linux/amd64/17.1/desktop/gnome/systemd (stable)
[23]  default/linux/amd64/17.1/desktop/plasma (stable)
[24]  default/linux/amd64/17.1/desktop/plasma/systemd (stable) *
[25]  default/linux/amd64/17.1/developer (stable)
[26]  default/linux/amd64/17.1/no-multilib (stable)
[27]  default/linux/amd64/17.1/no-multilib/hardened (stable)
[28]  default/linux/amd64/17.1/no-multilib/hardened/selinux (stable)
[29]  default/linux/amd64/17.1/systemd (stable)
[30]  default/linux/amd64/17.0/musl (exp)
[31]  default/linux/amd64/17.0/musl/hardened (exp)
[32]  default/linux/amd64/17.0/musl/hardened/selinux (exp)
[33]  default/linux/amd64/17.0/uclibc (exp)
[34]  default/linux/amd64/17.0/uclibc/hardened (exp)

这里推荐使用桌面环境的用户选择对应的桌面profile,例如我是使用systemdkde用户,这里我选择了24:

eselect profile set 24

然后更新一下系统,这里会安装/更新非常多的包:

eix-sync
emerge -avuDN @world -j6

这里说明一下emerge-j6参数,即一次可以同时最多编译6个软件包,这个可以极大提高安装的速度,特别是一些小软件包特别多的时候。当然这个也比较考验你的CPU和内存。建议这个时候喝杯茶,或者玩会其它设备,例如switch,等待安装完成。

安装KDE桌面环境

由于我本人偏爱KDE环境,因此这里介绍一下KDE的安装,Gnome等其他桌面环境可以参考Gentoo的Wiki,这里提一句,虽然Gnome官方不支持非systemd,但是gentoo的维护者patch过了gnome相关代码,并且从systemd中fork出来的单独的组件,使得gnome也可以跑在非systemd系统上。 首先按照上面的profile选择,选择适合kde的profile,参加上面的内容。

安装KDE基础桌面

KDE的包非常非常的多,这里Gentoo提供一个抽象的Meta包,可以通过安装这一个包,依赖安装整套kde桌面环境,以获得完整的KDE桌面体验:

emerge -av kde-plasma/plasma-meta

这里提示一下,可以使用equery u kde-plasma/plasma-meta或者eix kde-plasma/plasma-meta(前文提到的portage增强工具)来查看相关的use flag

equery u plasma-meta

equery.png 这里根据顔色的不同,来标识相关的use flag是否已经被启用,例如图片中的红色就表示use flag已经启用 然后根据自己的需要,启用相关的use flag,例如我需要启用networkmanager,而默认并没有启用,启用方法有两个,第一中是通过前文安装的portage增强工具安装启用:

# -E指定use flag,-p制定相关的软件包
euse -E networkmanager -p kde-plasma/plasma-meta

第二种方法是直接编辑/etc/portage/package.use/下相关的文件,你可以根据软件包新建一个文本文件,例如plasma-meta:

# 多个use用空格隔开
kde-plasma/plasma-meta networkmanager

其实就是第一种方法的手动版,这种方式主要好处是批量的时候能快一点。

另外提一句,也可以安装kde-plasma/plasma-desktop作为代替,这个依赖的包会少很多,如果有需要就自己安装其他的包,适合有精简用户的需求。

安装KDE桌面控件

KDE提供了不少有用的桌面控件,例如天气,输入法面板等等。安装方式如下:

emerge --ask kde-plasma/kdeplasma-addons

安装KDE应用

对于日常使用,还可以安装kde的一些软件,你可以直接全部安装,但是kde提供了很多可能你永远都永不到的软件,因此Gentoo对kde的应用进行了进一步的分级。 全部安装:

emerge -av kde-apps/kde-apps-meta

我安装的部分:

emerge -av kde-apps/kdeutils-meta kde-apps/kdemultimedia-meta kde-apps/kdegraphics-meta kde-apps/kdecore-meta kde-apps/kdeadmin-meta

启用sddm

这里我建议不要在chroot 环境中使用,因为linux很常见的一个问题就是显卡驱动没有配置正确,导致开机黑屏,因此这边可以等重启测试startx没有明显报错后再启用

systemd:

systemctl enable sddm

openrc:

rc-update add xdm default

安装配置内核

预编译内核

Gentoo目前也提供了官方预编译内核,新手可以通过安装预编译内核跳过内核配置,但是我尝试过,似乎无法识别lvm,放弃了。 官方提供的内核安装方式如下:

# 注意这个包还处于测试状态,因此需要添加--autounmask来允许portage安装这个测试的软件包
emerge -av gentoo-kernel-bin --autounmask

传统的手动编译内核

Gentoo提供了一个patch过的内核,主要优化的编译界面,可以快速启用针对openrc/systemd相关的编译选项,等等。

emerge -av gentoo-source

注: Gentoo也提供了一些实验特性,如果想用的话,可以开启experimental use flag 注意:如果你的硬件很新,请使用最新内核而不是LTS内核,否则容易因为驱动问题,无法正常工作,要使用最新的内核,请执行如下操作:

echo sys-kernel/gentoo-sources ~amd64 >> /etc/portage/package.accept_keywords

通过eselect list kernel,来选择要编译的内核,然后进入/usr/src/linux文件夹,执行make menuconfig,就能见到如下界面: kernel.png

如提示所言通过上下移动,通过空格选择编译选项,是编译到内核/编译为模块,还是完全不编译。这里注意一点,很多内核驱动是需要二进制的firmware的,这个时候有两种选择, 编译到kernel里,然后,把firemware也编译到kernel里,或者编译为module,动态加载,fireware也可以放在文件系统。没有特殊情况的话,一般选择后者。 另外,对于新手来说,我们精简的目标仅仅限于内核的部分驱动,也就是Device Drivers里面的东西。

关于查看硬件信息的小技巧

在chroot环境下,可以直接运行lspci -v来查看自己的硬件信息,方便编译内核的时候寻找对应的驱动模块和驱动:

lspci -v
...
00:18.3 Host bridge: Advanced Micro Devices, Inc. [AMD] Matisse Device 24: Function 3
Flags: fast devsel
Kernel driver in use: k10temp
Kernel modules: k10temp
...

AMD 5700XT驱动相关

amd driver.png

以上图片显示的是最重要的部分,完整的支持如下,参考Gentoo Wiki。注意,这里要取消API Radeon,如果你和我一样用比较新的AMD显卡。

Processor type and features  --->
[*] MTRR (Memory Type Range Register) support (CONFIG_MTRR)
Device Drivers  --->
Graphics support  --->
<*/M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) ---> (DRM_FBDEV_EMULATION)
[*]   Enable legacy fbdev support for your modesetting driver
<   > ATI Radeon
<M/*> AMD GPU
[ /*] Enable amdgpu support for SI parts (DRM_AMDGPU_SI)
(only needed for Southern Islands GPUs with the amdgpu driver)
[ /*] Enable amdgpu support for CIK parts (DRM_AMDGPU_CIK)
(only needed for Sea Islands GPUs with the amdgpu driver)
ACP (Audio CoProcessor) Configuration  --->
[*] Enable AMD Audio CoProcessor IP support (CONFIG_DRM_AMD_ACP)
(only needed for APUs)
Display Engine Configuration  --->
[*] AMD DC - Enable new display engine (DRM_AMD_DC)
[ /*] DC support for Polaris and older ASICs
(only needed for Polaris, Carrizo, Tonga, Bonaire, Hawaii)
[ /*] AMD FBC - Enable Frame Buffer Compression
[ /*] DCN 1.0 Raven family
(only needed for Vega RX as part of Raven Ridge APUs)
<*/M> HSA kernel driver for AMD GPU devices (HSA_AMD)
<*/M> Sound card support  --->
<*/M> Advanced Linux Sound Architecture  --->
[*]   PCI sound devices ---> (CONFIG_SND_PCI)
HD-Audio  --->
<*> HD Audio PCI (CONFIG_SND_HDA_INTEL)
[*] Support initialization patch loading for HD-audio (CONFIG_SND_HDA_PATCH_LOADER)
<*> whatever audio codec your soundcard needs
<*> Build HDMI/DisplayPort HD-audio codec support (CONFIG_SND_HDA_CODEC_HDMI)
(2048) Pre-allocated buffer size for HD-audio driver (CONFIG_SND_HDA_PREALLOC_SIZE)

这里仅仅是内核支持,如果你使用X,还需要安装xorg相关的驱动:

echo VIDEO_CARDS="amdgpu radeonsi radeon" >> /etc/portage/make.conf
emerge -avuDN @world

更多详细信息可以参考Gentoo Wiki

Intel网卡相关

现在台式机流行的带WIFI的主板网卡一般是Intel的,对于intel最近出品的网卡系列,在内核的驱动一般都是iwlwifi,这个可以通过lscpi确认,如果LiveCD环境能够正常 连接WIFI的话。

image.png 如果你的CPU不强,你可以和我一样,把上图除了iwlwifi之外的其它品牌的网卡驱动去掉,提升编译时间。完整的编译选项可以参考Gentoo Wiki,应该已经默认选上了,为了以防万一可以检查确认一下。

另外intel的网卡同样需要firmware,不要忘记安装。

声卡相关

内核配置如下:

Device Drivers --->
<*> Sound card support
<*> Advanced Linux Sound Architecture --->
[*] PCI sound devices  --->
Select the driver for your audio controller.
HD-Audio  --->
Select a codec or enable all and let the generic parse choose the right one:
[*] Build Realtek HD-audio codec support
[*] ...
[*] Build Silicon Labs 3054 HD-modem codec support
[*] Enable generic HD-audio codec parser
General setup --->
[*] System V IPC

注意这里的HD-Audio也是可以精简的,但是如果注意把HDMI/DisplayPort的选项选上,如果你想要HDMI输出音频的话。 内核选项开启之后,记得安装配套的软件,例如alsa和pluseaudio

euse -E alsa pulseaudio
emerge -avuDN @world

开启处理器优化编译(实验特性)

根据自己的CPU型号,选择合适的编译选择,这个可以在GCC编译内核的时候开启针对特定处理器的编译优化,参见https://www.phoronix.com/scan.php?page=news_item&px=Linux-4.17-march-native

image.png

文件系统

如果向我一样使用lvm,请在开启内核的lvm支持:

Device Drivers  --->
Multiple devices driver support (RAID and LVM)  --->
<*> Device mapper support
<*> Crypt target support
<*> Snapshot target
<*> Mirror target
<*> Multipath target
<*> I/O Path Selector based on the number of in-flight I/Os
<*> I/O Path Selector based on the service time

注意不要忘记安装lvm2:emerge -av lvm2并启用:systemctl enable lvm2-monitor.service

然后是特定的文件系统支持,以xfs为例。 image.png

编译安装内核 && initramfs

上述工作完成之后,就可以编译安装内核了:

make -j32 # 编译内核
make install # 安装内核到/boot
make modules_install # 安装内核模块

一般对于Linux启动而言,需要一个initramfs,来挂载问加系统,加载firmware等等初始化操作,然后才是系统的1号进程启动。(也有不使用initramfs启动的方法,有兴趣可以自己google,我不太熟悉这里不多介绍了) 在Gentoo下,生成initramfs有三种种方式:

  1. 自己写一个: https://wiki.gentoo.org/wiki/Early_Userspace_Mounting
  2. genkernel Gentoo官方维护的一个内核生成工具,包含了生成initramfs的功能
  3. Dracut 从Fedora移植过来的initramfs生成工具

经过我的测试,genkernel在无法生成在lvm+systemd环境下正常工作的initramfs,需要Dracut:

dracut -a lvm --kver 5.5.4-gentoo # --kver后更对应的kernel版本号

安装firmware

许多硬件的Linux驱动除了在内核的代码,还需要二进制的firmwares来保证正常工作,而二进制的firmware往往是不开源的,所以不在linux的代码库内,要单独安装,Gentoo向其它发行版一样, 提供了firmware的集合。注意,对于amd来说,需要启用initramfs use flag,否则可能会无法正常驱动X。

emerge -av sys-kernel/linux-firmware

配置语言/时区

# 生成locale
echo en_US.UTF-8 UTF-8 >> /etc/locale.gen
echo zh_CN.UTF-8 UTF-8 >> /etc/locale.gen
echo zh_TW.UTF-8 UTF-8 >> /etc/locale.gen
locale-gen
# systemd set locale
localectl set-locale LANG=en_US.utf8
# systemd set timezone
timedatectl set-timezone Asia/Shanghai

安装NetworkManager用于网络连接

euse -E networkmanager
emerge -avuDN @world

systemctl enable NetworkManager

安装Grub引导

要启动系统,需要一个引导器,Linux下的引导器有很多,除了Grub,还有systemd-boot等,这里用我比较熟悉的Grub。

添加uefi支持
# echo 'GRUB_PLATFORMS="efi-64"' >> /etc/portage/make.conf
# 安装Grub
emerge -av sys-boot/grub
# 如果你同时安装了其它系统,请安装os-prober
emerge -av sys-boot/os-prober
# 安装引导
grub-install --target=x86_64-efi --efi-directory=/boot
# 生成引导文件
grub-mkconfig -o /boot/grub/grub.cfg

另外你也可以修改/etc/default/grub来添加一些grub启动的选项。

配置用户

# 配置root用户
passwd root

对于日常使用来说,使用root肯定是不合适的,添加一个普通用户来进行日常活动:

useradd -m -G users,wheel,audio,video -s /bin/bash/ wgjak47
passwd wgjak47

另外也推荐使用sudo,来进行高权限操作:

emerge -av sudo

然后执行visudo,开启特殊权限

...
## Uncomment to allow members of group wheel to execute any command
%wheel ALL=(ALL) ALL
...

重启测试系统是否可用

运行reboot,重启系统,看看是否能正常引导。对于Gentoo而言,这个往往并不顺利,我遇到的大部分原因如下:

  1. 涉及文件系统的bug,导致特定文件系统无法挂载,例如我上文提到过的genkernel的bug,这中情况要详细的记录启动中报错的信息,可以通过google或者去Gentoo forum发帖求助
  2. 驱动问题,例如显卡,这种情况往往会启动成功,但是无法启动X,而且可能出现系统运行不稳定的情况。首先检查一下相关driver是否编译为modules并成功加载了,firmware是否安全,这些日志可以通过dmesg | more查看,也有部分可能是因为 软件不够新导致的,注意查看论坛,是否有遇到相同情况的用户

如果成功进入,系统,运行startx,看是否可以正常运行,如果没有问题,就可以systemctl enable sddm,下次开机自动进入登录界面了。

备份

对于刚刚安装好的系统,我建议备份一下到移动硬盘/备用机械硬盘,以防万一,这里推荐使用rsync:

# 备份的目标是我挂载到/data的机械硬盘的backup目录
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/data/*","/swapfile"} / /data/backup

日后做重要变更的时候也可以不定期更新。

配置开发环境

我个人使用Spacemacs进行golang/Python/rust(写着玩)进行开发,浏览器使用Firefox,在Gentoo下安装十分简单:

sudo emerge -av golang rust firefox-bin emacs

Python是Gentoo自带,所以不用特地安装,但是我推荐使用pyenv进行开发,参见:pyenv

Emacs 27 && 28

随着LSP的流行,emacs26原本的json解析器不堪重负,emacs27引入了C实现的json解释器jsonson,用来改善lsp的支持。虽然27还在测试,没有正式发布,但是不妨碍我们使用:

echo app-editors/emacs ** >> /etc/portage/.package.accept_keywords

注意,emacs的版本有点不同,并不是~amd64这样的,所以要使用**进行匹配。然后指定版本安装emacs:

emerge -av app-editors/emacs::27.0.9999-r1 app-editors/emacs::28.0.9999 # 这里同时安装了两个版本,gentoo的一大特性就是支持软件包的多个版本。

然后你就可以使用eselect emacs list && eselect emacs set来选择自己喜欢的版本了:

# eselect emacs list
Available Emacs symlink targets:
[1]   emacs-27-vcs
[2]   emacs-28-vcs

# eselect emacs set 1

由于是测试版,很不稳定,因此我建议也安装一下稳定版本,然后如果测试版出问题,可以通过eselect快速切换。

此外为了支持图片和其他spacemacs的高级特性,也需要额外开启一些emacs的use flag: image.png

euse -E json gzip-el harfbuzz gconf gsettings athena dynamic-loading xft toolkit-scroll-bars motif m17n-lib libxml2 kerberos gfile Xaw3d -p app-editors/emacs

注: 不同于其他软件,版本号为9999的为live版本,并不会被emerge -avuDN @world更新,用户需要使用emerge @live-rebuild来进行更新。 注2: 你也可以emerge -av app-portage/smart-live-rebuild并通过emerge @smart-live-rebuild来更新,这个比起live-rebuild优势是会跳过构建已经更新的包

启用Overlay

Gentoo的官方仓库虽然有很多包,但是并不能完全满足我们的需要,Gentoo提供了一种叫做Overlay的机制,方便用户存放自己的ebuild,但是注意,非官方的overlay提供的ebuild没有经过官方认证, 可能会造成系统损坏,请慎重选择。 添加overlay现在有两种方案,除了传统的layman方案,现在Gentoo官方推荐eselect repository方式,来管理overlay:

eselect repository help

安装steam

steam软件包由steam-overlay提供,首先启用steam-overlay:

eselect repository enable steam-overlay
emerge -av steam-meta

按照提示即可。

安装Fcitx5

fcitx4已经没有更新了,作者投入到了fcitx5的开发当中,对于kde环境,已经可以满足日常使用了,要安装Fcitx5,请添加gentoo-zh overlay

eselect repository enable gentoo-zh
emerge -av fcitx5 fcitx5-rime fcitx5-qt fcitx5-gtk fcitx5-chinese-addons kcm-fcitx5

在kde环境下,运行kcm-fcitx5,即可生成配置文件,对于自动启动,使用kde的设置,选择Startup and Shutdown,添加fcitx5即可。 注:Gentoo下的fcitx5目前没有中文以外的输入法支持,例如日语等,因为本人的精力有限,也不会日语,所以没有添加到gentoo-zh,欢迎有余力的同好贡献。