同步操作将从 deepinwiki/wiki 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
[TOC]
gentoo 是一个比较专业的linux发行版,它需要用户从一个很基础的框架,构建编译完成一个完全的系统。
我认为这会对linux的深入理解有所帮助。
安装 gentoo 需要具备一定的基础:
install-amd64-minimal-<release>.iso
: https://mirrors.tuna.tsinghua.edu.cn/gentoo/releases/amd64/autobuilds/current-install-amd64-minimal/install-amd64-minimal-20191225T214502Z.iso
passwd root # 设置管理员的密码,然后才能远程登录
rc-service sshd start # 开启ssh远程登录服务
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 # 安装阶段可以使用这个软件提高配置效率
# 方法一
date -s "2019-10-27 18:41:00" #设置时间,注意这个是UTC时间,也就是北京时间-8个小时得到的时间。因为安装时还没有设置正确的时区,所以默认为UTC+0时区(北京时间是UTC+8)。
# 方法二
ntpd -q -g # 通过网络上的时间服务器设置时间
linux可以通过驱动来支持特殊的虚拟机磁盘,但是引导系统并没有这种驱动。
另外linux内核默认是不支持虚拟机的特殊网卡的。
gentoo 的安装比较复杂,也许一次,一天结束不了。所以可以编写脚本来重复进入安装环境。(包括退出 chroot 环境),这样会提高不少效率。
gentoo 和普通的linux发行版优势在哪里,本节就要从大局上观察gentoo的功能特性:
gentoo 的 Portage 是软件管理系统,使用python和bash编写。这个系统使用 emerge 前端工具。而 ebuild 是软件的载体,包含软件的配置信息。ebuild 包的集合就是一个软件仓库。
本地仓库的地址是:/var/db/repoks/gentoo/
安装过程中下载的软件源码存放在:/var/cache/distfiles/
自定义管理软件的配置在:/etc/portage/
查询本地仓库信息的前端工具:equery
支持根据授权协议(软件许可证)管理软件:
支持一个软件的多个版本分支,这技术叫 SLOT 。但是SLOT是 ebuild 包信息中的一项精心安排,不等于可以随意安装任意软件的多个版本,这避免了无意义的多个版本的安装。
支持 USE 构建标志(可以深度定制编译选项,这是portage系统最有特色的功能之一)。
类似 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 的方法有两个:
# = 表示匹配特定版本
# 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 年新用户还是会面对这个问题):
解决策略,我认为:
USE=’-harfbuzz'
(freetype 因为USE harfbuzz 产生对 harfbuzz 的依赖)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 来配置当前使用哪个插槽。
它的提示同一个插槽安装不同版本的包,就是这个意思。
解决方法比较粗暴:
这个问题和著名的 freetype harfbuzz 相关, pango 依赖 freetype 的 harfbuzz USE。
emerge -C pango
USE='-harfbuzz' emerge -aq freetype harfbuzz freetype
USE='harfbuzz' emerge -aq freetype pango
五、相关案例
六、自动配置工具
除了主动配置,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 # 根据你的实际情况来分区
分区为:
cfdisk 分区不会先学习。这里不展开讨论了。
比如分区情况如下:
另外,一些动态的文件系统(即内核引导过程中会生成的虚拟文件系统),也要挂载到目标位置:
# 创建挂载目标文件夹
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
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,主要的配置文件是:
# 添加镜像源到配置文件,选清华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中的系统文件和内核本身不是捆绑的,系统可以拥有多个内核,一次选择启动其中一个,甚至可以借助别的系统中的内核,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 菜单比较好看
出来的配置窗口的操作方法:
<Enter>
选择子菜单--->(或空子菜单----)。S
upport xxx,按 s 键就能跳到该项<Y>
包括,<N>
排除,<M>
模块化功能。<Esc>
<Esc>
退出,按<?>
获得帮助,按</>
进行搜索。[*]
内置,[]
排除,<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.标识 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
即可查看网络接口的名字。
# 修改 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 仓库
layman -a steam-overlay
# 安装 steam
emerge -aq steam-launcher
后台服务是什么?就是在后台默默运行的程序,它提供一些基础支持给前台程序。我们使用的虽然是前台程序,但是后台如果没有运行服务,那么它也是不能正常工作的。
后台程序有两个基本特性,就是自动启动,后台执行。那么怎么管理它,配置它?这就是后台管理程序 openrc 的任务了。现在大部分 linux 发行版使用的都是 systemd 管理程序,但是它太庞大,所以就有人开发了更加小巧的 openrc。
openrc 不是单独的软件,而是一个系统。它有一套管理软件,配置文件和执行脚本。
rc-service:
openrc 提供”运行级别“的分组功能,服务需要配置到特定的运行级别上执行。
rc-update:
rc-status:
openrc 可以对服务进行配置
openrc:
不同级别实际上代表了将会执行哪些关联服务,而这些服务对当前级别的目的提供支持。所以改变运行级别的含义就是改变系统的运行状态和运作模式。
多个服务实例:
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
shebang:
#!/sbin/openrc-run
脚本节点:
脚本参数:
环境变量:
KDE 是两大主流桌面之一,另一个是 gnome。 kde 会更类似 windows,而且可配置性也更高一些。
不过, kde 是非常庞大的桌面,带有庞大的相关包。除非你很清楚都有什么包,否则可以安装官方的包组:
安装桌面之前,首先要选择配置:
eselect profile list
# [8] default/linux/amd64/17.1/desktop/plasma (stable)
eselect profile set 8
emerge -aq --newuse --update --deepin @world
gentoo 的配置是有层级的,建议先安装初级的配置练练手,桌面配置相关的冲突可能很多,需要解决。
选好 profile 配置,并不会主动安装桌面,只是基本环境而已。
安装桌面前,先安装基本的图形设备:
emerge -aq nvidia-drivers # 如果有冲突就解决
nvidia-xconfig # 这个会自动配置 /etc/X11/xorg.conf ,然后才能正常
nvidia-xconfig --prime # 这个会产生prime 双显卡配置,没双显卡不用配置
安装桌面:
估计要一天吧。
配置桌面:
# 很大可能都已经安装过(黄色的 R)标记,不用再装
emerge -aq dbus eudev udisks
本人安装的时候 dbus 和 sddm (用户桌面登录管理器)产生了冲突,原因不明,这时候你可把 dbus 停掉,不影响桌面启动。
修改 /etc/conf.d/display-manager:
添加到后台启动:
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:
这一节又从整体上去把握一下gentoo系统从引导过程开始执行的相关任务。
服务脚本支持的操作:
服务管理工具 rc-update:
脚本的用户配置:
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:
用户目录的环境变量:
临时环境变量(终端输入):
# 影响当前终端会话和子会话
export PATH="~/bin:${PATH}"
# 只影响当前会话
AAA="hello"
作为gentoo的精髓,当然要对portage大书特书。如果不深入理解portage,那么用gentoo的意义已经变得可有可无了。
配置:
配置项:
/etc/portage/repos.conf
可以手动修改配置,但有时候程序修改了被保护的配置,会有一个让你选择是否保存修改的步骤,这时候就要借助配置修改工具了。
表现为在/etc/portage目录下出现._cfg0000_<name>
的文件。
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
portage系统在安装或者卸载软件的过程,实际是一个ebuild构建软件的过程,它会有独立的环境变量,独立的bash脚本过程:
gentoo 网络配置比较简单。
# 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"
工具:
rfkill list # 查看wifi开关有没有被关闭
frkill unblock all #打开所有无线设备
配置:
modules="wpa_supplicant"
iwconfig_eth1="mode managed"
在具备系统雏形的基础上,我们可以花点精力去研究一下系统的各个组件,毕竟,我的目的也不是为了用这个gentoo系统(毕竟构建太麻烦)。
用ssh登录虚拟机来使用gentoo命令行还是可以的,和本机使用命令行的体验是一样的。
目录:
工具:
作用:
linux的文件系统有个模块:FUSE(filesystem in userspace),即“用户空间的文件系统”,来统一不同文件系统的差异,对终端用户来说,他们的表现是类似的。
工具:
访问控制:
挂载选项:
文件系统种类:
UEFI 固件和工具:
echo -off
fs0:
cd efi\drivers
echo "Loading drivers:"
for %d in *.efi
load %d
endfor
echo "Reloading filesystems"
map -r
# 创建菜单项,将磁盘1的2分区/efi/shell/shell.efi 文件作为引导器加入菜单,标题EfiShell
efibootmgr -c -d /dev/sda -p 2 -L EfiShell -l /efi/shell/shell.efi
后台服务管理器,负责管理从初始化到系统正常运行到关闭系统的服务调用过程。
服务管理器种类:
设备管理器:
systemd:
systemctl daemon-reexec
systemd-machine-id-setup
hostnamectl set-hostname Name
localectl set-locale LANG=zh_CN.UTF-8
timedatectl
nm-connection-editor
/nmtui
journalctl
gpasswd --add UserName systemd-journal
journalctl
systemctl
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:
其他对应 systemd:
计划任务:
sys-apps/sysvinit:
openrc(官方建议): 相对systemd来说比较轻量化,开放性比较好。
::sysinit:/sbin/openrc sysinit
::wait:/sbin/openrc boot
::wait:/sbin/openrc
softlevel=nonetwork
总不能一直用命令行,毕竟命令行是工作,桌面才是生活。
# 查看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 是一个平铺型窗口管理器,默认是不支持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
暂时告一段落
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。