1

Gentoo是一个非常著名的发行版,在Linux高手中非常流行。之前我也是被Gentoo的威名震慑了,所以一直没有尝试安装,最近感觉可以尝试一下了。所以今天来看看如何在虚拟机中安装Gentoo吧。本文参考了Gentoo 安装手册,如果想了解更多关于安装Gentoo的知识,可以直接查看官方文档。

当然有一说一,Gentoo的安装确实比Arch复杂多了。Arch其实安装起来并不算复杂,就是第一次操作命令行不熟悉,而Gentoo相比之下复杂多了,感觉难度是Arch安装5倍不止。特别是配置内核这一项的复杂程度,可能就顶了Arch整个安装的复杂度。

准备工作

下载镜像

首先到Gentoo官网下载所需的网络安装镜像,和Arch一样,Gentoo没有提供完整安装包,只有一个网络安装镜像。当然硬要说的话,Gentoo还是有完整镜像的,不过这个镜像已经三四年没有更新了,所以我们完全不用管它。

下载网络安装镜像

启动虚拟机

首先新建虚拟机的过程就不说了,我选择的CPU是2核,内存2G,硬盘空间32G,启动方式EFI。除了启动方式必须设置成EFI以外,其他设置全部按大家实际情况来就行了。设置好之后用网络镜像启动虚拟机,应该会看到如图所示的界面。

启动界面

非常有趣的一点就是Gentoo的Live环境了,它虽然是命令行终端,但是却非常神奇的支持鼠标操作,。鼠标拖动选择文本等操作全部支持,真的是让人惊叹。

进入Live界面

开启SSH

虽然虚拟机是可以支持剪贴板复制等操作的,但是在系统安装过程中是没办法支持的。所以接下来要输入的大量命令会让人感到十分困扰。所以为了方便最好开启SSH,这样我们好歹大部分命令可以直接复制粘贴。

rc-service sshd start

默认root密码为空,为了能够SSH,还有手动设置一下root密码。

passwd

开启成功之后,输入ip a命令查看一下虚拟机的IP,然后我们就可以SSH到虚拟机内部了。
查看IP地址

这样一来就不需要手打命令了。当然并不是说所有命令都能无脑复制粘贴,有些地方还是需要根据自己需求进行修改的。使用SSH还有一个好处就是在下面配置区域的时候,如果你只指定了中文区域,在终端中汉字会显示成方块,但是在SSH中可以正常显示。如果你准备直接在终端中输入命令的话,记得同时启用英文区域。

成功登录

安装Stage3文件

磁盘分区

当然,因为是虚拟机安装,所以烧录镜像、配置网络等复杂步骤不需要进行,我们直接从磁盘分区开始。因为我是EFI方式启动,所以要分两个区,ESP以及根分区。

parted /dev/sda mklabel gpt
parted /dev/sda mkpart efi fat32 0% 512M
parted /dev/sda mkpart root ext4 512M 100%
parted /dev/sda set 1 esp on

# 格式化分区
mkfs.fat -F32 /dev/sda1
mkfs.ext4 /dev/sda2

最后将根目录分区挂载为/mnt/gentoo,就可以进行下一步的工作了。

mount /dev/sda2 /mnt/gentoo

安装Stage3

这里简单按我的理解介绍一下Gentoo的包,详细信息请参考关于Stage Tarball的官方文档,简单说来可以分为Stage 1/2/3/4四个类型:Stage 1可以简单理解成源代码的包;Stage 2同样包含了Stage 1的所有文件,但是同时还包含了Stage 1编译出来的文件,也就说是Stage 2是自包含的包(自己可以编译出自己);Stage 3则是包含了系统必备工具的集合,也就是我们这里要安装的系统基础组件(不包括内核和引导器);Stage 4除了Stage 3的文件之外,还包含了内核和系统引导器,所以Stage 4就是一个可运行的包。这里我们要学习如何安装Gentoo,所以选择下载Stage 3就可以了,Stage 4主要是用于虚拟机快速运行之类的。

