1 Star 0 Fork 11

coder_lw / wiki

forked from deepinwiki / wiki 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
gentoo.md 58.44 KB
一键复制 编辑 原始数据 按行查看 历史
htqx 提交于 2021-07-23 17:16 . kde 组件包

[TOC]

gentoo

前言

gentoo 是一个比较专业的linux发行版,它需要用户从一个很基础的框架,构建编译完成一个完全的系统。

我认为这会对linux的深入理解有所帮助。

安装 gentoo 需要具备一定的基础:

  1. 熟悉 linux shell 操作
  2. 会 nano 编辑配置
  3. 简单阅读英文提示的能力
  4. 对 linux 管理有一定的认知

准备工作

  1. install-amd64-minimal-<release>.iso: https://mirrors.tuna.tsinghua.edu.cn/gentoo/releases/amd64/autobuilds/current-install-amd64-minimal/install-amd64-minimal-20191225T214502Z.iso
  2. stage3: https://mirrors.tuna.tsinghua.edu.cn/gentoo/releases/amd64/autobuilds/current-install-amd64-minimal/stage3-amd64-20191225T214502Z.tar.xz
  3. 开启ssh服务(虚拟机或者远程操作)
passwd root # 设置管理员的密码,然后才能远程登录
rc-service sshd start # 开启ssh远程登录服务
  1. 良好的网络,因为gentoo通过网络下载和构建系统的
ip a # 查看ip
ip l # 查看设备
iw dev # 查看wifi
wpa_passphrase 6-1_5G 12345678 > /etc/wpa_supplicant/wpa_supplicant.conf # 配置 wifi 和 密码
wpa_supplicant -B -i wlp5s0 -c /etc/wpa_supplicant/wpa_supplicant.conf # 连接 wifi 设备 wlp5s0  

net-setup #  安装阶段可以使用这个软件提高配置效率
  1. 设置时间。网络下载需要正确的同步时间。
# 方法一
date -s "2019-10-27 18:41:00" #设置时间,注意这个是UTC时间,也就是北京时间-8个小时得到的时间。因为安装时还没有设置正确的时区,所以默认为UTC+0时区(北京时间是UTC+8)。
# 方法二
ntpd -q -g # 通过网络上的时间服务器设置时间
  1. 虚拟机安装注意事项

linux可以通过驱动来支持特殊的虚拟机磁盘,但是引导系统并没有这种驱动。

另外linux内核默认是不支持虚拟机的特殊网卡的。

  1. 安装技巧

gentoo 的安装比较复杂,也许一次,一天结束不了。所以可以编写脚本来重复进入安装环境。(包括退出 chroot 环境),这样会提高不少效率。

背景理解

gentoo 和普通的linux发行版优势在哪里,本节就要从大局上观察gentoo的功能特性:

gentoo 的 Portage 是软件管理系统,使用python和bash编写。这个系统使用 emerge 前端工具。而 ebuild 是软件的载体,包含软件的配置信息。ebuild 包的集合就是一个软件仓库。

本地仓库的地址是:/var/db/repoks/gentoo/

安装过程中下载的软件源码存放在:/var/cache/distfiles/

自定义管理软件的配置在:/etc/portage/

查询本地仓库信息的前端工具:equery

支持根据授权协议(软件许可证)管理软件:

  1. /etc/portage/make.conf
  2. /etc/portage/package.license
  3. /var/db/repos/gentoo/licenses/
  4. /var/db/repos/gentoo/profiles/license_groups

支持一个软件的多个版本分支,这技术叫 SLOT 。但是SLOT是 ebuild 包信息中的一项精心安排,不等于可以随意安装任意软件的多个版本,这避免了无意义的多个版本的安装。

支持 USE 构建标志(可以深度定制编译选项,这是portage系统最有特色的功能之一)。

  1. /etc/portage/make.conf
  2. /etc/portage/package.use/
  3. /var/db/repos/gentoo/profiles/use.desc
  4. /var/db/erepos/gentoo/profiles/use.local.desc
  5. /etc/portage/make.profile/

emerge 安装问题

类似 debian 的 apt, arch 的 pacman, gentoo 的软件管理工具叫 emerge。

但是 emerge 主要是通过源代码来构建软件,它类似普通软件安装管理,但是会有很多编译上的参数可以配置,并且,安装的时候必定会遇到 依赖冲突,这个不要慌,下面简单的总结一下解决的方案:

一、license 版权冲突

默认,gentoo 是只允许 FREE 软件版权声明的软件安装,但是一些私有软件,不开源的软件,也是存在在软件仓库中的。安装的时候就会警告。解决的方法:

# xxx 是组别
# yyy 是包名
# zzz 是版权声明
# 路径也许不存在,可以创建,这个配置目录下是控制应用是否允许某个版权声明
# 这个在冲突的时候会提示需要什么版权,但不会提示解决方法
echo 'xxx/yyy zzz' > /etc/portage/package.license/yyy

二、use 冲突

gentoo 的一个特色,就是将底层繁复编译参数归结为 use,类似开关的东西,不同的 use 会编译不同的软件特性和组件。 一个包有多个 use。 问题在于,有时候有些 use 会导致“循环依赖”问题。

修改 use 的方法有两个:

  1. 修改 /etc/portage/package.use/ 下的配置
  2. 修改 USE 环境变量
# = 表示匹配特定版本
# xxx 组别
# yyy 包名
# -1.0.1 版本号
# X 表示添加 X USE
# -staging 表示删去 staging USE
echo '=xxx/yyy-1.0.1 X -staging' > /etc/portage/package.use/yyy

# 临时修改本次安装的 USE
USE='X -staging' emerge -aq yyy 

三、循环依赖

A 包要求安装 B包,这叫 A 依赖 B。然后 B 包又要求安装 A包,这叫循环依赖。

如果是其他包管理软件,这叫系统性错误,是软件仓库管理人员配置有问题。但是这在gentoo 中一定层度上是合理的。因为 A包只有开启某个 USE 的时候才会依赖 B。如果把对应的 USE 关闭, 他就不会依赖 B, 循环依赖就会解除,等B编译完成后,A 再开启这个 USE 即可完美解决这个循环依赖。

著名的 freetype 包和 harfbuzz 包的循环依赖案例(官网论坛 2014 年就在讨论,到今天 2021 年新用户还是会面对这个问题):

解决策略,我认为:

  1. 只安装这两个包,缩小问题规模(因为你可能是安装其他东西提示这两个包的循环依赖错误)
  2. 临时修改 USE=’-harfbuzz'(freetype 因为USE harfbuzz 产生对 harfbuzz 的依赖)
  3. emerge -aq freetype harfbuzz freetype 这种排列也有一定自动解决的能力

ps:本人是通过修改 package.use 的配置来解决的。

四、多版本依赖

错误提示: Multiple package instances within a single package slot have。

这个问题是成因是之前编译的 C 包依赖 A 包的某个 USE,而现在你需要改变 A 包的这个 USE 来重新构建 A 包,这种依赖就会提示系统要安装同一个包(同一个插槽)的不同版本。

插槽 solt 是 gentoo 的一种技术,比如 python 2 和 python3 的包名字相同,但是 gentoo 允许同时安装,怎么区分?就是所谓插槽技术。包依赖写法上是:python:2 这样。用户通过 eselect python 来配置当前使用哪个插槽。

它的提示同一个插槽安装不同版本的包,就是这个意思。

解决方法比较粗暴:

  1. 删除 C
  2. 配置 A
  3. 恢复 C

这个问题和著名的 freetype harfbuzz 相关, pango 依赖 freetype 的 harfbuzz USE。

emerge -C pango
USE='-harfbuzz' emerge -aq freetype harfbuzz freetype
USE='harfbuzz' emerge -aq freetype pango

五、相关案例

  1. freetype / harfbuzz
  2. freetype / pango
  3. ncurses / gpm

六、自动配置工具

除了主动配置,gentoo 自带了一些自动化配置工具,在冲突的时候它会提示你(不过是英文,要耐心看报错)。

etc-update 这个工具会自动将需要的USE 配置到 /etc/portage/package.use/zz-autounmask 。

遇到相关提示的时候,只需要:

etc-update
# 然后输入 -3 确认
# 然后输入 y 确认

这样它就会将需要的 USE 配置追加到 zz-autounmask 文件中。

