在Mac上安装Gentoo Linux
Contents
前言
这不是一份简短的Gentoo Linux安装手册,我想在这篇文章中向你展示更多Gentoo Linux的魅力。
为什么选择Gentoo?
Gentoo 是一个基于源码的滚动发行版。 Gentoo的基础包和软件都是由源码来构建的并且有Portage的USE标记来开启或者是关闭软件的特性。Gentoo提供了一个类似于ports的系统(Portage)所以Gentoo更适合于系统的定制化。
如果你有使用其他的Linux经验也可能会问为什么不用Archlinux,也是滚动发行版包管理器也比portage快。
你是对的,Portage的包管理工具比Arch或者是其他发行版的包管理更加复杂和强大,但是这是由于设计哲学上的问题:
Gentoo的目标是努力创建近乎理想的工具,可以满足许多不同目标用户的工具。
Arch的哲学就是: Keep It Simple, Stupid. 在简单的安装了一台虚拟机之后也确实感觉到了这一点。
但是我还是更喜欢Gentoo的设计一点,有一种整个系统尽在掌握的感觉。
less is more, but more is also less.
缘起
我是一个非常贫苦刚刚步入社会的学生。
今年毕业之后因为疫情的影响好不容易进了一家公司,但是日常的开销不足以让我更换掉现在的机器(只有单个核心的年迈机器。)。
前些日子在和一位帅气的学长 温柔的学姐在茶会上聊起了工作的一些事情可能是听到了我的抱怨了吧哈哈哈,当时说要送我一台笔记本,当时还在想不会吧?这两天收到了发现是一台Macbook Pro 2015年的15寸版本,还有一个yubico。
配置大概是这样子的
型号 | CPU | 内存 | 硬盘 |
---|---|---|---|
Macbook Pro 2015 15inch | I7 4770HQ | 16G | 2TB |
在此之前一直都有想要试试看Gentoo的想法,但是奈何手上的笔记本只有可怜的单核2G内存,因为日常还需要使用的缘故结果自然也是不了了之。
这次就有机会尝试一下了,并且将其作为主力系统进行使用。
这次安装Gentoo打算使用这样的组合:
类别 | 包或包组 | 说明 |
---|---|---|
基础系统 | @system | 基础系统 |
X Windows | Xorg Server | 使用Xorg作为X Windows的后端服务 |
桌面 | kde | 本次安装将会使用KDE桌面 |
输入法 | fcitx-rime | 使用fcitx作为输入法框架,使用rime输入法作为日常使用 |
浏览器 | chromium + firefox | 多来几个浏览器方便debug |
邮箱客户端 | thunderbird | 雷鸟邮件客户端 |
密码管理器 | keepassxc + pass | 一个为gui的一个为命令行的密码管理器 |
截图软件 | flameshot | 很棒的截图软件 |
环境准备
先来说明一下安装Gentoo的环境准备。
我这里是准备了以下:
- Macbook Pro * 1 (安装机器)
- Dell 老机器 * 1 (我将会在这个节点进行操作)
- U盘 * 1 (安装介质)
- USB千兆网卡 (因为发现在Gentoo下面无线有问题,信道支持有限,在Ubuntu Livecd下工作正常,正在尝试解决这个问题。) 拓扑图如下:
制作安装介质
之前一直有听说Gentoo安装比较麻烦,看了一些关于Gentoo安装的文档,我认为难点在于内核的配置上,其他应该问题不大(😂)。
为了能够最大程度少去配置内核我这里选择了Ubuntu Desktop Livecd,将会以这个内核配置为基础进行自己的内核配置
下载ISO文件
|
|
制作USB启动盘
将U盘插入这台老的Dell机器然后使用dd
刻录安装介质
|
|
耐心等待程序执行完成。
等到执行完成之后你就有了一个Ubuntu 20.10 Desktop的安装介质
启动安装介质
将制作好的启动介质插到Macbook Pro上然后按住Option
键再按开机,会出现一个EFI的选项,这个EFI选项就是我们的Ubuntu安装介质选择这个然后回车启动!
接下来会出现一个Grub菜单,选择 safe graphical
这个选项回车。
接下来会检测磁盘分区如果不喜欢可以选择 Ctrl+c 结束掉。
最后来到Ubuntu的欢迎界面,这里选择 Try Ubuntu
配置SSH
首先右键桌面打开终端:
输入 sudo -i
提升为root
用户
配置密码
为了能够正常连接到这个livdcd环境还需要给这个livecd配置一个密码
|
|
配置
openssh-server
除此之外还需要配置openssh-server
来让我的另外一台电脑可以通过ssh进行链接
|
|
如上图所示可以看到
openssh-server
已经运行了,接下来我们需要验证一下是否可以正常链接。
使用ip
命令查看当前主机分配到的ip
|
|
这里的enp1s0
就是物理网卡192.168.122.230
就是我们livecd获取到的地址我们可以通过这个ip来进行链接。
连接到livecd
使用ssh
命令来连接到livecd
|
|
ubuntu用户就是我们设置过密码的管理员账户
192.168.122.230就是livecd通过DHCP获取到的地址
安装Gentoo
在能够正常连接到livecd之后我们就可以开始安装Gentoo了
分区
使用fdisk
查看当前分区
|
|
这里的/dev/nvme0n1
就是Mac的硬盘,我的Gentoo系统也会安装到这里。
这次分区我打算使用LUKS做一个全盘加密,分区就比较简单:
文件系统 | 类型 | 挂载点 | 大小 |
---|---|---|---|
/dev/nvme0n1p1 | fat32 | /boot | 64M |
/dev/nvme0n1p2 | luks | nil | all |
/dev/mapper/root | ext4 | / | all |
使用fdisk
来进行分区
|
|
查看分区表
|
|
这里分区就创建完成了。
初始化文件系统
在分区创建完成之后需要格式化成特定的文件系统挂载才能够正常使用,根据我们之前的分区规划我们来对当前的2个分区来进行初始化。
初始化
/dev/nvme0n1p1
|
|
初始化
/dev/nvme0n1p2
这里我选择的是在LUKS上创建文件系统,所以先要初始化LUKS
|
|
这里会提示你的输入大写的YES
然后输入你的密码,这里同样是没有回显的放心输入好了。
这里LUKS就初始化完成了,但是我们的初始化分区工作还没有完成还需要解开LUKS来对分区初始化
打开LUKS 分区
|
|
这里会提示输入密码(这个密码就是在之前初始化时候的密码)
可以看到在密码正确输入之后分区被打开了,设备位置位于/dev/mapper/system
初始化
/dev/mapper/system
|
|
到这里分区的初始化就完成了
挂载分区
在完成了分区的初始化之后,就要开始挂载分区了。
首先我们创建一个挂载点
|
|
挂载分区
|
|
创建 /boot
挂载点
|
|
挂载/boot
分区
|
|
挂载目录结构如下图所示
到这里我们就完成挂载分区了
安装Gentoo安装文件
设置日期和时间
在安装Gentoo之前,我们要确保livecd里面的时间设置正确。错误的时间配置可能会导致安装包的时候抛出异常和一堆错误。
设置时区
|
|
选择安装文件
选择对一个基础的压缩包将会为稍后的安装节省大量的时间:
- multilib (包含32和64位程序的兼容性)
- no-multilib (只支持64位的程序)
考虑到我是刚开始折腾Gentoo我这里就选择的是multilib
下载stage压缩包
首先进入到/mnt/gentoo
目录
|
|
我这里使用的是阿里云的源你也可以选择其他的源
目录基本在gentoo/releases/amd64/autobuilds/current-stage3-amd64/
下面
这个下载链接可能会因为时间的关系失效,如果失效可以进入到这个目录下面选择最新的压缩包进行下载。
|
|
查验压缩包的SHA512校验值
|
|
确保值一致
接下来解压压缩包
|
|
请确保使用的是这个解压命令(保持权限还是压缩之前的状态)
Portage 文件说明
在开始配置Portage之前我们先对Portage有哪些文件先做一下说明
在 /etc/portage 下的文件 | 文件说明 |
---|---|
repos.conf | 指定特定站点的仓库配置,包括仓库的同步机制和URL |
make.conf | 这个文件包含了Portage的各种重要的变量定义。这些变量还告诉系统:
|
package.mask | package.mask中指定的软件将会不被安装(可以将其看成黑名单),当新版本的软件出现一些问题的时候(或者是不兼容)可以在这个文件中添加对应的记录。 |
package.unmask | 这个文件的作用将会覆盖package.mask的效果(安装白名单)。 |
package.use | package.use包含单个软件包的USE标志的列表。 当指定仅具有局部含义的标志或者是在特殊情况下希望将其打开(比如说测试特性),它会派上用场 |
package.license | 这个文件允许你基于每个软件包来设置许可证(比如说我想要整个系统都是free的但是某个软件例外) |
package.accept_keywords | 这个文件主要的作用是允许你使用测试而非稳定分支的包。最好少用以避免依赖污染。有的时候是必要的比如说:portage 树中没有可用的稳定软件时 |
env | 这里是定义特殊的配置文件比如说只允许单核心编译MAKEOPTS="-j1" 这里的配置文件是给package.env 作为引用 |
package.env | package.env 允许将上面定义的环境设置引用到特定的软件包 |
Atoms, Packages, Categories, Versions, Sets and SLOTs
这里来对Portage包管理的一些术语做一些简单的介绍
- 软件包指的是同类软件块,每个都提供一个可以安装的ebuild,不管是额外的包还是gentoo的包。
- 包作为树的叶子,被分组为类别,这些类别就相当于是通过功能来划分,比如说openvpn属于net-vpn这个类别
- 程序的原子指的是由完整类别组成的名称,没有版本和其他的限定符号比如说 net-vpn/openvpn 什么时候会用到原子呢?比如说你要引用一个基于SQLite的数据库
dev-python/axiom
但是这个是和sci-mathematics/axiom
是一个软件包名字这个时候原子就派上用场了。 - 通常可以通过 packages::reponame 附加到原子上从而指定特定仓库中的ebuild来安装软件包
- Portage支持一个软件的多个版本,这里是需要portage tree中存在这个软件的多个版本ebuild。
- 在有些时候需要打开软件包的某个特性的时候就需要修改
/etc/portage/package.use
下面的内容,如果指定的是基本原子那就是意味着对这个程序的所有版本都应用这个USE,当然也可以指定特定版本的。可以使用这些前缀来指定特定版本的原子:(">", ">=", "=", "<=", "<")
这些将会限制原子在特定版本下的USE比如说>=net-vpn/openvpn-2.4.3 inotify
将这个添加到/etc/portage/package.use
文件中这就意味着告诉Portage在openvpn大于等于2.4.3的时候启用inotify这个USE。 关于更多的原子的细节可以参考man 5 ebuild
。 - 可以将多个原子分为一组,从而可以针对整个组来进行操作(比如说重建某个组)。对于这个组有个名字:集合,集合以
@
作为前缀,其中一些是在Portage里由预先定义的比如说@system
集合包括主要的系统软件包。像是我们安装一个软件包(原子)这个就会记录在/var/lib/portage/world
中。(@world
集合包含了@system
集合,如果有需要还可以自己定义集合。)。 - 关于Gentoo的系统版本,你可能会发现Gentoo和其他发行版不太一样不像是Ubuntu有那种Xenial Xerus之类的版本,如果你有用过Archlinux之类的滚动发行版你可能会知道Gentoo也是滚动发行版。Gentoo本身就没有版本,当你更新系统的时候都会更新到最新的版本(取决于你是在稳定分支还是测试分支)。这样的好处就是当新的软件的ebuild到了portage tree的时候可以修改portage配置文件来尝试使用。但是同样的也带来一个新的问题相较于Ubuntu这样的二进制发行版,有的时候编译会不通过。
是时候回到安装了!
配置Portage
我们的第一个Portage的配置是确保 下载/拆包/准备/配置/编译/安装/合并 这个周期能够尽可能的高效,这意味着要利用系统可以提供的任何并行性。
我们需要从两个方面入手
- 最大运行Portage的作业数量
- 以及每个ebuild自身调用make进程并行线程的最大数量。
按照Gentoo Wiki的建议我们将会吧并发的作业数量和make线程数设置为等于系统CPU的线程数+1,当系统平均负载到达或者是超过CPU数量的时候,我们需要阻止新的作业加入或者是新的编译开始。
我们要设置的两个变量是EMERGE_DEFAULT_OPTS
(Portage作业数控制)和MAKEOPTS
(make的线程数),这些通常是在make.conf
里面定义。
因为Portage不支持命令替换之类的高级Bash功能,所以我们将会在 root 的.bashrc
中设置。
Tips: 一般来说,emerge是以root用户启动的,当编译的时候,emerge通常会降低特权以“portage”这个用户运行。
用你喜欢的编辑器打开/mnt/gentoo/root/.bashrc
文件(本教程用nano作为主要的编辑器)
Tips:
-w
选项是告诉nano
编辑器不要自动换行,因为自动换行有的时候会搞乱配置文件。 nano是一个很简单的编辑器:用方向键可以上下左右移动,像是任何文本处理工具一样进行编辑,完成编辑之后使用Ctrl+x退出(按住Ctrl的同时再按x):如果你修改了文件系统会提示你是否要保存,这个时候输入y
再按enter退出,保存更改。输入n退出即是不保存更改退出。
|
|
内容如下
|
|
保存并退出nano
Tips: 如果在编译的时候遇到并行的问题希望回到更加保守的配置,可以设置上面的
MAKEOPTS="-j1"
来进行全局设定。
接下来我们要确保.bashrc
这个文件是root登陆的shell读取的,因此还需要复制一份默认的.bash_profile
配置文件
|
|
接下来进入make.conf
配置文件本身。我们安装的stage3文件已经包含了基本的配置。我们将用nano
编辑器打开这个文件,删除现有行,然后替换我们的配置。(nano中,Ctrl+k 可以用来快速剪切当前行)
|
|
内容如下:
|
|
Tips: 在
/etc/portage/make.conf
中给你的系统设置特定的VIDEO_CARDS
和INPUT_DEVICES
。参见下边的这张表
保存并退出nano
这里是刚开始的stage3文件中包含的make.conf
配置简要,以及我们所添加的。
变量 | 类型 | 默认值 | 我们设置的值 | 描述 |
---|---|---|---|---|
COMMON_FLAGS | Standard | -O2 -pipe | -march=native -O2 -pipe | 这个变量仅定义一些通用的标志,这些标志会传给GNU编译器,在编译源码的时候使用,缺省值为 -O2 ,这是它推荐设置的级别(以较小的编译时间为代价,生成更小,更快的代码),以及-pipe ,它指示编译器在可能的情况下更多的使用管道而不是临时文件从而加快编译速度。我们保留这些添加了-march=native 。这个会自动检查CPU的类型,并且会利用CPU其特性生成代码。需要注意的是在这个设置了情况下编译的软件在其他的计算机是很可能无法使用的! |
CFLAGS | Standard | ${COMMON_FLAGS} | ${COMMON_FLAGS} | 这个变量设置在编译C代码时的编译器标志 |
CXXFLAGS | Standard | ${COMMON_FLAGS} | ${COMMON_FLAGS} | 这个变量设置在编译C++ 代码时候的编译器标志 |
FCFLAGS | Standard | ${COMMON_FLAGS} | ${COMMON_FLAGS} | 将CPU标志传给FORTRAN编译器 |
FFLAGS | Standard | ${COMMON_FLAGS} | ${COMMON_FLAGS} | 将CPU标志传给 FORTRAN77编译器 |
ACCEPT_LICENSE | Incremental | -* @FREE | * | 接受所有许可的软件 |
CHOST | Standard | x86_64-pc-linux-gnu | x86_64-pc-linux-gnu | CHOST变量非常重要。 它是Architecture-vendor-operating_system-C_library的元组,用于控制构建过程。这里我们不会进行更改。 |
ACCEPT_KEYWORDS | Incremental | amd64 | amd64 | 这个变量就是控制你的系统是稳定版本还是非稳定版本 amd64 就是处于稳定分支的系统只接受上游测试通过的软件包 ~amd64 就是测试版本接受最新的ebuild 即使可能不稳定。 |
USE | Incremental | various flags set by profile | empty | 默认的stage3是有一个bindist的USE的这里留空,使用profile的默认USE |
CPU_FLAGS_X86 | USE_EXPAND | mmx mmxext sse sse2 | mmx mmxext sse sse2 | 这个变量告诉Portage 使用哪个处理器的特定标志(比如说启动MMX的支持),我们这里保留默认的配置在章节中我们会使用app-portage/cpuinfo2cpuflags 这个包自动为我们生成适合优化的配置。 |
PORTDIR | Standard | /var/db/repos/gentoo | /var/db/repos/gentoo | 这个变量定义了Portage树的位置,这里我们保持原样。 |
DISTDIR | Standard | /var/cache/distfiles | /var/cache/distfiles | 这个变量定义了存储源码包的tarball位置,这里我们保持原样。 |
PKGDIR | Standard | /var/cache/binpkgs | /var/cache/binpkgs | 这个变量定义了存储二进制包的位置,这里我们保持原样。 |
LC_MESSAGES | Standard | C | C | 这个变量用于设置编译时候输出的语言。我们这里设置为C(表示英文输出),这是提交编译报错时必须的,但是你也可以根据自己的需要来更改方便你的使用 |
PORTAGE_ELOG_CLASSES | Standard | absent | info warn error log qa | 这个变量告诉Portage要记录哪些ebuild信息,我们这里的设置为打开所有信息。 |
PORTAGE_ELOG_SYSTEM | Standard | absent | echo save | 这个变量指示Portage处理日志消息,在这个设置下日志将会输出回显,并保存。 |
FEATURES | Incremental | various features set by profile | split-elog buildpkg | 顾名思义,这个变量用于打开或者是关闭Portage的功能。我们打开了split-elog,确保日志会存在 /var/log/portage/elog 的子目录中,同时我们也打开了 buildpkg的功能,这个是在构建成功软件包的时候保存一份二进制版本到之前设置的PKGDIR中。 |
VIDEO_CARDS | USE_EXPAND | comprehensive list of video cards set by profile | intel i965 | 这个变量就是告诉各种程序在你的系统里面是什么显卡。我在这里制定了 intel i965这么几个驱动(这个也是在Mac上测试通过可以正常启动X的情况) |
INPUT_DEVICES | USE_EXPAND | various input devices set by profile | libinput wacom synaptics | 这个变量是告诉X Windows我们需要支持哪些输入设备。 |
Chroot
Chroot的最终准备
我们需要创建并配置一个文件,这个文件/mnt/gentoo/etc/portage/repos.conf/gentoo.conf
将会告诉Portage从哪里获取最新的Portage树。
首先我们需要创建文件夹
|
|
修改内容如下
|
|
保存并退出
上面这个配置文件说明了以下内容:
设置主要的仓库为gentoo
存储位置是在 /var/db/repos/gentoo
同步方式为websync(之后会改为增量的 rsync)
接下来我们要确保chroot之后还可以使用这个Mac的网络,也就是我们需要复制一下 /etc/resolv.conf
配置文件
|
|
-L选项可确保我们不会错误地复制符号链接,因为一旦chroot,主机文件系统将变得不可访问。
然后,我们还需要确保 chroot 之后还可以使用 /proc
, /sys
, /dev/
,这些特殊的文件系统
|
|
Tips: 在非Gentoo官方的Livecd中
/dev/shm
可能被连接到了/run/shm
还需要运行以下命令
|
|
进入chroot
这里进入chroot的准备工作就完成了,我们现在就可以进入chroot了
|
|
进入chroot之后可能遇到命令无法执行的情况我们需要执行以下操作
|
|
我们设置了一个
PS1
这个方便区分我们当前是在什么环境
安装和更新Portage Tree
在这里我们要安装Portage树的快照,通知Portage可以安装哪些文件,可用的配置文件等等。
为了安全起见,我们需要更新必要的公共密钥,然后下载并验证最新的快照,运行以下命令即可:
|
|
现在我们有了基本的portage树,我们可以切换到rsync协议,使其保持更新的状态:
|
|
将sync-type
改为rsync
注销掉原来的那行 webrsync
|
|
再次同步
|
|
有的时候会遇到源不可用的情况,这里再补充一种利用git同步Portage tree的配置。
在完成了第一次webrsync
同步之后安装git包
|
|
再去修改配置文件
|
|
内容更改如下
|
|
保存退出后我们需要将原来的目录删除
|
|
再次进行同步
|
|
设置基本的配置文件
像是之前所说到的Gentoo使用配置文件来设置特定的架构和使用场景。配置文件还限制了可以安装的可以安装软件包的版本,默认的USE之类的,这个基本的profile是由Gentoo开发者来维护的。
这里我们检查一下是否在17.1 amd64配置文件即可,
|
|
在这里我们的默认配置文件已经在这个profile文件,如果你想要手动选一下可以使用eselect
工具来设置配置文件
|
|
你可以通过这条命令来查看配置文件make.conf
环境,这个在提交bug的时候最好也附加上去
|
|
如果你对USE标志的含义不是很理解可以通过下面这条命令去查找其含义(比如说useflag
)
|
|
或者是在线查询
确保更新了Portage
在完成了更新portage tree的时候portage提示Portage有可用的更新了,可以通过这条命令来更新Portage
|
|
--oneshot
选项是通知Portage不要把自己记录在world
文件
--ask-verbose
选项是emerge在对系统进行任何更改之前通知你,并产生详细的输出(可以简写为 -av
)。
按回车进行更新
更新Portage树的同时也会带来一些新闻条目,这些发布的新闻条目最好是阅读一下,这些是很重要的,这些通常是Gentoo开发者对用户发布的简单公告,如果想要查看当前的新闻条目可以运行:
|
|
你会注意到有新闻的编号,假如你想要阅读新闻N,可以输入:
|
|
如果你已经看完了所有的新闻,你可以运行这条命令来清除已经阅读过的新闻
|
|
设置时区和语言环境
我们还没有设置时区和语言环境,我们现在来设置这些。
首先是时区设置。你可以在/usr/share/zoneinfo/
下面找到你所在位置的对应时区(这里比如说亚洲上海时区)
|
|
现在我们需要重新配置sys-libs/timezone-data
包,重建这个包将会从/etc/timezone
中取值,并在/etc/localtime
中反应正确的值。
|
|
其次我们必须设置合适的语言环境,我们必须要在/etc/locale.gen
中指定要使用的语言环境。编辑这个文件,并添加以下内容
|
|
这里我们以英文和中文为例子:
|
|
保存并退出文件。
接下来我们必须要基于/etc/locale.gen
文件中的配置,运行locale.gen
来创建语言环境:
|
|
在运行成功之后,我们还需要指定以后默认使用的语言环境,使用下面这条命令来查找当前的系统有的语言环境
|
|
我们现在先保持为C环境,后面再修改成实际的语言环境
|
|
现在重新载入环境
|
|
通知Portage使用特定的CPU功能
在之前配置/etc/portage/make.conf
中我们把CPU_FLAGS_X86
设置成默认的值mmx mmxext sse sse2
,在这里我们将会用到 app-portage/cpuid2cpuflags
这个工具来设置对应的变量
|
|
安装完成之后,运行这个工具并且记录下输出(你运行的输出可能和我的不太一样,这个输出取自我这台Mac)
|
|
然后修改/etc/portage/make.conf
文件
|
|
内容如下
|
|
保存并退出。
Gentoo Bootstrap: 从Stage1到Stage2
首先我们要构建自己的工具链!
Gentoo Portage Tree里面提供了一个bootstrap.sh
脚本。
现在我们切换到脚本存在的目录:
|
|
然后运行
|
|
注意这里输出的版本可能和你的不一样
Gentoo FAQ建议是先查看这个并编辑,接下来我们也会这么做,这里面也存在几个问题:
- 对于现代的GCC,我们需要添加一个
openmp
的USE。 CONFIG_PROTECT
为空表示在这个bootstrap
过程中配置文件将会被覆盖。
- 修复GCC的USE问题
使用nano打开/var/db/repos/gentoo/scripts/bootstrap.sh
文件
|
|
按Ctrl+w输入export USE="-
按Enter进行搜索
修改这行内容如下
|
|
保存并退出
- 做配置文件备份
我们可以使用qfile
来查询我们已经修改过的文件属于那个程序,以及这次重构是否会影响到,如果影响到我们就需要进行备份。
|
|
这里我们的重构会影响到这个glibc,所以我们要对更改的文件做一个备份。
|
|
现在一切就绪,让我们开始真正的bootstrap
程序吧
|
|
在bootstrap.sh
完成之后,我们还需要检查一下GCC的配置,因为在之前的重新构建编译器过程中,可能Portage Tree中有新的可用版本构建的就是新的GCC。
|
|
这里看起来只有一个配置,如果你选择的是测试分支(~amd64
)可能会有多个可用的GCC版本
你可以运行这条命令来切换到最新的GCC
|
|
还需要更新环境
|
|
如果你的输出是只有一个GCC那么这些是不用再去操作的。
如果你更新了GCC你还需要做这些
再备份一次glibc的配置文件
|
|
现在我们需要再运行一次bootstrap.sh
脚本,以确保使用新的编译器重新构建了工具链中的所有内容,
|
|
完成bootstrap.sh
之后,我们需要还原备份的配置文件,然后重新生成语言环境
|
|
现在再来检查语言环境是否是C
|
|
最后返回 /
目录
|
|
Gentoo Bootstrap 从Stage2到Stage3
现在我们需要使用我们在上面构建出来的全新工具链来构建@world
集合里面的所有包。
在开始之前我们还需要创建一个空的timestamp
文件,这个文件可以用于在构建完成之后检查可执行文件和库被重建,并且对这些进行标记。
|
|
现在我们已经准备好重新构建@world
集合中的所有内容,运行这条命令开始构建:
|
|
别忘了回车开始构建。 这里是关于我们上述这条命令的解释
参数 | 简写 | 描述 |
---|---|---|
--ask | -a | 在开始之前,会显示会发生什么(比如说升级降级卸载slot等),然后询问你是否继续还是终止,这个选项建议每次使用都保留 |
--verbose | -v | 提供emerge 操作的更多信息。(比如说--ask 提供的信息中每个包的USE标记) |
--emptytree | -e | 编译并安装所有的包(在这里安装的是@world 这个集合里面所包含的所有包以及其相应的依赖关系)。这里是让在计算依赖关系的时候假设系统没有任何的包 |
--with-bdeps=y | N/A | 将编译时依赖关系也考虑进来,从而让依赖关系树更加完整。 |
@world | N/A | 这里指定是@world 集合 @ 标记后面加上集合的名称就表示引用的是一个集合的软件包而非单个包(原子) |
Tips: 这个操作将会持续相当长的时间,建议使用会话管理的工具来去保存构建工作 推荐使用
screen
或者是tmux
Screen安装和使用
这里只介绍非常基本的使用,想要了解更多的screen
用法可以查阅man
手册
|
|
安装完成之后,我们要创建一个会话来保存我们的构建工作
|
|
这里就会进入一个名为rebuild
的会话中,运行重新构建@world
集合。
|
|
现在我们可以使用Ctrl+a 再按D 保存这个会话并且回到原来的会话。
如果你想要回到这个rebuild
会话可以输入
|
|
这样就回到rebuild
也就是正在构建@world
这个会话查看进度如何。
Tmux 安装和使用
Tmux也是一个会话管理,我日常使用比较多的也是tmux这里也简单介绍一下tmux的简单使用
安装tmux
|
|
创建一个名为rebuild
会话
|
|
运行重新构建@world
|
|
运行Ctrl-b +d 脱离会话,回到当前的shell中,如果想要重新连接到这个会话可以运行
|
|
经过长时间的构建我们终于从Stage2构建到了Stage3,这里可能有一些包已经经过升级了,如果你想要卸载掉旧的包可以执行:
|
|
或者想要再来一次可以执行
|
|
验证bootstrap
首先恭喜你完成了bootstrap,当前chroot环境里面的所有二进制文件,库都被重新构建了。这里为了确保没有遗漏的包的发生,我们要对之前创建的时间戳文件进行检查。
运行这条命令(可能需要耗费一些时间):
|
|
这个命令会查找所有可执行的文件。它不会产生输出(如果我们的bootstrap重建完成会重新创建所有这类文件)。
对于可执行的二进制文件来说太多了(动态库,静态库),我们已经检查了大多数的共享库,因为它们的执行位已经设置过了,但是相对于那些静态库和对象文件我们还没有设置位还需要运行另外一个测试
|
|
这个测试同样会耗费一些时间请耐心等待。
切换配置文件
在完成bootstrap之后我们要再去选择一个自己喜欢的配置文件。 这里我不打算上DE(Desktop environment),打算上WM(节省更多的内存可以用于做实验或者是其他)。 所以我这里选择的profile是desktop的profile,用这条命令设置:
|
|
在更新profile文件之后最好是更新一下环境,载入新的环境变量
|
|
更新系统
|
|
这次切换profile文件之后再去更新出现了报错我们借助这个机会来看看如何根据Portage提供的信息来排错
这里Portage告诉我们当前的USE标记不能够让让Portage继续为我们更新系统,我们需要对这两个包的USE进行调整。
还记得Portage在哪里调整单个包的USE吗?没错就是在/etc/portage/package.use
下面,这个位置可以是单个文件也可以是一个目录。
我个人比较推荐使用目录的方式去管理USE,在目录下创建单个包(原子)的文件来管理单个包的USE。
|
|
Python 我们按照之前说过的如何对单个包的USE进行配置,来配置python的USE
|
|
Sqlite
Sqlite同样处理一下
|
|
现在重新尝试更新一下系统
|
|
但是这次Portage还是不给我们过并且又抛出一个错误
同样的我们按照这个提示进行修改
Python
|
|
bluez
|
|
现在重新尝试更新一下系统
|
|
现在可以正常更新了,这个更新会根据profile里面的USE设定重新构建大量的包。(可以继续工作了,让它慢慢更新好了。)
安装和配置内核
接下来就是安装和配置内核,也是最为繁琐的一个步骤。
Gentoo有很多种内核可以选择
名称 | 描述 |
---|---|
Genkernel | Genkernl是一个用于构建内核和initramfs的构建工具,它提供了一个默认的内核配置文件。通常建议不熟悉手动编译内核的用户使用 |
gentoo-sources | 对于大多数用户,建议使用的是这个内核,Gentoo会对这个内核进行维护(打一些轻量的补丁以修复安全问题,内核错误和兼容性问题) |
gentoo-kernel | 这个内核提供了默认的配置以适用于大多数不同的系统,适用于不想从头配置自己内核的用户。 |
ck-sources | 这个内核是Con Kolivas的内核补丁集,这个内核主要用于提高系统响应的能力和交互性,并针对于各种工作负载进行配置。 |
git-sources | 这个内核是跟踪上游开发内核的每日快照,如果你对内核的最新特性感兴趣或者是想要参与内核的开发和测试那么这个内核就是为你而生的。 |
在这里我会分别介绍三种配置内核的方式
- Genkernel 方式配置内核
- Gentoo-kernel-bin 方式配置内核
- 利用已有的内核配置文件配置内核
在配置内核之前
在配置内核之前我们需要查看当前的硬件配置:
|
|
如果没有
lspci
命令可以安装这个包
|
|
当然还有一种方法不让这个pciutils
在这个@world
集合里面我们可以自己创造一个集合
创建/etc/portage/sets
文件夹
|
|
创建并编辑/etc/portage/set/yafa
文件
|
|
内容如下
|
|
告诉Portage安装@yafa
这个集合中的包并且自动安装其依赖
|
|
查看当前的硬件和使用的内核模块
|
|
再这个图中就是我现在的这个Mac的硬件情况以及使用的内核驱动
Genkernel 方式配置内核
Genkernel 是一个自动化构建内核和initramfs
的工具,Genkernel可以做这些事情:
- 配置内核
- 构建内核(
bzImage
)并复制到/boot
- 创建
initramfs
并复制到/boot
- 创建 symlinks 到
/boot
- 添加自定义的功能到
initramfs
- 压缩
initramfs
安装
|
|
Genkernel用一般用法为
|
|
选项
Genkernel选项有很多大部分可以在/etc/genkernel.conf
这个文件中找到,在使用genkernel
的时候命令行给定的参数优先级别是比/etc/genkernel.conf
文件中的参数优先级高
用户交互选项
选项 | 描述 |
---|---|
–config=/path/to/genkernel.conf | 指定配置文件。如果不实用这个选项默认使用的是/etc/genkernel.conf 配置文件 |
–[no-]menuconfig | 在开始构建内核之前,激活或者是停用(make menuconfig )命令 这个命令会启动交互式配置菜单 |
–gconfig | 这个提供了依赖于GTK+库的内核配置程序。这个好处是用这个工具配置更加容易和清楚,不好的地方就是需要X Windows的支持没办法运行在命令行下面 |
–xconfig | 和--gconfig 选项类似,不过这个是基于QT的 |
–[no-]save-config | 是否将内核配置保存到/etc/kernels 目录下,建议开启方便以后备份和使用。 |
–kernname=NickName | 允许修改/boot 目录中的内核和initramfs 的名称,生成的类似这种格式kernel-nickname-version 和initramfs-nickname-version |
系统选项
此处列出的配置选项定义哪些功能会或不会在生成内核和 initramfs 中启用。
选项 | 描述 |
---|---|
–[no-]splash | 是否在initramfs中激活Fbsplash缓冲帧的支持。要覆盖fbsplash使用的默认主题,请使用--splash=PreferredTheme (其中PreferredTheme 是/etc/splash 目录中目录之一的标题,你可以选择其他的)。 |
–splash-res=PreferredResolution | 这个选项允许系统在启动的时候准备挂载/ 阶段的分辨率。为了缩小initramfs的大小尽量选择系统支持的分辨率其他的分辨率就关掉(如果你是打算给livecd编译内核最好是省略这个选项) |
–do-keymap-auto | 在启动过程中强制选择键盘映射 |
–lvm | 如果你有使用LVM逻辑卷管理请启用这个选项。(在启用之前确保系统已经安装了sys-fs/lvm2 的包) |
–dmraid | 这个选项包含了对DMRAID的支持,如果你在使用DMRAID作为/ 文件系统请确保开启了这个选项 |
–luks | 这个选项包含了对LUKS的支持,这个选项是我现在所需要的因为开启了LUKS加密,这个选项让initramfs加入了对LUKS的工具支持。 |
–disklabel | 把对磁盘标签和对UUID的支持加入到initramfs |
–iscsi | 添加iscsi的支持到initramfs |
–multipath | 添加multipath的支持到initramfs |
–linuxrc=/path/to/the/linuxrc_file | 这个选项可以指定一个用户创建的linuxrc文件(这个文件在内核启动阶段,实际引导过程之前的初始化脚本)。这个脚本可以在/usr/share/genkernel/ 下找到默认的脚本 |
–cachedir=/path/to/alt/dir | 重新编译内核时候使用的默认缓存位置 |
–tempdir=/path/to/new/tempdir | 指定编译内核的时候genkernel 使用的临时目录位置 |
–unionfs | 在 initramfs镜像中包含统一文件系统的支持。 |
–mountboot | 是否要将/boot 挂载到单独的分区上。这个会检查/etc/fstab 里面的内容来获取挂载引导分区的说明(如果你需要的话)。 |
–microcode | 为Xen和Linux早期微码支持创建一个Intel/Amd处理器微码的早期cpio |
构建选项
Genkernel 支持下面这些选项,并且在构建内核的时候将其传给相关的应用程序。
选项 | 说明 |
---|---|
–kernel-cc=someCompiler | 指定内核在编译时候使用的编译器 |
–kernel-ld=someLinker | 指定内核编译过程中使用的链接器 |
–kernel-as=someAssembler | 指定内核编译过程中使用的汇编程序 |
–kernel-make=someMake | 指定内核编译过程中使用的Make程序的替代方法 |
–utils-cc=someCompiler | 指定在编译实用工具过程中使用的编译器 |
–utils-ld=someLinker | 指定在编译实用工具过程中使用的链接器 |
–utils-as=someAssembler | 指定在编译实用工具过程中使用的汇编程序 |
–utils-make=someMake | 指定在编译实用工具过程中使用的Make程序的替代方法 |
–makeopts=-jX | 指定编译内核和实用工具时候的并发线程数。(通常是线程数+1) |
在编译过程中起作用的选项
下面这些选项通常在编译过程中生效:
选项 | 说明 |
---|---|
–kerneldir=/path/to/sources/ | 指定内核源码的位置,可以不是默认的/usr/src/linux 目录 |
–kernel-config=/path/to/config-file | 指定内核使用的配置文件。默认情况下会在 --kerneldir 中找到的内核版本,并在/etc/kernel/ 下面找到对应的内核版本。如果没有找到genkernel 将会在/usr/share/genkernel/$arch/ 下面找通用的内核配置。 |
–module-prefix=/path/to/prefix-directory/ | 指定要安装内核模块的目录。(默认是/lib/modules) |
–[no-]clean | 在编译内核之前执行或者是不执行make clean 命令。 |
–[no-]mrproper | 在内核编译之前启用或停用make mrproper 命令。像是之前的make clean 命令类似的这个命令会删除所有目标文件和依赖项但是除了这些还会删除旧的配置文件。如果你不想要删除你的旧内核配置文件请保持这个选项关闭 |
–oldconfig | 发出make oldconfig 命令,这个命令将会尝试从/usr/share/genkernel/ 中的通用脚本收集系统的信息。这是一个非交互的过程:没有用户输出。(如果和--clean 结合使用后面的--clean 将会失效) |
–[no-]module-rebuild | 在构建内核和内核模块之后,运行或者是不运行emerge @module-rebuild 来构建额外的模块(比如说virtualbox的模块)。默认的情况下启用这个选项 |
–callback=“echo hello” | 在构建内核和内核模块之后,但是在构建initramfs之前,调用指定的参数在这个例子里面为 hello |
–[no-]install | 激活或者是取消make install 命令,这个命令将会把内核文件和initrafms文件copy到引导分区。 |
–no-ramdisk-modules | 避免将任何模块复制到genkernel 创建的initramfs 中。 |
–all-ramdisk-modules | 将所有可用的模块全部复制到genkernel 创建的initramfs 中。 |
–genzimage | 在创建内核之前先创建initramfs(这个只适用于PPC) |
debug 参数
在内核编译过程中可以通过调整debug参数来控制输出的信息和显示方式。
选项 | 说明 |
---|---|
--loglevel=<0|1|2|3|4|5> | 控制genkernel打印信息的详细程度。变量loglevel 是0-5之间的整数。0代表无输出5代表在内核编译和制作initramfs过程中尽可能提供更多的信息 |
–logfile=/path/to/output_file | Genkernel默认的输出的日志文件。默认的输出在/var/log/genkernel.log |
–[no-]color | 激活或者是取消带颜色输出 |
–[no-]cleanup | 激活或取消运行后的清理,从而达到调试的目的 |
动作
Genkernel 支持以下操作:
动作 | 描述 |
---|---|
all | 构建所有的东西,包括initramfs 、kernel 、modules |
bzImage | 只构建内核的镜像 |
kernel | 只构建内核镜像和模块 |
initramfs | 只构建initramfs |
配置
Genkernel 给用户提供了一个最简单的方法那就是genkernel all
但是会生成大量不必要的模块,这里有一个适用于大多数系统的通用配置:
|
|
上面这条命令就是创建了一个可以支持LUKS的initramfs,但是内核和initramfs都不会被安装到引导分区后面的--menuconfig
将会打开交互式配置工具,从而进行交互式配置。
在交互界面如果你是老手你可以开始配置你的内核,如果你是新手这次我们先选择退出按esc会提示是否保存配置文件,我们选择保存,就会开始构建新的内核以及
initramfs
。
等到构建完成之后可以看/var/tmp/genkernel/
下面这里面就是我们构建的内核以initramfs
文件了。
|
|
除了这种交互式的配置还可以通过修改配置文件来减少刚开始配置内核的工作量,还记得genkernel
的默认配置文件位置吗?我们将会复制一份在此基础上进行修改来生成我们的第一份内核配置文件。
首先创建我们的工作目录
|
|
复制一份默认的配置文件
|
|
修改配置文件
|
|
内容如下
|
|
再次生成内核文件和initramfs
文件:
|
|
到这里你就有了一份基本的内核配置并且已经可以启动了(大概率),但是网卡之类的可能还是不能正常工作。这个时候就需要针对于自己的硬件去查找对于的配置了。
这里我推荐你查看金步国配置内核选项介绍这篇文档,来去配置你的内核,当然内核配置和我们现在安装的选项有很大的不同了,还需要再去搜索内核文档这些选项的意义。
如果你有充足的时间我建议你可以尝试使用make config
然后使用Google搜索。
使用gentoo-kernel-bin
配置内核
gentoo-kernel-bin
就是上游打好的内核如果想要快速进入系统,后面再去慢慢配置内核这个内核也是一个不错的选项。
安装
|
|
安装完成之后内核以及initramfs
已经在/boot
下面了。
使用已有的配置文件配置内核
我这里有一份配置好的内核配置,功能上已经调好了,内核使用的是gentoo-sources
内核
在安装内核之前我们要先设置一下gentoo-sources
的USE
|
|
symlink
可以当更新内核的时候自动将最新的内核软连接到/usr/src/linux
目录。
experimental
这个可以针对CPU来进行优化,和一些实验性特性,详细可以参考这里
现在我们可以安装内核了
|
|
首先进入内核文件夹
|
|
下载我的内核配置文件
|
|
使用make oldconfig
去生成一份新的配置文件
|
|
也许你需要在我这个内核基础上再去做一些修改
|
|
修改工作完成之后可以运行以下命令生成新的内核和模块并将其安装到/boot
目录下
|
|
生成initramfs
initramfs其实是initrd
的替代品,它是一个临时的文件系统,它在启动阶段被linux
内核调用。initrd
主要当作/
文件系统被挂载之前做准备工作。
如果你将必要的驱动都build in内核是可以不要initramfs的,这里我使用的LUKS全盘加密,需要initramfs阶段来解开LUKS分区。
生成initramfs的方式也有很多,这里我会介绍以下2种方式生成initramfs:
- genkernel
- Dracut
genkernel
在之前genkernel安装的内核的时候已经介绍的非常详细了如果你想要单独生成一个initramfs可以使用这条命令
|
|
--luks
这个参数是因为我这次安装是用到了luks所以要在initramfs
中加入LUKS的工具支持。
除此之外还要安装sys-fs/cryptsetup
这个包,不然重启之后由于缺少这个工具还是没办法正常使用
|
|
Dracut
安装
|
|
构建initramfs
首先确保你的/boot
分区已经挂载了
|
|
这样不加任何参数将会创建一个通用的initrmafs
如果你想要只为这个机器创建initrmafs
可以加--hostonly
|
|
dracut还有很多额外的模块,像是这次安装我们就需要用到crypt
模块,还有很多模块如下表:
模块名称 | 描述 | Enable? | 额外包 |
---|---|---|---|
dash | 包含了/bin/dash 和/bin/sh | always | |
i18n | 包含了键盘布局,console的字体等等 | always | |
rpmversion | 在initramfs 中包含dracut的版本信息 | 当/etc/redhat-release 存在的时候这个模块会被打开 | |
convertfs | 在下一次启动中将 / 合并到 /usr 中 | never | |
kernel-modules | 包含用于/ 文件系统和其他设备启动时设备的内核模块 | always | |
fstab-sys | 安排在rootfs 之前挂载任意分区 | 当/etc/fstab.sys 存在的时候,或者是命令行包含--fstab 或者是--add_fstab 时。 | |
resume | 允许initramfs 从低功耗模式状态恢复。 | 当存在swap分区的时候 | |
rootfs-block | 安排包含要挂载rootfs 的块设备。 | always | |
terminfo | 包含terminfo 文件 | always | |
udev-rules | 包含一些非常基本的udev规则 | always | |
securityfs | 安排尽早挂载securityfs | never | |
usrmount | 安排挂载 /usr | always | |
base | 包含大部分基本的工具 | always | |
fs-lib | 包含了文件系统工具(包括mount 命令) | always | |
img-lib | 包含了用于解压图像的工具 | never | |
shutdown | 设置用于关机的hook | always | |
biosdevname | 开启BIOS网络设备的重命名 | always | 需要安装sys-apps/pciutils 和sys-apps/biosdevname 包 |
btrfs | btrfs文件系统的支持 | host-only: rootfs | sys-fs/btrfs-progs |
caps | 支持在初始化之前删除功能 | systemd init 不使用 | sys-libs/libcap |
crypt | 支持全盘加密rootfs | host-only: rootfs | sys-fs/cryptsetup 这里我们使用了LUKS加密所以还要安装这个包 |
crypt-gpg | 将GPG用于crypt支持(需要crypt模块) | never | app-crypt/gnupg |
dmraid | 支持rootfs 在FakeRAID上 | host-only: rootfs | sys-fs/multipath-tools , sys-fs/dmraid |
dmsquash-live | 支持LiveCD的rootfs | never (host-only: refused) | |
gensplash | 包含一个静态启动画面 | never | media-gfx/splashutils 在官网的portage树已经找不到了 |
iscsi | rootfs 在iscsi设备上的支持 | host-only: rootfs | sys-block/open-iscsi |
livenet | 通过HTTP检索rootfs 需要dmsquash-live 模块 | never | |
lvm | 支持rootfs 在LVM逻辑卷管理上 | host-only: rootfs | sys-fs/lvm2 |
mdraid | 支持rootfs 在软RAID上 | host-only: rootfs | sys-fs/mdadm |
multipath | 支持rootfs 在多路径上 | host-only: rootfs | sys-fs/multipath-tools |
nbd | 支持rootfs 在网络块设备上 | host-only: rootfs | sys-block/nbd |
nfs | 支持NFS挂载rootfs | host-only: rootfs | net-fs/nfs-utils 和net-nds/rpcbind |
plymouth | 包含启动动画 | always | sys-boot/plymouth |
ssh-client | 包含ssh和scp客户端 | never | dev-libs/openssl |
syslog | 包含远程登陆日志 | never | app-admin/syslog-ng 或者是rsyslog |
debug | 包含常用的故障排除工具 | never | 安装Dracut时候开启 USE=debug |
dm | 包含 device-mapper | never | sys-fs/device-mapper 或者是 sys-fs/lvm2 |
ifcfg | 在运行时候生成网络配置 | never | |
network | 为网络启动启用网络 | always | net-misc/dhcp 和 sys-apps/iproute2 |
selinux | 安排要加载的Selinux策略 | 当安装开启 USE=selinux 的时候 | |
url-lib | 包含curl命令和SSL证书 | never | net-misc/curl |
设定配置文件 主配置文件默认在
/etc/dracut.conf
我这里创建一个全新的文件来做dracut的配置
|
|
内容如下
|
|
保存并退出
生成initramfs
文件
|
|
安装bootload
这里使用的bootload是GRUB
安装
|
|
安装grub到引导分区
|
|
因为我们使用LUKS还需要对grub进行配置
|
|
按Ctrl+w 进入查找模式输入
GRUB_CMDLINE_LINUX
回车,去掉掉这行的注释(删除#
号)
修改内容如下
|
|
分别来说一下添加这些内容的含义
crypt_root=UUID=dbdff0d5-0c06-44b8-9879-a56400c80135
这个是LUKS分区的UUID可以用过lsblk
查看:例如
|
|
这里的话/dev/nvme0n1p2
就是LUKS分区所在的UUID不要复制错了
root=/dev/mapper/root
这个是解开LUKS分区后的默认位置
root_trim=yes
开启ssd的trim功能
rhgb
详细模式像是硬件检测之类的信息都会打印出来如果你不想要这些你可以设置为quite
alpha_support=1
测试的支持
loglevel=7
内核debug模式 如果你不想要详细的输出可以尝试调成其他的数值0-7
保存退出
生成grub.cfg
文件
|
|
配置fstab
配置fstab可以选择手写的方式也可以选择使用Archlinux的genfstab来生成fstab文件,个人比较推荐用Archlinx的genfstab来去做,减少人工输入的错误。
手写的方式配置fstab
基本语法
/etc/fstab
这个文件中每行都包含一个分区,驱动器或者是网络共享必须要设置。每行有6列,由空格和制表符分割。列内容如下:
- 设备文件,UUID或者是标签或者是其他找到分区或数据源的方法
- 将分区或者是数据源挂载到的目录
- 文件系统类型
- 选项,包括是否在引导阶段挂载系统
- 调整分区的存档计划(
app-arch/dump
使用)。0为禁用,1为启用该功能。 - 控制fsck在引导时检查设备/分区是否有错误,根分区应该是1。 其他的分区应该是2 (用于在root之后检查)用0就是完全不检查。 e.g.
|
|
让我们一起写一个很简单的挂载/
分区的例子,首先查看一下当前分区的UUID
|
|
以及挂载点
|
|
我们可以看到这个/dev/mapper/system
这个分区是挂载在/
下面的其分区UUID为7e664075-eedd-4d1a-9218-ac4c6471b033
那么我们可以这样写fstab
:
|
|
也许你注意到了这里有个 defaults
参数这个是干嘛的?这个是给使用的文件系统传输挂载的选项,许多都是通用的但是有些选项是特定文件系统才有的,这个说起来有点复杂请看下面这个表格:
选项 | 说明 |
---|---|
defaults | 使用默认挂载选项 rw,suid,dev,exec,auto,nouser,async |
auto | 在启动的时候自动挂载文件系统 |
noauto | 不在启动的时候自动挂载文件系统(这个通常为了安全可以这样设置,比如说boot下面存LUKS的KEY) |
ro | 以只读的方式挂载文件系统 |
rw | 读写的方式挂载文件系统 |
sw | 挂载swap文件系统 |
atime | 每次读取的时候更新inode的访问时间 |
relatime | 仅在写入时更新inode的访问时间以提高性能 |
noatime | 从不更新inode的访问时间来获得最高性能 |
sync | 在每次写入之后同步到设备。这个可能会缩短SSD的寿命 |
async | 异步同步驱动器 |
discard | 等于开启了trim的支持 |
exec | 允许执行二进制文件 |
noexec | 不允许执行二进制文件 |
suid | 跟随SUID 和SGID 位。 |
nosuid | 不跟随SUID 和SGID 位 |
user | 允许用户挂载文件系统 |
users | 允许每个用户挂载文件系统 |
nouser | 只允许root用户挂载文件系统 |
这些选项可以根据你的需要来灵活调整。
genfstab方式配置fstab
可以从我的dotfiles
里面找到这个genfstab
脚本
|
|
生成fstab
格式的输出
|
|
将输出追加到/etc/fstab
文件中
|
|
这里有很多不需要的可以删除掉类似tracefs
、cgroup2
、none
等等,精简后的fstab
文件如下
|
|
到这里fstab
的配置就算是完成了。
安装网络组件
为了重启之后机器还能够正常上网和排障,所以这里还需要安装一个网络组建,我这里更倾向于NetwrokManager这个网络组建,当然你也可以选择其他的网络组件
安装
|
|
启动
|
|
设置主机名
编辑/etc/conf.d/hostname
修改内容如下
|
|
你可以将yafa
设置成你喜欢的名字
添加和设置管理员账户
现在我们可以给root用户设置密码了
|
|
注意输入密码是没有回显的
但是日常用root操作还是太过于危险了,我们需要创建一个管理员用户作为我们日常的使用:
|
|
xena 是我的用户名你可以换成你的
设置密码
|
|
注意输入密码是没有回显的
为了实现临时的超级管理员权限我们还需要安装一个包
|
|
配置sudo
|
|
这样在wheel
组的用户在使用sudo的时候输入密码的时候就可以使用root的权限运行了。
安装网络组件
可以选择使用dhcp或者是NetworkManager服务去管理服务
dhcp
|
|
开机启动
|
|
networkmanager
安装:
|
|
开机启动:
|
|
安装系统推荐组件
安装记录日志的程序
|
|
加入到开机启动
|
|
定时任务
cron可以做定时任务,比如说每天,每周,每个月执行什么操作非常方便,建议安装。
安装定时任务
|
|
加入到开机启动
|
|
文件索引
|
|
远程访问(可选)
开机启动openssh-server
|
|
备份和清理工作
清理
删除之前下载的stage3文件
|
|
配置文件备份
可以暂时在/root
下创建一个备份的文件夹用于备份
|
|
复制我们所修改的文件到这个文件夹
|
|
重启
现在可以准备重启了,我们先要退出chroot环境
|
|
然后卸载文件系统
|
|
最后重启
|
|
在重启过grub的时候会提示让输入LUKS卷的密码输入之后就应该可以正常引导系统了! 但是现在只是基础的系统,距离我们想要用的桌面还还差一点。
故障排除
有的时候会遇到一些错误,这里记录一下可能遇到的错误以及如何处理。
安装和配置桌面
这里安装的桌面为KDE桌面,为了方便安装我们首先要切换一下系统的配置文件:
|
|
更新系统
|
|
在更新完成之后我们来安装桌面和必要的包
安装KDE桌面及应用
KDE 这里安装的是整个KDE+完整的应用:
|
|
配置KDE启动
这次启动我不打算用DM去管理改用startx
的方式。
创建并编辑~/.xinitrc
文件:
|
|
内容如下
|
|
接下来我们还要创建一个~/.xprofile
文件:
|
|
内容如下:
|
|
保存退出。
现在输入startx
之后就可以启动桌面了。
现在我们已经算是安装完成了ww。
最后的话
这次历时4天的安装体验让我学到了很多,像是Linux的启动流程,Initramfs,内核配置,桌面配置等等。 感受了Gentoo Linux的魅力,虽然这篇文章到这里就结束了,但是这也是我使用Gentoo Linux的开始。 感谢学姐送的Mac,同时也感谢Telegram Gentoo-zh群组热心大神的支持! 是时候回到工作了!