Stage4

Gentoo 的安装一向比较费时,如果你有一堆机器该怎么办?每一台手工编译,岂不是要累死。 受 Chymeric Tutorials的mkstage4 - Stage 4 Tarballs Made Easy 文章启发 , 这里我们来讲个简单的办法:

  • 安装配置好一台gentoo的机器。记得make.conf里面的编译选项不要优化过度。我自己的设置是:
1
2
    CFLAGS="-march=ivybridge -mtune=native -O2 -pipe"
    CXXFLAGS="${CFLAGS}"
  • 使用 mkstage4脚本 为现有机器制作stage4。 最近cpu漏洞经常升级内核,产生了很多不必要的文件,我专门在 TheChymera/mkstage4的原脚本 中增加了只备份正在运行的内核的相关代码(运行时 增加 -k 参数),并进行了一些优化。在我自己的机器上stage4的文件从原来的7GB减到了4GB,也极大的节省了解压的时间。 不过需要注意的是,解压时需要分别解压 .ksrc 和 .kmod

例如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
    liuk@localhost ~/proj/mkstage4 $ sudo ./mkstage4.sh -l -s -k -e /dataA -e /home/liuk/dataZ1/ /dataB/gentoo-stage4-20180511 --exclude=/dataB/* --exclude=/ssd/*
    Are you sure that you want to make a stage 4 tarball of the system
    located under the following directory?
    /

    WARNING: since all data is saved by default the user should exclude all
    security- or privacy-related files and directories, which are not
    already excluded by mkstage4 options (such as -c), manually per cmdline.
    example: $ mkstage4.sh -s /my-backup --exclude=/etc/ssh/ssh_host*

    COMMAND LINE PREVIEW:
    tar -cjpP --ignore-failed-read --exclude=/home/*/.bash_history --exclude=/dev/* --exclude=/var/tmp/* --exclude=/media/* --exclude=/mnt/*/* --exclude=/proc/* --exclude=/run/* --exclude=/sys/* --exclude=/tmp/* --exclude=/usr/portage/* --exclude=/var/lock/* --exclude=/var/log/* --exclude=/var/run/* --exclude=/dataA --exclude=/home/liuk/dataZ1/ --exclude=/usr/src/*  --exclude=/lib64/modules/*  --exclude=dataB/gentoo-stage4-20180511.tar.bz2 --exclude=lost+found --exclude=/dataB/* --exclude=/ssd/* -f /dataB/gentoo-stage4-20180511.tar.bz2 /*

    tar -cjpP --ignore-failed-read -f /dataB/gentoo-stage4-20180511.tar.bz2.ksrc /usr/src/linux-4.16.6-gentoo*

    tar -cjpP --ignore-failed-read -f /dataB/gentoo-stage4-20180511.tar.bz2.kmod /lib64/modules/4.16.6-gentoo*

    Type "yes" to continue or anything else to quit: yes
  • 使用 SystemRescueCd 引导系统,follow Gentoo Install Handbook,将 Installing stage3 换成我们自己的Stage4文件
1
tar xvjpf archive_name.tar.bz2

Configuring the kernel 步骤,可以直接替换成

1
2
    tar xvjpf archive_name.tar.bz2.kmod
    tar xvjpf archive_name.tar.bz2.ksrc

然后chroot进入新系统

1
2
3
4
5
6
7
8
9
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

chroot /mnt/gentoo /bin/bash
source /etc/profile
export PS1="(chroot) ${PS1}"

似乎最好在chroot之后再挂载boot及efi分区,这点还没有完全确定。

1
2
3
4
5
#if use intel cpu
iucode_tool -S --write-earlyfw=/boot/early_ucode.cpio /lib/firmware/intel-ucode/*
##if use efi
mount -o remount,rw /sys/firmware/efi/efivars
grub-install --target=x86_64-efi --efi-directory=/boot/efi #[--removable]

然后,一定记得修改 /etc/fstab 中磁盘分区设置,之后在chroot中环境生成 initramfs

1
2
3
dracut --force --kver 4.14.76-gentoo #4.14.76-gentoo 按照你安装的kernel version string来
grub-mkconfig -o /boot/grub/grub.cfg
reboot

有必要的话,进入UEFI设置一下启动顺序。

emerge –usepkg

如果多台机器使用相同的 /etc/portage/ 目录,则可以通过nfs挂载 /usr/portage/packages ,然后使用 emerge –usepkg 来安装新的包,配置文件中唯一可以根据每台机器不同情况修改估计只有 MAKEOPTS="-j6"。