2020-11-05 重新安装踩了一遍坑


首先加载的 livecd 要支持zfs , 我采用的是自己打包的 archiso https://github.com/reconquest/archiso-zfs 别人打包的 archiso https://github.com/danboid/ALEZ

1 分区

gdisk /dev/sda 进入分区模式

Part     Size   Type
----     ----   -------------------------
   1       2M   BIOS boot (ef02)
   2     256M   EFI System (ef00)
   3       xG   Linux swap (8200)
   4     xxxG   Solaris root (bf00)

首先 n 新建 BIOS 分区, 大小 +2M
n 建立 EFI 分区, 大小 +256M
建立 BIOS 的时候提示选择分区类型的时候输入 ef00 , 标示为 BIOS boot ,下面的类似
然后按需建立 Linux swap ,当然不要也行,切忌在 zfs 分区建立 swap
建完分区后 w 保存分区
mkfs.vfat -F 32 /dev/sda2 格式化 EFI 分区
mkswap /dev/sda3 格式化 swap

2 zfs 分区

创建 zfs 池,并分卷设置挂载点

zpool create zrool(zfs池名字,可自定义) /dev/disk/by-id/xxxx-part4
zfs create -o compression=lz4 -o mountpoint=none zrool/data
zfs create -o compression=lz4 -o mountpoint=none zrool/rootfs
zfs create -o compression=lz4 -o mountpoint=/ zrool/rootfs/default
zfs set mountpoint=none zrool

zrool/data 下面还要不要建立分区看自己情况,比如给 /srv, /home 建一个和系统快照分开

设置启动分区

zpool set bootfs=zrool/rootfs/default zrool

复制 zpool.cache

cp /etc/zfs/zpool.cache /tmp/zpool.cache

导出 zfs 池

zpool export zrool

3 挂载分区

下面的都以 UEFI 启动为例

zpool import zrool -R /mnt
mkdir -p /mnt/etc/zfs
cp /tmp/zpool.cache /mnt/etc/zfs/zpool.cache
mkdir /mnt/boot/efi
mount /dev/sda2 /mnt/boot/efi
cd /mnt
VERSION='20181228'
wget "https://gentoo.osuosl.org/releases/amd64/autobuilds/current-stage3-amd64-systemd/stage3-amd64-systemd-${VERSION}.tar.bz2"
tar xjf "stage3-amd64-systemd-${VERSION}.tar.bz2"

VERSION 版本号自行前往 https://gentoo.osuosl.org/releases/amd64/autobuilds/current-stage3-amd64-systemd/ 查看并替换

4 chroot

mount -t proc proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --make-rslave /mnt/sys
mount --rbind /dev /mnt/dev
mount --make-rslave /mnt/dev
chroot /mnt /bin/bash
source /etc/profile
export PS1="(chroot) $PS1"

5 更新和安装

echo "nameserver 8.8.8.8" > /etc/resolv.conf  # DNS 看鸡子是国内的还是国外的自己改一改
emerge-webrsync

5.1 时区和编码

东八区时区和英文 UTF-8 编码,好像没什么不对

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
emerge --config sys-libs/timezone-data
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
eselect locale set en_US.UTF-8
env-update && source /etc/profile && export PS1="(chroot) $PS1"

5.2 多线程编译和优化 CPU 编译

MAKEOPTS=$[`echo \`nproc\``+1]
echo "MAKEOPTS=\"-j${MAKEOPTS}\"" >> /etc/portage/make.conf
emerge app-portage/cpuid2cpuflags
TEMP=`cpuid2cpuflags | awk -F ':' '{print $2}' | sed 's/^[ \t]*//'`
echo "CPU_FLAGS_X86=\"${TEMP}\"" >> /etc/portage/make.conf
emerge -avuDN @world

5.3 安装必要的包和内核

echo "sys-kernel/gentoo-kernel -initramfs" > /etc/portage/package.use/gentoo-kernel
emerge -av sys-kernel/genkernel sys-kernel/gentoo-kernel cronie 

# 开机自启动这些包
systemctl enable sshd.service
systemctl enable cronie.service
systemctl enable systemd-networkd.service
systemctl enable systemd-timesyncd.service  # 国内注意修改 /etc/systemd/timesyncd.conf FallbackNTP 为墙内 NTP 服务器


# root 敢死队
sed -i "s@#PermitRootLogin@PermitRootLogin@" /etc/ssh/sshd_config
sed -i "s@PermitRootLogin.*@PermitRootLogin yes@" /etc/ssh/sshd_config
sed -i "s@#PasswordAuthentication@PasswordAuthentication@" /etc/ssh/sshd_config
sed -i "s@PasswordAuthentication no@PasswordAuthentication yes@" /etc/ssh/sshd_config

# 初始化 /etc/machine-id
systemd-machine-id-setup

5.4 配置网络

不重命名网卡为 en* ,这一步非必须,一般是 ens18,重命名网卡下面配置文件ens18 需要更改为 eth0
ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules

cat > /etc/systemd/network/80-dhcp.network <<EOF
[Match]
Name=ens18

[Network]
DHCP=yes
EOF
  • 静态 IPv4 + IPv6
    下面用局域网地址作为演示,实际根据情况自行更改
cat > /etc/systemd/network/10-ens18.network <<EOF
[Match]
Name=ens18

[Network]
Gateway=192.168.1.1
Address=192.168.1.123/24
Gateway=fe80::1

[Address]
Address=fe80::20c:29ff:fef9:1/64
EOF

5.5 root 密码别忘了

passwd

6 安装grub, fstab

# grub 添加 zfs 支持,并安装
echo "sys-boot/grub libzfs" > /etc/portage/package.use/grub
emerge -av sys-boot/grub
grub-install /dev/sda
# 如果有只读的错误报出,执行
mount -o remount,rw /sys/firmware/efi/efivars
# 生成带 zfs 模块的 initramfs
genkernel initramfs --zfs --makeopts=-j`nproc`
# 生成 grub.cfg
grub-mkconfig -o /boot/grub/grub.cfg
# 设置 zfs 开机启动
systemctl enable zfs-import-cache
systemctl enable zfs-import.target
systemctl enable zfs-mount
systemctl enable zfs.target

7 fstab 配置

UUID1=`blkid /dev/sda2 | awk '{printf($2)}' | awk -F "[\"\"]" '{print $2}'`
# TYPE1=`blkid /dev/sda2 | awk '{printf($4)}' | awk -F "[\"\"]" '{print $2}'`
echo "UUID=${UUID1} /boot/efi vfat noauto 1 2" >> /etc/fstab
UUID2=`blkid /dev/sda3 | awk '{printf($2)}' | awk -F "[\"\"]" '{print $2}'`
# TYPE2=`blkid /dev/sda3 | awk '{printf($3)}' | awk -F "[\"\"]" '{print $2}'`
echo "UUID=${UUID2} swap swap defaults 0 0" >> /etc/fstab

8 退出并重启

exit
reboot

9 启动成功后给鸡起个名

使用 localhost 某些程序会出神奇的问题...

HOSTNAME='这里机器名自己填'
hostnamectl set-hostname ${HOSTNAME}
echo "127.0.0.1 ${HOSTNAME}" >> /etc/hosts
echo "::1 ${HOSTNAME}" >> /etc/hosts