在MacBook Pro上安装Gentoo Linux
备注
Gentoo Linux安装是一个纯手工一步步完成,需要非常小心谨慎,也非常占用时间。不过,只要安装成功,后续就可以不断滚动升级,并且能够获得很多系统运维的深刻知识,特别是自定义编译内核以及USE优化精简,都能够充分发挥硬件性能。所以还是值得投入时间精力进行实践的。
我大约话费了2~3个晚上来完成初步部署,后续会定制一个精简的 移动云架构 来实现开发
安装实践环境有以下两个:
上述两个MacBook笔记本都是同一代产品,架构相同,区别仅是CPU主频(i7 vs. i5)以及GPU(Nvidia vs. Intel),所以大致安装过程相同
制作Gentoo Linux安装U盘
在OS X 的Terminal终端,使用以下命令将
.iso
文件转换成.img
:
hdiutil convert -format UDRW -o install-amd64-minimal-20230220T081656Z.img install-amd64-minimal-20230220T081656Z.iso
备注
Mac设备需要使用EFI stub loader,但是需要注意EFI限制了boot loaderc参数,所以需要将参数结合到内核中 ( How to install Gentoo ONLY Mid-2012 macbook air )。
UEFI Gentoo Quick Install Guide 指出需要使用 UEFI-enabled
启动介质,如LiveDVD或者Gentoo-based SystemRescueCD ,详细参考 Gentoo Handbook 。此外,也可以参考 Arch Linux on a MacBook
OS X会自动添加 .dmg
文件名后缀,所以实际生成的文件名是 install-amd64-minimal-20230220T081656Z.img.dmg
检查插入U盘对应设备:
diskutil list
如果U盘已经被自动挂载,则需要先下载挂载,例如:
sudo diskutil unmountDisk /dev/disk2s2
将Gentoo Linux安装镜像写入U盘:
sudo dd if=install-amd64-minimal-20230220T081656Z.img.dmg of=/dev/rdisk2 bs=100m
网络
Gentoo Linux在MacBook Pro配置Wifi 是非常麻烦的过程: 我的 MacBook Pro 15" Late 2013 使用了 Broadcom BCM4360 无线芯片,对开源支持不佳。我至今依然没有很好解决这款wifi芯片的驱动(编译),所以最初在安装Gentoo Linux时不得不使用有线网络连接。
不过,如果使用 Android 手机,可以使用 通过USB Tethering方式共享Android的Internet连接 来实现一个通用的USB无线网卡。这样就可以非常容易在安装中连接到无线网络,顺利进行安装。是的,目前我就是采用这种方法来解决安装联网(甚至可以让 FreeBSD 在无法使用 Broadcom BCM4360 无线芯片情况下通过这种方式连接无线网络 )
安装
备注
我采用MacBook的双启动模式: 先安装 macOS ,安装时使用macOS内置磁盘工具将磁盘划分为2个分区,保留一个分区给Gentoo Linux使用
早期我安装双启动模式采用了 rEFInd
工具(现在依然可以使用):
下载 rEFInd二进制.zip文件 并解压缩
按住
Command+R
开机(进入Mac的recovery模式)当OS启动后,选择 Utilities -> Terminal
执行
rEFInd
安装程序:cd refind-bin-0.10.2 ./refind-install
再次启动系统
备注
我现在为了简化,采用启动时安装 option
键,利用硬件内置的磁盘分区选择来启动不同操作系统。所以可以不用安装 rEFInd
,不过安装 rEFIne
可以方便自动启动选择界面。
备注
在 MacBook Air 13" Early 2014 部署时,由于硬盘空间太小,并且我也不太可能切换到 macOS ,所以就没有采用双启动,而是直接将整个磁盘都分配给Gentoo
启动LiveCD,进入安装过程(需要连接一个有线网络,通过DHCP获取IP连接Internet)
登陆是root用户身份,执行以下命令启动
sshd
并设置好root用户密码,这样就方便我远程登陆到主机上进行下一步安装:
# 启动ssh服务
ssh-keygen -A
/usr/sbin/sshd
# 设置root用户密码
passwd
MacBook Pro 15" Late 2013 分区
备注
MacBook Pro 15" Late 2013 换过 NVMe存储 存储( 升级MacBook(2013~2017) SSD成NVMe存储 ),所以磁盘空间较大(1T)
注意:我这里的案例是保留了macOS分区,也就是采用双启动方式。所以分区和后面挂载 /boot 分区和纯粹的只使用Linux的分区是不一样的 如果你只安装Gentoo Linux(删除macOS),那么就采用下面的 " MacBook Air 13" Early 2014 分区 " 方法
磁盘分区:
livecd ~ # parted -a optimal /dev/nvme0n1
GNU Parted 3.5
Using /dev/nvme0n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: SAMSUNG MZVL21T0HCLR-00B00 (nvme)
Disk /dev/nvme0n1: 1024GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 20.5kB 210MB 210MB fat32 EFI System Partition boot, esp
2 210MB 256GB 256GB
3 256GB 1024GB 768GB fat32 msftdata
(parted)
警告
只有分区3是可以删除(之前安装macOS保留的空白分区),我将创建一个50G磁盘分区用于操作系统
之所以没有将所有磁盘分区都用完,是因为我规划在其余 NVMe存储 磁盘分区中采用 ZFS 作为数据存储文件系统,来实现灵活的卷管理
创建一个名为
rootfs
分区,格式化成xfs
:
rootfs
分区(parted) rm 3
(parted) mkpart primary xfs 256GB 320GB
(parted) name 3 rootfs
(parted) print
Model: SAMSUNG MZVL21T0HCLR-00B00 (nvme)
Disk /dev/nvme0n1: 1024GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 20.5kB 210MB 210MB fat32 EFI System Partition boot, esp
2 210MB 256GB 256GB
3 256GB 320GB 63.8GB xfs rootfs
(parted)
备注
对于UEFI启动,磁盘上必须有一个分区是系统的EFI启动分区,并且是 vfat
文件系统
为什么我没有创建这个 EFI 系统分区呢? 原因是系统磁盘上已经有一个Apple的 macOS 操作系统,已经构建了 分区1
,这个分区已经是 boot, esp
标记。只需要将这个分区挂载为Linux的 /boot
目录就可以。
当然,如果是整个磁盘作为Linux使用,则可以抹掉整个磁盘所有分区,然后单独为Linux创建一个 boot, esp
标记的 vfat32
分区,挂载到 /boot
。
创建文件系统 - 将分区3格式化成
xfs
文件系统( 使用了-f
强制参数,因为需要覆盖之前的分区信息 ):
rootfs
分区,创建XFS文件系统mkfs.xfs -f /dev/nvme0n1p3
挂载 root 分区文件系统:
mount /dev/nvme0n1p3 /mnt/gentoo
MacBook Air 13" Early 2014 分区
备注
MacBook Air 13" Early 2014 原装存储 只有 128GB (在没有 升级MacBook Air 2010存储SATA硬盘(m.2转接) 之前)
磁盘分区:
livecd ~ # parted -a optimal /dev/sda
GNU Parted 3.5
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: ATA APPLE SSD SD0128 (scsi)
Disk /dev/sda: 121GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 20.5kB 210MB 210MB fat32 EFI System Partition boot, esp
2 210MB 121GB 121GB macOS
(parted)
上述有2个 macOS 分区,由于我只使用 Gentoo ,所以会删除掉这两个分区(先重建分区表)
重建GPT分区表,并创建2个分区:
boot, esp
标记的vfat32
分区,挂载为/boot/EFI
, 命名为rootfs
的 XFS文件系统 分区,作为系统磁盘(保留 100GB 作为数据分区,使用 ZFS )
# 初始化磁盘分区表
parted /dev/sda mklabel gpt
# 创建第一个sda1分区,用于EFI启动
parted -a optimal /dev/sda mkpart ESP fat32 0% 256MB
parted /dev/sda set 1 esp on
# 系统分区sda2,分配21GB, XFS
parted -a optimal /dev/sda mkpart primary xfs 256MB 21GB
parted /dev/sda name 2 rootfs
# 完成后检查
parted /dev/sda print
# 分区格式化
mkfs.vfat -F 32 -n efi-boot /dev/sda1
mkfs.xfs -f /dev/sda2
完成后输出的分区情况如下:
Model: ATA APPLE SSD SD0128 (scsi)
Disk /dev/sda: 121GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 256MB 255MB ESP boot, esp
2 256MB 21.0GB 20.7GB rootfs
挂载 root 分区文件系统:
mount /dev/sda2 /mnt/gentoo
安装stage
Gentoo Linux提供了 Multilib (32和64位),也提供了纯64位的 No-Multilib 。通常建议使用 Multilib
,因为这个选项的 stage tarball兼容性最好,系统会尽可能使用64位库,只有需要兼容性的时候才会回退到32位版本。这为将来的定制提供了很大的灵活性。
如果选择 no-multilib
tarball,则会构建完全的64位操作系统环境。但是后续要切换到 Multilib
变得不可能,尽管在技术上依然是可能的。
警告
除非绝对必要,刚开始使用Gentoo的用户不应该选择 no-Multilib
tarball。因为从 no-multilib
迁移到 multilib
需要对Gentoo 和较低级别的工具链有非常好的知识(对于Toolchain developers也是非常困难的)。
备注
Gentoo Linux默认使用 OpenRC
作为init,而不是复杂的 Systemd进程管理器 (可选)
此外stage还区分LLVM版本,这个版本是使用Clang编译的,并且Gentoo也支持将主编译器切换为Clang。但是由于gcc是事实标准,有些软件使用Clang编译会出错,所以Clang提供了fallback到gcc的方式。并且Clang不能编译glibc,所以实际上系统还是会保留gcc。此外,Clang编译的软件并没有比Gcc编译的软件更快,且通常会占用更多内存。不过,Clang采用了BSD协议,比较宽松,所以在BSD系统以及商业公司支持上通常会选择Clang,对于个人而言(散兵游勇)通常会选择Gcc。请参考 为什么Clang不能取代GCC? 讨论,其中 为什么Clang不能取代GCC? - 韩朴宇的回答 - 知乎 有很多人讨论了这个问题,可以参考
下载
stage tarball
并解压缩:
stage tarball
解压缩cd /mnt/gentoo
# stage3-amd64-openrc-20230220T081656Z.tar.xz 已经存放到这个目录下
# 2023年9月,我重新部署时采用纯64位系统,所以采用 stage3-amd64-nomultilib-openrc-20230903T170202Z.tar.xz
tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner
配置编译选项
为了优化系统,可以设置影响 Gentoo 官方支持的包管理器 Portage 行为的变量。 所有这些变量都可以设置为环境变量(使用 export
),但通过 export
设置不是永久的。
Portage 在运行时读取 make.conf
文件,这将根据文件中保存的值更改运行时行为。 make.conf
可以被认为是 Portage 的主要配置文件,所以要小心对待它的内容。
vi /mnt/gentoo/etc/portage/make.conf
编辑配置
CFLAGS
和 CXXFLAGS
CFLAGS
和 CXXFLAGS
变量分别定义了 GCC C 和 C++ 编译器的优化标志。 虽然这些是在这里一般定义的,但为了获得最佳性能,需要分别为每个程序优化这些标志。
在 make.conf
中,应该定义优化标志,使系统通常响应最快。 不要在这个变量中放置实验设置; 过多的优化会使程序行为异常(崩溃,故障)。
备注
对于优化选项,请参考GNU在线手册或gcc信息页面。 make.conf.example
也包含了很多示例和信息。
修订
make.conf
配置添加-march=native
(通常已足够),可以以本机处理器最佳原生优化进行编译:
# These settings were set by the catalyst build script that automatically
# built this stage.
# Please consult /usr/share/portage/config/make.conf.example for a more
# detailed example.
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"
# If left undefined, Portage's default behavior is to set the MAKEOPTS value to the same number of threads returned by `nproc`
MAKEOPTS="-j8"
# NOTE: This stage was built with the bindist Use flag enabled
# This sets the language of build output to English.
# Please keep this setting intact when reporting bugs.
LC_MESSAGES=C
GENTOO_MIRRORS="http://mirrors.aliyun.com/gentoo http://distfiles.gentoo.org"
ACCEPT_LICENSE="-* @FREE @BINARY-REDISTRIBUTABLE"
USE="wayland man dbus elogind alsa pulseaudio ogg gtk -systemd -X -mesa -gnome -qt5 -qt6 -kde -fortran"
VIDEO_CARDS="intel"
ACCEPT_KEYWORDS="~amd64"
FEATURES="ccache"
CCACHE_DIR="/var/cache/ccache"
备注
MAKEOPTS="-j4"
现在不是必须的,因为 nproc
返回的就是本机处理器核心数量
Chrooting
(可选):选择镜像网站
执行选择最佳镜像网站:
mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf
备注
当使用 emerge
进行软件安装(源代码编译),下载源代码包的配置就是由 make.conf
指定的。非常不幸,由于GFW阻塞,现在(2023)几乎无法访问Gentoo官网以及默认下载网站,并且 mirrorselect
也无法运行(因为首先需要从官网拉取 mirrorlist
就是失败的)。参考 make.conf.example ,实际上 mirrorselect
在 make.conf
配置中添加了如下类似内容:
# 建议最后保留默认配置
GENTOO_MIRRORS="<your_mirror_here> http://distfiles.gentoo.org http://www.ibiblio.org/pub/Linux/distributions/gentoo"
在国内可以参考Gentoo官方文档 Gentoo source mirrors 选择国内镜像网站,例如阿里云提供的镜像网站:
GENTOO_MIRRORS="http://mirrors.aliyun.com/gentoo http://distfiles.gentoo.org http://www.ibiblio.org/pub/Linux/distributions/gentoo"
配置
/etc/portage/repos.conf/gentoo.conf
Gentoo ebuild存储库:
mkdir --parents /mnt/gentoo/etc/portage/repos.conf
cp /mnt/gentoo/usr/share/portage/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf
备注
可以参考 Gentoo rsync mirrors 配置 gentoo.conf
,例如选择中国的rsync镜像网站
sync-uri = rsync://rsync.cn.gentoo.org/gentoo-portage
复制DNS信息
将本机的DNS配置信息复制到 Gentoo 安装目录:
cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
挂载必要文件系统
挂载文件系统:
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
mount --bind /run /mnt/gentoo/run
mount --make-slave /mnt/gentoo/run
进入新环境
进入Gentoo新环境:
chroot /mnt/gentoo /bin/bash
source /etc/profile
export PS1="(chroot) ${PS1}"
挂载boot分区
MacBook Pro 15" Late 2013 分区
对于保留macOS的安装,挂载boot分区是直接挂载原先macOS的ESP分区到 /boot
。如果抹除了macOS,则参考下面 " MacBook Air 13" Early 2014 分区 " 方法
挂载boot分区(这个分区是MacBook的macos和gentoo公用的):
mount /dev/nvme0n1p1 /boot
MacBook Air 13" Early 2014 分区
对于只使用Gentoo Linux的系统,则ESP分区挂载到 /boot/efi
目录下(参考 Quick Installation Checklist )
mkdir /boot
mount /dev/sda1 /boot
配置Portage
如果服务器位于限制性防火墙后面(使用HTTP/HTTPS协议下载快照),则使用:
emerge-webrsync
如果没有网络限制,则可以使用传统的rsync方式同步:
emerge --sync
备注
国内镜像网站虽然没有GFW干扰,下载速度较快。但是 国内镜像网站同步有延迟,可能会存在好几天都没有同步最新文件的情况 ,所以使用 emerge-webrsync
下载快照文件可能会失败(因为快照还没有同步)。不过,使用 emerge --sync
可以绕开这个同步延迟问题,最多也就是本次同步不能及时得到官方的最新版本(稍微旧几天的版本)。
选择正确profile
备注
Desktop profiles
并非专用于桌面环境。 它们仍然适用于像 i3 或 sway 这样的最小窗口管理器。
profile
是任何 Gentoo 系统的构建块(building block)。它不仅为 USE
、 CFLAGS
和其他重要变量指定默认值,还将系统锁定在特定范围的包版本。 这些设置都由 Gentoo 的 Portage 开发人员维护。
查看系统当前使用的
profile
:
profile
eselect profile list
输出显示:
profile
Available profile symlink targets:
[1] default/linux/amd64/17.1 (stable)
[2] default/linux/amd64/17.1/selinux (stable)
[3] default/linux/amd64/17.1/hardened (stable)
...
[15] default/linux/amd64/17.1/no-multilib (stable) *
[16] default/linux/amd64/17.1/no-multilib/hardened (stable)
[17] default/linux/amd64/17.1/no-multilib/hardened/selinux (stable)
[18] default/linux/amd64/17.1/no-multilib/systemd (dev)
...
备注
当使用 Systemd进程管理器 时,请确保 profile
名称中包含 systemd
,否则请确保 不包含 systemd
在2023年9月的实践,我采用 no-multilib (stable)
,尝试构建一种轻量级的64位Linux系统
警告
profile
升级不能掉以轻心: 选择初始配置文件时,请确保使用与 stage3 最初使用的版本相同的配置文件
选择初始 profile
文件时,请确保使用与 stage3 最初使用的版本相同的配置文件
设置profile案例(仅供参考):
profile
eselect profile set 5
备注
之前我曾经采用过 sway - i3兼容Wayland compositor 最小化窗口管理器,所以选择 default/linux/amd64/17.1/desktop
( 5
)
更新 @world set
此时,明智的做法是更新系统的 @world set
,以便建立 base
。
以下步骤是必要的,以便系统可以应用自构建 stage3
以来出现的任何更新或 USE flag
更改以及任何配置文件选择:
emerge --ask --verbose --update --deep --newuse @world
备注
简单来说,配置文件名称越短,系统的 @world set
就越不具体; @world set
不具体,系统需要的包就越少:
例如, default/linux/amd64/17.1
只需要更新很少的包;而 default/linux/amd64/17.1/desktop/gnome/systemd
就会更新很多包,因为 init
系统从 OpenRC 切换到 Systemd进程管理器 并且会安装GNOME桌面环境框架。
配置USE变量
USE
是Gentoo为用户 提供的最强大的变量之一,可以配置支持或不支持某些选项来编译多个程序。例如有些程序可以支持 GTK+
或 Qt
情况下编译,或者支持 SSL
,有些程序甚至可以使用帧缓冲( svgalib
)而不是X11支持来完成编译。
大多数Linux发行版为了能够尽可能多支持不同环境(软件和硬件),采用了最大化的编译参数,这导致增加了程序大小以及启动时间,而且会导致大量的依赖。使用Gentoo的用户可以通过定义编译选项来精简系统,使得硬件发挥更大功效。
默认的 USE
设置使用Gentoo配置文件 make.defaults
。Gentoo使用了一个(复杂的)继承系统。检查当前的USE配置最简单的方法是:
emerge --info
获取USE配置emerge --info | grep ^USE
完整的 USE
flags 可以在 /var/db/repos/gentoo/profiles/use.desc
查看
CPU_FLAGS_*
某些架构(包括 AMD64/X86, ARM, PPC)有一个名为 CPU_FLAGS_ARCH
的 USE_EXPAND
变量(视情况用相应的架构替换 ARCH
)。这个变量将构建配置为特定的汇编代码或者其他内部函数中的编译,通常是 硬编码
(hand-written) 或者其他扩展,并且与要求编译器为特定CPU功能(例如 march=
)输出的优化代码不同。
除了根据需要配置其 COMMON_FLAGS
之外,用户还应设置此变量。
安装工具包:
cpuid2cpuflags
工具包emerge --ask app-portage/cpuid2cpuflags
执行:
cpuid2cpuflags
cpuid2cpuflags
在我的 MacBook Pro 15" Late 2013 上输出:
cpuid2cpuflags
输出CPU_FLAGS_X86: aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3
在我的 MacBook Air 13" Early 2014 上输出:
cpuid2cpuflags
输出CPU_FLAGS_X86: aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3
这里可以看到 MacBook Pro 15" Late 2013 和 MacBook Air 13" Early 2014 作为同代产品,CPU特性是相同的
将输出结果添加到
package.use
:
cpuid2cpuflags
输出添加到 package.use
echo "*/* $(cpuid2cpuflags)" > /etc/portage/package.use/00cpu-flags
备注
我记得大约20年前,我在使用Gentoo Linux在我的一台联想笔记本上编译Gentoo Linux。那时候还没有 cpuid2cpuflags
,是手工查CPU型号然后猜测哪些CPU相关的 Flags 需要配置,为 make.conf
添加类似 mmx sse2
这样的优化参数。现在都有工具可以代劳了...
(可选)配置 ACCEPT_LICENSE
变量
Gentoo包的licenses存储在ebuild的 LICENCE
变量中。系统接受的特定licenses可以在以下文件定义:
/etc/portage/make.conf 文件中的系统范围。
/etc/portage/package.license 文件中的每个包。
/etc/portage/package.license/ 文件目录中的每个包。
Portage 在 ACCEPT_LICENSE
中查找允许安装的包:
portageq envvar ACCEPT_LICENSE
默认输出是:
@FREE
备注
需要修订Licenses,添加 @BINARY-REDISTRIBUTABLE
,否则无法安装下文的 sys-kernel/linux-firmware
简单的方法是修改
/etc/portage/make.conf
添加可以接受的licenses:ACCEPT_LICENSE="-* @FREE @BINARY-REDISTRIBUTABLE"
另外一种方法是为每个软件包配置licenses,也就是创建
/etc/portage/package.license
目录,然后创建一个为每个软件包配置licences的文件,如/etc/portage/package.license/kernel
内容案例如下:app-arch/unrar unRAR sys-kernel/linux-firmware @BINARY-REDISTRIBUTABLE sys-firmware/intel-microcode intel-ucode
配置时区
所有的时区信息可以从 /usr/share/zoneinfo/
目录下查找,我使用 Asia/Shanghai
对于使用默认的 OpenRC ,配置时区写在 /etc/timezone
文件:
echo "Asia/Shanghai" > /etc/timezone
然后重新配置 sys-libs/timezone-data
软件包,这个软件包会更新 /etc/localtime
:
emerge --config sys-libs/timezone-data
备注
sys-libs/timezone-data
是将 /usr/share/zoneinfo/Asia/Shanghai
复制为 /etc/localtime
。这和我之前在 部署NTP服务(集群) 采用软连接方法不同
配置本地化(语言支持)
修订
/etc/locale.gen
(我这里直接添加,原配置文件是一些注释案例):
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
根据
/etc/locale.gen
生成所有本地化支持:
locale-gen
命令,根据 /etc/locale.gen 生成本地化支持locale-gen
可以看到实际生成了2个本地化支持:
locale-gen
命令输出,显示支持2个本地化字符集 * Generating 2 locales (this might take a while) with 8 jobs
* (2/2) Generating C.UTF-8 ... [ ok ]
* (1/2) Generating en_US.UTF-8 ... [ ok ]
* Generation complete
* Adding locales to archive ... [ ok ]
选择本地化
显示可支持的
lcoale
:
eselect locale list
输出信息如下:
Available targets for the LANG variable:
[1] C
[2] C.utf8
[3] POSIX
[4] en_US.utf8
[5] C.UTF8 *
[ ] (free form)
当前是 C.UTF8
可以修订,例如
en_US.utf8
:
eselect locale set 4
重新加载环境:
env-update && source /etc/profile && export PS1="(chroot) ${PS1}"
配置内核准备
(可选)安装firmware 和/或 microcode
Firmware
在开始配置内核并重启系统前,建议安装 sys-kernel/linux-firmware
!!!
原因是现代很多无限网卡需要Firmware才能正常工作,而AMD/Nvidia/Intel的GPU通常也需要Firmware才能发挥全部功能:
安装Fireware:
sys-kernel/linux-firmware
emerge --ask sys-kernel/linux-firmware
Microcode
CPU处理器也需要固件更新:
AMD处理器:
sys-kernel/linux-firmware
Intel处理器:
sys-firmware/intel-microcode
安装intel microcode:
sys-kernel/intel-microcode
emerge --ask sys-firmware/intel-microcode
备注
CPU microcode后续再具体学习实践
内核配置和编译
终于来到了最核心的部分
Gentoo提供了三种内核管理方法,并且安装以后任何时候都可以切换到其他新方法: 以下是最简单到最复杂的方法
全自动方法: 分发内核
分发内核用于配置、自动构建和安装 Linux 内核、其相关模块和(可选,但默认启用)initramfs 文件。 未来的内核更新是完全自动化的,因为它们是通过包管理器处理的,就像任何其他系统包一样。 如果需要自定义,可以提供自定义内核配置文件。 这是最少涉及的过程,并且非常适合新的 Gentoo 用户,因为它开箱即用,并且系统管理员的参与最少。
混合方法:Gentoo genkernel
新内核源代码通过系统包管理器安装。 系统管理员使用 Gentoo 的 genkernel
工具来一般配置、自动构建和安装 Linux 内核、其相关模块和(可选,但默认情况下未启用)initramfs 文件。 如果需要自定义,可以提供自定义内核配置文件。 未来的内核配置、编译和安装需要系统管理员以运行 eselect kernel、genkernel 和可能的其他命令的形式参与每次更新。
全手动方式:
新内核源代码通过系统包管理器安装。 内核是使用 eselect 内核和一系列 make 命令手动配置、构建和安装的。 未来的内核更新会重复配置、构建和安装内核文件的手动过程。 这是最复杂的过程,但提供了对内核更新过程的最大控制。
备注
初次安装我采用 分发内核
(Distribution kernels) ,以便尽快运行。等系统稳定后,在切换到 全手动方式
分发内核
分发内核是涵盖解包、配置、编译和安装内核的完整过程的 ebuild
。 这种方法的主要优点是作为 @world
升级的一部分,包管理器将内核更新到新版本。 这不需要比运行 emerge 命令更多的参与。 分发内核默认为支持大多数硬件的配置,但是提供了两种自定义机制: savedconfig
和 config snippets
。
在使用分发内核之前,先确保系统安装了正确的
installkernel
包 (一种是systemd-boot
一种是gentoo
,我使用后者,默认已经在 stage3 安装好了,所以不用重复):emerge --ask sys-kernel/installkernel-gentoo
安装分发内核,有两种方式:
一种是从源代码编译一个Gentoo patches的内核(我采用这个方法):
emerge --ask sys-kernel/gentoo-kernel
另一种是直接安装预先编译好的内核:
emerge --ask sys-kernel/gentoo-kernel-bin
备注
安装内核后,包管理器会自动将其更新到更新的版本。 以前的版本将被保留,直到包管理器被要求清理陈旧的包
如果要清理旧包:
emerge --depclean
或者指定清理旧内核版本:
emerge --prune sys-kernel/gentoo-kernel sys-kernel/gentoo-kernel-bin
(无需操作)分发内核安装完成后,能够自动重建由其他软件包安装的内核模块:
linux-mod.eclass
提供dist-kernel
USE 标志,它控制对virtual/dist-kernel
的 subslot 依赖性sys-fs/zfs
和sys-fs/zfs-kmod
等包上使用了dist-kernel
USE 标志,所以能够根据更新的内核自动重建,相应地生成initramfs
(一般无需操作)如果需要,也可以在内核升级完成后手工触发
initramfs
重建:emerge --ask @module-rebuild
如果需要一些内核模块在早期启动时加载(例如ZFS),则应该通过以下命令重建
initramfs
emerge --config sys-kernel/gentoo-kernel emerge --config sys-kernel/gentoo-kernel-bin
备注
安装内核源代码和手工编译(或者 Genkernel
),我准备后续独立搞( Gentoo内核编译 ),这里先忽略
配置系统
文件系统配置
/etc/fstab
提供了文件系统挂载配置(挂载点和选项)。文件系统标签和UUID可以通过 blkid
命令查看,对于多磁盘,由于启动系统时识别磁盘可能顺序随机(导致设备识别名变化),所以建议使用UUID来识别设备进行挂载。但是,需要注意,当分区被擦除,则文件系统label和UUID值将会变化或移除。
警告
LVM的卷和LVM的snapshot使用相同的UUID,所以如果挂载LVM卷不要使用UUID。
我的实践在 MacBook Pro 15" Late 2013 (macOS和Linux双启动)和 MacBook Air 13" Early 2014 (Linux独占)略有不同,所以这里分开记述
MacBook Pro 15" Late 2013 文件系统
使用
blkid
检查磁盘,当前显示主机内部的NVMe设备分区如下:
/dev/nvme0n1p3: UUID="4897f75b-f7b4-4c8b-ae8e-e39f923685c1" BLOCK_SIZE="512" TYPE="xfs" PARTLABEL="rootfs" PARTUUID="fbf163f3-a42e-411a-be61-f2ae7b398e61"
/dev/nvme0n1p1: LABEL_FATBOOT="EFI" LABEL="EFI" UUID="67E3-17ED" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="6cd70fde-609c-4e2b-aaa1-ab64a4a68ed8"
/dev/nvme0n1p2: UUID="f3dd09f5-068d-4f9c-b756-e0abe94939e7" BLOCK_SIZE="4096" TYPE="apfs" PARTUUID="1d31b24d-12c5-4bb4-a193-59231dd16665"
其中 分区3 是安装Gentoo Linux的分区,将被挂载到根分区 /
; 分区1是原先 macOS 安装时已经构建的 vfat32
文件系统分区,用于存储EFI启动信息,这个分区也是和 Gentoo Linux 共用的,将被挂载到 /boot
目录
检查
ls -lh /dev/disk/by-uuid
可以看到上述分区信息,这个设备路径可以用于配置/etc/fstab
:
lrwxrwxrwx 1 root root 15 Feb 24 23:03 4897f75b-f7b4-4c8b-ae8e-e39f923685c1 -> ../../nvme0n1p3
lrwxrwxrwx 1 root root 15 Feb 24 22:56 67E3-17ED -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 Feb 24 22:56 f3dd09f5-068d-4f9c-b756-e0abe94939e7 -> ../../nvme0n1p2
配置
/etc/fstab
如下:
/dev/disk/by-uuid/4897f75b-f7b4-4c8b-ae8e-e39f923685c1 / xfs defaults,noatime 0 1
/dev/disk/by-uuid/67E3-17ED /boot vfat defaults,noatime 0 2
MacBook Air 13" Early 2014 文件系统
使用
blkid
检查磁盘,当前显示主机内部的SATA设备分区如下:
/dev/sda2: UUID="eedcd1d3-6550-483b-9cd8-1bedbbeda28b" BLOCK_SIZE="4096" TYPE="xfs" PARTLABEL="rootfs" PARTUUID="1c16164d-fab1-49f8-8d95-7c7dd02ec8ed"
/dev/sda1: UUID="084C-D157" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="ESP" PARTUUID="7c24264b-dee7-48f3-8544-2b4c08efaeca"
同样,检查
ls -lh /dev/disk/by-uuid
可以看到上述分区信息,这个设备路径可以用于配置/etc/fstab
:
lrwxrwxrwx 1 root root 10 Dec 16 21:05 084C-D157 -> ../../sda1
lrwxrwxrwx 1 root root 10 Dec 16 20:59 eedcd1d3-6550-483b-9cd8-1bedbbeda28b -> ../../sda2
配置
/etc/fstab
如下:
/dev/disk/by-uuid/eedcd1d3-6550-483b-9cd8-1bedbbeda28b / xfs defaults,noatime 0 1
/dev/disk/by-uuid/084C-D157 /boot vfat defaults,noatime 0 2
网络配置
主机名
主机名配置
xcloud
(bcloud
):
echo "xcloud" > /etc/hostname
网络
对于动态获取IP地址,可以采用
dhcpcd
:
emerge --ask net-misc/dhcpcd
rc-update add dhcpcd default
rc-service dhcpcd start
备注
如果使用有线网络,则上述使用dhcpcd就已经足够,甚至无需配置网络。Gentoo使用了自己独特的 netifrc
框架来配置和管理网络接口。这个 net-misc/netifrc
默认已经安装
hosts文件
/etc/hosts
文件帮助解析不能通过DNS服务器解析的服务器,通常要设置本机 hostname
对应解析:
127.0.0.1 xcloud.cloud-atlas.io xcloud localhost
::1 xcloud.cloud-atlas.io xcloud localhost
系统信息
配置root用户密码:
passwd
Init和启动配置
OpenRC
OpenRC使用 /etc/rc.conf
来配置服务的启动和关闭,这个配置文件中有大量的注释来帮助设置. (待实践)
安装工具
系统日志服务
对于使用OpenRC,当前Gentoo的Stage3压缩包缺少一些工具,原因是有多个软件提供相同功能,所以Gentoo让用户自行选择。而 Systemd进程管理器 是集成了日志服务,所以不需要这个安装配置。以下是OpenRC的配置日志服务 sysklogd
(一个开箱即用的传统系统日志服务,没有采用重量级的 rsyslog
或 syslog-ng
):
emerge --ask app-admin/sysklogd
rc-update add sysklogd default
(可选)工具集合
安装cron服务/文件索引/ssh服务启用/dos文件系统工具:
# 定时服务
emerge --ask sys-process/cronie
rc-update add cronie default
# 时钟同步服务,非常重要
emerge --ask net-misc/chrony
rc-update add chronyd default
# 文件索引
emerge --ask sys-apps/mlocate
# 启用ssh远程登陆
rc-update add sshd default
# 分区工具parted
emerge --ask sys-block/parted
# xfs文件系统维护
emerge --ask sys-fs/xfsprogs
# dos文件系统工具
emerge --ask sys-fs/dosfstools
# 安装bind(DNS)客户端工具
emerge --ask net-dns/bind-tools
# 安装 nc
emerge --ask net-analyzer/netcat
# 安装DHCP客户端
emerge --ask net-misc/dhcpcd
# 安装无线工具
emerge --ask net-wireless/iw net-wireless/wpa_supplicant
# git
emerge --ask dev-vcs/git
# USB工具(提供了lsusb)
emerge --ask sys-apps/usbutils
# vim 或 neovim
#emerge --ask app-editors/vim
emerge --ask app-editors/neovim
# sudo
emerge --ask app-admin/sudo
# Gentoo Toolset(提供了equery)
emerge --ask app-portage/gentoolkit
配置bootloader
Gentoo 官方文档 Configuring the bootloader 提供了多种bootloader设置方法。对于UEFI系统,例如我的MacBook Pro,我采用之前 MacBook Pro上运行Arch Linux 相同的方法: 采用 efibootmgr
来管理UEFI启动顺序,这也是Gentoo官方bootloader文档中介绍的可选方法之一
安装:
emerge --ask sys-boot/efibootmgr
MacBook Pro 15" Late 2013
配置启动Gentoo:
efibootmgr --disk /dev/nvme0n1 --part 1 --create --label "Gentoo Linux" --loader /vmlinuz-6.1.12-gentoo-dist --unicode \
'root=PARTUUID=fbf163f3-a42e-411a-be61-f2ae7b398e61 rw initrd=\initramfs-6.1.12-gentoo-dist.img' --verbose
备注
--disk /dev/nvme0n1
是指整个磁盘设备--part 1
是指ESP分区,这个分区是Apple和Gentoo共享的root=PARTUUID=fbf163f3-a42e-411a-be61-f2ae7b398e61
这个参数是PARTUUID
,是通过ls -lh /dev/disk/by-partuuid/
查询得到。注意,不是磁盘UUID(在/etc/fstab
中使用磁盘UUID)
MacBook Air 13" Early 2014
配置启动Gentoo:
efibootmgr --disk /dev/sda --part 1 --create --label "Gentoo Linux" --loader /vmlinuz-6.1.67-gentoo-dist --unicode \
'root=PARTUUID=1c16164d-fab1-49f8-8d95-7c7dd02ec8ed rw initrd=\initramfs-6.1.67-gentoo-dist.img' --verbose
备注
--disk /dev/sda
是指整个磁盘设备--part 1
是指ESP分区,这个分区是vfat32格式的启动分区root=PARTUUID=1c16164d-fab1-49f8-8d95-7c7dd02ec8ed
这个参数是PARTUUID
,是通过ls -lh /dev/disk/by-partuuid/
查询得到。注意,不是磁盘UUID(在/etc/fstab
中使用磁盘UUID)
收尾工作
添加用户账号(huatai),并且添加到sudo中:
useradd -G users,wheel,audio -u 502 -g 20 -s /bin/bash huatai
重启系统:
exit cd umount -l /mnt/gentoo/dev{/shm,/pts,} umount /mnt/gentoo{/boot,/sys,/proc,} reboot
备注
安装完成后,后续可以执行 升级Gentoo 来保持系统滚动更新
参考
Apple MacBook - 早期版本MacBook的安装
ArchLinux MacBook - 在MacBook上运行Arch Linux,文档较为全面
Apple Macbook Pro Retina - 在Retina版本的MacBook Pro上安装Gentoo
Install Gentoo Prefix on MacBook Pro - 在OS X系统中运行Gentoo Prefix获得Gentoo Linux体验