Gentoo 笔记

1 安装

搜索一下能找到的 Gentoo 安装教程已经很多了,我也不打算再增加一篇重复的,只是记下自己安装过程中的一些操作,免得下次自己需要再做的时候还要再找一次。

1.1 参考内容

1.2 规划

拿来安装 Gentoo 的机器是一台 NUC10,主要用途是 headless server,规划中不会有大型应用需要编译。可以的话,我打算尽可能避免 gui 和 X 的选项。

我一开始的想法是 systemd + LVM,LVM 是考虑到第一次用 gentoo,后面可能还会有重装,用 LVM 把 home 分区单独分出来会方便一些;systemd 完全是出于使用习惯。不过看了一遍上面的手册和其他人的文章之后,我觉得第一次装还是用 openrc 好了,减少不必要的爬坑,顺便能再用回非 systemd 的系统也挺好?

update: 目前的安装用了 btrfs 和 systemd

1.3 过程

安装过程基本跟 handbook 一致,唯一的区别在分区的地方。

  • USB 启动盘: LiveUSB/Guide

    sudo dd if=image.iso of=/dev/sda bs=1m
    

    Intel NUC 上基本没什么特殊的硬件。

  • 启动 ssh

    ssh 需要先给 root 设置一个密码。debian 系常用的重复一遍弱密码让系统接受的技巧似乎在 gentoo 上行不通,老实用一个强密码吧。

    rc-service sshd start
    
  • LVM 分区(选择一)

    LVM

    一个500MB的 boot 分区,fat32,给 UEFI 准备的,剩下的都是一个 LVM 的 PV。我把 swap 分区也放在 LVM 里面了,稍微有点不确定这么做有没有性能的损失,不过考虑到内存的大小,估计平时基本不会动到 swap,应该问题不大。

    主分区是 ext4。下次再想折腾的时候不如看看 zfs as root?

    最后 chroot 的时候别忘了把 /home 分区挂上。

  • Btrfs 分区(选择二)

    Btrfs

    分区方案是一个 boot 分区,Fat32,给 UEFI 准备的 boot 和 ESP,剩下的是一个 Btrfs 的分区。Btrfs 分三个子卷:roofs 作为根分区、home 目录还有 swap 用来装 swap file。Btrfs 现在还不支持用子卷作为 swap 分区,所以只能用 swap 文件。

    # 先挂载 btrfs 分区供后续操作
    mount /dev/nvme0n1p2 /mnt/gentoo
    cd /mnt/gentoo
    
    # 创建子卷
    btrfs subvolume create rootfs
    btrfs subvolume create home
    btrfs subvolume create swap
    
    # 卸载 btrfs 分区
    umount /mnt/gentoo
    
    # 挂载 rootfs 子卷给后续系统安装用
    mount -o rw,relatime,compress=zstd:3,ssd,discard=async,space_cache,autodefrag,subvol=rootfs /dev/nvme0n1p2 /mnt/gentoo
    
  • make.conf

    添加了下面的内容

    COMMON_FLAGS="-march=native -O2 -pipe"
    MAKEOPTS="-j12"
    CPU_FLAGS_X86="aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3"
    
    ACCEPT_LICENSE="*"
    GRUB_PLATFORMS="efi-64"
    
    USE="-gui -X"
    

    其中 CPU_FLAGS_X86 的值来自 cpuid2cpuflags 命令的输出

  • profile
    • openrc default/linux/amd64/17.1/no-multilib/hardened 后来换到了 default/linux/amd64/17.1/no-multilib
    • systemd default/linux/amd64/17.1/systemd
  • 内核

    内核我花了点时间自己配置了一下,平时用 debian 的时候很少要自己编译。

    基本上把 gentoo 推荐的选项 + LVM 和文件系统对应的部分 + lspci 看到自己硬件对应的驱动这几部分都选上,然后 cifs 之类要用到的功能选上就差不多了。我自己不想用 wifi 所以去掉了所有 wifi 的支持和驱动,顺手也拿掉了以太网部分自己用不上的硬件驱动。

    理论上自己用不上的驱动都可以去掉?但这么洁癖的事情还是等有时间再说了。

    (选择一)使用 genkernel 生成 initramfs:

    # 这是用 lvm 的例子
    genkernel --lvm --mdadm --install --kernel-config=/boot/config-5.4.92-gentoo initramfs
    # 根分区是 btrfs 的例子
    genkernel --btrfs --install --kernel-config=/boot/config-5.10.27-gentoo initramfs
    

    (选择二)使用 dracut 生成 initramfs:

    dracut -H -f --kver 5.10.27-gentoo
    
  • logger

    我用了推荐的 sysklogd。systemd 的话可以直接用 systemd-journald,不需要另外安装 logger。

  • boot loader

    LVM 的话把这行加到 /etc/default/grub : GRUB_CMDLINE_LINUX\"dolvm"=

  • 最后 hardened 的 profile 是禁止 root ssh 登录也禁止普通用户 ssh 密码验证的,所以记得重启系统之前把 ssh pub key 写好。

1.4 Systemd

Systemd 目前官方还没有对应的安装手册,网上能找到的都是各种个人的安装笔记,而且基本是作为桌面台式机使用的。Headless 机器的安装略微有点不同。

Systemd 的话,是可以不用安装 logger 和 cronie 的,可以用 systemd-networkd/resolved 和 systemd-timer 代替。网络设置的部分也需要跳过手册的部分,用这部分代替。

另外 install CD chroot 中是可以 systemctl enable 的,记得重启机器之前先

systemctl enable systemd-networkd
systemctl enable systemd-resolved
systemctl enable sshd

2 笔记

2.1 Emerge

  • upgrade system

    # --ask --update --verbose --deep --newuse
    emerge -auvDN @world
    
  • cleanup

    # always run with -p --pretend
    # --ask
    emerge -a --depclean
    
  • update packages with version 9999

    emerge @live-rebuild
    

3 杂项

3.1 multilib/no-multilib

如果遇到

ldd: '/usr/bin/ldd: line 160: /lib/ld-linux.so.2: cannot execute binary file: Exec format error

这样的错误,很可能是 multilib 的系统但是内核没有打开 IA32 emulate。

Author: sinxccc

Created: 2021-04-19 Mon 19:54