整体步骤

一般来讲一个linux发行版的安装步骤其实大体上都差不多,基本分为以下几步:

1. 制作启动盘

2. 从启动盘启动进入安装流程

3. 硬盘分区

4. 复制文件到分区

5. 安装引导软件(现代linux基本上都是grub)

6. 进行一些初次启动的基础设置

7. 重启进入新系统

8. 对新系统进行个性化设置

制作启动盘

大多数发行版都是通过自己的启动盘启动后进入安装步骤。而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镜像模式。

把刚刚制作好的usb启动盘插入usb口,然后开机,狂按delete键进入bios设置,选择usb存储介质启动,就可以从刚刚制作好的usb启动盘启动。

要特别说明一下。gentoo官方的启动盘带了一些有助于安装的工具,最重要的是mirrorselect和cpuid2cpuflags这两个工具。但是gentoo官方的启动盘没有带中文字体,就算输入法可以使用网上一些在线输入法的网站,但是没有中文字体的话,在浏览中文网站时,看到的全是小方块。这个时候可能需要浏览英文网站作为安装手册。不过也可以在启动后,通过kde控制面板直接安装中文字体,这样在浏览中文网站的时候就可以很好的显示中文了。

连通网络

因为gentoo在安装过程中要下载很多文件,所以必须要连通网络。

因为我选的是Live GUI,所以开机启动以后,进入了KDE桌面,会自动识别计算机硬件以及网络。因为我的机器在路由器后面,而路由器开启了dhcp,所以网络变成了自动配置,直接就连接到了网络上。

在左下角的开始菜单可以启动浏览器,通过浏览器浏览网页,可以在线阅读安装教程,比纯字符界面的启动盘操作方便多了。

同样通过左下角的开始菜单,启动一个命令行窗口。因为是KDE桌面,所以konsole还可以开启多标签页,可以在一个标签里进行安装,在另一个标签里输入其他命令。这样方便多了。

开启sshd服务并设置root密码:

livecd ~# sudo -i
livecd ~# passwd root
livecd ~# /etc/init.d/sshd start

磁盘准备

基础分区要求
/deve/sda1 efi 分区

/dev/sda2 swap 分区

/dev/sda3 root 分区

查看磁盘

livecd ~ # lsblk
NAME  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0   7:0    0  3.2G  1 loop /run/rootfsbase
sda     8:0    0  300G  0 disk 
sr0    11:0    1  3.3G  0 rom  /run/initramfs/live

分区

livecd ~ # parted -a optimal /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mktable gpt
(parted) print                                                            
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 322GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 
Number  Start   End     Size    File system     Name  Flags
 1      1049kB  2147MB  2146MB  fat32           efi   boot, esp
 2      2147MB  10.7GB  8590MB  linux-swap(v1)  swap  swap
 3      10.7GB  322GB   311GB   xfs             root

格式化分区

livecd ~ # mkfs.vfat /dev/sda1
mkfs.fat 4.2 (2021-01-31)
livecd ~ # mkswap /dev/sda2
mkswap: /dev/sda2: warning: wiping old swap signature.
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=6b99b3e8-371f-4a84-b000-00784b508c51
livecd ~ # swapon /dev/sda2
livecd ~ # mkfs.xfs /dev/sda3
mkfs.xfs: /dev/sda3 appears to contain an existing filesystem (xfs).
mkfs.xfs: Use the -f option to force overwrite.

挂载分区

livecd ~ # mount /dev/sda3 /mnt/gentoo
livecd ~ # mkdir /mnt/gentoo/boot
livecd ~ # mount /dev/sda1 /mnt/gentoo/boot

安装Gentoo基本系统

下载stage3

前往挂载根文件系统的Gentoo挂载点(很像/mnt/gentoo):

livecd ~ # cd /mnt/gentoo

根据不同的安装媒介,这里有一堆工具可用来下载一个阶段。这些工具之一就是links,一个非图形化、目录驱动的浏览器。要下载一个阶段,访问到Gentoo镜像列表形如:

livecd /mnt/gentoo # links https://www.gentoo.org/downloads/mirrors/

通过links工具软件选择相应的源并下载stage3文件,下载完成后将下载文件解压

livecd /mnt/gentoo # tar xpvf stage3-* --xattrs-include='*.*' --numeric-owner

配置编译选项

通过对/mnt/gentoo/etc/portage/make.conf文件进行修改配置编译选项
此处采用nano工具进行编辑操作
其中重点的是对CFLAGS和CXXFLAGS

