LFS 11.2(Linux From Scratch)構建過程全記錄(十): 使 LFS 系統可引導

寫在前面:

本文將對LFS系統進行引導配置,包含對/etc/fstab的配置和grub的配置。

本文將進行linux系統內核的安裝。

警告:本文中的每個配置都是關鍵配置,配置一旦錯誤將會導致系統無法運行,請打起十二分精神!!!

 

/etc/fstab配置

/etc/fstab是用於確定每個分區含義的配置文件。

在10.2中,文章給了你fstab文件的模板,它長這樣:

cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file-system mount-point type options dump fsck
# order
/dev/<xxx> / <fff> defaults 1 1
/dev/<yyy> swap swap pri=1 0 0
proc /proc proc nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /run tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
# End /etc/fstab
EOF

輸入完該命令後,並非萬事大吉,因爲你還要將<xxx>,<yyy>和<fff>設置爲正確的內容

 

其中:

 

<xxx>表示root所對應的分區,注意根目錄磁盤是配置好的,新的,用於安裝LFS的磁盤

<fff>表示root分區的文件系統類型,筆者的文件系統是ext4

下方的<yyy>對應swap分區

對於sdb,筆者的分區情況如下:

 

因此,<xxx>對應sdb3,<fff>對應ext4,<yyy>對應sdb2

但是,我們還有boot分區,該分區也要一併設置進fstab中,我們還要增加boot的設置

填充後的fstab如下表所示:

cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# filesystem mount-point type options dump fsck
# order
/dev/sdb3  /        ext4     defaults            1 1
/dev/sdb1  /boot    ext4     defaults,noauto     0 2
/dev/sdb2  swap     swap     pri=1               0 0
proc       /proc    proc     nosuid,noexec,nodev 0 0
sysfs      /sys     sysfs    nosuid,noexec,nodev 0 0
devpts     /dev/pts devpts   gid=5,mode=620      0 0
tmpfs      /run     tmpfs    defaults            0 0
devtmpfs   /dev     devtmpfs mode=0755,nosuid    0 0
# End /etc/fstab
EOF

然後,考慮到在接下來的設置中,由於磁盤將會互換(詳見第二章中提到的),sdb會變爲sda,編號不穩定,我們可以用穩定的UUID進行磁盤確認。

我們可以用以下的指令獲取磁盤的UUID,命令和輸出如下圖所示

我們用sdb1/2/3對應的UUID對上面的fstab進行替換,替換後的fstab如下:

cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system mount-point type options dump fsck
# order
#/dev/sda3 is the root
UUID=76f5021a-8167-44a2-b374-0f3d1e29cbd4 / ext4 defaults 1 1
#/dev/sda1 is the boot
UUID=b6113556-ac9b-4b3a-9cbd-6d2ee13a2b71 /boot ext4 defaults,noauto 0 2
#/dev/sda2 is the swap
UUID=fd80d9b0-f028-49b6-958c-342c40f35ec9 swap swap pri=1 0 0
proc /proc proc nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /run tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
# End /etc/fstab
EOF

上文是筆者最終採用的寫入fstab的代碼

警告:該部分fstab切勿直接複製,請確認自己的LFS上root和swap對應的磁盤號和UUID,再確認是否有boot存在,否則LFS有變磚可能

 

Linux內核安裝

和普通的包安裝一樣,我們先解壓,再cd,然後執行以下指令,以確保內核源代碼絕對乾淨

make mrproper
make defconfig

 

隨後,運行以下代碼,以下代碼將會進入內核編譯配置界面

make menuconfig

這個指令將會打開一個奇怪的配置界面(有點像BIOS)

然後按照下方的提示去完成,提示長這樣:

Processor type and features --->
 [*] Build a relocatable kernel [CONFIG_RELOCATABLE]
 [*] Randomize the address of the kernel image (KASLR) [CONFIG_RANDOMIZE_BASE]
General setup --->
 [ ] Compile the kernel with warnings as errors [CONFIG_WERROR]
 < > Enable kernel headers through /sys/kernel/kheaders.tar.xz [CONFIG_IKHEADERS]
General architecture-dependent options --->
 [*] Stack Protector buffer overflow detection [CONFIG_STACKPROTECTOR]
 [*] Strong Stack Protector [CONFIG_STACKPROTECTOR_STRONG]