我们到清华镜像寻找最新的Stage 3的包,可以看到这里有很多文件,x32的我们不需要,带nomultilib的也不需要,iso的也不需要。我们要找的就是tar.xz格式的归档文件,除了包以外,还有三个附加文件分别包含了归档包的内容信息(CONTENTS)、校验信息(DIGESTS)以及加密的校验信息(DIGESTS.asc)。我们要把文件和三个校验文件全部下载下来。

寻找Stage 3包

下载命令如下,当然在下载之前,必须将工作目录切换到/mnt/gentoo也就是我们的根目录下,这样做的目的很简单,因为一会要将系统文件解压到根目录下。这里的下载链接是我目前复制出来的,假如大家以后看到本文的话,需要自己打开浏览器重新复制一下文件下载链接。

# 必须先切换到/mnt/gentoo
cd /mnt/gentoo

wget https://mirrors.tuna.tsinghua.edu.cn/gentoo/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20200223T214502Z.tar.xz
wget https://mirrors.tuna.tsinghua.edu.cn/gentoo/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20200223T214502Z.tar.xz.CONTENTS
wget https://mirrors.tuna.tsinghua.edu.cn/gentoo/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20200223T214502Z.tar.xz.DIGESTS
wget https://mirrors.tuna.tsinghua.edu.cn/gentoo/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20200223T214502Z.tar.xz.DIGESTS.asc

如果条件不允许,还可以使用另外一种方式避免手动输入这么一大长串链接。这就是利用文本浏览器link来上网并下载文件,光标选择,回车点击超链接,d开始下载,q退出浏览器。我们要做的就是用文本浏览器访问清华镜像网站,然后下载文件。

links https://mirrors.tuna.tsinghua.edu.cn/gentoo/

文本浏览器界面如下,使用起来也不算麻烦,将文件本体以及三个校验文件全部下载下来。

使用文本浏览器下载

然后用下面的命令来校验文件。

sha512sum -c stage3-amd64-*.tar.xz.DIGESTS

文件正确的话,应该会显示两个OK两个FIALED。失败的是另一种校验算法,只要有两个OK,就说明我们下载的文件是正确无误的。

校验文件

最后用下面命令来解压文件,后面的两个选项的作用是保留归档文件中所有文件正确的权限和命名空间关系。这样Gentoo的Stage3文件就算安装完成了。

tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner

配置基本系统

设置编译选项

Gentoo是一个源代码发行版,安装大多数软件的时候,其实都是安装的源代码,然后在本地编译的。为了能够更快更好的编译软件,还需要配置一下portage的编译选项。

# 编辑配置文件
nano /mnt/gentoo/etc/portage/make.conf

# 修改COMMAN_FLAGS
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"

# 添加MAKEOPTS,数字改成虚拟机设置的总内核数+1
MAKEOPTS="-j5"

设置镜像源

用下面的命令设置镜像源,推荐选择清华大学镜像源,按空格选中,然后回车确认。设置成功后,应该可以在文件最后面看到清华大学的镜像源。

mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf

# 或者你懒得选择,直接把清华镜像源加到配置文件后面也可以
echo 'GENTOO_MIRRORS="https://mirrors.tuna.tsinghua.edu.cn/gentoo"' >> /mnt/gentoo/etc/portage/make.conf

然后创建Portage配置文件目录,并将Gentoo安装镜像里的配置文件复制给我们的系统。

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

另外还要复制DNS信息,这里--dereference参数是必须的,不然可能复制到的只是一个链接而已。

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

切换进入新环境

用下面的命令切换到新的环境中,最后一条命令不是必须的,但是它会在命令提示符前面添加一个(chroot)提示我们处在新环境中。

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

挂载boot分区

这里很多发行版都使用了不同的挂载点,最常用的挂载点是/boot/efi,ArchWiki里推荐使用/efi,而这里Gentoo文档中介绍的是使用/boot,我们按照文档走就可以了。