七、~amd64 测试软件冲突

gentoo 有很多包会提示 masked by: ~amd64 keyword, 啥意思?就是这个包还没有在 amd64 架构上进行充分测试,但不代表不能用,所以你非要用,也是可以配置的。

# 这个配置文件将允许你配置需要强行安装的软件
echo 'xxx/yyy' >> /etc/portage/package.accept_keywords 

构建基础

下载.iso镜像,验证文件完整性,刻录,引导进入光盘系统后:

passwd root # 创建管理员root的密码
rc-service sshd start # 开启ssh远程登录服务
ip a # 查看ip
ntpd -q -g # 通过网络上的时间服务器设置时间

因为光盘是无法保存的,下次开机还是要重做一次。如果使用虚拟机,这时候用 ssh 登录,就很方便了,因为虚拟终端登录是支持中文的。而在虚拟机里面的终端是不支持中文的。如果你是真实电脑安装,那么开启ssh后台服务这一步可以免去。

分区

lsblk # 查看设备情况
cfdisk /dev/sda # 根据你的实际情况来分区

分区为:

  1. /boot/efi : 300m引导,fat32格式
  2. / : 20G 以上,ext4 格式
  3. gpt 分区表
  4. bios 设置为uefi引导

cfdisk 分区不会先学习。这里不展开讨论了。

创建挂载点

比如分区情况如下:

  1. /dev/sda1 : 挂载到/mnt/gentoo/boot/efi
  2. /dev/sda2 : 挂载到/mnt/gentoo/

另外,一些动态的文件系统(即内核引导过程中会生成的虚拟文件系统),也要挂载到目标位置:

  1. /proc : /mnt/gentoo/proc
  2. /sys : /mnt/gentoo/sys
  3. /dev : /mnt/gentoo/dev
# 创建挂载目标文件夹
mkdir -pv /mnt/gentoo/{boot/efi,proc,sys,dev}
# 挂载
mount -v /dev/sda1 /mnt/gentoo/boot/efi
mount -v /dev/sda2 /mnt/gentoo
mount -v --types proc /proc /mnt/gentoo/proc
mount -v --rbind --make-rslave /sys /mnt/gentoo/sys
mount -v --rbind --make-rslave /dev /mnt/gentoo/dev

下载解压stage3包

cd /mnt/gentoo
links https://mirrors.tuna.tsinghua.edu.cn/gentoo # 这是一个命令行的网页浏览器,可以在releases/amd64/autobuilds/current-stage3-amd64下面找到stage3-amd64-xxxx.tar.xz下载,当然也可以提前下载好

# 验证下载的文件的完整性是很必要的步骤,万一文件不完整将浪费你大量时间
# 比如我下载的是:stage3-amd64-20191225T214502Z.tar.xz
# 对应的验证文件就是:stage3-amd64-20191225T214502Z.tar.xz.DIGESTS.asc
# 查看sha512sum校验码
sha512sum stage3-amd64-20191225T214502Z.tar.xz
# 对照官方给出的校验码
cat stage3-amd64-20191225T214502Z.tar.xz.DIGESTS.asc
# 校验码很长,一般看最后几位正确即可

# 解压缩
tar -xpvf stage3-amd64-20191225T214502Z.tar.xz --xattrs-include='*.*' --numeric-owner
# 这一步之后,/mnt/gentoo这个目标系统上,就有了基本的系统文件了

配置构建系统