livecd /mnt/gentoo # nano -w /mnt/gentoo/etc/portage/make.conf
COMMON_FLAGS = "-march=native -mtune=native -O2 -pipe"
# -march=native -mtune=native 针对当前cpu优化
# -O2 中等优化,比较稳妥,如果要激进的优化可以使用-O3,但是会有一些危险的汇编代码可能会导致计算出错
# -pipe 在编译期使用管线IO而不是临时文件,通过增加内存占用的代价加快编译速度
MAKEOPTS = "-j16"           
# 采用多线程编译,加快编译速度。根据CPU线程数和内存填写,数字可以是CPU核心数,但是数字不能超过内存G数的一半
CFLAGS="${COMMON_FLAGS}" # 
C编译器的优化选项
CXXFLAGS="${COMMON_FLAGS}" 
# C++编译器的优化选项
FCFLAGS="${COMMON_FLAGS}" 
# Fortran 9x编译器的优化选项,其实和FFLAGS没啥差别
FFLAGS="${COMMON_FLAGS}" 
# Fortran编译器的优化选项
ACCEPT_LICENSE="*"
#接受所有软件许可证
ACCEPT_KEYWORDS="amd64"
#只安装AMD64稳定分支软件

#还可以通过命令
livecd ~ # cpuid2cpuflags
CPU_FLAGS_X86: aes avx2 avx512_vnni avx512bw avx512cd avx512dq avx512f avx512vl f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3

CPU_FLAGS_X86="aes avx avx2 avx512_vnni avx512bw avx512cd avx512dq avx512f avx512vl f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3"
#开启对该cpu所拥有指令集的支持
#cpuid2cpuflags也是gentoo官方启动盘中自带的一个工具,其他系统的启动盘可能没有带这个工具

同步镜像

livecd /mnt/gentoo # mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf

只选择阿里云与清华大学

Gentoo ebuild 软件仓库

livecd /mnt/gentoo # mkdir --parents /mnt/gentoo/etc/portage/repos.conf
livecd /mnt/gentoo # cp /mnt/gentoo/usr/share/portage/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf

需要编辑

livecd /mnt/gentoo # nano /mnt/gentoo/etc/portage/repos.conf/gentoo.conf

sync-uri = rsync://rsync.gentoo.org/gentoo-portage
改为
sync-uri = rsync://rsyncl.cn.gentoo.org/gentoo-portage

复制DNS信息

livecd /mnt/gentoo # cp --dereference /etc/resolv.conf /mnt/gentoo/etc/

挂载必要的文件系统

livecd /mnt/gentoo # nano /mnt/gentoo/etc/resolv.conf
livecd /mnt/gentoo # mount --types proc /proc /mnt/gentoo/proc
livecd /mnt/gentoo # mount --rbind /sys /mnt/gentoo/sys
livecd /mnt/gentoo # mount --make-rslave /mnt/gentoo/sys
livecd /mnt/gentoo # mount --rbind /dev /mnt/gentoo/dev
livecd /mnt/gentoo # mount --make-rslave /mnt/gentoo/dev
livecd /mnt/gentoo # mount --bind /run /mnt/gentoo/run
livecd /mnt/gentoo # mount --make-slave /mnt/gentoo/run

进入新环境

现在所有的分区已经初始化,并且基础环境已经安装,是时候进入到新的安装环境了。这意思着会话将把根(所能访问到的最顶层位置)从当前的安装环境(安装CD或其他安装媒介)变为安装系统(叫做初始化分区)。因此叫作change root或chroot。
完成chroot有三个步骤:

  • 使用chroot将根位置从/(在安装媒介里)更改成/mnt/gentoo/(在分区里)

  • 使用source命令将一些设置(那些在/etc/profile中的)重新载入到内存中

  • 更改主提示符来帮助我们记住当前会话在一个chroot环境里面

livecd /mnt/gentoo # chroot /mnt/gentoo /bin/bash
livecd / # source /etc/profile
livecd / # export PS1="(chroot) ${PS1}"
(chroot) livecd / #

配置Portage

安装Portage快照

接下来,是安装Portage快照,一个用来告诉Portage哪些软件标题可用于安装、哪些配置文件可以由管理员选择等等的文件集合。建议使用emerge-webrsync。这将从Gentoo的一介镜像中得到最新的Portage快照(Gentoo每天发布一个基准)并安装到系统中。

(chroot) livecd / # emerge-webrsync

可选:更新Portage树