mount /dev/sda1 /boot

配置Portage

Portage是Gentoo的软件包管理器,首先我们从网络上下载数据库快照。

emerge-webrsync

然后选择列出可用的profile,从中选择一个。这里又用到了另外一个工具eselect,它是Gentoo的通用管理界面,让我们方便的完成系统的各种配置和操作。因为Gentoo安装比较复杂,而且又是编译安装,所以这里选择其他profile的话,可能编译时间会非常长。因此这里大家看看就好,保持默认即可。

# 先列出可用的profile,带星号是目前选择的
eselect profile list
# 假如你想选择的话
eselect profile set 2

下面是我的profile输出。
查看profile

更新@world set

@world集合是Gentoo所有软件和配置的集合,要进行下一步的安装和配置,必须先更新@world集合。

emerge --ask --verbose --update --deep --newuse @world

配置USE环境变量

作为一个源代码编译的Linux发行版,Gentoo的很多软件包并不是直接安装二进制版本,而是下载源代码由用户选择编译。USE环境变量就是Gentoo提供给用户的一个工具,利用它可以指定一些环境变量,在编译的时候启用或者禁用某些功能。假如我现在要安装的是Gnome桌面,就可以禁用Qt的编译选项,这样编译出来的软件就不包含Qt的功能,软件包更加小巧,运行起来也会更快一点。

当然新手用户就没有必要更改这些高级选项了,默认的就完全够用了。如果你想要看看USE变量里面有什么东西的话,可以用下面的命令。

emerge --info | grep ^USE

如果想查看USE变量里面所有可用的选项,可以用下面的命令。

less /var/db/repos/gentoo/profiles/use.desc

配置时间和区域

首先要配置时区。

echo Asia/Shanghai > /etc/timezone
emerge --config sys-libs/timezone-data

然后配置区域。

echo 'zh_CN.UTF-8 UTF-8' >> /etc/locale.gen
# 如果你不用SSH,需要添加英文区域
echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen
locale-gen

# 列出可用的区域
eselect locale list
# 选择中文区域的编号
eselect locale set 2

最后重新加载一下环境变量。注意一下上面的设置,如果你是SSH到虚拟机系统的话,可以放心配置中文区域,但是如果你是直接在虚拟机终端里操作的话,需要在eselect locale set那里选择英文区域,不然汉字是无法正确显示的。

env-update && source /etc/profile && export PS1="(chroot) ${PS1}"

安装和配置内核

官方文档这里详细介绍了如何配置和优化内核,开启必须的功能,关闭不必要的功能。虽然对于初学者来说貌似这是很高深的知识,但是如果你照着做的话,会发现配置内核也不是这么困难的工作。当然如果你还是有点心虚的话,Gentoo也可以自动配置内核。

首先安装内核源代码和内核编译工具。因为Gentoo的安装是在本地编译的,所以用时比较长。假如你发现安装瞬间完成,是因为没有更新配置文件的原因。需要输入etc-update并选择-3自动更新配置文件,然后重新输入命令即可编译安装。

emerge --ask sys-kernel/gentoo-sources
emerge --ask sys-kernel/genkernel

配置fstab

fstab是一个很重要的文件,在系统启动的时候,会读取fstab文件并挂载fstab中记录的分区。这里我们有boot分区和根目录分区两个要挂载的分区。而genkernel工具要安装内核的话,自然需要知道我们的启动分区在哪里,因此首先要配置fstab文件。

首先用lsblk -f命令查看分区信息,要注意UUID和标签。另外要注意如果重新分区或者格式化,这些信息就会发生变化。

