作为Linux菜鸟,却由于对性能的追求而想安装Gentoo,也失败了几十次,走了太多的弯路,甚至花一整个五一假期照着某医科生的帖子,从stage1开始装,然后还失败了。近些时总算找到了诀窍,能做到除核心配置失误导致死机外,都能安装成功。
最近又对zfs起了兴趣,想把Gentoo装在zfs上。经过这几个月的不断失败和重装(最多的是找不到引导区),终于在昨天晚上安装成功(撒花~撒花~~)
特写此文记录一下。
1.安装前须知
1.1最容易犯的错误
- 忘记设密码
- 忘记安装文件系统支持
- 忘记设置网络
1.2补救方法
1.2.1非zfs下
mount {DEV} /mnt/gentoo
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/devchroot /mnt/gentoo /bin/bash
# 以上即可,还可以加上export PS1="(chroot) ${PS1}"
1.2.2zfs下
zpool import -d {DEV} -R /mnt/gentoo -f {POOLNAME}
zfs mount -a
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/devchroot /mnt/gentoo /bin/bash
export PS1="(chroot) ${PS1}"
2.安装过渡系统
我找到很多的资料都是从Arch安装的,但是我试过几次都有冲突问题(高手可以略过),于是我尝试着通过Gentoo作媒介来在ZFS安装Gentoo并成功。
2.1分区准备
准备装系统的盘/dev/sda被分为6个区,其中sda1~sda3用来装在ZFS上的系统,sda4~sda6用来装过渡系统。
sda1、sda4为300M的FAT32分区,作为EFI所用。sda2、sda5为1G的EXT4分区,用作/boot(因为我不想以FAT32分区作/boot)。sda6为50G的XFS分区(其实其它类型也行)。sda3也是50G现在不用设定分区类型。
另外最好先下载好stage3的xz压缩包,在下载https://www.gentoo.org/downloads/即可。
2.2安置stage3
启动Gentoo的安装镜像, Minimal Installation和 LiveGUI USB Image都可以。执行以下操作
mkdir -p /mnt/gentoo
mount /dev/sda6 /mnt/gentoo
mkdir -p /mnt/gentoo/boot
mount /dev/sda5 /mnt/gentoo/boot
mkdir -p /mnt/gentoo/boot/efi
mount /dev/sda4 /mnt/gentoo/boot/efi
cp -v stage3-*-.xz /mnt/gentoo
cd /mnt/gentoo
tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner
#选择中国源
mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf
mkdir -p -v /mnt/gentoo/etc/portage/repos.confcd /mnt/gentoo/usr/share/portage/config/
cp -v repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf#加入中国源
nano -w /mnt/gentoo/etc/portage/repos.conf/gentoo.conf:sync-uri = rsync://mirrors.163.com/gentoo-portage #sync-uri = rsync://mirrors.tuna.tsinghua.edu.cn/gentoo-portage/ #sync-uri = rsync://rsync.mirrors.ustc.edu.cn/gentoo-portage/ #sync-uri = rsync://rsync.mirrors.ustc.edu.cn/gentoo-portage/ #sync-uri = rsync://mirrors.yun-idc.com/gentoo-portage/
# 复制DNS信息
cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
# 挂载系统必要环境,并进入Chroot环境
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
#mount --make-rslave /mnt/gentoo/sys (不使用systemd,所以注释掉)
mount --rbind /dev /mnt/gentoo/dev
#mount --make-rslave /mnt/gentoo/dev (不使用systemd,所以注释掉)chroot /mnt/gentoo /bin/bash
mkdir -p /var/db/repos/gentoo # 只用一次,后面进chroot不需要
env-update # 只用一次,后面进chroot不需要
source /etc/profile # 只用一次,后面进chroot不需要
export PS1="(chroot) ${PS1}" # 可以不用这句
现在你已经进入要安装的系统中了,此后你的操作会直接影响安装后的系统。你在此时安装的内容和修改的设置都会保留在安装后的系统中。你也可以理解为,现在使用的是跑在“外部”核心上的系统,和我们的目标的最大区别是没有可以引导的自身核心而已。
注意:make.conf中的ACCEPT_KEYWORDS要设为amd64,如果按网上教程设为~amd64会有zfs的支持问题(高手可无视这一条)
2.3安装系统核心
此处我去掉了其它教程中emerge @world的步骤,因为现在这个过渡系统不需要作这个升级(我是之后把sda4~sda6都删除了),而且也不会影响核心的安装。
另外我建议不要再这个阶段emerge太多东西,因为这阶段会多出多余的步骤,耗费更多的时间。
nano -w /etc/hosts
# 添加github的host
185.199.108.133 raw.githubusercontent.com 185.199.109.133 raw.githubusercontent.com 185.199.110.133 raw.githubusercontent.com 185.199.111.133 raw.githubusercontent.com
emerge-webrsync # 更新软件列表
eselect profile list
eselect profile set 1 # 过渡系统最基础的即可
echo "Asia/Shanghai" > /etc/timezone
emerge --config sys-libs/timezone-data
hwclock --systohc
date MMDDhhmmYY #设为当前时间nano -w /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
eselect locale list
eselect locale set en_US.UTF-8
env-update && source /etc/profile # 后面不需要了
export PS1="(chroot) ${PS1}"
# 生成/etc/fstab配置
emerge --ask --quiet genfstab
genfstab -U -p / >> /etc/fstab
# 有人说genfstab是Arch下的,其实有Gentoo版
# 安装Linux核心
emerge --ask --quiet --verbose sys-kernel/gentoo-kernel-bin
# 过渡系统嘛~装个已编译好的即可,能省下大量CPU、硬盘消耗和时间
eselect kernel list
eselect kernel set 1 # 不出意外只能选1,如果不是,那就是安装时出意外了
# 这样会自动生成/usr/src/linux。很多软件emerge时会寻找Linux的Header,所以我先设定好kernel的版本。
# 安装文件系统支持
emerge --ask --quiet sys-fs/xfsprogs
emerge --ask --quiet sys-fs/dosfstools
emerge --ask --quiet zfs zfs-kmod # zfs最好在核心和其它文件系统之后
# 这里需要注意确认zfs是不是安装成功。这里不成功的话后面也别做了。
emerge --ask --quiet --verbose sys-kernel/linux-firmware
emerge --ask --quiet sys-kernel/genkernel
genkernel initramfs --kernel-config=/usr/src/linux/.config
emerge --ask --quiet --verbose sys-boot/grub:2
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=TmpGen
grub-mkconfig -o /boot/grub/grub.cfg
# 这两步也很可能出错
# 设置时钟
nano -w /etc/conf.d/hwclock
clock="local"
# 修改主机名
nano -w /etc/conf.d/hostname
hostname={主机名}
nano -w /etc/hosts
127.0.0.1 localhost {主机名} ::1 localhost {主机名}
# 配置有线网络
emerge --ask --quiet --noreplace net-misc/netifrc
ifconfig # 查看本机网络设置
cd /etc/init.d
ln -s net.lo net.enp5s0 # enp5s0是我机器上的设定,诸位按自己的机器设置修改
rc-update add net.enp5s0 default
emerge --ask --quiet net-misc/dhcpcd
# 安装无线网络工具
emerge --ask net-wireless/iw # Open或WEP网络
emerge --ask net-wireless/wpa_supplicant # WAP或WAP2网络
# 设置root密码
passwd
# 不要忘记哦
2.4重启机器
通过以上步骤基本上将过渡系统安装好了,现在重启机器验证下能否进入。
# 退出chroot环境
exit
umount -a
reboot
如果能引导进入上面所配置的系统,那么可以进入此系统,以此为基础安装在ZFS上的目标系统。
如果进系统失败,可以先把sda4~6格式化掉,再按上述步骤再做一遍。
3.安装在ZFS上的Gentoo系统
3.1安装准备
进入上述安装的过渡系统,先创建zfs分区。
# 加载zfs模块
modprobe zfs
# 查看块设备的id
ls -l /dev/disk/by-id
# 可以得到类似下面的结果
lrwxrwxrwx 1 root root 9 Mar 26 00:40 ata-WDC_WD10SPSX-22A6WT0_WD-WXA2A52FUKHC -> ../../sda lrwxrwxrwx 1 root root 10 Mar 26 00:40 ata-WDC_WD10SPSX-22A6WT0_WD-WXA2A52FUKHC-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 Mar 26 00:40 ata-WDC_WD10SPSX-22A6WT0_WD-WXA2A52FUKHC-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 Mar 26 00:40 ata-WDC_WD10SPSX-22A6WT0_WD-WXA2A52FUKHC-part3 -> ../../sda3 lrwxrwxrwx 1 root root 10 Mar 26 00:40 ata-WDC_WD10SPSX-22A6WT0_WD-WXA2A52FUKHC-part4 -> ../../sda4 lrwxrwxrwx 1 root root 10 Mar 26 00:40 ata-WDC_WD10SPSX-22A6WT0_WD-WXA2A52FUKHC-part5 -> ../../sda5 lrwxrwxrwx 1 root root 10 Mar 26 00:40 ata-WDC_WD10SPSX-22A6WT0_WD-WXA2A52FUKHC-part6 -> ../../sda6 lrwxrwxrwx 1 root root 13 Mar 26 2023 nvme-J.ZAO_5_SERIES_256GB_SSD_MHA235T002396 -> ../../nvme0n1 lrwxrwxrwx 1 root root 15 Mar 26 2023 nvme-J.ZAO_5_SERIES_256GB_SSD_MHA235T002396-part1 -> ../../nvme0n1p1 lrwxrwxrwx 1 root root 15 Mar 26 2023 nvme-J.ZAO_5_SERIES_256GB_SSD_MHA235T002396-part2 -> ../../nvme0n1p2 lrwxrwxrwx 1 root root 13 Mar 26 2023 nvme-uuid.3bdb662a-440d-ed11-b13b-5901b2ee7c69 -> ../../nvme0n1 lrwxrwxrwx 1 root root 15 Mar 26 2023 nvme-uuid.3bdb662a-440d-ed11-b13b-5901b2ee7c69-part1 -> ../../nvme0n1p1 lrwxrwxrwx 1 root root 15 Mar 26 2023 nvme-uuid.3bdb662a-440d-ed11-b13b-5901b2ee7c69-part2 -> ../../nvme0n1p2 lrwxrwxrwx 1 root root 9 Mar 26 2023 usb-Teclast_CoolFlash_8960281250321381726-0:0 -> ../../sdb lrwxrwxrwx 1 root root 10 Mar 26 2023 usb-Teclast_CoolFlash_8960281250321381726-0:0-part1 -> ../../sdb1 lrwxrwxrwx 1 root root 9 Mar 26 00:40 wwn-0x50014ee2154caec4 -> ../../sda lrwxrwxrwx 1 root root 10 Mar 26 00:40 wwn-0x50014ee2154caec4-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 Mar 26 00:40 wwn-0x50014ee2154caec4-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 Mar 26 00:40 wwn-0x50014ee2154caec4-part3 -> ../../sda3 lrwxrwxrwx 1 root root 10 Mar 26 00:40 wwn-0x50014ee2154caec4-part4 -> ../../sda4 lrwxrwxrwx 1 root root 10 Mar 26 00:40 wwn-0x50014ee2154caec4-part5 -> ../../sda5 lrwxrwxrwx 1 root root 10 Mar 26 00:40 wwn-0x50014ee2154caec4-part6 -> ../../sda6
# 创建zfs分区
zpool create -f -o ashift=12 \
-o cachefile-/etc/zfs/zpool.cache \
-O acltype=posixacl \
-O relatime=on \-O atime=off \
-O xattr=sa \
-O dnodesize=legacy \
-O normalization=formD \
-O mountpoint=none \
-O canmount=off \
-O devices=off \
-O compression=lz4 \
-O dedup=off \-m none \
-R /mnt/gentoo \
zgenroot \/dev/disk/by-id/ata-WDC_WD10SPSX-22A6WT0_WD-WXA2A52FUKHC-part3
# 如果想给zfs设置密码,可以使用
-O encryption=on -O keyformat=passphrase
zfs create -o mountpoint=none -o canmount=off zgenroot/ROOT
zfs create -o mountpoint=/ zgenroot/ROOT/default
# 配置zpool bootfs
zpool set bootfs=zgenroot/ROOT/default zgenroot
挂载其它文件系统
mkdir -p /mnt/gentoo/boot
mount /dev/disk/by-id/ata-WDC_WD10SPSX-22A6WT0_WD-WXA2A52FUKHC-part2 /mnt/gentoo/boot
mkdir -p /mnt/gentoo/boot/efi
mount /dev/disk/by-id/ata-WDC_WD10SPSX-22A6WT0_WD-WXA2A52FUKHC-part1 /mnt/gentoo/boot/efi
复制zfs缓存
mkdir -p zgenroot/etc/zfs
cp /etc/zfs/zpool.cache zgenroot/etc/zfs/zpool.cache
复制已下载的文件
cd /
cp -v starge3-*.xz /mnt/gentoo/
cd /mnt/gentoo
tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner
mkdir -p -v /mnt/gentoo/etc/portage/repos.conf
cp -v /etc/portage/repos.conf/gentoo.conf /mnt/gentoo/etc/portage/repos.conf/
mkdir -p /mnt/gentoo/var/cache/distfiles
cd /var/cache/distfiles
cp -v *.* /mnt/gentoo/var/cache/distfiles/
进入要安装的系统:
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
#mount --make-rslave /mnt/gentoo/sys (不使用systemd,所以注释掉)
mount --rbind /dev /mnt/gentoo/dev
#mount --make-rslave /mnt/gentoo/dev (不使用systemd,所以注释掉)chroot /mnt/gentoo /bin/bash
mkdir -p /var/db/repos/gentoo # 只用一次,后面进chroot不需要
env-update # 只用一次,后面进chroot不需要
source /etc/profile # 只用一次,后面进chroot不需要
export PS1="(chroot) ${PS1}" # 可以不用这句
进行如下设置:
nano /etc/portage/package.use/zfssys-fs/zfs dist-kernel sys-fs/zfs-kmod dist-kernel
nano /etc/portage/package.use/grub
sys-boot/grub libzfs
nano /etc/portage/package.accept_keywords/zfs
sys-fs/zfs amd64 =sys-fs/zfs-999 ** sys-fs/zfs-kmod amd64 =sys-fs/zfs-kmod-999 **
系统设置:
nano -w /etc/hosts
# 添加github的host
185.199.108.133 raw.githubusercontent.com 185.199.109.133 raw.githubusercontent.com 185.199.110.133 raw.githubusercontent.com 185.199.111.133 raw.githubusercontent.com
emerge-webrsync # 更新软件列表
eselect profile list
eselect profile set 9 # 这路要装KDE
echo "Asia/Shanghai" > /etc/timezone
emerge --config sys-libs/timezone-data
hwclock --systohc
date MMDDhhmmYY #设为当前时间# 生成/etc/fstab配置
emerge --ask --quiet genfstab
genfstab -U -p / >> /etc/fstab
# 这里要把/etc/fstab中zfs的分区信息注释掉
blkid >> /etc/fstab
nano -w /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
eselect locale list
eselect locale set en_US.UTF-8
env-update && source /etc/profile # 后面不需要了
export PS1="(chroot) ${PS1}"
3.2安装核心
下载核心代码。因为这里是要真正使用的系统,所以不使用bin,而是下载代码核心的代码自己编译(这才是使用Gentoo的精髓啊!)
emerge --ask --quiet sys-kernel/gentoo-sources
eselect kernel set 1
emerge --ask --quiet --verbose sys-kernel/linux-firmware
emerge --ask --quiet sys-kernel/genkernel
emerge --ask --quiet sys-fs/xfsprogs
emerge --ask --quiet sys-fs/dosfstools
emerge --ask --quiet zfs
emerge --ask --quiet sys-firmware/intel-microcode sys-apps/iucode_tool
iucode_tool -S
iucode_tool -S -l /lib/firmware/intel-ucode/*
cp -v /usr/share/genkernel/arch/x86_64/generated-config /usr/src/linux/.config
cd /usr/src/linux
# 配置核心,也是容易翻车的步骤
make menuconfig
make -j20
make modules_install
make install
emerge --ask zfs-kmod
这里在编译核心后安装zfs-kmod,是因为zfs-kmod需要检测存在的核心。而且zfs0kmod要连接github下载,很有可能失败,所以需要去掉--quiet注意观察。如果kmod安装失败,会在引导时找不到分区。
rm -rf /etc/hostid && zgenhostid
mkdir -p /etc/kernels
cp -v .config /etc/kernels/kernel-config-<内核版本号>-gentoo-x86_64
genkernel --install initramfs
rc-update add zfs-import boot
rc-update add zfs-mount boot
rc-update add zfs-share default
rc-update add zfs-zed default
emerge --ask --quiet --verbose sys-boot/grub:2
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GenZFS
nano -w /etc/default/grub
GRUB_CMDLINE_LINUX="dozfs=cache quiet iommu=pt nowatchdog" GRUB_CMDLINUX_LINUX_DEFAULT="spectre_v1=off spectre_v2=off spec_store_bypass_disable=off pti=off"
grub-mkconfig -o /boot/grub/grub.cfg
如上面装过渡系统那样配置网络和设置密码。
emerge --ask --quiet sys-power/acpid
rc-update add acpid default
emerge --ask --quiet sys-power/thermald
rc-update add thermald
3.3重启
#退出chroot
exit
umount /mnt/gentoo/boot/efi
umount /mnt/gentoo/boot
zfs umount -a
zpool export -f zgenroot
reboot