gentoo特色的构建系统,叫Portage,主要的配置文件是:

  1. /etc/portage/make.conf
  2. /etc/portage/repos.conf/*.conf
# 添加镜像源到配置文件,选清华tsinghua
mirrorselect -i -o >> etc/portage/make.conf 
# GENTOO_MIRRORS="https://mirrors.aliyun.com/gentoo/ https://mirrors.tuna.tsinghua.edu.cn/gentoo"

# MAKEOPTS="-j12"
# 查看并调整配置,可以添加以上到里面,其中 -j12 表示开启 12 个线程来编译,根据你cpu核心数填写,能极大提高编译速度

# COMMON_FLAGS="-march=native -O2 -pipe"
# 修改该配置,添加 -march=native 参数,提高编译后软件性能

nano etc/portage/make.conf 

# gentoo 的软件仓库的配置地址在/etc/portage/repos.conf/目录下的.conf文件,名字可以自己写,但要求.conf结尾
# 可以复制默认的配置到里面
mkdir -pv etc/portage/repos.conf
cp -v usr/share/portage/config/repos.conf etc/portage/repos.conf/gentoo.conf

配置网络

linux要访问互联网,要配置好相关的DNS文件,这个文件引导的时候会生成,但是我们现在还不能引导新系统,所以要先复制现在的配置到新系统的对应位置。

cp -dereference -v /etc/resolv.conf /mnt/gentoo/etc/

进入目标文件系统

啥意思?/mnt/gentoo是我们的目标文件系统,将来就是启动这个文件系统,linux有个命令,可以将当前的系统切换到/mnt/gentoo,即/mnt/gentoo 变成 /。

# 切换当前的根目录到/mnt/gentooi
# 并执行切换后的第一个命令/bin/bash 即现在的/mnt/gentoo/bin/bash
chroot /mnt/gentoo /bin/bash 
# 执行环境设置
source /etc/profile
# 修改命令提示为,增加“(chroot)”字符串在前面,以标识现在是chroot 根后的环境。之后可以用exit来退出chroot环境。
export PS1="(chroot) ${PS1}"
# 从这里开始,做的操作是基于硬盘上的新系统而言,而不是光盘上老系统,chroot的好处,就是新系统还没配置完成,也可以借助另一个系统来引导并进入,这在修复系统的时候经常会使用到这项技术。

引导新系统

这一步的目的是继续配置完善新系统,并让其可以独立引导自身。

# 更新远程软件仓库信息,gentoo的软件仓库系统叫ebuild
emerge-webrsync 

# gentoo通过eselect 来配置要安装的软件
# 显示可选的配置,*标识当前的选择
eselect profile list  

# 选择配置2,例子,不要运行,默认即可
eselect profile set 2 

# 当更新了选择要运行以下命令
emerge --ask --verbose --update --deep --newuse @world 

# 查询允许的软件许可证
# @FREE 开源软件
# @BINARY-REDISTRIBUTABLE 二进制自由分发
# @EULA 非自由产品
portageq envvar ACCEPT_LICENSE
# 查询设置的USE标志(软件功能特性)
portageq envvar USE

设置时区

# 时区文件在/usr/share/zoneinfo文件夹内
# Asia/Shanghai 是北京时间的时区
# zdump可以测试用该时区文件显示时间
zdump /usr/share/zoneinfo/Asia/Shanghai
# 配置时区
echo "Asia/Shanghai" > /etc/timezone
# 配置portage系统的相关时区组件
# 生成更新/etc/localtime 本地时区文件。
emerge --config sys-libs/timezone-data
# 测试时间,这时能和北京时间对上了,而不是UTC时间
date

设置地区

地区的设置,会影响系统显示的语言。

nano /etc/locale.gen #配置语言编码

配置文件内容如下:

# 英文
en_US ISO-8859-1
en_US.UTF-8 UTF-8
# 高贵的中文
zh_CN GBK 
zh_CN.UTF-8 UTF-8
locale-gen #根据配置重新生成区域模块

locale -a  # 显示当前可以选择的本地化区域

eselect locale show # 显示 gentoo 模块当前配置的区域
eselect locale list # 显示可选列表
eselect locale set 9 # 选择zh_CN.utf8 这项(注意看你的编号实际是多少)

# 重新加载配置好的环境变量到命令行
env-update 
source /etc/profile
export PS1="(chroot) ${PS1}"

构建linux内核

linux中的系统文件和内核本身不是捆绑的,系统可以拥有多个内核,一次选择启动其中一个,甚至可以借助别的系统中的内核,chroot进系统来操作(比如现在的做法)。可以说是很灵活的。

这一步就是编译生成新系统自己的内核。

# 下载内核源码包,提示回yes即可
# 内核源码包将安装到/usr/src/目录下,如 linux-5.10.49-gentoo-r1
emerge --ask sys-kernel/gentoo-sources

# 创建个 linux 符号链接(很多工具访问这个目录来确定内核源代码位置)
ln -s  /usr/src/linux-5.10.49-gentoo-r1 /usr/src/linux

# 安装硬件信息检测工具lspci
emerge --ask sys-apps/pciutils
lspci # 查看硬件配置信息,假装能看懂即可

# 配置内核
cd /usr/src/linux
make menuconfig # 建议 make nconfig 菜单比较好看

出来的配置窗口的操作方法:

  1. 箭头键浏览菜单。
  2. <Enter>选择子菜单--->(或空子菜单----)。
  3. 突出显示的字母是热键。比如 Support xxx,按 s 键就能跳到该项
  4. <Y>包括,<N>排除,<M>模块化功能。
  5. <Esc> <Esc>退出,按<?>获得帮助,按</>进行搜索。
  6. 图例:[*]内置,[]排除,<M>模块,<>未选模块

所谓模块是指linux内核的一项扩展功能,它将内核的一些功能做成外部模块文件,这样能缩小内核大小。内核模块存放在/lib/modules/内核版本/文件夹中。

基本不需要修改,可以直接套用默认设置。

make localmodconfig # 建议使用这个引导盘自带的默认配置,而不用以上人工配置
make # 开始编译内核,请耐心等待漫长的编译过程

# 安装内核模块
# 我的是安装到/lib/modules/4.19.86-gentoo/
# 根据你安装时候的内核版本,最后的文件夹有所不同
# 复制内核模块完毕后,它运行 "depmod 4.19.86-gentoo"来更新内核模块间依赖关系的表格
# 这样模块就会自动加载到内存
make modules_install 

# 安装内核
# arch/x86/boot/bzImage --> /boot/vmlinuz-4.19.86-gentoo :内核
# System.map --> /boot/System.map-4.19.86-gentoo :符号表
# .config --> /boot/config-4.19.86-gentoo:当前内核的配置选项
make install 

# 安装驱动的固件
# 固件是驱动固化的一部分
# 啥意思?可以理解驱动需要它才完整,即可
# linux中的驱动属于内核的一部分
# 大多时候,这部分作为内核模块放置到内核文件外部
# 内核 --> 内核模块(驱动)--> 固件
# 大概就是这么一个关系
# 安装到: /lib/firmware
emerge --ask sys-kernel/linux-firmware

# 注意,gentoo安装软件是有个许可证制度
# 默认是开源许可证
# 而linux-firmware 不是源代码开放的
# 因此系统可能在这里会阻止你安装
# 提示:IMPORTANT: config file '/etc/portage/package.license' needs updating.
# 即你需要更新/etc/portage/package.license
# 来接受linux-firmware的许可证
# 方法如下:
etc-update # 应答时输入 -3 即可
# 实质是添加以下内容到package.license文件:
# =sys-kernel/linux-firmware-20191215 linux-fw-redistributable no-source-code
# 然后再次安装固件包,就能顺利安装了

内核和内核模块的安装并不复杂,就是复制相关文件而已。路径中带有版本信息,因此可以同时安装多个内核。那,系统怎么知道引导哪个内核?

注意这是两个概念,引导内核的工具叫引导管理器,比如grub,这个管理器可以搜索当前所有的内核,生成引导菜单,至此,系统就可以引导了。

配置新系统

引导系统需要准备:

  1. /etc/fstab : 分区挂载点
  2. /etc/hosts : 主机名
  3. /etc/rc.conf :后台服务管理
    1. /etc/conf.d/keymaps : 键盘码表
    2. /etc/conf.d/hwclock : 硬件时钟
  4. 网络设置

fstab 挂载点

格式: 1.标识 2.挂载点 3.文件系统 4.挂载选项 5.dump 6.fsck

# 用lsblk获得partuuid信息
# 这个信息很长,所以这样会方便很多
# 然后按照格式修改回来即可
lsblk -o name,partuuid,mountpoint >> /etc/fstab

# 编辑修改
nano /etc/fstab

内容类似:

# user settings
#sda1 88321b18-1068-894c-ad11-b58317d5c4b2 
#sda2 
PARTUUID=114f7555-1f5d-574c-b4eb-8e241c5468ed /boot/efi vfat rw 0 0
#sda3 
PARTUUID=304b9f21-f2da-e04c-b4c2-8e1fc4c49a4c /  ext4 defaults 0 1

将lsblk 转储的信息编辑以下,去掉无用的信息。

第一项:partuuid是一串字符,按照fstab的格式要求,要添加PARTUUID=在前面。

第二项:挂载点

第三项:文件系统,efi分区是fat32,在linux中标识为vfat。根分区是ext4

第四项:挂载参数。一般defaults默认即可。其中,vfat格式的挂载参数比较复杂,参数比较多,每个参数要用逗号分隔,如果要显示汉字还要指定codepage文字编码。具体参考:https://www.cnblogs.com/Zyf2016/p/6337787.html

第五项:dump 项填0即可,表示不备份信息。

第六项:fsck 是检查磁盘的顺序,0不检查,1 一般是 / 根分区 ,2 是其他分区。

# 可以测试一下自动挂载的情况
# 以免重启之后挂载失败,导致引导失败
umount -a #卸载所有设备,但是正在使用的卸载不了,比如根分区,所以测试不了它
lsblk # 查看挂载情况
mount -a # 根据/etc/fstab文件的设置自动挂载
lsblk # 看看有没有自动挂载成功
findmnt # 这个可以看到更加详细的挂载选项的信息

主机名和网络

nano /etc/conf.d/hostname # 改成你喜欢的名字,如我改成 hostname="gentoo"

# 网络配置
emerge --ask --noreplace net-misc/netifrc
nano /etc/conf.d/net

内容如下:

# 网络名
dns_domain_lo="vbox"
nis_domain_lo="vbox.nis"
# 动态ip
config_eth0="dhcp"
# 后台服务自动启动网络接口
cd /etc/init.d
ln -sv net.lo net.eth0
rc-update add net.eth0 default

这里要注意,我们假设网络接口是eth0,而实际上linux内核对网络接口的命名并不一定是这个名字,如果启动后发现不是,那么就要重新配置正确的名字。启动后用ip a即可查看网络接口的名字。

  1. 修改/etc/conf.d/net
  2. 重新添加后台启动
  3. 删除错误的
    1. rm /etc/init.d/net.eth0
    2. rc-update del net.eth0 default

hosts 主机网络

# 修改 ip 和域名的对应关系
nano /etc/hosts

类似:

127.0.0.1	gentoo gentoo.vbox localhost 

基本应用

安装系统需要的基本工具。

系统日志:

# 安装
emerge --ask app-admin/sysklogd
# 自动启动
rc-update add sysklogd default

计划任务:

emerge --ask sys-process/cronie
rc-update add cronie defaul

文件索引:

emerge --ask sys-apps/mlocate

远程访问:

rc-update add sshd default

动态ip客户端:

emerge --ask net-misc/dhcpcd

PPPoE客户端(拨号工具):

emerge --ask net-dialup/ppp

wifi工具:

emerge --ask net-wireless/iw 
# 这里有个错误
# 如不用wifi可以跳过
emerge --ask net-wireless/wpa_supplicant

这里出现的错误(也许你没有),是wpa_supplicant依赖低版本的openssl库,而之前已经安装了更高版本的库,怎么办?

emerge提示我修改USE=+bindist,具体这样做:

# 将新USE应用到软件
# = 匹配版本
# net-wireless/wpa_supplicant 包
# -2.9-r1 版本
# +bindist 构建标志USE 
echo "=net-wireless/wpa_supplicant-2.9-r1  +bindist" >> /etc/portage/package.use/openssl.use
# 再次安装即可
emerge --ask wpa_supplicant

引导管理器

linux世界中,grub和lilo是比较常用的引导管理工具。

# 安装grub2 ,编译需要等待一段时间
emerge --ask --verbose sys-boot/grub:2
# 安装引导器文件
grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable
# 生成引导菜单
grub-mkconfig -o /boot/grub/grub.cfg

这要求你的系统配置成uefi启动模式。要怎么做?这里不展开了。

grub 的引导管理器,是一个特殊的可执行文件(efi格式),但是如果你增加一个内核,就要求重新生成一次比较麻烦,所以菜单配置是独立于管理器的。这个设计允许你安装新系统,或者新内核,可以只更新一下引导菜单。生成菜单的工具可以搜索到对应的内核和系统,并生成对应的引导菜单。

主板引导菜单管理器

除了基于硬盘的管理器,主板bios里面也可以保存uefi的引导菜单。电脑是先读取主板的菜单,然后再读取硬盘的菜单,理论上你可以只用一个,或者两个都用,双重保障。基于硬盘会更加灵活,基于主板优先级更高。

# 安装主板引导菜单管理器
emerge --ask sys-boot/efibootmgr
# 复制当前内核到efi分区,必须
# 因为uefi只能读取efi分区
cp -v /boot/vmlinuz-4.19.86-gentoo /boot/efi/EFI/BOOT/
# 查看efi分区的位置
lsblk
# 创建主板菜单条目
# 我这里是第一个硬盘的第二个分区是efi分区
# 内核是可以自我引导的
# uefi用的路径方式类似windows的反斜杠
# 相对于efi分区做起点,而非linux根
efibootmgr --create --disk /dev/sda --part 2 --label "Gentoo" --loader '\efi\boot\vmlinuz-4.19.86-gentoo'
# 查看菜单详情
efibootmgr -v

设置新系统账户

没有密码的root账户是无法登录的。

# 这里设置是改变新系统的配置
# 而不是临时的光盘系统
passwd root # 输入密码
# 设置管理员可以用ssh远程登录
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config

至此,新系统已经准备完毕。

exit # 退出chroot
# 卸载挂载点
# -l 立即断开文件系统,清理工作后续进行
# -R 递归卸载
umount -l /mnt/gentoo/dev{/shm,/pts,} 
umount -R /mnt/gentoo
reboot # 重启测试新系统是否正常引导

注意,重启系统后,网络有可能是不正确配置的,要按照前面讲述的步骤来修改。

ip a # 查看网络接口是否和配置的一样

日常管理

用户管理

# 创建新用户,并添加进users和wheel组
# wheel组可以用 “su - ” 登录root账户
useradd -m -G users,wheel htqx
# 设置密码
passwd htqx

变更本地语言

中文在终端下是无法显示出来的,如果你发现自己出现方框,可以改变本地语言的环境变量

LANG=en_US.UTF-8

软件管理

远程仓库信息同步的方式:

# 和官方仓库直接同步(最新)避免频繁使用,否则会被列入黑名单
emerge --sync
# 或使用web协议和镜像同步
emerge-webrsync

搜索

emerge --search neofetch
emerge -s neofetch
emerge -S neofetch # 搜索内容包括说明信息

emerge -aq eix # 安装
eix-update # 同步资料库
eix neofetch # 搜索速度飞快!但需要安装 eix
# 输出:
[ Results for search key : neofetch ]
Searching...

*  app-misc/neofetch
      Latest version available: 6.0.0
      Latest version installed: [ Not Installed ]
      Size of files: 113 KiB
      Homepage:      https://github.com/dylanaraps/neofetch
      Description:   Simple information system script
      License:       MIT-with-advertising

[ Applications found : 1 ]
# app-misc/neofetch 就是该包的准确标识

安装

# emerge 会自动定位下载 neofetch
# 并进入安装步骤
emerge --ask neofetch # -a 是交互式,询问你确认
emerge -a neofetch
emerge -a -q neofetch # 减少信息输出

emerge -a -p neofetch # p 选项是预览结果,并不执行,很多命令可以用这个预览一下,以免误操作

重装

# 重装但不标记为主动安装的软件(这样便于自动卸载)
# 比如对依赖项的重装
# 对于主动安装的软件将添加如 @world 列表,被系统跟踪维护
emerge --oneshot neofetch
emerge -1 neofetch

# 变更 USE 时(添加和删除)重新安装
emerge -1 --newuse neofetch
emerge -1N neofetch

# 添加 USE 时重新安装
emerge -1 --changed-use neofetch
emerge -1U neofetch

卸载

# 强制删除
emerge --unmerge neofetch
emerge -C neofetch

# 查看是否有依赖项,没有再删除(有先处理)
emerge -depclean -v neofetch # 不想进行删除,按 ctrl+c 终止
emerge -cv neofetch 
emerge -pcv neofetch # 建议先预览一下

升级

emerge --update neofetch
emerge -u neofetch

其他操作

# 查询软件包的依赖
emerge --pretend neofetch
emerge -p neofetch

# 下载到/var/cache/distfiles,不安装
emerge --fetchonly neofetch

# 删除缓存的包
rm -rf /var/cache/distfiles/*
eclean distfiles # 仅删除过时的包
rm -rf /var/tmp/portage/* # 临时安装文件

# 查看包安装信息
emerge -vp neofetch

# 修复反向依赖
revdep-rebuild
emerege @preserved-rebuild

# 查找已安装软件的相关文件
# 这工具要先安装 app-portage/gentoolkit 包
equery files --filter=doc neofetch

更新系统

所谓更新系统,就等于将系统里面的软件都更新一遍。

# 支持更多参数
# --deep 将依赖项也更新
# --with-bdeps=y 将构建工具也更新
# --newuse 执行新的构建选项USE
# --depclean 将已经没用的依赖卸载掉

# 升级系统所有软件
emerge --update --newuse --deep @world
emerge -uND @world

# 删除不被依赖的软件包和重建被依赖的软件包
emerge --depclean 

# 更新依赖关系
# 这个工具在 app-portage/gentoolkit 包提供
revdep-rebuild

配置方法

更改构建选项USE:

这是 gentoo 最具特色的功能,可以根据 USE 构建选项来调整软件的特性。

# 设定自定义USE选项
echo "app-misc/neofetch -X" >> /etc/portage/package.use/neofetch

# 查看包支持的USE选项
equery uses neofetch 

添加许可证:

gentoo 的软件需要认可它的许可证才能安装。

echo 'xxx/yyy 许可证' > /etc/portage/package.license/yyy

添加测试:

有部分软件标记 ~amd64 ,意思是没经过充分测试,但你可以添加为测试软件

echo 'xxx/yyy' >> /etc/portage/package.accept_keywords

二进制包

gentoo 大部分包都是源代码,让用户从头构建,但是也支持预编译的二进制包。

# 先删除,演示
emerge --unmerge neofetch

# 预编译成二进制包
# 默认存放路径 /var/cache/binpkgs/
quickpkg neofetch 
# 安装二进制包
emerge --usepkg neofetch
# 使用
neofetch

安装第三方软件仓库

官方的软件仓库东西不少,但是还是不如其他大的发行版,不过有爱好者补充了一些应用,在 gentoo-zh 中可以下载安装。

# 源管理工具
emerge -avt layman
# 列出可以用的源
layman -L
# 添加 gentoo-zh 源
layman -a gentoo-zh
# ok,用 emerge 搜索安装即可

安装 steam 游戏

游戏是单独的仓库。

# 添加 Steam 仓库
layman -a steam-overlay
# 安装 steam
emerge -aq steam-launcher

openrc 后台服务

后台服务是什么?就是在后台默默运行的程序,它提供一些基础支持给前台程序。我们使用的虽然是前台程序,但是后台如果没有运行服务,那么它也是不能正常工作的。

后台程序有两个基本特性,就是自动启动,后台执行。那么怎么管理它,配置它?这就是后台管理程序 openrc 的任务了。现在大部分 linux 发行版使用的都是 systemd 管理程序,但是它太庞大,所以就有人开发了更加小巧的 openrc。

openrc 不是单独的软件,而是一个系统。它有一套管理软件,配置文件和执行脚本。

rc-service:

  1. 状态: rc-service 服务 status
  2. 启动: rc-service 服务 start
  3. 停止: rc-service 服务 stop

openrc 提供”运行级别“的分组功能,服务需要配置到特定的运行级别上执行。

rc-update:

  1. 当前服务所处的运行级别:rc-update show -v
  2. 配置到特定运行界别(default)上运行: rc-update add 服务 default
  3. 从当前运行级别中删除: rc-update delete 服务

rc-status:

  1. 列出当前运行级别的所有服务的状态:rc-status
  2. 崩溃的服务: rc-status -c
  3. 运行级别: rc-status -l
  4. 所有服务: rc-status -s

openrc 可以对服务进行配置

  1. 服务的配置:/etc/conf.d/服务
    1. 服务.运行级别
    2. 服务
    3. 服务.ext.运行级别
    4. 服务.ext
  2. 运行级别(创建对应目录):/etc/runlevels/运行级别
  3. openrc 主配置: /etc/rc.conf

openrc:

  1. 改变运行级别: openrc 运行级别
  2. 默认自带的运行级别:
    1. boot : 引导 (服务会一直运行)
    2. shutdown: 关机 (关闭所有服务)
    3. sysinit: 系统初始化 (服务会一直运行)
    4. default: 默认
    5. nonetwork: 无网络
    6. hotplugged: 热插拔(动态生成)
    7. manual: 手动(动态生成)
    8. single: 单用户模式 (即维护模式,将关闭除了sysinit 外的所有服务)

不同级别实际上代表了将会执行哪些关联服务,而这些服务对当前级别的目的提供支持。所以改变运行级别的含义就是改变系统的运行状态和运作模式。

多个服务实例:

openrc 允许运行同一个服务的多个实例。

# 只需要创建原服务的一个链接,格式: 服务.别名
ln -s /etc/init.d/tinydns /etc/init.d/tinydns.internal

# 相关配置也可对应生成
cp /etc/conf.d/tinydns /etc/conf.d/tinydns.internal
cp -r /etc/tinydns /etc/tinydns.internal

oopenrc 脚本

shebang:

#!/sbin/openrc-run

脚本节点:

  1. start()
  2. stop()
  3. status()
  4. depend() : 依赖
    1. use : 插件(如果有配置到当前运行级别)
    2. need : 依赖
    3. want : 插件(不管在不在当前运行级别配置了)
    4. after : 在指定服务之后启动
    5. before : 在指定服务之前启动
    6. provide : 提供服务(真实或虚拟的)
    7. config : 配置文件(如果有变化将重新计算依赖)
  5. start_pre()

脚本参数:

  1. name
  2. cfgfile
  3. command
  4. command_args
  5. command_user
  6. pidfile
  7. start_stop_daemon_args
  8. command_background

环境变量:

  1. RC_SVCNAME : 服务名
  2. RC_SERVICE : 路径

安装 KDE 桌面

KDE 是两大主流桌面之一,另一个是 gnome。 kde 会更类似 windows,而且可配置性也更高一些。

不过, kde 是非常庞大的桌面,带有庞大的相关包。除非你很清楚都有什么包,否则可以安装官方的包组:

  1. plasma-meta
  2. kde-apps-meta (尤其慢)
    1. kde-apps/kdeaccessibility-meta:“无障碍”程序和工具。
    2. kde-apps/kdeadmin-meta:管理工具,用以管理系统。
    3. kde-apps/kdecore-meta :基本的应用,比如文件管理器,编辑器,终端模器。
    4. kde-apps/kdeedu-meta :教育用程序和游戏。
    5. kde-apps/kdegames-meta :基本的桌面游戏
    6. kde-apps/kdegraphics-meta :图形方面的程序,例如图片查看器,取色器等。
    7. kde-apps/kdemultimedia-meta: 多媒体程序和服务。
    8. kde-apps/kdenetwork-meta :网络相关的程序和 VNC 服务。
    9. kde-apps/kdepim-meta :个人信息管理程序比如电子邮件客户端,组织,讯录等等。
    10. kde-apps/kdesdk-meta :一些开发工具
    11. kde-apps/kdeutils-meta :基本的桌面工具,比如归档管理器,计算器等等。

安装桌面之前,首先要选择配置:

eselect profile list 
# [8]   default/linux/amd64/17.1/desktop/plasma (stable)
eselect profile set 8
emerge -aq --newuse --update --deepin @world

gentoo 的配置是有层级的,建议先安装初级的配置练练手,桌面配置相关的冲突可能很多,需要解决。

选好 profile 配置,并不会主动安装桌面,只是基本环境而已。

安装桌面前,先安装基本的图形设备:

  1. nvidia-drivers (如果你有 nvidia 显卡)
emerge -aq nvidia-drivers # 如果有冲突就解决
nvidia-xconfig # 这个会自动配置 /etc/X11/xorg.conf ,然后才能正常
nvidia-xconfig --prime # 这个会产生prime 双显卡配置,没双显卡不用配置

安装桌面:

  1. plasma-meta
  2. kde-apps-meta :这个可以不用安装,但会少很多实用工具,除非你很清楚他们的名字,分别安装定制当然更好

估计要一天吧。

配置桌面:

  1. 后台服务
    1. dbus
    2. udev
    3. display-manager
# 很大可能都已经安装过(黄色的 R)标记,不用再装
emerge -aq dbus eudev udisks

本人安装的时候 dbus 和 sddm (用户桌面登录管理器)产生了冲突,原因不明,这时候你可把 dbus 停掉,不影响桌面启动。

修改 /etc/conf.d/display-manager:

  1. DISPLAYMANAGER="sddm"

添加到后台启动:

rc-config add dbus default
rc-config add udev init
rc-config add display-mananger default

后来我修改 dbus 的配置 /etc/init.d/dbus ,添加在 display-manager 后运行就就正常了:

depend() {
        need localmount
        after bootmisc
        after display-manager # 添加这行
}

一些比较常用的app:

  1. wps-office
  2. okular : 看 pdf
  3. ark : 解压缩
  4. filelight : 分析目录空间占用
  5. kcalc : 计算器
  6. kate : 文档编辑器
  7. kwrite : 记事本
  8. kfind : 查找文件
  9. kolourpaint : 画图
  10. kget : 下载
  11. konversation : 聊天室
  12. krdc : 远程连接
  13. krfb : 桌面共享
  14. system-config-printer : 打印机设置
  15. kinfocenter : 系统信息
  16. ksystemlog : 日志
  17. ksysguard : 任务管理器
  18. konsole : 命令行终端
  19. partitionmanager : 磁盘分区
  20. kdiskfree : 磁盘剩余空间
  21. systemsettings5 : 系统设置
  22. dragon : 播放器
  23. elisa : 音乐播放器
  24. juk : 音乐播放器
  25. k3b : 光盘刻录
  26. kdenlive : 视频剪辑
  27. kmix : 声音控制器
  28. phonon / phonon-gstreamer : kde 声音系统和其后端(注意:默认会安装 phonon-vlc 后端,带一个 vlc 播放器)
  29. spectacle : 截图

探索机制

这一节又从整体上去把握一下gentoo系统从引导过程开始执行的相关任务。

  1. 引导程序grub
  2. 内核
  3. init 进程
    1. /etc/inittab
  4. /etc/fstab 文件系统
  5. /etc/init.d/ 后台服务
    1. /etc/runlevels/boot
    2. /etc/runlevels/default
  6. agetty 启动终端,接受登录

服务脚本支持的操作:

  1. start启动、stop停止、restart重启
  2. zap同步状态、status状态
  3. ineed依赖、iuse可用(仅运行级别内)、iwant想用(所有脚本)
  4. needsme被依赖、usesme被可用、wantsme被想用

服务管理工具 rc-update:

  1. add添加到组(runlevels运行级别)
  2. del删除从组
  3. show显示某组脚本

脚本的用户配置:

  1. /etc/conf.d/脚本名
  2. /etc/conf.d/basic
  3. /etc/rc.conf

openrc 脚本: gentoo 默认采用的openrc工具做后台服务管理,因此脚本是openrc格式的。

#!/sbin/openrc-run
# 依赖信息
depend(){}
# 启动需要的命令
start(){}
# 停止需要的命令
stop(){}

环境变量

环境变量只是很简单的词组对 "变量=值" ,但是对系统的状态和运行机制有着深刻的影响。

环境变量 举例 说明
PATH PATH=/bin:/sbin 可执行文件夹组
ROOTPATH ROOTPATH=/sbin:/usr/sbin 管理员可执行文件夹组
LDPATH LDPATH=/usr/local/lib 动态链接器搜索目录
CONFIG_PROTECT portage保护
CONFIG_PROTECT_MASK portage不保护

环境设置工具 env-update:

  1. /etc/env.d/
  2. /etc/profile.env
  3. /etc/profile
  4. /etc/ld.so.conf
  5. /etc/portage/env/
  6. /etc/portaage/package.env/

用户目录的环境变量:

  1. ~/.bashrc
  2. ~/.bash_profile

临时环境变量(终端输入):

# 影响当前终端会话和子会话
export PATH="~/bin:${PATH}" 

# 只影响当前会话
AAA="hello"

Portage

作为gentoo的精髓,当然要对portage大书特书。如果不深入理解portage,那么用gentoo的意义已经变得可有可无了。

配置:

  1. /usr/share/portage/config/make.globals
  2. /etc/portage/make.profile/: 多级配置目录
    1. make.defaults
    2. /etc/portage/profile/packages : 自定义配置,覆盖make.profile
  3. /etc/portage/make.conf : 主配置文件
    1. package.mask : 屏蔽的软件包
    2. package.unmask: 解除系统屏蔽的包
    3. package.accept_keywords: 允许安装的非兼容包
    4. package.use : 特定包的USE特性
    5. package.provided: 手动安装的包
  4. /usr/share/portage/config/make.conf.example
  5. /etc/portage/repos/gentoo.conf :仓库的配置
    1. /var/db/repos/gentoo : 默认的本地仓库
    2. /usr/sharse/portage/config/repos.conf :自带的配置存档
  6. /var/db/pkg/: 包安装到系统的记录信息
  7. /var/cache/edb: 缓存

配置项:

  1. PKGDIR="/var/cache/binpkgs" : 预编译包的存放位置
  2. DISTDIR="/var/cache/distfiles": 源码包的存放位置
  3. PORTDIR="/var/db/repos/gentoo": 本地仓库
  4. PORTAGE_TMPDIR="/var/tmp": 临时文件
  5. ROOT="/": 安装软件的相对根
  6. PORT_LOGDIR="/var/log" : 日志目录
    1. PORTAGE_ELOG_CLASSES: 记录的信息级别
      1. info
      2. warn
      3. error
      4. log
      5. qa
    2. PORTAGE_ELOG_SYSTEM: 日志处理模块
      1. save : 存放在$PORT_LOGDIR/elog/ 或 /var/log/portage/elog/
      2. custom : $PORTAGE_ELOG_COMMAND
      3. syslog
      4. mail
      5. save_summary
      6. mail_summary
    3. PORTAGE_ELOG_COMMAND : 自定义日志处理模块
  7. GENTOO_MIRRORS: 源代码服务器
  8. PORTAGE_BINHOST: 预构建包服务器

/etc/portage/repos.conf

  1. sync-type: 服务器类型
  2. sync-uri: 服务器链接

配置修改工具

可以手动修改配置,但有时候程序修改了被保护的配置,会有一个让你选择是否保存修改的步骤,这时候就要借助配置修改工具了。

表现为在/etc/portage目录下出现._cfg0000_<name>的文件。

  1. dispatch-conf : 有版本管理功能的修改工具
  2. etc-update : 一步确认的工具

gentoo这里的设计异常复杂繁琐,相当让人讨厌。

私有库

可以创建自己的私有Portage库。

# 仿造官方仓库目录结构
mkdir -pv /home/htqx/myportage/{metadata,profiles}
# 库信息
cat > /home/htqx/myportage/metadata/layout.conf <<EOF
masters=gentoo
auto-sync=false
EOF
# 库名
cat > /home/htqx/myportage/profiles/repo_name <<EOF
myrepo
EOF
# 让默认的portage账户组可以访问
chown -R portage:portage /home/htqx/myportage

# 链接到这个私有库
cat > /etc/portage/repos.conf/localrepo.conf <<EOF
[myrepo]
location = /home/htqx/myportage
EOF

ebuild构建过程

portage系统在安装或者卸载软件的过程,实际是一个ebuild构建软件的过程,它会有独立的环境变量,独立的bash脚本过程:

  1. /etc/portage/env/XXX : 独立的环境变量配置文件
  2. /etc/portage/package.env : 对特定包的环境变量文件配置
  3. /etc/portage/bashrc : 构建时启动bash脚本
  4. /etc/portage/postsync.d/: emerge更新仓库时运行的脚本
  5. /etc/portage/patches/: 自动打补丁

网络

gentoo 网络配置比较简单。

  1. /etc/conf.d/net
# eth0 是网卡名称,根据实际情况填写
# 可以绑定多个ip
# ip/网络段长度
config_eth0 = "192.168.0.2/24
192.168.0.3/24
240e:32:45::65:43:4/64"
# 默认路由
routes_eth0="default via 192.168.0.1"
# 默认dns
dns_servers_eth0="192.168.1.1"

# net.br0网桥 依赖 eth0接口 和 eth1接口
rc_net_br0_need="net.eth0 net.eth1"
# eth0 和 eth1 取消对虚拟设备net的支持
# net 是其他服务依赖的虚拟设备
# 即,只当br0联通了,网络才是完整的
rc_net_eth0_provide="!net"
rc_net_eth1_provide="!net"

# 配置管理网络接口的模块
# 默认是iproute2
modules="ifconfig"
# 针对接口来设置模块
# pump 是DHCP功能的模块,特点是迷你
# dhclient 配置复杂
# dhcpcd 默认
modules_eth0="pump"
# dhcp设置
# release 释放ip
# nodns 使用/etc/resolv.conf 设置的DNS
# nontp 使用/etc/ntp.conf
# nonis 使用/etc/yp.conf
dhcp_eth0="release nodns nontp nonis"

# 配置ADSL pppoe连接
# 密码文件 /etc/ppp/pap-secrets
# null 清除设置
config_eth1="null" 
config_ppp0="ppp"
link_ppp0="eth1"
plugins_ppp0="pppoe"
pppd_ppp0="novj novjccomp"
rc_net_ppp0_need="net.eth1"

# 使用APIPA 自动私有ip地址
# 范围 169.254.0.0/16
config_eth2="apipa"

# 配置Bonding绑定(多个接口合并成一个)
# 相关标准:802.3ad LACP 
slaves_bond0="br0 eth2"
config_bond0="192.168.100.4/24"
mode_bond0="balance-alb"

# 配置网桥
# 相关标准:802.1d
# 添加相关接口
config_eth0="null"
config_eth1="null"
bridge_br0="eth0 eth1"
config_bro="192.168.0.1/24"
rc_net_br0_need="net.eth0 net.eth1"

# 配置Tunneling隧道
iptunnel_vpn0="mode gre remote 207.170.82.1 key 0xffffffff ttl 255"
iptunnel_vpn0="mode ipip remote 207.170.82.2 ttl 255"
config_vpn0="192.168.0.2 peer 192.168.1.1"

# 配置VLAN
# 标准:802.1q
modules="iproute2"
vlans_eth0="1 2"
config_eth0_1="172.16.3.1/24"
routes_eth0_1="default via 172.16.3.254"
config_eth0_2="172.16.2.1/24"
routes_eth0_2="default via 172.16.2.254"
vlan1_name="vlan1"
vlan1_ingress="2:6 3:5"
eth0_vlan1_egress="1:2"

无线网络wifi

工具:

  1. net-misc/wicd
  2. net-misc/networkmanager
  3. net-wireless/iw
  4. net-wireless/wpa_supplicant
  5. net-wireless/rfkill
  6. sys-apps/ifplugd
  7. sys-apps/netplug
  8. net-dns/openresolv
rfkill list # 查看wifi开关有没有被关闭
frkill unblock all #打开所有无线设备

配置:

  1. /etc/wpa_supplicant/wpa_supplicant.conf
  2. /etc/conf.d/net:
modules="wpa_supplicant"
iwconfig_eth1="mode managed"

系统组件摘要

在具备系统雏形的基础上,我们可以花点精力去研究一下系统的各个组件,毕竟,我的目的也不是为了用这个gentoo系统(毕竟构建太麻烦)。

用ssh登录虚拟机来使用gentoo命令行还是可以的,和本机使用命令行的体验是一样的。

设备

目录:

  1. /dev
  2. /etc/udev/rules.d/
  3. /run/udev/rules.d/
  4. /lib/udev/rules.d/

工具:

  1. udev
  2. eudev

作用:

  1. 在用户空间运行(相对内核)
  2. 动态创建和删除设备文件
  3. 提供一致的设备命名
  4. 提供API程序接口

文件系统

linux的文件系统有个模块:FUSE(filesystem in userspace),即“用户空间的文件系统”,来统一不同文件系统的差异,对终端用户来说,他们的表现是类似的。

工具:

  1. mount :挂载设备到目录,从而通过文件读写设备内容
    1. /etc/fstab: 配置自动挂载
      1. localmount: 挂载磁盘的后台服务
      2. netmount:挂载网络共享磁盘的后台服务
      3. fsck: 检查修复磁盘的后台服务
      4. root: 挂载根的后台服务
      5. sysfs: 挂载/sys
      6. devfs: 挂载/dev
  2. udisk
  3. udevil : 自动挂载,基于内核事件轮询(events_poll_mesecs)
    1. /etc/udevil/udevil.conf
  4. autofs: 自动挂载
    1. /etc/autofs/autofs.master
  5. chroot: 变更/的相对位置
  6. fsck: 检查和修复文件系统的错误(先卸载)
  7. mdadm : RAID,多个磁盘组合在一起的技术
    1. RAID 0:1+1两个磁盘加速
    2. RAID 1: 1:1备份
    3. RAID 5: 1+1+n:1校验(不建议)
    4. RAID 6: 1+1+n:2校验
  8. chmod/chown/chgrp: 设置文件一般权限
  9. setfacl/getfacl: 设置获取文件的扩展权限
  10. mkfs : 格式化(初始化)文件系统

访问控制:

  1. POSIX Basic ACL: 基本访问控制表
  2. POSIX Extended ACL : 扩展访问控制表
    1. 多用户访问控制(非用户组模式)
    2. 多用户组访问控制

挂载选项:

  1. ro/rw: 只读/读写
  2. suid/nosuid: 开启或关闭suid和sgid位,提升安全性
  3. dev/nodev: 允许或不允许挂载设备文件,提升安全性
  4. exec/noexec: 允许或不允许执行程序,提升安全性
  5. user/nouser: 允许或不允许普通用户挂载
  6. auto/noauto: 允许或不允许自动挂载
  7. default: 等同rw,suid,dev,exec,auto,nouser,async
  8. strictatime/noatime/nodiratime/relatime: 修改文件的访问时间,是/不/文件夹不/一天后,优化性能
  9. lazyatime: 在内存中修改访问时间,优化性能
  10. async: 异步读写
  11. discard: SSD开启实时trim操作(对性能有影响),建议用fstrim命令手工整理。

文件系统种类:

  1. ext4 :linux 标准文件系统第4代(带日志)
  2. fat:微软win98和UEFI采用的文件系统
  3. ntfs:微软NT系统采用的文件系统
  4. jfs : IBM的带日志文件系统
  5. btrfs: 基于CoW(写入时复制)理论的文件系统
    1. 支持快照
    2. 支持RAID
    3. 灵活分区
  6. xfs: 高性能日志文件系统
  7. f2fs: 基于NAND闪存设备设计的文件系统
  8. ceph: 分布式对象存储和文件系统
    1. Cluster : 群集
    2. OSD(object store device): 对象存储设备
    3. MON(monitor): 仲裁监视器
    4. MDS(metadata server): 元数据服务器
    5. RBD(rodos block device): ceph块设备
  9. curlftpfs: 将FTP文件夹安装到本地
  10. cvmfs: 将HTTP只读文件系统以aufs(advanced multi layered unification filesystem高级多层统一文件系统)为基础安装到本地
  11. dislocker : 兼容NTFS BitLocker加密分区
  12. ecryptfs: 内核加密层
    1. /etc/pam.d :有关系统身份验证的配置文件
  13. encfs: 加密文件夹
  14. exfat: fat的扩展,常用于usb
  15. f2fs: flash-friendly filesystem闪存友好文件系统。
  16. cramfs: 内存文件系统
  17. efivarfs: efi变量文件系统
  18. bcachefs: 下一代CoW文件系统
  19. aufs: aufs(advanced multi layered unification filesystem)高级多层统一文件系统
  20. overlayfs:内核内建的联合类文件系统
  21. reiserfs: reiserfs第三版,带日志
  22. reiser4: reiserfs第四版,带日志
  23. squashfs:只读压缩文件系统,常见映像文件
  24. udf: 通用磁盘格式,常见.iso文件
  25. gfs2: 全局文件系统2,用于群集
  26. zfs: SUN公司CoW系统
  27. debugfs:内核debug用
  28. procfs:内核进程信息/proc
  29. securityfs:支持TPM可信计算模块
  30. sysfs:内核设备和驱动信息/sys
  31. tmpfs:内存存储文件
  32. devtmpfs:内核设备信息/dev
  33. nfs: 通用网络文件系统协议
  34. sshfs: ssh网络文件系统
  35. tahoe-lafs:最低授权网络文件系统,群集
  36. clusterfs:群集
  37. fuseiso:iso文件
  38. mtpfs:MTP媒体传输协议(手机)文件系统
  39. smbnetfs:SMB网络文件系统,即windows的共享文件
  40. squashfuse: 支持FUSE挂载方式的squash文件系统
  41. devpts: 伪终端设备 /dev/pts
  42. cgroup2: 内核控制组
  43. hfs/hfs+: 苹果文件系统
  44. openafs: IBM分布式文件系统
  45. cifs: 内核提供的samba网络文件支持

固件

  1. sys-kernel/linux-firmware :固件包
  2. sys-apps/dmidecode: 固件信息
  3. sys-apps/flashrom: 刷bios工具
  4. fwupd: 守护程序
  5. sys-firmware/intel-microcode: intel微码固件

UEFI 固件和工具:

  1. uefi shell: https://github.com/tianocore/edk2/releases
  2. uefi 文件系统驱动:http://efi.akeo.ie/downloads/efifs-latest/x64/
  3. efi/startup.nsh : 启动脚本
echo -off
fs0:
cd efi\drivers
echo "Loading drivers:"
for %d in *.efi
        load %d
endfor

echo "Reloading filesystems"
map -r
  1. OVMF 虚拟机uefi: https://www.kraxel.org/repos/jenkins/edk2/
  2. sys-boot/efibootmgr :uefi 引导菜单管理
# 创建菜单项,将磁盘1的2分区/efi/shell/shell.efi 文件作为引导器加入菜单,标题EfiShell
efibootmgr -c -d /dev/sda -p 2 -L EfiShell -l /efi/shell/shell.efi
  1. refind :引导管理器
  2. systemd-boot: 引导管理器
  3. grub2:引导管理器

服务管理

后台服务管理器,负责管理从初始化到系统正常运行到关闭系统的服务调用过程。

服务管理器种类:

  1. sysvinit
  2. openrc
  3. upstart
  4. systemd
  5. smf
  6. launchd
  7. epoch
  8. finit
  9. runit
  10. bsd rc.d

设备管理器:

  1. sys-fs/udev
  2. sys-fs/eudev
  3. systemd-udevd

systemd:

  1. sys-kernel/gentoo-sources :内核开启systemd支持
  2. /etc/mtab(/proc/self/mounts) : 挂载配置
  3. 挂载/usr
    1. sys-kernel/genkernel
    2. sys-kernel/dracut
    3. sys-kernel/genkernel-next
  4. lvmetad 服务挂载lvm分区
    1. /etc/lvm/lvm.conf
  5. 启动程序:init=/lib/systemd/systemd
  6. 升级:systemctl daemon-reexec
  7. 机器id: systemd-machine-id-setup
  8. 主机名:hostnamectl set-hostname Name
    1. /etc/hostname
  9. 区域: localectl set-locale LANG=zh_CN.UTF-8
    1. /etc/locale.conf
  10. 时间: timedatectl
  11. 自动加载的内核模块: /etc/modules-load.d/*.conf
  12. 网络: systemd-networkd.service/sytemd-resolved.service/NetworkManager.service(默认)/nm-connection-editor/nmtui
    1. /etc/systemd/network/*.network
    2. /run/systemd/resolev/resolv.conf: DNS
  13. 日志:systemd-journald.service/journalctl
    1. 添加权限用户组:gpasswd --add UserName systemd-journal
    2. journalctl
      1. -b: 启动
      2. -r: 逆序
      3. -f: 跟踪
      4. -p: 级别(emerg0,alert1,crit2,err3,warning4,notice5,info6,debug7)
      5. --since=: 时间段YYYY-MM-DD hh:mm:ss / yesterday/today/tomorrow
      6. -n: 指定行数
      7. -k: 指定内核消息
      8. -u: 指定单元
  14. /tmp 挂载为 tmpfs(内存文件系统)
  15. systemctl
    1. preset-all:预设服务
    2. list-units: 列出可用服务
    3. --all --full:所有服务
    4. --failed: 失败服务
    5. enable: 默认激活
    6. disable: 默认关闭
    7. start: 启动
    8. stop: 关闭
    9. daemon-reload: 重新加载配置/etc/systemd/system
    10. show --property=: 显示服务配置属性
    11. 将服务加入运行级别:ln -s /lib/systemd/system/mysqld.service /etc/systemd/system/multi-user.target.wants/db.service

服务表格:

表格比较大:https://wiki.gentoo.org/wiki/Systemd/zh-cn

sys-apps/openrc 对应 systemd:

  1. bootmisc/systemd-tmpfiles-setup
  2. consolefont/systemd-vconsole-setup
  3. devfs
  4. dmesg
  5. fsck/fsck*
  6. functions.sh
  7. hostname
  8. hwclock
  9. keymaps
  10. killprocs
  11. local
  12. localmount/local-fs.target
  13. modules/systemd-modules-load
  14. mount-ro
  15. mtab
  16. netmount/remote-fs.target
  17. numlock
  18. procfs
  19. root
  20. savecache
  21. staticroute
  22. swap/swap.target
  23. swclock
  24. sysctl/systemd-sysctl
  25. sysfs
  26. termencoding/systemd-vconsole-setup
  27. urandom/systemd-random-seed-load/systemd-random-seed-save

其他对应 systemd:

  1. rsyslog/rsyslog
  2. syslog-ng/syslog-ng
  3. alsasound/alsa-tstore/alsa-restore
  4. dhcpcd/dhcpcd
  5. net.*/net@/netctl@/NetworkManager/dhcpcd/systemd.networkd
  6. ntpd/nepd
  7. sshd/sshd/sshd.socket
  8. wap-supplicant/wpa_supplicant/wpa_supplicant@
  9. cupsd/cups/cups.socket/cups.patch
  10. bluetooth/bluetooth
  11. dbus/dbus/dbus.socket
  12. irqbalance/irqbalance
  13. microcode_ctl
  14. udev/udev
  15. udev-mount
  16. udev-postmount/udev-trigger
  17. acpid/acpid
  18. xdm/xdm
  19. iptables/iptables-store/iptables-restore

