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環境了,它雖然是命令行終端,但是卻非常神奇的支持鼠標操作,。鼠標拖動選擇文本等操作全部支持,真的是讓人驚嘆。
開啟SSH
雖然虛擬機是可以支持剪貼板復制等操作的,但是在系統安裝過程中是沒辦法支持的。所以接下來要輸入的大量命令會讓人感到十分困擾。所以為了方便最好開啟SSH,這樣我們好歹大部分命令可以直接復制粘貼。
rc-service sshd start
默認root密碼為空,為了能夠SSH,還有手動設置一下root密碼。
passwd
開啟成功之后,輸入ip a
命令查看一下虛擬機的IP,然后我們就可以SSH到虛擬機內部了。
這樣一來就不需要手打命令了。當然并不是說所有命令都能無腦復制粘貼,有些地方還是需要根據自己需求進行修改的。使用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)。我們要把文件和三個校驗文件全部下載下來。
下載命令如下,當然在下載之前,必須將工作目錄切換到/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輸出。
更新@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
故障排除
block device is not a valid root device gentoo
我一開始用的是XFS做根分區的文件系統,也確實在內核中將XFS相關選項設置為編譯到內核中,但是奈何不知道哪里漏了,所以最后啟動系統的時候,出現了這個錯誤。理論上找到所有XFS、驅動程序等相關選項,然后添加到內核配置中重新編譯一下內核,就可以解決問題了。可惜的是我對內核配置一竅不通,百般之下只好認栽,重新用EXT4安裝了一遍,終于成功了。