Portage树可以更新到最新版本。前面的emerge-webrsync命令将安装一个最近的Portage快照(通常是24小时以内),所以这一步是可选的。
假设需要最新更新的包(1小时以内),可以使用emerge --sync。这和s命令将使用rsync协议来更新Portage树(之前通过emerge-webrsync获得的)到最新状态。

(chroot) livecd / # emerge --sync

选择正确的配置文件

配置文件是任何一个Gentoo系统的积木。它不仅指定USE、CFLAGS和其它重要变量的默认值,还会锁定系统的包版本范围。这些设定全是由Gentoo的Portage开发者们来维护。
使用eselect,你能看到当前系统正在使用什么配置文件,现在来使用profile模块:

(chroot) livecd / # eselect profile list
(chroot) livecd / # eselect profile set 28

更新@world集合

(chroot) livecd / # emerge --ask --verbose --update --deep --newuse @world

时区配置

(chroot) livecd / # ls /usr/share/zoneinfo
(chroot) livecd / # echo "Asia/Shanghai" > /etc/timezone
(chroot) livecd / # emerge --config sys-libs/timezone-data

请避免使用/usr/share/zoneinfo/Etc/GMT*时区,它们的名字并不意味着想要的时区。例如,GMT-8实际上是GMT+8。
接下来,重新配置sys-libs/timezone-data包,将会为我们基于/etc/timezone条目更新/etc/localtime文件。/etc/localtime文件用于让系统的C类库知道系统在什么时区。

配置地区

下面的地区是一个示例,展示了同时使用英语(美国)和中文(中国)及附加字符格式(如UTF-8)。

(chroot) livecd / # nano -w /etc/locale.gen

FILE /etc/locale.gen启用US和CN地区及附加字符格式
en_US ISO-8859-1
en_US.UTF-8 UTF-8
zh_CN GBK
zh_CN.UTF-8 UTF-8

下一步是运行locale-gen。它将生成/etc/locale.gen文件中指定的所有地区。

(chroot) livecd / # locale-gen

等完成后,我们就来设定系统级别的区域设置。我们又一次使用eselect来做这件事,现在使用locale模块。通过eselect locale list可显示可用的目标:

(chroot) livecd / # eselect locale list
Available targets for the LANG variable:
  [1]   C
  [2]   C.utf8
  [3]   POSIX
  [4]   en_US
  [5]   en_US.iso88591
  [6]   en_US.utf8
  [7]   zh_CN
  [8]   zh_CN.gbk
  [9]   zh_CN.utf8
  [10]  C.UTF8 *
  [ ]   (free form)
(chroot) livecd / # eselect locale set 6
#选择 en_US UTF.8

通过eselect locale set VALUE可以设定正确的地区:
在完成了地区设置后重新加载系统环境:

(chroot) livecd / # env-update && source /etc/profile && export PS1="(chroot) $PS1"

配置Linux内核

安装内核源码

(chroot) livecd / # emerge --ask sys-kernel/gentoo-sources

# 列出系统中有的源码包
(chroot) livecd / # eselect kernel list 
Available kernel symlink targets:
  [1]   linux-6.6.38-gentoo
# 选择想要编译的源码包
(chroot) livecd / # eselect kernel set 1
# 检查一下源码包是否存在
(chroot) livecd / # ls -l /usr/src/linux 
lrwxrwxrwx 1 root root 19 Jul 21 19:34 /usr/src/linux -> linux-6.6.38-gentoo

安装cpuid2cpuflags

(chroot) livecd / # emerge --ask app-portage/cpuid2cpuflags

在Live GUI中,cpuid2cpuflags这个工具是有的,但是到了stage3里面,这个工具默认是没有自带的,为了后续可能用到,这里要安装一下

安装内核编译工具

(chroot) livecd / # emerge --ask sys-kernel/genkernel

手动配置内核

在进行内核编译前由于iwlwifi驱动编译的情况需要将采用的驱动编译到内核因此需要先安装系统所需的firmware固件

(chroot) livecd / # emerge --ask sys-kernel/linux-firmware

更新intel cpu的微代码,如果是AMD的cpu,不需要做

(chroot) livecd / # echo "sys-firmware/intel-microcode initramfs" > /etc/portage/package.use/intel-microcode
(chroot) livecd / # emerge --ask sys-firmware/intel-microcode

通过lspci程序来检测硬件信息,该程序在sys-apps/pciutils,安装该软件

(chroot) livecd / # emerge --ask sys-apps/pciutils
(chroot) livecd / # lspci -k //检测系统硬件