计划任务:

  1. ~/.local/share/systemd/user/backup-work.timer
  2. ~/.local/share/systemd/user/backup-work.service
  3. sys-process/systemd-cron

sys-apps/sysvinit:

  1. /etc/inittab :启动配置
    1. 标识:运行级别:动作:路径
  2. /etc/initscript :启动脚本
  3. /etc/shutdown.allow : 关闭计算机许可
  4. /var/run/pwerstatus : 电源状态

openrc(官方建议): 相对systemd来说比较轻量化,开放性比较好。

  1. 初始化:openrc-init
    1. init=/sbin/openrc-init
::sysinit:/sbin/openrc sysinit
::wait:/sbin/openrc boot
::wait:/sbin/openrc
  1. 守护进程:supervise-daemon
    1. /etc/init.d/*
      1. supervisor="supervise-daemon"
      2. 删除pidfile
      3. 删除后台指令
    2. ssd:start_stop_daemon(当前默认的守护进程)
  2. 设备管理:mdev/udev/eudev
  3. 主配置:/etc/rc.conf
  4. 内核参数指定运行级别: softlevel=nonetwork
  5. Elogind 替代 systemd-logind
  6. sys-apps/opentmpfiles 替代 tmpfiles.d
  7. 进程资源控制组:cgroup
    1. rc_controller_cgroups="yes"
    2. /sys/fs/cgroup
    3. rc_cgroup_${管理器}="${管理器}.${选项} ${值}"
      1. /etc/rc.conf
      2. /etc/conf.d/${服务}
  8. 网络管理:netifrc
    1. net-misc/netifrc
    2. net-misc/dhcpcd
    3. net-misc/wicd
    4. net-misc/NetworkManager
    5. net-misc/badvpn
  9. 消息通信:dbus

启动映像

桌面

总不能一直用命令行,毕竟命令行是工作,桌面才是生活。

# 查看sway桌面支持的编译选项
equery uses sway
# 安装,共67项安装,比较慢
emerge --ask sway

安装过程出现两次构建错误,一次是cmake,再装一次就行,一次是llvm,这个重装也没用,而且超级慢。

emerge --ask llvm #单独安装就可以,然后继续安装sway即可

# 安装后台服务(openrc类组件)
emerge --ask consolekit

安装的时候提示>=dev-libs/glib-2.60.7 dbus要开启USE编译选项:

# 添加自定义USE选项
# 再次安装consolekit即可
echo ">=dev-libs/glib-2.60.7 dbus" >> /etc/portage/package.use/consolekit

从这里可以看出gentoo的弱点,构建速度慢,构建成功率低。复杂度比一般的软件管理系统,如apt要高。当然,它的优势是可以定制软件的编译选项。

所以gentoo适合有一定编程能力,最好是看得懂代码的专业人士使用,否则你都不定制软件,那你用gentoo干啥?当然,如果你时间太多,gentoo构建一个sway可以花掉半天时间,这也是极好的。

启动桌面:

# 启动dbus服务
rc-service dbus start
# 加入到默认运行级别自动启动
rc-update add dbus default

配置sway

配置文件:

  1. /etc/sway/config
  2. ~/.config/sway/config

sway 是一个平铺型窗口管理器,默认是不支持root管理员登录的。因此先要登录一个普通帐号。然后继续。

# sudo提权工具
emerge --ask app-admin/sudo
# 编辑sudo管理文件
# 将 #%wheel ALL=(ALL) ALL 这行前面的井号去掉
# 以后wheel的组员,就可以用sudo 加任意命令来临时借用root的账户权限运行程序
visudo 
# 登录之前创建的普通帐号
# 输入帐号密码(不显示密码)
su htqx

# 复制标准配置到用户配置目录
# 将来可以在此基础上自定义
cp -v /etc/sway/config ~/.config/sway
# 编辑,注释背景图一行,因为这张图并不存在
# 找到:output * bg /usr/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill
# 在前面写个#即可注释掉该行(即该行不起作用了)
nano ~/.config/sway/config

# 安装权限组件
sudo emerge --ask pam

# 安装wayland虚拟终端
# 虚拟终端就是图形界面中的命令行
# 默认的虚拟终端不是wayland的
# 因为现在我们只是配置了wayland,没有配置X
# 查看编译选项
# 开启wayland
equery uses kitty
sudo emrge --ask kitty
# 配置开启wayland显示模式
cat > .config/kitty/kitty.conf <<EOF
linux_display_server wayland
EOF

# 将默认终端urxvt改成kitty
# 即找到set $term urxvt 这行
# 改成set $term kitty
nano .config/sway/config

# 启动sway
exec ck-launch-session sway

如果你启动不了,提示dri驱动没有(failed to open any drm device),开启不了后端之类的(unable to create backendDRM device),这是因为桌面系统是建立在图形显示之上,而图形显示依赖显卡驱动。如果你是虚拟机,你要编译内核,启动vmware的显卡驱动之类的(具体看你选中的是那种虚拟显卡),然后编译,安装模块即可。其他显卡也是同理。sway似乎还不支持nvidia的显卡。

# 重新编译内核模块
su root # 登录管理员帐号

# 进入当前内核的源码目录
cd /usr/src/linux-4.19.86-gentoo/
# 重新配置菜单
# 在 驱动->图形卡->vmware卡,选中即可
make menuconfig
# 编译
make
# 安装模块
make modules_install
# 重启生效
reboot 

# 安装mesa图形库
# 查看是否开启了wayland选项
# 还有vmware显卡(虚拟机)
equery uses mesa
# 设置开启相关选项
echo "media-libs/mesa wayland video_cards_vmware video_cards_virgl -video_cards_radeon -video_cards_radeonsi -video_cards_intel -video_cards_nouve " > /etc/portage/package.use/mesa
# 安装
emerge --ask mesa 

暂时告一段落

参考

  1. 字符集和编码II: fat/msdos/vfat (文件名乱码的问题): https://www.cnblogs.com/Zyf2016/p/6337787.html
  2. KDE 官方安装文档: https://wiki.gentoo.org/wiki/KDE/zh-cn
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/coder_lw/wiki.git
git@gitee.com:coder_lw/wiki.git
coder_lw
wiki
wiki
master

搜索帮助