为了避免被设为VIP导致用户无法浏览,该文章迁移到
https://gitee.com/silent_missile/technique_note
我个人要用到OpenFOAM和dealii这两个软件包。而它们都需要使用到mpi,有些软件包如deallii、hdf5对mpich的支持更好(因为mpich是Cray集群指定的,如果想要在Cray集群上运行mpi软件,就只能用mpich),但是在其他发行版上,大多数用到mpi的软件包都是基于openmpi的。而在一个系统内只允许有一个mpi,openmpi有从1.x到5.x多个版本,openmpi和mpich还不一样,虽然可以用mpi-selector激活特定的mpi,但是人家发行版已经编译好的二进制软件包想要重新制作难度太大了。这就导致我无法在一个统一的mpi接口上同时使用多个软件包。
Gentoo因为有USE系统,所以可以定制,这样就可以保证我能在一个统一的mpi接口上同时使用这些软件包。
可能有些用户觉得Gentoo很难,能够体现自己的水平。不过我个人觉得它的USE系统才是最有价值的,也是我真正需要的。
下面记录了我亲自安装的步骤,作为以后我再次安装时参考所用。
1 整体步骤
一般来讲一个linux发行版的安装步骤其实大体上都差不多,基本分为以下几步:
1. 制作启动盘
2. 从启动盘启动进入安装流程
3. 硬盘分区
4. 复制文件到分区。对于gentoo而言,这里还包含编译生成二进制文件的过程。
5. 安装引导软件(现代linux基本上都是grub)
6. 进行一些初次启动的基础设置
7. 重启进入新系统
8. 对新系统进行个性化设置
每一步都有各自的难点。不过以我的经验来看,最劝退的在硬盘分区这一步,容易搞坏。
另外对新系统进行个性化设置的时候,可能会发现某些地方和用户预期的不太一样,也可能导致劝退。
2 最前面的准备
2.1 制作启动盘
大多数发行版都是通过自己的启动盘启动后进入安装步骤。而Gentoo可以用任意的Linux启动,然后通过chroot切换到安装分区,再进行后续步骤。但是考虑到Gentoo安装过程中可能会用到一些自己特定的工具,所以我考虑后还是决定使用Gentoo官方的启动盘。
在
Downloads – Gentoo Linux
我下载了Live GUI USB Image。当然,用其他的live系统也可以,比如Debian或者openSUSE,不过有些Gentoo专属的工具可能会缺。
在
Rufus - 轻松创建 USB 启动盘
下载了rufus工具。
然后用rufus把刚才下载的Gentoo镜像烧录到了u盘上。记得rufus一定要用4.5或者更高版本,因为低版本的只能使用dd模式,而高版本的可以使用iso镜像模式。
用ventoy或者belenaetcher创建启动盘也可以,不过我喜欢rufus。
2.2 从启动盘启动
把刚刚制作好的usb启动盘插入usb口,然后开机,狂按delete键进入BIOS设置,选择usb存储介质启动,就可以从刚刚制作好的usb启动盘启动。
要特别说明一下。Gentoo官方的启动盘带了一些有助于安装的工具,最重要的是mirrorselect和cpuid2cpuflags这两个工具。但是Gentoo官方的启动盘没有带中文字体,就算输入法可以使用网上一些在线输入法的网站,但是没有中文字体的话,在浏览中文网站时,看到的全是小方块。这个时候可能需要浏览英文网站作为安装手册。不过也可以在启动后,通过KDE控制面板直接安装中文字体,这样在浏览中文网站的时候就可以很好的显示中文了。中文字体则有很多可以下载的地方,实在不行,可以从windows目录下复制simsun出来。
而如果采用其他发行版的启动盘,比如Debian/Ubuntu/Fedora之类,它们缺少一些工具,可能需要手动处理一些操作。
在我第一次安装的时候,使用的是Gentoo官方的启动盘,参考的也是英文的帖子。
2.3 关闭屏保和节能
默认的Linux桌面都开启了屏保和节能,如果长时间没有鼠标移动或者键盘敲击,计算机会先关闭屏幕,随后会进入睡眠,这样可以节能。但是对于Gentoo的安装,编译安装的时间是很长的,如果中途锁屏或者休眠会导致安装失败。
所以,即便是Live GUI,在进入以后的第一件事就是进入KDE控制中心关闭屏保和节能,否则后面会有麻烦。
2.4 连通网络
因为Gentoo在安装过程中要下载很多文件,所以必须要连通网络。
因为我选的是Live GUI,所以开机启动以后,进入了KDE桌面,会自动识别计算机硬件以及网络。因为我的机器在路由器后面,而路由器开启了DHCP,所以网络变成了自动配置,直接就连接到了网络上。
没错,很多市面上的教程都是讲解的minimal installation CD字符界面的启动盘如何开始配置网络,因为我用的Live GUI,网络配置这步省掉了。
在左下角的开始菜单可以启动浏览器,通过浏览器浏览网页,可以在线阅读安装教程,比纯字符界面的启动盘操作方便多了。
同样通过左下角的开始菜单,启动一个命令行窗口。因为是KDE桌面,所以konsole还可以开启多标签页,可以在一个标签里进行安装,在另一个标签里输入其他命令。这样方便多了。
也许有人认为在纯命令行的minimal installation CD系统下调试网络是一件水平更高的事情,但是我还没到那种水平,先从GUI开始。
在
Gentoo Linux安装教程20220218(长期更新维护)_gentoo安装-CSDN博客
的作者选择从minimal installation CD启动,通过命令行完成网络配置,然后启动ssh, 通过ssh远程操作来完成所有的后续步骤,这个方法适用于服务器的管理。
我这边是桌面系统,而且既然已经可以通过minimal installation CD启动,也就是说可以物理接触到这台电脑了。那也没有必要非得把安装系统的工作也通过远程来处理,完全可以直接操作电脑完成系统安装,然后在安装好的系统里开启ssh,再通过ssh远程操作完成个性化配置的步骤。
3 硬盘分区
我的电脑上有多块硬盘,专门拿出一块来做Linux系统用,所以我选择全盘安装,为此,我拆开机箱,把其他几块硬盘的SATA线拔了,以免误操作把其他几块硬盘上的数据破坏了。
我参考了几个文章
How to install Gentoo with UEFI LUKS LVM and systemd | amedeos home
Installing Gentoo – Alice's Digital Notebook
How To Install Gentoo With LVM and Disk Encryption | NKLY
关于硬盘分区,我采用的方案是GPT方式。搭配lvm和btrfs,lvm和btrfs的优势这里就不展开介绍了
如果这块硬盘之前安装过其他的Linux系统,可以不用进行分区操作,而是直接格式化,所以可以直接跳到格式化的章节。在最开始最好是把之前Linux系统的fstab备份出来,以作参考。
3.1 进入root模式
接下来进入实质的硬盘分区步骤。硬盘分区是十分危险的操作,必须要root权限,在Gentoo Live GUI环境里,通过sudo来提权执行是不需要输入密码的,但是如果想通过su命令直接切换为root却不行。所以可以用
sudo su
命令进入root模式
如果是其他发行版的Live盘,进入root的方式有所不同。如果是Linux Mint,也是sudo su。如果是Debian12 Live,它的root密码是live。如果是openSUSE,可以直接su,不需要密码。其他发行版的Live系统我没用过,不知道。
3.2 查看当前分区信息
konsole中输入命令
lsblk
输出结果大概如下
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 953.9G 0 disk ├─sda1 8:1 0 100M 0 part ├─sda2 8:2 0 16M 0 part ├─sda3 8:3 0 292.2G 0 part ├─sda4 8:4 0 680M 0 part └─sda5 8:5 0 660.9G 0 part sdb 8:16 0 238.5G 0 disk ├─sdb1 8:17 0 512M 0 part /boot └─sdb2 8:18 0 238G 0 part ├─system-swap 254:0 0 2G 0 lvm └─system-root 254:1 0 236G 0 lvm / sdc 8:32 0 3.6T 0 disk ├─sdc1 8:33 0 16M 0 part └─sdc2 8:34 0 3.6T 0 part nvme0n1 259:0 0 465.8G 0 disk ├─nvme0n1p1 259:1 0 16M 0 part └─nvme0n1p2 259:2 0 465.7G 0 part
可以看到有sda,sdb,sdc共3个sata硬盘,另外还有一个nvme0n1的nvme 硬盘,从容量和分区上上可以判断到底哪块硬盘是要用的。
当然,也可以使用
fdisk -l
列出的信息会更多。
3.3 初步分区
我选择了/dev/sdb作为安装硬盘
3.3.1 fdisk分区
使用命令
fdisk
进入分区模式
按m可以弹出提示
按l可以列出已有的分区
按d可以删除分区
按p可以打印出分区表,也就是可以列出各个分区的信息
因为我要使用全盘安装,所以先用d删除所有分区,删除所有分区后按l查看分区情况,然后按n增加新分区。我创建了以下几个分区:
esp启动分区128M,fat32格式
boot分区384M,fat32格式,也就是说esp分区和boot分区一共512M
其他硬盘空间划分为一个lvm卷
在这个lvm卷中创建一个swap分区作为系统的swap
把这个lvm卷剩余的空间创建一个btrfs分区作为/分区,在这步其实也可以创建多个分区分别给/,/usr,/home等,但是这不是十分重要的,所以我没有费心处理。
3.3.2 parted分区
fdisk有点古老,可以设置的内容也比较少,比如卷标之类的不能设置,也可以使用parted命令
parted -a optimal
进入分区模式后,可以用命令help查看用法。
按照以下命令创建分区。
如果是UEFI模式启动
# Make new GPT partition table
mklabel gpt
# Create an UEFI ESP
mkpart primary 1MiB 129MiB
name 1 efi
set 1 esp on
# Create a boot partition
mkpart primary 129MiB 513MiB
name 2 boot
set 2 boot on
# Create a LVM partition
mkpart primary 513MiB 100%
name 3 data-encrypted
set 3 lvm on
# Check that everything is correct and quit
quit
如果是BIOS模式启动
# Make new GPT partition table
mklabel gpt
# Create a BIOS Boot partition
mkpart primary 1MiB 129MiB
name 1 biosboot
set 1 bios_grub on
# Create a boot partition
mkpart primary 129MiB 513MiB
name 2 boot
set 2 boot on
# Create a LVM partition
mkpart primary 513MiB 100%
name 3 data-encrypted
set 3 lvm on
# Check that everything is correct and quit
quit
BIOS模式MBR分区不支持2T以上的硬盘,所以现在即使是创建分区也都是用UEFI模式GPT分区。这里之所以有区别,仅仅是考虑到将来启动的时候主板采用的启动模式。说到底还是建议使用UEFI模式。
3.4 lvm分区
剩下的第3个分区我打算创建lvm,所以操作有所不同。
创建lvm卷的时候可以加密也可以不加密,这里把两种都记录一下。
3.4.1 创建加密的lvm
如果你希望在lvm上开启加密,那么
cryptsetup luksFormat -c aes-xts-plain64 -s 512
会提示你是否创建加密分区,输入yes确认,然后按照提示输入加密的密码,这个分区就被加密了。然后使用命令
cryptsetup luksOpen lvm
在这个加密分区上创建lvm卷,这里会提示你输入加密的密码,把刚才的密码输入进去。注意这个命令最后的参数“lvm”这个成为了设备名,所以下一步使用命令
pvcreate /dev/lvm # lvm就是刚刚创建的加密分区名
创建lvm的物理卷
3.4.2 创建非加密的lvm
个人使用的电脑如果没必要加密,可以跳过加密这一步,直接创建lvm物理卷。
pvcreate
3.4.3 创建卷组
输入命令
vgcreate system # 在/dev/sdb3物理卷上创建卷组system
创建卷组
3.4.4 创建lvm分区
不论是加密还是不加密,我创建的卷组名都叫system。卷组创建好以后就可以创建分区,输入命令
lvcreate -L 8G -n swap system # 在system卷组内创建swap分区
lvcreate -l 100%VG -n root system # 在system卷组内创建/分区,使用剩余的全部空间
如果要创建更多的分区也是可以的,推荐在lvm卷组内创建分区。
3.5 格式化分区
创建分区的时候是不能指定文件系统的,所以创建分区完成后,使用以下命令格式化对应分区创建文件系统
mkfs.vfat -F32 # 创建fat文件系统用于UEFI启动,根据UEFI规范,其实fat12、fat16、fat32都可以,但是gentoo官方推荐fat32
mkfs.vfat -F32 # 创建fat32文件系统作为/boot分区
这里我采用了fat32格式的boot分区,也可以用ext4的。无论如何boot分区都必须是一个单独的primary分区,否则启动容易失败。
efi/esp分区必须是fat的
处理swap分区
mkswap /dev/system/swap # 刚才创建的lvm逻辑卷
swapon /dev/system/swap # 启用swap分区
处理根分区
mkfs.btrfs -L root /dev/system/root # 刚刚创建的逻辑卷
mkdir -p /mnt/gentoo # 如果是gentoo的Live GUI,这个目录已经建好了,其他发行版的Live GUI,需要新创建这个目录
mount /dev/system/root /mnt/gentoo # 把格式化后的分区挂在到一个目录上备用,通常是/mnt/gentoo
如果说这块硬盘之前安装过其他的linux系统,并且已经分好区了,那么前面的分区操作都不需要,直接执行这里的格式化就可以,只要用lsblk和blkid命令查看一下分区情况,确保mkfs时选择正确的分区即可。
3.6 分区错误的处理
如果分区过程中,比如说在创建lvm分区的时候,竟然自动创建了逻辑卷,那就说明之前的分区表有问题;再比如说在安装grub的时候,提示分区大小不一致……等等错误
要想彻底处理这些错误,最好是把lvm的分区全部删掉,用lvremove、vgremove、pvremove命令移除逻辑卷、逻辑卷组、物理卷,然后再重新创建lvm分区。
如果在创建lvm分区的时候,发现子分区竟然被自动创建了,那么几乎可以肯定分区出了错误,这个时候必须要这么处理。
4 安装stage3
很多安装教程都是建议用户使用curl和wget来下载stage3的压缩包。因为我用的是Live GUI,所以我用浏览器到镜像站点下载的stage3的压缩包。我下载的是desktop profile openrc。这是因为我考虑到将来可能会用到FreeBSD,而systemd和FreeBSD不兼容,迁移的时候会麻烦。
后面涉及到openrc和systemd的区别的地方,会有额外说明
4.1 挂载文件系统
stage3的压缩包下载以后,放到/mnt/gentoo目录,然后解压缩。因为用的是Live GUI,所以也可以用图形界面的工具解压缩到/mnt/gentoo目录
mount /dev/system/root /mnt/gentoo # 挂载根文件系统,前面已经挂载过了就不需要再挂载了
tar -xpvf stage3*.tar.xz # 解压缩文件
rm stage3*.tar.xz # 删除不再需要的压缩包
这样stage3的文件内容就都解压缩到/mnt/gentoo目录下了,而/mnt/gentoo其实是mount的/dev/sdb3这个lvm中的/分区。
解压缩以后,/mnt/gentoo目录下已经有了合适的目录结构,这个时候就可以挂载boot分区了。除了刚刚创建的boot分区以外,还要把UEFI启动的EFI分区也要挂载上去。
mount /mnt/gentoo/boot # 挂载boot分区
mkdir -p /mnt/gentoo/boot/efi
mount /mnt/gentoo/boot/efi # 挂载EFI/ESP分区
如果前面创建过除了/和/boot以外的其他分区,这时候也要一起挂载,比如说/usr分区。
stage3的/boot目录是空的,但是其他目录可不是空的,挂载的话需要额外处理。
比如说stage3解压缩的时候/usr已经有内容了,所以要先把已经解压缩的/usr重命名——比如说/usr.bak,然后创建一个空的/usr目录,再挂载分区到这个空的/usr,再把之前重命名的/usr.bak里面的内容移动到这个新创建的空的/usr目录里,最后再把之前那个重命名的/usr.bak删掉。
如果说除了/usr还有其他分区,比如/var或者/home,操作方法类似。
为了后续在chroot中运行,proc、sys、dev也挂载上去。
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
#mount --make-rslave /mnt/gentoo/sys #安装systemd需要
mount --rbind /dev /mnt/gentoo/dev
#mount --make-rslave /mnt/gentoo/dev #安装systemd需要
我选择的服务管理器是openrc,所以对于sys和dev不需要太多处理,如果选择systemd,还要额外处理一下。
shm是共享内存,当使用非Gentoo安装盘时,一些发行版会将/dev/shm符号链接到/run/shm/,在chroot后将变得不可用。为了让/dev/shm/是一个正常挂载的tmpfs,可以这样修复:
test -L /dev/shm && rm /dev/shm && mkdir /dev/shm
mount --types tmpfs --options nosuid,nodev,noexec shm /dev/shm
chmod 1777 /dev/shm
4.2 校对时间
因为gentoo安装过程中会下载很多文件,而且会对比文件的新旧,如果计算机本身的时间有问题,那就可能会在对比文件新旧的过程中产生一些不必要的麻烦,这里可以用命令行对一下时间。前面已经联通了网络,推荐自动对时
#自动或者手动设置时间
ntpd -q -g #自动
date <021822162021> #手动设置,这个例子是2021年11月27日19点16分
如果计算机的时间没问题,不进行这步操作也没事
4.3 复制DNS
因为当前的Live GUI已经识别了网卡,网络都已经配置好了,所以直接把当前系统的DNS设置复制到新的stage3里
cp -L /etc/resolv.conf /mnt/gentoo/etc/
4.4 配置编译选项
接下来要通过编辑/mnt/gentoo/etc/portage/make.conf文件来设置镜像站点以及编译选项,该操作也可以在切换到stage3以后进行,只要把路径变更一下就可以。
该操作需要用到mirrorselect和cpuid2cpuflags这两个工具,而这两个工具虽然包含在Gentoo启动盘里,却并没有包含在stage3中,所以我还是用包含了这两个工具的宿主机——也就是Gentoo Live GUI——进行了相关操作。
不管是用这两个工具处理,还是直接编辑,其实都是可以的,如果直接编辑的话直接切换到stage3里操作也没有问题。
4.4.1 设置镜像站点
Gentoo安装过程中会从服务器下载软件的源代码,下载到本地后编译生成二进制文件。为了改善下载的速度,我们把镜像站点选为离我们较近的站点。这个mirrorselect命令就是Gentoo官方启动盘中自带的一个工具,其他的启动盘里没有这个工具。
mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf
虽然是字符界面,但是会弹出老式的那种字符界面的图形菜单(TUI)供选择,根据自己的网络状态选取就好。
如果采用其他的启动盘,没有mirrorselect工具,也可以直接编辑
nano /mnt/gentoo/etc/portage/make.conf
里面的内容增加
GENTOO_MIRRORS="http://mirror.nju.edu.cn/gentoo/"
我这里用的是南京大学的镜像
4.4.2 编译优化选项
其实编译优化选项就是在编译的时候给编译器的优化参数。
可以参考以下几个链接。如果知道自己的cpu型号,可以直接指定;如果不知道自己的cpu型号,可以指定-march=native -mtune=native;如果是分布式编译,那就千万不要用-march=native -mtune=native,而是必须要指定cpu型号。当然,大部分网友用的应该都是本地编译,几乎很少有人会用分布式编译。
Linux Manpages Online - man.cx manual pages
GCC optimization - Gentoo wiki
Safe CFLAGS - Gentoo wiki
x86 Options (Using the GNU Compiler Collection (GCC))
COMMON_FLAGS = "-march=native -mtune=native -O2 -pipe"
# -march=native -mtune=native 针对当前cpu优化
# -O2 中等优化,比较稳妥,如果要激进的优化可以使用-O3,但是会有一些危险的汇编代码可能会导致计算出错
# -pipe 在编译期使用管线IO而不是临时文件,通过增加内存占用的代价加快编译速度
MAKEOPTS = "-j12" # 采用多线程编译,加快编译速度。根据CPU线程数和内存填写,数字可以是CPU核心数,但是数字不能超过内存G数的一半
CFLAGS="${COMMON_FLAGS}" # C编译器的优化选项 CXXFLAGS="${COMMON_FLAGS}" # C++编译器的优化选项 FCFLAGS="${COMMON_FLAGS}" # Fortran 9x编译器的优化选项,其实和FFLAGS没啥差别 FFLAGS="${COMMON_FLAGS}" # Fortran编译器的优化选项
还可以通过命令
cpuid2cpuflags
检测当前cpu支持的指令集,并通过在/mnt/gentoo/etc/portage/make.conf中增加对应内容,开启对该cpu所拥有指令集的支持。比如说Ryzen 5的cpu指令集支持如下
CPU_FLAGS_X86="aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sha sse sse2 sse3 sse4_1 sse4_2 sse4a ssse3 vpclmulqdq"
cpuid2cpuflags也是Gentoo官方启动盘中自带的一个工具,其他系统的启动盘可能没有带这个工具
4.4.3 本地化选项
Localization/Guide - Gentoo wiki
L10N="en en-US zh zh-CN" # 增加额外的语言支持 LINGUAS="en en_US zh zh_CN" # 一些基于gettext的软件包会使用这个参数来判断本地化,这个参数会使一些软件隐性的跳过locale参数,包管理器可能会无法判断locale参数,如果这个包要二次分发,那么不能设置这个参数
4.4.4 USE选项
Gentoo通过USE选项来调整软件在编译和配置时的参数,在这个配置文件中可以增加一些全局参数。而如果想在各个软件包中单独设置参数,则可以在/etc/portage/package.use/目录下的各个文件来调整,emerge系统并不介意具体的文件名,所以当你想要调整gcc的参数时,完全可以把配置文件命名为cgg,不过从系统管理的角度讲,最好是命名为目录名或者软件包名。
在设定了系统方案system profile以后,系统方案会给出一套全局的USE参数,一般来讲不需要修改。如果有需要的话可以按照下面的格式来修改
USE="wayland"
特别强调,除非是全局都需要,否则不要在/etc/portage/make.conf中修改,而是在/etc/portage/package.use目录下单独设定各个软件包所需的USE参数
在USE选项中,还可以增加hardened参数来提高安全性,不过这额外的安全性可能会在未来带来使用上的不便,比如SELinux
加固的Gentoo (Hardened Gentoo) - Gentoo wiki
另外如果需要使用一些可互换的库,必要时切换使用,那么可以参考这个维基
https://wiki.gentoo.org/wiki/Eselect
使用eselect进行切换
要特别强调的是,下面这个页面
https://wiki.gentoo.org/wiki/Blas-lapack-switch
已经过时了,因为2025年9月
https://public-inbox.gentoo.org/gentoo-dev/db65740b619e7b2413ac2b4b06f94db960f3e46e.camel@gentoo.org/
官方开发者决定把切换不同BLAS/LAPACK实现的手段更改为flexiblas,而eselect-blas/eselect-lapack/eselect-cblas将被逐步废弃
flxiblas的用法可以参照
https://docs.icer.msu.edu/Using_BLAS_and_FlexiBLAS_to_speed_up_linear_algebra_operations/
比如说在编译一段代码的时候
gcc -lflexiblas mycode.c -o mycode
执行这段代码的时候
FLEXIBLAS=/usr/lib64/libopenblas.so ./mycode
就可以调用速度优化的openblas而不是速度较慢的reference lapack
也可以
flexiblas list
列出所有BLAS实现,然后设定环境变量
flexiblas default
这样每次运行需要调用BLAS的时候就会自动调用,而不是每次单独指定了
4.4.5 显卡VIDEO_CARDS
4.4.5.1 如果是nvidia的显卡
VIDEO_CARDS="nvidia" # 闭源驱动
# 或者
VIDEO_CARDS="nouveau" # 开源驱动
一般来讲,闭源驱动性能要好一些,但是一旦内核更新,可能会丢失驱动,导致图形界面起不来。开源驱动不必担心丢失驱动,但是性能差很多。
当然,也可以两个都装,然后在启动的时候切换选择。
nouveau & nvidia-drivers switching - Gentoo wiki
不过切换显卡驱动是一件非常繁琐的工作。
4.4.5.2 如果是intel的显卡
VIDEO_CARDS="intel" # intel开源驱动
intel的开源驱动会通过依赖关系引入clang。这就带来一个新的问题:系统默认编译器的选择。
在选择系统方案system profile的时候,会选择系统默认编译器,如果选gcc,那么有很多备选项,甚至还有桌面环境。而如果选择llvm/clang,就只能从openrc和systemd这两个基础系统中选择1个,至于hardened/musl/multilib/desktop之类的就都没有了,如果想要安装桌面或者其他更丰富的需求,相对来讲没有那么方便。
如果希望整个系统都用统一的编译器gcc来编译的话,在这里引入clang会引入额外的东西,对于心理洁癖这会很不爽。而且如果选择以gcc作为基础,安装clang的时候要先用gcc编译clang,而编译clang很耗时,不仅初次安装很耗时,未来每次升级都很耗时。
当然,如果希望整个系统都用统一的编译器clang来编译的话,引入clang倒是无所谓。但是如果想要做hardened/musl/multilib/desktop之类的方案就要自己手动处理,也很麻烦。
说到底,如果硬件需要,也是没办法的事。
4.4.5.3 如果是ATI的显卡
VIDEO_CARDS="amdgpu radeon radeonsi" # amd开源驱动
ATI开源了它的显卡驱动,所以在Linux世界,ATI的卡最简单,什么都不用操心。我的卡就是ATI的。
如果不设置VIDEO_CARDS,那么除了nvidia的闭源驱动以外,这里提到的几项都会加进去。 没错,intel加进去也会引入clang,不仅会导致耗时还会在系统里增加很多额外的东西。当然,这样的话兼容性是最好的,即使将来换了硬件也不必担心。用户需要在“简洁”与“兼容”之间做一个权衡。
4.4.6 许可证
ACCEPT_LICENSE=“*” # 对任何软件的许可协议都接受,这样在emerge的时候不会每编译一个软件包都需要你来接受许可协议,而是自动接受,然后自动处理后续的软件包
4.4.7 其他选项
其实还可以添加INPUT_DEVICES这个选项。不过我用的是台式机,不需要针对触摸板或者指点杆做特殊处理。如果需要用游戏手柄、手写板之类的,还是要设置一下的。
4.5 切换到stage3
前面所有的操作都是在Live GUI系统里做的,从这里开始才会切换到安装好的stage3系统中。
接下来切换到刚刚解压缩出来的stage3了
chroot /mnt/gentoo /bin/bash
source /etc/profile
export PS1="(chroot) $PS1"
通过chroot命令,当前命令行——也就是konsole里的标签页——也就切换到了新解压缩出来的stage3系统中。接下来的所有操作就都是在stage3新系统里的操作
4.6 设定stage3
4.6.1 源同步
4.6.1.1 设置源
编辑配置文件
mkdir -p /etc/portage/repos.conf
cp /usr/share/portage/config/repos.conf /etc/portage/repos.conf/gentoo.conf
nano /etc/portage/repos.conf/gentoo.conf
将
sync-uri = rsync://rsync.gentoo.org/gentoo-portage
修改为
sync-uri = rsync://mirror.nju.edu.cn/gentoo-portage
这样就把官方的portage源切换为南京大学的镜像。
4.6.1.2 执行源同步
emerge-webrsync # 下载Gentoo ebuild数据库快照,稍陈旧,大概2天前,一般来讲足够用了
emerge --sync # 更新Gentoo ebuild存储库,最新的,大概几个小时前。这步网络比较慢,具体要多久视你的网络情况而定,也是切换本地源的原因。其实这么新也没啥用,不推荐
4.6.2 生成fstab
这步操作的顺序比较自由,在解压缩stage3压缩包之后(也就是说还在宿主机Live GUI环境,没有切换到stage3时)、重启之前都可以。
linux系统启动的时候会读取/etc/fstab文件并按照其内容挂载文件系统。内容类似下面
/dev/system/root / btrfs defaults 0 0
/dev/system/swap swap swap defaults 0 0 UUID="A84A-FDFE" /boot vfat utf8,codepage=936 0 2 UUID=BA13-AD23 /boot/efi vfat utf8,codepage=936 0 2
每行代表一个块设备(或者可以理解为一个分区),每行分成6段,分别代表以下含义:
第1段:块设备。可能是/dev目录下的设备名,也可能是UUID、Label或者LV path。如果是UUID,等号后面的内容可以用双引号包起来,也可以不包
第2段:挂载点。挂载的目录位置
第3段:文件系统格式
第4段:参数。比如编码、读写权限、配额等等
第5段:是否做dump备份
第6段:磁盘检查
更多介绍可以参考
https://wiki.debian.org/fstab
在开机的时候,系统会按照fstab自动挂载其中的分区。其他块设备如果需要挂载,可以在系统启动后通过其他方法挂载,而不建议通过fstab在启动阶段挂载。
这是因为如果多个硬盘的存在,增减硬盘的时候,那么/dev/sdx中的x可能会变,而fstab不会自动改变,这样在系统启动的时候fstab就会出错,并进而导致系统故障,所以fstab里也要避免使用这种可能会变的设备名。增减硬盘UUID是不变的,为了避免类似错误,尽量使用UUID而不是dev名。
所以fstab应该仅包含开机所需的最少的块设备的配置。其中swap和根目录是必须的。如果启动目录/boot和/boot/efi也是独立分区的话,也是必须的。另外,如果/usr、/var、/home是独立分区,也是启动阶段必须的。其他的如/bin、/sbin等,虽然也是开机阶段必须的,但一般不会把它们单独分区。而/var/db、/var/log、/var/www、/mnt/xxx、/run/media/xxx之类的不是启动必须的,而是启动后,运行各种程序时候才需要的,它们可以不放在fstab里。
前面分区的时候单独划分了boot分区,所以就要在fstab中有一行。例子中/boot的UUID就是之前命令blkid输出的挂载到/boot的/dev/sda2的UUID,每次格式化mkfs之后都会生成一个新的。所以如果将来系统管理的时候有格式化的操作,记得要把这个UUID改过来。
根分区和swap分区用的是lvm的卷,使用的其实是lvdisplay显示的LV Path
如果这块硬盘之前安装过其他的Linux系统,可以不用进行分区操作,而是直接格式化。在最开始最好是把之前Linux系统的fstab备份出来,以作参考。要注意的是格式化后UUID会变,所以在fstab中需要做相应的修改。
想获得各个分区的UUID,可以运行以下命令
blkid
4.6.2.1 使用genfstab工具
手动编辑fstab出错的可能比较大,所以也可以使用genfstab工具。但是stage3中默认没有自带这个工具,所以需要emerge安装,这也是我为什么要把这步操作放在源同步之后。
emerge --ask sys-fs/genfstab
genfstab --help
然后根据提示操作。
在fstab中,一个基本原则就是:独立分区的用UUID,lvm分区的用逻辑卷路径名。所以即使是genfstab生成的内容,最好也是分两次生成,一次用逻辑卷路径名,一次用UUID,然后拼接到/etc/fstab里。也可以以逻辑卷路径名的为基础,然后把需要换成UUID的换成blkid的显示内容。
4.6.3 设置时区
System time - Gentoo wiki
4.6.3.1 现代的处理方法
通过以下命令可以查看可用的时区
ls /usr/share/zoneinfo
如果有子目录的话,意味着里面还有更多的时区选项,比如
ls /usr/share/zoneinfo/Asia
就可以看到Shanghai
根据可选的时区设置时区,比如说我国使用的是
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
4.6.3.2 老式的处理方法
以前老式的处理方法是这样的:先编辑/etc/timezone文件,里面的内容就是时区
Asia/Shanghai
然后更新系统设置
emerge --config sys-libs/timezone-data
这种老式的更新时区的方法,更新时区设定这步操作必须要在源同步之后进行,因为更新时区设定这步操作需要读取/var/db/repos/gentoo目录的内容,而前面源同步emerge-websync的时候会把源服务器的数据库同步到/var/db/repos/gentoo目录。对于一个新的系统,在源同步emerge-webrsync之前的时候这个目录是空的,所以必须要在源同步之后才能执行更新时区设定。而如果要从源同步该数据库到本地,需要对比本地时间和源服务器的时间,而如果本地时间错误,可能会导致源同步失败。两者形成了循环依赖。因此,前面校对时间的操作必须要在Live GUI宿主机系统完成,而不能在chroot后来做。
实际上这种老式的处理方法就是创建了/etc/localtime的软链接指向/usr/share/zoneinfo下的时区文件,所以没必要这么处理。老式的方法建议放弃,还是推荐新式的方法。
4.6.4 设定系统方案system profile
eselect profile list # 列出备选的系统方案
eselect profile set
首先是列出备选的系统方案,然后根据清单选择
如果想要安装桌面系统,最好这步选好对应的桌面系统。虽然可以由desktop基础来安装桌面系统的软件包,但是容易出问题,因为profile里有一些特别的USE设定。
如果选择kde桌面,则最好选择plasma
如果选择gnome桌面,则最好选择gnome
选好以后可以查看该方案的USE
emerge --info | grep ^USE
输出内容非常多
如果还想看更多的USE,可以打开/var/db/repos/gentoo/profiles/use.desc查看
4.6.5 安装cpuid2cpuflags
在Live GUI中,cpuid2cpuflags这个工具是有的,但是到了stage3里面,这个工具默认是没有自带的,为了后续可能用到,这里要安装一下
emerge --ask app-portage/cpuid2cpuflags
如果前面用的Live GUI不是Gentoo的,而是其他发行版的,没有cpuid2cpuflags工具,因而在前面编辑/etc/portage/make.conf的时候没有添加CPU_FLAGS_X86的话,现在有了这个工具就可以添加这个选项了。
添加过这个选项以后,照理说需要完全更新系统,不过现在不用急着更新,后面其他的设置完成以后一起更新。
4.6.6 设置locale
nano /etc/locale.gen
里面的内容
en_US ISO-8859-1 en_US.UTF-8 UTF-8 zh_CN.GB18030 GB18030 zh_CN.UTF-8 UTF-8
# GB18030已经覆盖了GBK和GB2312,更何况在Linux系统,基本上大家都会选UTF-8,其实后面两个不设置也没事
# zh_CN.GBK GBK # zh_CN.GB2312 GB2312
早年,Gentoo官方提供的默认配置文件中只有en、ja等少数几个例子。在2025年9月的更新后,Gentoo官方提供的默认配置文件中,提供了UTF8所支持的所有语言的备选项,只要删掉对应行行首的注释就可启用。如果用户不在系统里用ISO-8859-1和GB18030的话,只启用UTF8也是完全可以的。如果在应用程序里需要ISO-8859-1或者GB18030的话,可以在应用程序里单独处理,系统里没必要处理了。
然后运行命令
locale-gen # 生成本地化文件
eselect locale list # 列出本地化选项
eselect locale set
编辑/etc/env.d/02locale文件
LANG="zh_CN.utf8" LC_COLLATE="C.utf8"
刷新本地化环境变量
env-update # 更新系统环境
source /etc/profile # 更新当前bash
export PS1="(chroot) $PS1" # 当前bash提示符被重置后,再改为合适的提示符,主要是避免误认
4.6.7 更新gcc
有些时候系统内可能会有多个编译器,这主要是考虑到一些二进制分发的软件的兼容性。但是为了保证系统自身的兼容性,在编译整个系统的时候最好是使用同一个编译器。另外一般来说新版的gcc不仅自身运行速度(编译速度)会更快,而且生成的二进制代码也要更快一些。所以要设置一下系统默认编译器。
gcc-config --list-profiles # 查看备选的gcc
gcc-config 2
如果是新安装的系统,通常候选的gcc只有1个版本,所以也无所谓了。
如果过了一段时间以后有了新的gcc,在emerge升级系统的时候会安装新的gcc,到时候也可以这么切换默认gcc。
4.6.8 更新系统
前面所有的设置完成以后,就可以用新的参数重新编译整个stage3,然后从这个重新编译的stage3继续后面的安装。
emerge --ask --verbose --update --deep --newuse @world #更新@world集(系统升级、profile构建stage3、use标记变化时需要)
emerge -avuDN @world # 也可以用缩写
系统更新以后,电脑上的stage3系统就相当于全部重新编译了一遍,编译优化参数就是之前设置的COMMON_FLAGS。现在这个stage3系统的速度应该是有一定的提升的,不能说很大,因为目前这个系统里面对cpu占用比较多的程序暂时还没有。
4.6.9 定制内核
更新固件。AMD的CPU微代码也在里面。
emerge --ask sys-kernel/linux-firmware # 更新固件
Intel的CPU微代码有一个单独的包
echo "sys-firmware/intel-microcode initramfs" > /etc/portage/package.use/intel-microcode
emerge --ask sys-firmware/intel-microcode
安装内核源代码,注意不是内核
emerge --ask sys-kernel/gentoo-sources # 安装源码包
eselect kernel list # 列出系统中有的源码包
eselect kernel set
ls -l /usr/src/linux # 检查一下源码包是否存在
默认情况下,内核编译工具都会到/usr/src/linux目录去找内核源代码,而在执行eselect kernel set
安装好内核源代码以后到/usr/src目录下看看找到源代码的目录,已经使用eselect选择过,genkernel工具会自动读取选取的这个源码包
安装内核编译工具
emerge --ask sys-kernel/genkernel
调整内核参数
cd /etc
cp -p genkernel.conf genkernel.conf.ORIG # 备份旧的配置文件
nano genkernel.conf
/etc/genkernel.conf的内容中
MAKEOPTS="$(portageq envvar MAKEOPTS)" LVM="yes" # 我用了lvm
LUKS="yes" # 如果之前选择了加密的lvm就是必需的,否则不必
BTRFS="yes" # 我用了btrfs文件系统
MICROCODE="all" # 默认是all,会使得编译生成的kernel体积增大,可以针对intel或者amd的cpu单独设定以减小kernel的体积。因为我的电脑主要用于大规模并行计算,所以对运行速度要求高,对启动速度以及这么微小的内存占用不敏感,所以我没改
MICROCODE_INITRAMFS="no" # 默认是no,大多数情况下no没有问题,但是某些intel的cpu需要设定为yes,否则启动会出问题。我的cpu是amd的,不用改
FIRMWARE_INSTALL="no" # 默认是no,如果设定为yes会和前面安装的sys-kernel/linux-firmware冲突。随内核更新的这部分firmware兼容性肯定是可以保证的,但是相比于sys-kernel/linux-firmware稍微旧一些,而且也不好更新,毕竟内嵌在kernel里的firmware每次更新都要更新kernel
BOOTLOADER="no" # 默认是no,如果设定为yes,则会在安装过程中修改grub.cfg文件自动添加启动项,但是如果使用其他启动软件比如说另一个Linux发行版的grub或者systemd-boot,就会出问题。所以我决定后面单独处理grub
DEFAULT_KERNEL_SOURCE="/usr/src/linux" # 这是一个软链接指向eselect kernel set所指定的内核源码目录,执行eselect kernel set
其他的选项看自己的实际情况。如果需要对其他文件系统的支持,比如说xfs、zfs等,也可以添加。
安装硬件探测工具
emerge --ask sys-apps/pciutils # 安装包含lspci命令的sys-apps/pciutils包
配置并编译内核
genkernel --menuconfig all # 需要再调整参数的用--menuconfig,不需要多调整的可以不加这个参数
如果需要添加其他参数,可以参考维基
Genkernel - Gentoo wiki
可以编辑/etc/genkernel.conf文件,也可以在运行genkernel命令的时候添加命令行参数。
genkernel提供了通用的内核配置文件(好像借鉴的Fedora Core的内核配置),会编译内核和initramfs,然后将生成的二进制文件安装到适当的位置。它提供了系统首次启动时最小的常规硬件支持,并允许将来自定义内核配置以及对内核额外升级。
但是这个“通用”的内核配置文件出于通用性的考虑,不仅选项没有kernel自带的选项那么多,生成的内核也稍微大了一点。通过小心的裁剪可以让内核缩小不少,--menuconfig参数会进入kernel的配置界面,选项非常丰富,远比/etc/genkernel.conf文件丰富得多。
因为我的电脑主要用于大规模并行计算,所以对运行速度要求高,对启动速度以及微小的内存占用不敏感。修改menuconfig的上千个选项耗费的心神是在太大,而所获的收益对我而言没有那么多。所以我没改,直接用默认的。如果是嵌入式设备,对内核体积和内存占用非常敏感,那还是要改的。
Gentoo官方wiki说:“虽然使用genkernel维护内核可以让系统管理员对系统内核,initramfs和其他选项更新时有更多的操作,但当新的源代码发行时,却会投入更多的时间和精力去更新内核。”
如果你不喜欢genkernel工具,也可以自己动手编译kernel,甚至可以不用Gentoo官方的kernel source
我本人觉得genkernel很方便。本来还想写一下手动编译内核的流程,后来想想还是算了,毕竟我上次编译内核是很多年前,当年的方法和现在差别很大。
早几年的文章中会说,genkernel只是编译内核,不会安装,还需要一条额外的命令来安装
genkernel --install initramfs
现在已经不需要了,只要在/etc/genkernel.conf配置
# Install to $BOOTDIR INSTALL="yes"
genkernel就会在编译完成后,自动安装。其实这个选项默认已经开启
4.6.9.1 安装额外的文件系统支持
LVM - Gentoo wiki
Btrfs - Gentoo wiki
emerge --ask sys-fs/btrfs-progs # btrfs支持
echo "sys-fs/lvm2 lvm" > /etc/portage/package.use/lvm2 # 对lvm的支持调整一下USE参数
emerge --ask sys-fs/lvm2 # 对lvm的支持
rc-update add lvm boot # openrc系统设定在启动阶段载入lvm支持
# systemctl enable lvm2-monitor.service # systemd
emerge --ask sys-fs/ntfs3g # 对ntfs的支持
emerge --ask sys-fs/fuse-exfat sys-fs/exfatprogs # 对exfat的支持,大容量U盘用
对lvm的支持要特别注意,如果不把它加入到boot启动阶段,将来开机会出问题
如果需要支持其他的文件系统,如xfs、zfs等,除了要在内核中开启对应的选项,在这里也需要添加对应的支持软件。
为了把lvm的支持加入到启动阶段,需要设定系统服务。有些时候一个软件的服务名和包的名可能不太一样,尤其是lvm,所以需要查找一下它用的到底是什么服务名。
4.6.9.2 systemd服务
使用systemd,如果找不到服务名那么可以
ls /usr/lib/systemd
ls /lib/systemd
查看系统中有的服务,后缀为service的文件都是服务
然后用
systemctl enable
把服务加入启动,其实就是在/etc/systemd/system/sysinit.target.wants目录下创建一个指向实际服务配置文件的软链接
4.9.6.3 openrc服务
如果需要使用openrc,那么可以
ls /etc/rc.d/init.d
ls /etc/init.d
查看系统中有的服务
另外/etc/init.d就是指向/etc/rc.d/init.d的软链接
而rc-update命令就是在编辑/etc/rc.conf文件,所以其实手动编辑效果是一样的。没错,openrc会从前往后执行,并且不会自动解决依赖关系,完全靠管理员手动管理,所以lvm一定要放在boot段。后面提到的dbus和sddm类似,必须要把dbus放在sddm前面。
到这里,stage3就已经达到可以启动并运行的程度。
4.6.10 安装引导软件grub
如果不安装引导软件,而是采用其他的引导程序,其实也可以引导。比如说,电脑上有另外一个Linux,那么可以通过那个Linux的grub来引导这个gentoo;或者也可以通过可移动媒体来引导;或者其他的引导程序都可以。当然,如果电脑上只有一个Linux,而且不想每次开机都要插U盘,那就安装grub吧
在/etc/portage/make.conf中增加grub的配置内容
GRUB_PLATFORMS="efi-64" # x86_64 UEFI支持,目前最流行的
# GRUB_PLATFORMS="efi-32" # x86 i386 UEFI支持,因为32位cpu时代基本没有UEFI启动的设备,所以该选项其实没什么用武之地
# GRUB_PLATFORMS="pc" # x86 i386 BIOS MBR支持,古老
# GRUB_PLATFORMS="pc efi-64" # x86 i386 BIOS MBR支持,同时支持x86_64 UEFI,也就是同时支持老旧的和新的
# GRUB_PLATFORMS="pc efi-64 efi-32" # 同时支持:x86 i386 BIOS MBR,x86_64 UEFI ,x86 i386 UEFI
其实这一步在前面设定编译选项编辑make.conf的时候,就可以做,不过因为这个跟grub直接相关,所以我还是特别把这步操作放在这里记录。
增加grub对lvm的支持
echo "sys-boot/grub device-mapper" > /etc/portage/package.use/grub # 修改grub编译的USE选项
编译grub
emerge --ask sys-boot/grub
把grub安装到引导存储器上。安装前记得用lsblk命令查看一下块设备的清单,不要选错了
grub-install --target=x86_64-efi --efi-directory=/boot/efi
我是在一整个硬盘上安装,不用grub做多操作系统启动,所以没有让grub通过os-probe探测其他操作系统。当我使用多系统时,我会在开机时按delete进入BIOS选择启动的硬盘,以此来启动不同的操作系统
找到加密lvm的UUID
blkid
该命令会列出各个存储设备的信息,其中最重要的是UUID
配置grub
nano /etc/default/grub
里面的内容
GRUB_CMDLINE_LINUX_DEFAULT="dolvm crypt_root=UUID=
介绍一下这几个选项
dolvm,开启这个参数才能让grub在启动时支持lvm文件系统格式
crypt_root和crypt_swap支持加密卷。如果前面使用了加密的lvm,则必须要设置;如果没有加密,这两个不加也没事
root指的是根目录,注意这里root对应的值是lvdisplay命令显示的内容,也可以用lsblk显示的内容
生成grub配置文件
grub-mkconfig -o /boot/grub/grub.cfg
到这里stage3就已经安装到硬盘上,而且启动器grub也安装好了,stage3基础就算是配置好了,电脑重启的时候就可以通过刚才安装的grub引导进入刚刚安装好的stage3。
最近还出现了一个新的引导软件systemd-boot,宣称比grub更加轻量级。systemd-boot顾名思义只能用在systemd系统上,而我选的openrc。而且我觉得引导软件又不会占用太多的系统资源,也不差启动那半秒钟,所以我最后决定继续用grub。
接下来要进行一些额外的配置
5 初次启动前配置
5.1 配置网络
5.1.1 使用networkmanager管理网络
NetworkManager - Gentoo wiki
emerge --ask net-misc/networkmanager # NetworkManager支持,网络连接管理服务,自动识别网卡,自动dhcp
rc-update add NetworkManager default # NetworkManager随系统启动
# systemctl enable NetworkManager # systemd
rc-update add sshd default #启用开机ssh,将来可以远程登录上来,进行远程操作
我是反对使用netifrc和dhcpcd的,因为networkmanager更适合桌面电脑
有了networkmanager开机启动以后,每次开机网络都会自动配置,自动联网
5.1.2 设置主机名
echo "your_host_name" > /etc/hostname
有一些文章建议编辑/etc/conf.d/hostname,我不建议
另外还要设定一些特定的主机名对应的ip,可以编辑/etc/hosts,一般来讲都是用来指定内网地址或者绕开DNS污染,或者屏蔽掉特定的站点的
systemd可以使用hostnamectl工具在正运行systemd的系统设置系统的主机名。但是,在安装过程中,应当使用systemd-firstboot命令。推荐采用直接编辑的方法。
5.2 一些管理工具
emerge -av app-portage/gentoolkit # gentoo的一些工具
5.3 设置root密码
第一次开机登录的时候使用该密码登录
passwd root
这个时候新系统已经达到可用的状态了,如果不需要桌面,那就可以重启了,用户可以在重启后以root登录,并在新系统完成所有操作。不过在安装好桌面之前,只有命令行可用。如果是服务器系统本来就不安装桌面,倒也无所谓;如果用户需要图形界面,那就麻烦一点。
但是如果希望继续在方便的图形界面操作,建议一直到桌面安装完成再重启,这样一直在Live GUI的图形界面进行后续操作。
6 初次启动的配置
初次启动的时候,直接从grub菜单选择启动内核即可。
启动后以root登录,密码刚才设置过了。
如果没有重启,继续在Live GUI宿主机里以root身份执行后续的操作也是没问题的。
这些设置没有严格的顺序限制,先后顺序随意。在重启前设置其实都可以。
6.1 添加普通用户
创建一个新的普通用户
useradd -m -G users,wheel,pipewire,video,portage -s /bin/bash
passwd
日常情况下可以以这个普通用户登录来使用
6.1.1 设置sudo
安装sudo程序
emerge --ask --verbose app-admin/sudo # sudo支持
如果想要让这个普通用户可以用sudo的话,需要以root编辑/etc/sudoers文件,不过该文件默认是只读的,所以还要先修改权限
chmod u+w /etc/sudoers
nano /etc/sudoers
找到
%wheel ALL=(ALL:ALL) ALL
把这一行前面的注释取消掉。这样整个wheel组的成员都可以使用sudo,这也是为什么前面添加普通用户的时候要把它加入wheel组。
如果不想要整个用户组 都有权sudo,那就设置单个用户
这样这个普通用户就可以使用sudo了
设定好以后,就可以退出root登录,改用普通用户重新登录,后面的操作都可以以普通用户的身份,通过sudo完成。
如果有必要,也可以把/etc/sudoers的文件权限恢复为只读
chmod u-w /etc/sudoers
这么多的文字是为了讲清楚这件事,如果图省事,完全可以用一个命令搞定
sed -i 's/\# \%wheel ALL=(ALL) ALL/\%wheel ALL=(ALL) ALL/g' /etc/sudoers
6.2 计划任务
emerge -av sys-process/cronie # 计划任务
rc-update add cronie default # 计划任务随系统启动
# systemctl enable cronie # systemd系统
6.3 时间同步
6.3.1 时区
前面在安装系统的时候,只是简单设置了一下时区,时区的更多设置要在系统安装好后进行。
对于计算机而言,有2个时钟:硬件时钟和操作系统时钟。
硬件时钟设置为UTC时间,然后在操作系统里设置时区,硬件时钟和操作系统时钟之间有相应的差异,比如说中国北京时间是东八区,就比UTC早8小时,这是Linux系统常见的配置。
Windows不是这样的,Windows会把硬件时钟和操作系统时钟都设置为当地时间,硬件时钟就是当地时钟。
所以如果在Linux运行期间,进行过时间同步,那么硬件时钟就会偏离当地时间,如果这个时候重启进入Windows,在Windows时间同步完成前就会把硬件时钟当作系统时钟来显示,而且没有按照时区进行修正,这样双系统用户就会看到两个系统时间有差异。
想要处理这个问题,就要让两个系统选择一样的时区配置,两种配置哪个都行,但是两个操作系统要统一。
我一般是按照硬件时钟UTC,系统时钟当地时间。
可以这样查看硬件时钟
hwclock --show
对比一下系统时钟就知道现在用的是哪个方案了。
6.3.1.1 使用openrc系统
设置硬件时钟
nano /etc/conf.d/hwclock
里面的内容如下。选其中一个,默认是UTC,我也建议用UTC
clock="local" # 硬件时钟为当地时间
clock="UTC" # 硬件时钟为UTC时间
设定每次启动时从网络上的时间服务器同步时间
rc-update add hwclock boot
6.3.1.2 使用systemd系统
systemd系统不需要管/etc/conf.d/hwclock,这个文件在systemd系统不存在,systemd也不会读取它
systemd自带了一个命令timedatectl来进行系统的时间管理,openrc没有这类功能。通过以下命令可以查看当前时区
timedatectl
或者这个命令也可以查看可用的时区
timedatectl list-timezones
使用下面的命令也可以选择时区
timedatectl set-timezone Asia/Shanghai
设置硬件时钟的种类
timedatectl set-local-rtc 0 # 硬件时钟设置为UTC
timedatectl set-local-rtc 1 # 硬件时钟设置为当地时间
timedatectl还有很多功能,这里就不多介绍了。
不论是openrc还是systemd,设定好以后,每次开机都会连接到网络上的时间服务器做时间同步,时间同步服务有2种方案ntp和chrony
chrony可以替代ntp,功能更丰富。出于兼容性的考虑,各个服务器上运行的可能都是chrony,但是对外提供的接口都是ntp的。
6.3.2 ntp方案
emerge --ask net-misc/ntp # ntp时间校准服务
rc-update add ntp-client default # openrc系统内ntp随系统启动
# systemctl enable ntpdate.service # systemd
6.3.3 chrony方案
emerge --ask net-misc/chrony
# openrc用下面的命令
rc-service chronyd start
rc-update add chronyd default
# systemd用下面的命令
# systemctl start chronyd.service
# systemctl enable chronyd.service
ntp和chrony选一个就行,不能两个都装,如果两个都装了,只能启用一个
7. 安装桌面
如果已经重启进入新系统,此时仍然是root在字符界面登录的状态。如果没有重启进入新系统,那么继续在Live GUI的命令行标签页。
Gentoo推荐的桌面系统有KDE和GNOME两种,这也是Linux世界最常用的两种桌面,这里分别记录。
7.1 安装KDE
7.1.1 KDE的基本安装
KDE - Gentoo wiki
emerge --ask kde-plasma/plasma-meta
emerge --ask kde-plasma/kdeplasma-addons
emerge --ask kde-apps/kde-apps-meta
如果哪个包在安装后提示要进行相应的操作,记得完成操作。其中kde-apps/ark安装后会提示需要安装一些压缩解压缩的后台程序,比如rar/7zip/lrzip
这个过程中,ffmpeg会因为依赖关系而自动安装,另外KDE自带的媒体播放器也会安装,多媒体也就解决了。在gentoo-17.x时代,ffmpeg默认是4.x版本的,到了gentoo-23.x时代,ffmpeg已经更新到6.x版本。
KDE桌面环境自带了一个Falkon的浏览器,其实就是以前的qupzilla。如果不喜欢,可以另外安装Firefox或者Chromium
在2024.9.1,Gentoo把KDE升级到了6.x。这导致了大量问题,最主要的是:还有很多软件包依赖qt5,所以即使升级到了kde6,还是要在系统内安装很多qt5的库和软件,导致系统臃肿,尤其是qtwebengine,编译时间特别长,还要为qt5和qt6分别编译一份,时间加倍。
7.1.2 设置SDDM
SDDM是KDE自带的登录管理器,如果使用桌面系统,默认开机进入SDDM,然后输入用户名和密码登录进入桌面会话。
SDDM - Gentoo wiki
emerge --ask kde-plasma/sddm-kcm # 前面如果安装过KDE,那就已经安装了
usermod -a -G video sddm # 如果sddm用户不在video组内,就无法使用显卡加速,SDDM界面就会特别缓慢
emerge --ask gui-libs/display-manager-init
rc-update add dbus default # sddm依赖dbus,所以必须要添加dbus,而且还必须要在sddm之前添加,很多图形应用——包括gnome中的很多组件都依赖dbus
rc-update add display-manager default # sddm开机启动
rc-update add elogind boot # openrc需要,systemd不需要
# openrc需要3条命令,systemd就简单多了,一条命令就够
# systemd不要设置display-manager,直接设置sddm开机启动
# systemd系统的话会自动分析服务之间的依赖关系,只要设定了sddm启动,systemd会自动把dbus提前启动
# systemctl enable sddm
elogind是systemd的一部分,为了适应openrc系统,gentoo开发组专门把这部分从systemd中剥离出来,做成了elogind。如果elogind没有启动,其实不耽误SDDM的运行,也不耽误KDE或者GNOME,但是在SDDM或者GDM登录界面,将会没有“重启”和“关机”的按钮,想要重启或者关机,只能登录进桌面再操作,或者切换到其他tty再用ctrl+alt+del重启(tty没登录的话可以用快捷键重启,但是不能关机)。也就是说,只有openrc系统需要安装elogind,systemd系统是不需要安装elogind的。
另外有一处还需要单独处理
nano /etc/conf.d/display-manager
里面的内容
DISPLAYMANAGER="sddm" # 这里默认的是xdm,要改过来
到了这个时候,桌面系统已经达到了可用的状态,即使用户的水平不能脱离桌面,到这步也已经可以完全脱离Live GUI系统,重启进入新系统了。
7.1.3 KDE的中文化
到了这步,英文的显示和使用是没有问题的,但是中文显示是小方块,而且没法输入中文。
7.1.3.1 安装中文字体
emerge --ask media-fonts/noto-cjk media-fonts/source-han-sans media-fonts/source-sans media-fonts/source-serif
eselect fontconfig list #查看系统中的所有字体
eselect fontconfig enable
安装以后,KDE的应用程序就能正确显示中文了。
然后在KDE控制面板中设置为中文,从KDE桌面注销后,再次登录KDE后就全都是中文了。
网上很多文章会推荐安装文泉驿字体wqy,但是我个人使用下来感觉noto字体更好看。
7.1.3.2 楷体的处理
字体包会带上arphic字体——也就是楷体,因为字母顺序的原因,安装以后会把系统默认字体改为arphic楷体,我觉得很难看。但是如果删掉arphic字体的话,系统内就没有楷体了,这样在需要楷体的地方就会很麻烦。
既要在系统内保留arphic字体,还要把其他更漂亮的字体优先显示,可以参考这篇帖子
Arch(KDE Plasma)中文化_arch中文输入法-CSDN博客
设置/etc/fonts/51-local.conf来调整字体族的设置,以此保证noto字体的优先级高于思源字体和名流字体。这样arphic字体(名流字体)的楷体就不会鹊巢鸠占,默认显示还是noto字体。
不过我偷了点懒,我觉得openSUSE的字体配置不错,所以直接把openSUSE系统的/etc/fonts/config.avail目录下的
22-noto-cjk-rendering.conf
49-family-default.conf
59-family-prefer-lang-specific-cjk.conf
59-family-prefer-lang-specific-noto.conf
60-family-prefer.conf
这几个文件拷贝过来,放在/etc/fonts目录下,然后在eselect fontconfig enable
这几个文件在openSUSE的Live GUI里就有,不需要安装后再提取。如果没有openSUSE Live GUI,也可以到openSUSE的网站单独下载fontconfig的rpm,解压缩以后里面有。
如果此时SDDM登录界面还是英文。找到/etc/env.d/02locale文件,将LANG变量的值由en_US.utf8更改为zh_CN.utf8。这样即使用户没有登录,SDDM显示的也是中文了。
7.1.3.3 fcitx输入法
搭配KDE桌面的中文输入法,fcitx性能最好,不仅集成问题最少,而且响应速度快,附加的额外依赖包也少。
ibus也可以在KDE用,但是它依赖GNOME的一些包,所以如果在KDE安装ibus一不小心就会把半个gnome装进去。而且2024年9月的时候,ibus在KDE6桌面运行,响应速度很慢,延迟很严重。
在2024年10月,Gentoo官方的fcitx已经更新到5.x,旧的4.x已经被标记为obsoleted
emerge --ask app-i18n/fcitx # 中文输入平台
emerge --ask app-i18n/fcitx-chinese-addons # 一系列中文输入法
emerge --ask app-i18n/fcitx-rime # 中州韵输入法,里面包含了繁体输入法
emerge --ask app-i18n/fcitx-configtool # 配置的图形界面
这样就安装好了fcitx
注意fcitx-4.x时代的fcitx-libpinyin、fcitx-cloudpinyin、kcm-fcitx现在不能用了。这几个包名字是Gentoo里面的包名字,在其他发行版可能叫不同的名字,也可能同样的名字指的不是这几个包。总之,在emerge的时候,注意看依赖关系,如果依赖了fcitx-4.x,就不要选。
在KDE桌面,进入“控制面板->输入设备->虚拟键盘”,在里面选择fcitx5即可启用。然后在系统托盘的输入法图标上点右键,选择配置,可以把右侧的输入法添加到左侧,这样就启用了具体的输入法。
过去在使用X图形系统的时候,通过编辑环境变量XMODIFIERS、GTK_IM_MODULE、QT_IM_MODULE来配置fcitx。到了Wayland图形系统都不需要了,如果你配置了这几个变量,在KDE wayland启动载入fcitx的时候,会提示错误,不管它也没事。当然如果因为种种原因,必须要停留在X图形系统,那还是要配置这几个环境变量的,网上教程很多。
7.1.4 音频服务
2022年Gentoo的音频服务已经从pulseaudio切换到了pipewire
PipeWire sound server migration – Gentoo Linux
如果是openrc,pipewire音频服务不需要特别处理,登录进桌面以后,系统就会自动识别声卡并设置。但如果是systemd就会出问题,pipewire不会自动启动,所以进入桌面的时候,识别不到声卡。这是因为在创建第一个普通用户的时候还没安装KDE,也就没有pipewire。此时登录KDE桌面,任务栏没有音频的图标,也没有声音。如果是在安装好KDE桌面以后再创建普通用户,那就没这个问题。
解决普通用户没有音频的方法参考官方wiki
PipeWire - Gentoo wiki
以下操作在普通用户权限下执行
如果系统内残留有pulseaudio,需要先停止pulseaudio
systemctl --user disable --now pulseaudio.socket pulseaudio.service
为用户设置pipewire自动启动
systemctl --user enable --now pipewire-pulse.socket wireplumber.service
这两个服务依赖pipewire,所以systemd会自动分析依赖关系,然后自动启动pipewire。不过如果你希望在没有这两个服务的情况下还能自动启动pipewire的话
systemctl --user enable --now pipewire.service
这样,等到用户重新登录的时候,pipewire就会自动启动。声卡就会自动识别,KDE桌面任务栏会有声音的小图标。
另外pipewire建议用户退出audio组,加入pipewire组
usermod -aG pipewire
usermod -rG audio
当然,如果用户的某些需求必须要保留在audio组内,也可以不退出
设定好以后,从KDE桌面注销,再重新登录,就可以看到任务栏有音频的图标,而且也有声音了。
7.2 安装GNOME
7.2.1 基本安装
GNOME的安装也挺简单
GNOME/Guide - Gentoo wiki
emerge --ask gnome-base/gnome
env-update && source /etc/profile
gpasswd -a
rc-update add elogind boot # openrc需要,systemd不需要
# rc-service elogind start # 可以现在就启动,也可以重启后自动启动
然后编辑文件
nano /etc/conf.d/display-manager
和KDE的SDDM不同,GNOME的登录管理器是GDM
DISPLAYMANAGER="gdm"
然后把登录管理器加入启动项
rc-update add dbus default # 启动dbus服务,很多图形应用——包括gnome中的很多组件都依赖dbus
rc-update add display-manager default
# rc-service display-manager start # 虽然官方说现在就可以启动桌面,但是我一般习惯后面再处理一些事情,然后再启动桌面,或者重启进桌面
# systemd
# systemctl enable gdm.service
# systemctl start gdm.service # 可以立即启动
# systemctl enable --now gdm.service # 这个命令可以把服务加入启动,同时立即启动服务,相当于上面两条命令合并
7.2.2 用户组
如果用户没有加入video组,则可能会出问题,前面在创建普通用户的章节中介绍了一定要加入video组,如果前面没有处理,这里可以
gpasswd -a
即插即用设备的支持
gpasswd -a
7.2.3 提权
当运行过程中需要root权限时,弹出对话框请求输入root密码。这个功能在KDE是默认的,但是在GNOME需要手动开启。
nano /etc/polkit-1/rules.d/49-wheel.rules
里面加入内容
polkit.addAdminRule(function(action, subject) { return ["unix-group:wheel"]; });
到这里,基础的GNOME就安装好了,桌面系统已经达到了可用的状态,即使用户不能脱离桌面,到这步也已经可以完全脱离Live GUI系统,重启进入新系统了。
7.2.4 GNOME扩展
既然用了GNOME,那就必须得用extension
emerge --ask gnome-extra/gnome-shell-extensions
eselect gnome-shell-extensions list
eselect gnome-shell-extensions enable
开启通过浏览器一键安装extension
emerge --ask gnome-extra/gnome-browser-connector
GNOME安装后自带了一个简易的浏览器,可以用来安装扩展。如果想用其他浏览器安装扩展,其实也可以。
有一个好消息,就是GNOME扩展的网站上的扩展,都不是链接到github上的,所以不需要梯子。
以下扩展我比较喜欢
7.2.4.1 常用扩展
User Themes - GNOME Shell Extensions
这个扩展可以使用自定gtk主题,比如窗口装饰,面板风格等。用户可以到
Gnome-look.org
查找自己喜爱的主题,然后通过这个扩展选择。但不幸的是,很多主题的下载链接其实是指向GitHub的
Dash to Panel - GNOME Shell Extensions
这个扩展可以把GNOME默认的上面板+下任务栏的风格,修改为类似windows的下面板+下任务栏。上面板+下任务栏是苹果风格,华丽但是并不好用,作为生产力用户,我更喜欢windows的风格。
Blur my Shell - GNOME Shell Extensions
当面板为浅色时,一旦窗口浮动,面板里的字也会变成浅色,可能GNOME这样的设计是为了让用户更加专注,但是我不喜欢。所以我选这个扩展,可以先再dash to panel里把面板设置成深色(更像windows),然后用blur my shell把面板里的字体设置成浅色,这样看的更清楚。
GitHub - vinceliuice/Fluent-gtk-theme: Fluent design gtk theme for linux desktops
启用了user theme和blur my shell后,我非常喜欢这套主题
ArcMenu - GNOME Shell Extensions
更丰富的开始菜单风格
Date Menu Formatter - GNOME Shell Extensions
这个扩展可以调整面板上时钟的显示格式
Media Controls - GNOME Shell Extensions
这个扩展可以在音量控制那里提供更多的功能
7.2.5 GNOME的中文化
7.2.5.1 安装中文字体
和KDE一样,也要安装中文字体才能正确显示
emerge --ask media-fonts/noto-cjk media-fonts/source-han-sans media-fonts/source-sans media-fonts/source-serif
eselect fontconfig list #查看系统中的所有字体
eselect fontconfig enable
和KDE一样,GNOME也要面对arphic字体鹊巢鸠占的问题,处理方法也和KDE一样。
如果此时GDM登录界面还是英文。处理方法和KDE一样,找到/etc/env.d/02locale文件,将LANG变量的值由en_US.utf8更改为zh_CN.utf8。这样即使用户没有登录,GDM显示的也是中文了。
7.2.5.2 ibus输入法
既然用了GNOME,那就不要用fcitx了,fcitx在gnome桌面运行总有奇奇怪怪的问题。
ibus是GNOME的亲儿子,直接上ibus才是正道。
IBus - ArchWiki
IBus - Gentoo wiki
emerge --ask app-i18n/ibus ibus-libpinyin
然后编辑~/.profile文件
export XIM=ibus export GTK_IM_MODULE=ibus export QT_IM_MODULE=ibus export XMODIFIERS=@im=ibus export XIM_PROGRAM="ibus-daemon" export XIM_ARGS="--daemonize --xim"
ibus-daemon -rxRd
然后进GNOME->Settings > Keyboard > Input Sources,在里面添加Chinese Pinyin就好了