知道了标签和UUID,就可以填写fstab信息了,虽然也可以用/dev/sda1这样的块设备名称,但是不够安全。所以我们用UUID来编写fstab。第一个是分区名,推荐使用标签或者UUID;第二个是挂载点,也就是分区挂载的位置;第三个是分区的文件系统类型;第四个是挂载选项;第五个dump参数,默认0即可;第六个pass参数,对于根分区要设置成1,其他分区设置成2。最后fstab应该类似这样。当然UUID或者标签应该改成你自己实际的值。你的fstab文件应该类似下面这样。

UUID=1f3f0313-cfc3-47d3-90e3-52c6d1b67757       /       ext4     noatime 0 1
UUID=2E77-ED51          /boot           vfat    defaults,noatime                0 2

手动配置内核

在开始手动配置内核之前,我们需要了解硬件的各项信息,这需要安装另一个包来做到。

emerge --ask sys-apps/pciutils

在配置之前,还可以通过lsmod命令来查看当前所处的Gentoo Live镜像开启的功能, 这可以作为我们在配置内核时的重要参考。

一切准备好之后,就可以切换到内核源代码目录并打开配置菜单。

cd /usr/src/linux
make menuconfig

这样就会打开一个终端界面的图形化配置工具,和其他一些终端工具操作方法类似,光标键选择,空格选择,按两下Esc退回到上一个界面,/是搜索。
内核配置工具界面

必选配置

有些内核选项是必须的,必须编译到内核中,而不是作为模块加载。*表示包括到内核中,M表示作为模块加载,[]只有包括到内核中和排除在外两种选项,<>则有包括到内核中、排除在外和以模块加载三种选项。下面这些选项都必须以*方式编译到内核中。

devtmpfs支持。

Device Drivers --->
  Generic Driver Options --->
    [*] Maintain a devtmpfs filesystem to mount at /dev
    [*]   Automount devtmpfs at /dev, after the kernel mounted the rootfs

SCSI磁盘支持。

Device Drivers --->
   SCSI device support  --->
      <*> SCSI disk support

选择支持的文件系统。因为前面我用的FAT32格式化的ESP,EXT4格式化的根目录,所以这里这两项(FAT32也就是VFAT)必须包括到内核中,虚拟内存和proc文件系统也是必选的。其实这里还可以取消掉不需要的文件系统,但是对于新手我不建议取消任何自己不明白的东西,很容易弄的最后内核没办法启动。

File systems --->
  < > Second extended fs support
  < > The Extended 3 (ext3) filesystem
  <*> The Extended 4 (ext4) filesystem
  < > Reiserfs support
  < > JFS filesystem support
  < > XFS filesystem support
  < > Btrfs filesystem support
  DOS/FAT/NT Filesystems  --->
    <*> MSDOS fs support
    <*> VFAT (Windows-95) fs support
 
Pseudo Filesystems --->
    [*] /proc file system support
    [*] Tmpfs virtual memory file system support (former shm fs)

假如你使用PPPoE拨号的话,还需要启用以下功能。但是因为我们是虚拟机嘛,所以就不用动下面的设置了。

Device Drivers --->
  Network device support --->
    <*> PPP (point-to-point protocol) support
    <*>   PPP support for async serial ports
    <*>   PPP support for sync tty ports

如果你的处理器是多核的,还需要开启SMP(对称多处理器支持)。

Processor type and features  --->
  [*] Symmetric multi-processing support

就算是虚拟机,也经常遇到使用USB的情况,所以USB也必须启用。

Device Drivers --->
  HID support  --->
    -*- HID bus support
    <*>   Generic HID driver
    [*]   Battery level reporting for HID devices
      USB HID support  --->
        <*> USB HID transport layer
  [*] USB support  --->
    <*>     xHCI HCD (USB 3.0) support
    <*>     EHCI HCD (USB 2.0) support
    <*>     OHCI HCD (USB 1.1) support

系统体系相关的内核配置

因为我们选择了multlib,所以32和64位的程序都会安装。为了支持32位程序,必须启用32位程序模拟功能。这里其实倒是不用怎么改,默认已经都选上了。