检测完系统硬件设备下一步就开始手动编译内核

(chroot) livecd / # cd /usr/src/linux
#复制genkernel的config文件
(chroot) livecd /usr/src/linux # cp /usr/share/genkernel/arch/x86_64/generated-config /usr/src/linux/.config
(chroot) livecd /usr/src/linux # make menuconfig
#删除openrc 开启linux config next

操作系统内核编译可以参考金步国的Linux-4.4-x86_64 内核配置选项简介

http://www.jinbuguo.com/kernel/longterm-linux-kernel-options.html

安装内核

(chroot) livecd /usr/src/linux # make -j16 && make modules_install -j16
(chroot) livecd /usr/src/linux # make install

生成initramfs文件

(chroot) livecd /usr/src/linux # genkernel --install initramfs

如果觉得手动配置较为麻烦也可以通过genkernel工具来自动完成内核构建

(chroot) livecd /usr/src/linux # cd /etc
(chroot) livecd /usr/src/linux # cp -p genkernel.conf genkernel.conf.ORIG # 备份旧的配置文件
(chroot) livecd /usr/src/linux # nano genkernel.conf
# 这是一个软链接指向eselect kernel set所指定的内核源码目录
DEFAULT_KERNEL_SOURCE="/usr/src/linux" 
# 需要再调整参数的用-menuconfig,不需要多调整的可以不加这个参数
(chroot) livecd /usr/src/linux # genkernel --menuconfig all 

配置系统

文件系统配置fstab

(chroot) livecd /usr/src/linux # nano /etc/fstab

/dev/sda1               /boot           vfat            defaults        1 2
/dev/sda3               /               xfs             defaults        0 1
/dev/sda2               swap            swap            defaults        0 0

修改root密码

(chroot) livecd /usr/src/linux # passwd

配置bootloader

在完成了一系列基本的系统安装配置后需要完成最后一步,配置bootloader也就是引导器,我的系统默认使用grub2作为引导,首先需要安装grub2软件,同时因为我是采用uefi的,因此需要添加一些额外的标记

(chroot) livecd /usr/src/linux # echo 'GRUB_PLATFORMS="efi-64"' >> /etc/portage/make.conf
(chroot) livecd /usr/src/linux # emerge --ask sys-boot/grub:2

注意:如果采用systemd作为初始化脚本那么需要额外修改一些配置修改/etc/default/grub 文件添加GRUB2 systemd 配置示例

(chroot) livecd /usr/src/linux # nano /etc/default/grub

GRUB_CMDLINE_LINUX="init=/usr/lib/systemd/systemd"

(chroot) livecd /usr/src/linux # grub-install --target=x86_64-efi --efi-directory=/boot
(chroot) livecd /usr/src/linux # grub-mkconfig -o /boot/grub/grub.cfg

安装日志工具、网络工具、定时任务

(chroot) livecd /usr/src/linux # emerge --ask app-admin/sysklogd
(chroot) livecd /usr/src/linux # emerge --ask sys-process/cronie
(chroot) livecd /usr/src/linux # emerge -av app-portage/gentoolkit
(chroot) livecd /usr/src/linux # emerge -av app-admin/sudo
(chroot) livecd /usr/src/linux # emerge --ask net-misc/chrony
(chroot) livecd /usr/src/linux # systemctl start chronyd.service
(chroot) livecd /usr/src/linux # systemctl enable chronyd.service
(chroot) livecd /usr/src/linux # systemctl enable sshd
(chroot) livecd /usr/src/linux # emerge --ask networkmanager
(chroot) livecd /usr/src/linux # systemctl enable systemd-networkd.service

#systemd-networkd resolv.conf默认不会自动更新,要systemd管理DNS设置,替换resolv.conf为一个符号连接并启动到systemd-resolved。
#(chroot) livecd /usr/src/linux # ln -snf /run/systemd/resolve/resolv.conf /etc/resolv.conf
#(chroot) livecd /usr/src/linux # systemctl enable systemd-resolved.service
#(chroot) livecd /usr/src/linux # systemctl start systemd-resolved.service

(chroot) livecd /usr/src/linux # systemctl enable --now NerworkManager


(chroot) livecd /usr/src/linux # nmcli connection modify Wired\ connection\ 1 ipv4.addresses 192.168.13.129/24 ipv4.gateway 192.168.13.1 ipv4.dns 223.5.5.5 ipv4.method manual connection.autoconnect yes  
  