Device Drivers --->
 Graphics support --->
 Frame buffer Devices --->
 [*] Support for frame buffer devices ----
 Generic Driver Options --->
 [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
 [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
 [*] Automount devtmpfs at /dev, after the kernel mounted the rootfs [CONFIG_DEVTMPFS_MOUNT]

對於不同的選項,其存在有縮進,縮進表示的是該菜單的級別(因爲有二級甚至三級菜單)

我以Support for frame buffer devices舉例,這個是要你在菜單中依次選擇Device Drivers——Graphics support——Frame buffer Devices,隨後在選項中找到Support for frame buffer devices,並將這個選項選上。

這個菜單隻能用鍵盤進行操控,可用的爲鍵盤的上下左右鍵,以及Y鍵和N建(筆者沒用到N鍵)

你需要按照上文的提示,對編譯進行配置。

 

如果你是64位系統,你需要進行下列配置

Processor type and features --->
 [*] Support x2apic [CONFIG_X86_X2APIC]
Device Drivers --->
 [*] PCI Support ---> [CONFIG_PCI]
 [*] Message Signaled Interrupts (MSI and MSI-X) [CONFIG_PCI_MSI]
 [*] IOMMU Hardware Support ---> [CONFIG_IOMMU_SUPPORT]
 [*] Support for Interrupt Remapping [CONFIG_IRQ_REMAP]

 

如果你在虛擬機環境中,你還需要將以下選項全部選上

警告:如果在虛擬機環境下,沒有選擇上述的選項,將會導致vfs unable to mount root fs on unknown-block(0 0)的提示,將會導致LFS無法啓動

該部分內容在LFS-BOOK中是沒有的,但非常重要

Device Drivers --->
   Generic Driver Options --->
      [*] Maintain a devtmpfs filesystem to mount at /dev
   [*]Network device support --->
      [*]Ethernet Driver support --->
         [*] AMD PCnet32 PCI support
   [*]Fusion MPT device support --->
      <*> Fusion MPT ScsiHost drivers for SAS
      <*> Fusion MPT misc device (ioctl) driver  
      [*] Fusion MPT logging facility 
   SCSI device support --->
      [*] SCSI low-level drivers
File Systems --->
    [*] Ext3 Journaling file system support

以下配置假設你在虛擬機中使用SCSI配置的虛擬磁盤(詳見筆者第二章)

如果在GRUB引導啓動LFS的過程中,出現了以下提示:

vfs unable to mount root fs on unknown-block(0 0)

則說明在配置linux內核的過程中,沒有選上上述的選項,需要重新進行配置,重裝linux內核即可解決問題。

(如果你不斷地進行VMware的鏡像,那麼這不是什麼大問題,莫慌,筆者也掛了一次)

 

完成上述設置後,運行make

接着,運行make modules_install

 

完成後,我們要完成一些文件的複製,命令如下

cp -iv arch/x86/boot/bzImage /boot/vmlinuz-5.19.2-lfs-11.2
cp -iv System.map /boot/System.map-5.19.2
cp -iv .config /boot/config-5.19.2

如果有需要的話,可以安裝一些文檔,命令如下

install -d /usr/share/doc/linux-5.19.2
cp -r Documentation/* /usr/share/doc/linux-5.19.2

運行下列命令,確保內核源代碼目錄中所有文件都屬於root

chown -R 0:0 ../linux-5.19.2

和一般的包安裝相同,我們cd出去,然後清理該安裝包,即完成了linux內核的安裝。

 

GRUB安裝

警告:不正確的GRUB安裝及配置將會導致LFS系統無法啓動

無需解壓和cd,我們直接運行以下命令

grub-install /dev/<sd?>

注意<sd?>通常設置爲sda,因爲BIOS只在第一塊磁盤中讀取GRUB信息。

但是,在筆者的系統中,<sd?>設置爲了sdb,這是因爲在完成安裝後,筆者將會在虛擬機中調換兩塊硬盤的位置,LFS所在的磁盤將會變成sda

 

創建/boot/grub/grub.cfg

警告:該部分需要結合自己電腦的配置進行,不當設置將會導致LFS變磚

cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5
insmod ext2
set root=(hd0,1)
menuentry "GNU/Linux, Linux 5.19.2-lfs-11.2" {
 linux /vmlinuz-5.19.2-lfs-11.2 root=/dev/sda3 ro
}
EOF

set root=(hd0,1)的含義爲:要在第0塊硬盤的第1個分區,作爲boot所在的分區(即爲sda1)

爲何設置爲sda1?這是因爲LFS中的boot分區設置在sdb1,而且未來將會互換LFS和宿主機的磁盤,sdb1將會變爲sda1。

root=/dev/sda3 ro的含義爲:在互換LFS和宿主機硬盤後,root分區將會出現在sda3的位置。

備註:以上配置爲boot爲單獨分區的配置,如果你沒有設置boot分區,那麼/vmlinuz-5.19.2-lfs-11.2前需要加一個/boot

 

寫在末尾

至此,我們完成了第十章中三個關鍵的配置

再次警告:這三個配置務必再三確認,在進一步向前時請務必備份,否則你將前功盡棄。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章