Processor type and features  --->
   [*] Machine Check / overheating reporting 
   [*]   Intel MCE Features
   [*]   AMD MCE Features
   Processor family (AMD-Opteron/Athlon64)  --->
      ( ) Opteron/Athlon64/Hammer/K8
      ( ) Intel P4 / older Netburst based Xeon
      ( ) Core 2/newer Xeon
      ( ) Intel Atom
      (*) Generic-x86-64
Binary Emulations  --->
   [*] IA32 Emulation

启用GPT支持,因为前面我用的GPT分区表,EFI启动方式,所以这两项也必须启用。

-*- Enable the block layer --->
   Partition Types --->
      [*] Advanced partition selection
      [*] EFI GUID Partition support

EFI的支持。

Processor type and features  --->
    [*] EFI runtime service support 
    [*]   EFI stub support
    [*]     EFI mixed-mode support
 
Firmware Drivers  --->
    EFI (Extensible Firmware Interface) Support  --->
        <*> EFI Variable Support via sysfs

虚拟机相关内核配置

这里我用的是VMware,所以下列内核选项也必须选择。某些选项依赖其它选项,使用搜索功能查看具体的依赖项,然后依次启用。

[*] Networking support  --->
        Networking options  --->
            <*> Virtual Socket protocol
            <*>   VMware VMCI transport for Virtual Sockets 
    Device Drivers  --->
            Misc devices  --->
                <*> VMware Balloon Driver
                <*> VMware VMCI Driver
            SCSI device support  --->
                [*] SCSI low-level drivers  --->
                   <*>   VMware PVSCSI driver support
        [*] Network device support  --->
                [*]   Ethernet driver support  --->
                    [*]   AMD devices
                    <*>     AMD 8111 (new PCI LANCE) support
                    <*>     AMD PCnet32 PCI support
                    [*]   Intel devices
                    <*>     Intel(R) PRO/1000 Gigabit Ethernet support
                    <*>     Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support 
                <*>   VMware VMXNET3 ethernet driver
            Input device support  --->
                [*]   Keyboards  --->
                    <*>   AT keyboard
    File systems  --->
        <*> FUSE (Filesystem in Userspace) support

把上面所有必选项都配置好之后,选择save保存配置文件,然后exit退出。默认配置文件名是.config,但是最好手动复制一个备份,有时候默认名称的配置文件会莫名丢失,只能重头再配置一次。然后就可以开始编译和安装了。这个过程可能持续十分钟到几个小时,主要取决于你选择的功能大小以及电脑配置。

# 编译内核
make && make modules_install
# 编译完成后安装内核到boot分区
make install

自动编译内核

如果你感觉手动配置内核比较麻烦,或者辛辛苦苦配了半天,结果内核没配对系统进不去了。可以考虑第二种方式,就是自动编译内核。这种方式有个缺点就是会开启大部分选项,所以编译内核用时比较长。

网上查了一下可能需要几十分钟到两三个小时,在虚拟机中编译的话可能用时更长,但是考虑到自己研究如何把内核跑通可能也得用这么长时间,所以自动编译内核也不是不可以。假如你在手动配置内核的时候遭受了很多失败,不妨考虑考虑电脑挂在那里让它慢慢编译。

genkernel all

安装firmware和initrampfs

虽然官方文档说这是可选的,但是为了保险起见我们还是安装firmware。

emerge --ask sys-kernel/linux-firmware

别忘了安装initramfs,如果你是自动编译内核的话,可以不用安装initramfs,因为genkernel all会自动安装内核以及initramfs。

genkernel --install initramfs

内核编译完毕之后,查看/boot分区内容,应该会看到initramfs和vmlinuz文件,这样内核就准备就绪了。

配置系统

接下来就是一些系统配置工作。

网络配置

设置主机名

nano -w /etc/conf.d/hostname
# 设置主机名
hostname="mygentoo"

配置网络

先安装软件包。

emerge --ask --noreplace net-misc/netifrc

然后配置DHCP。