#    连接网卡Wired\ connection\ 1
 
#    ipv4.method manual                    - - -  IPv4模式   (aoto=自动  manual=静态)
#    ipv4. addresses 192.168.84.129/24     - - -  IP地址
#    ipv4.gateway 192.168.84.1             - - -  网关
#    ipv4.dns 8.8.8.8                      - - -  dns解析
(chroot) livecd /usr/src/linux # nmcli connection up Wired\ connection\ 1

配置引导和启动

(chroot) livecd /usr/src/linux # systemd-firstboot --prompt --setup-machine-id
(chroot) livecd /usr/src/linux # systemctl preset-all

重启

(chroot) livecd /usr/src/linux # exit
livecd /mnt/gentoo # cd
livecd ~ # umount -l /mnt/gentoo/dev{/shm,/pts,}
livecd ~ # umount -R /mnt/gentoo
livecd ~ # reboot

安装图形界面

安装KDE  

此时仍然是root在字符界面登录的状态

安装框架

/ # emerge --ask kde-plasma/plasma-meta
/ # emerge --ask kde-plasma/kdeplasma-addons
/ # emerge --ask kde-apps/kwalletmanager
/ # emerge --ask kde-plasma/kwallet-pam
/ # emerge -1 kde-cli-tools
/ # emerge --ask kde-apps/kde-apps-meta

设置SDDM

/ # emerge --ask kde-plasma/sddm-kcm
/ # usermod -a -G video sddm 
# 如果sddm用户不在video组内,就无法使用显卡加速,SDDM界面就会特别缓慢
/ # emerge --ask gui-libs/display-manager-init
# sddm依赖dbus,所以必须要添加dbus,而且还必须要在sddm之前添加
/ # rc-update add dbus default
/ # systemctl enable dbus 
# systemd用这个命令设置dbus
rc-update add display-manager default 
# SDDM 开机启动
/ # systemctl enable sddm 
# systemd用这个命令设置sddm开机启动

另外有一处还需要单独处理

/ # nano /etc/conf.d/display-manager

CHECKVT=7
DISPLAYMANAGER="sddm" # 这里默认的是xdm,要改过来

安装GNOME

GNOME的安装比KDE简单

安装框架

/ # emerge --ask gnome-base/gnome gdm
/ # env-update && source /etc/profile
/ # gpasswd -a <username> plugdev # 把常用的普通用户加入plugdev组,在安装gnome-base/gnome的时候,该用户组已经被自动创建。
/ # systemctl enable gdm
/ # systemctl start gdm

用户组

如果用户没有加入video组,则可能会出问题,前面在创建普通用户的章节中介绍了一定要加入video组,如果前面没有处理,这里可以

/ # gpasswd -a <user> video

即插即用设备的支持

/ # gpasswd -a <username> plugdev 

提权

当运行过程中需要root权限时,弹出对话框请求输入root密码。这个功能再KDE是默认的,但是在GNOME需要手动开启。

/ # nano /etc/polkit-1/rules.d/49-wheel.rules

polkit.addAdminRule(function(action, subject) {
    return ["unix-group:wheel"];
});

GNOME扩展

既然用了GNOME,那就必须得用extension

/ # emerge --ask gnome-extra/gnome-shell-extensions
/ # eselect gnome-shell-extensions list
/ # eselect gnome-shell-extensions enable <extensions list>

开启通过浏览器一键安装extension

GNOME安装后自带了一个简易的浏览器,可以用来安装扩展。如果想用其他浏览器安装扩展,其实也可以。

有一个好消息,就是GNOME扩展的网站上的扩展,都不是链接到github上的,所以不需要梯子。

/ # emerge --ask gnome-extra/gnome-browser-connector

完整中文化

安装字体

/ # 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 <noto-cjk-fonts>   #刚刚安装的时候输出信息里的字体,尤其是sc(简体中文)字体

设置/etc/fonts/local.conf来调整字体族的设置,以此保证noto字体的优先级高于思源字体和名流字体。这样arphic字体(名流字体)的楷体就不会雀巢鸠占,默认显示还是noto字体。

ibus输入法

/ # emerge --ask app-i18n/ibus ibus-libpinyin

然后编辑~/.profile文件
/ # nano ~/.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

全系统使用ibus 

nano /etc/environment

GTK_IM_MODULE=ibus
QT_IM_MODULE=ibus
XMODIFIERS=@im=ibus

然后进GNOME->Settings > Keyboard > Input Sources,在里面添加Chinese Pinyin就好了