nano -w /etc/conf.d/net

# 添加DHCP配置
config_eth0="dhcp"

配置网络自启动。

cd /etc/init.d
ln -s net.lo net.eth0
rc-update add net.eth0 default

等到成功进入系统以后,可能会出现没网的情况,因为默认的网络接口名字不一定是eth0,这时候需要使用ip a查看一下实际的名称,然后重新编辑一下网络配置。

# 添加正确的网络配置
cd /etc/init.d
ln -s net.lo net.eno16777736
rc-update add net.16777736 default

# 删除错误的配置
rm /etc/init.d/net.eth0
rc-update del net.eth0 default
# 启动网络
rc-service net.16777736 start

实际网络接口名

设置root密码

别忘了设置root密码。

passwd

安装工具

还有一些系统工具也需要安装。

日志工具

安装和启动日志工具。

emerge --ask app-admin/sysklogd
rc-update add sysklogd default

远程登录

因为前面设置了中文区域,所以终端会显示方块。最好这里直接预先开启SSH服务,方便以后远程登录。

rc-update add sshd default

文件系统工具

因为系统使用了FAT32和EXT4两个文件系统,所以至少这两种工具必须安装。

emerge --ask sys-fs/dosfstools sys-fs/e2fsprogs

网络工具

安装DHCP工具。

emerge --ask net-misc/dhcpcd

添加用户

root用户是特权用户,日常使用并不安全,所以需要添加新用户。

useradd -m -G users,wheel,audio -s /bin/bash yitian
passwd yitian

磁盘清理

是不是想起来有些地方不对劲,没错,还有一开始下载的stage3文件,假如最后系统成功启动了的话,他们就没用了,可以安全的删除掉。

rm /stage3-*.tar.*

安装系统引导器

最后一步就是安装系统引导器了,推荐使用grub,功能齐全。

安装grub

emerge --ask --verbose sys-boot/grub:2

将grub安装到系统中

grub-install --target=x86_64-efi --efi-directory=/boot
grub-mkconfig -o /boot/grub/grub.cfg

安装完毕之后,输入exit退出chroot环境。

(chroot) livecd ~ # exit

然后就umount分区,然后重启系统。

cd
umount -l /mnt/gentoo/dev{/shm,/pts,}
umount -R /mnt/gentoo
reboot

系统成功启动好了吗?

重启之后应该会看到grub的界面,但是别以为这就成功了。因为重点是手动配置编译的内核是否能够正常启动。所以接下来继续观察,看看是否可以成功启动内核进入系统。如果你一次性安装成功,那么恭喜了。

但是我前后总共装了三四天才算成功。第一天照着官方文档慢慢看慢慢敲命令,第二天卡在了配置内核这一步了,然后前后反复测试,最后把前面的各种步骤弄得非常熟悉,可以直接复制粘贴命令。最后我放弃了手动配置内核,做好了编译大半天的准备,于是改用genkernel自动编译内核。然后最悲催的事情发生了,genkernel半个小时以后失败了。

最后没办法我又开始了手动配置内核的步骤,终于慢慢靠着搜索把文档列出来的所有项都找到并配置好了。而且为了保险起见,这次我没有关闭任何默认内核配置,只按着文档把所有新的项加上去了。终于奇迹发生了,重启之后终于成功了!

安装screenfetch截个图,做个纪念。

emerge app-misc/screenfetch

screenfetch

故障排除

block device is not a valid root device gentoo

我一开始用的是XFS做根分区的文件系统,也确实在内核中将XFS相关选项设置为编译到内核中,但是奈何不知道哪里漏了,所以最后启动系统的时候,出现了这个错误。理论上找到所有XFS、驱动程序等相关选项,然后添加到内核配置中重新编译一下内核,就可以解决问题了。可惜的是我对内核配置一窍不通,百般之下只好认栽,重新用EXT4安装了一遍,终于成功了。


techstay
988 声望55 粉丝