1. 程式人生 > >lfs學習筆記(三)最終構建與配置

lfs學習筆記(三)最終構建與配置

lfs學習筆記(三)連結:https://www.cnblogs.com/renren-study-notes/p/10199381.html

一名linux愛好者,記錄構建Linux From Scratch的過程

經部落格園-駿馬金龍前輩介紹,開始接觸學習lfs,用部落格記錄學習筆記,如有寫的不恰當的地方,望多多指正。
筆記中只是記錄一些問題和書中表述不清晰的內容的處理辦法以及我的解決思路,僅做參考。

要實際構建lfs請結合lfs官方的書籍操作

Linux From Scratch(LFS)是一個專案書籍,提供完全從原始碼構建自己的自定義Linux系統的分步說明。

構建過程中使用到的網站:
lfs書籍原版(英文)下載連結:http://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-8.3.tar.bz2
lfs(linux中國翻譯版)下載連結:https://codeload.github.com/LCTT/LFS-BOOK/zip/8.3-translating
檔案映象網站彙總:http://www.linuxfromscratch.org/mirrors.html

使用的機器型號:Thinkpad-L450
使用主機作業系統:manjaro-xfce-18.0.1
使用lfs書籍版本lfs-book-8.3(官網英文版)

第6.7章

開始構建第一個包

第六章中構建的所有包必須進行測試。

軟體構建過程:
以下以Linux API Headers包為例,其後的軟體包構建過程大同小異,出現不同的選項會在後面補充,不完全貼出書中內容。
這時你的命令列或終端的環境應該是:

1.設定變數:
2.掛載你為lfs建立的所有分割槽
3.逐步完成6.2.2與6.2.3章節內容後

4.chroot進入lfs分割槽繼續操作。

根據上一章節的構建要求,首先進入到/mnt/lfs/sources/sources目錄

cd /sources


因為Linux API Headers在linux-4.18.5.tar.xz包中,所以解壓包:

tar -xvf linux-4.18.5.tar.xz


進入解壓完的軟體:

cd  linux-4.18.5

 執行書中的編譯說明

make mrproper

make INSTALL_HDR_PATH=dest headers_install
find dest/include \( -name .install -o -name ..install.cmd \) -delete
cp -rv dest/include/*
/usr/include

1.在軟體包編譯,測試,安裝過程中出現的如下命令:

make 
make check
make tests
make test make install

在沒有要求必須使用make -j1引數的情況下,make後面都可加 -j(N) 引數 提升速度

(-j [N], --jobs[=N]          同時允許 N 個任務;無引數表明允許無限個任務)
軟體包編譯安裝完成後,書中會有一些相應的配置說明,完成這些操作說明。
執行完每書中每個軟體包頁最後一個命令後執行:

cd /mnt/lfs/sources(返回sources目錄)
rm -rf binutils-2.31.1(刪除解壓的軟體包目錄)

繼續構建下一個軟體包

第6.9章

glibc的配置

按照書籍安裝步驟到(可以使用localedef程式安裝單個語言環境)步驟

我們需要安裝英文語言環境和中文語言環境

1.建立語言環境安裝目錄

mkdir -pv /usr/lib/locale

2.安裝語言環境

localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8

第6.9.22章

新增時區資料,這裡我們新增亞洲/上海時區

1.安裝和設定時區資料

tar -xf ../../tzdata2018e.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward pacificnew systemv; do
    zic -L /dev/null   -d $ZONEINFO       -y "sh yearistype.sh" ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz}
    zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz}
done

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

2.確定時區

tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
 1) Africa
 2) Americas
 3) Antarctica
 4) Asia
 5) Atlantic Ocean
 6) Australia
 7) Europe
 8) Indian Ocean
 9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.

3.這裡我們選擇4亞洲

Please select a country whose clocks agree with yours.
 1) Afghanistan          18) Israel            35) Palestine
 2) Armenia          19) Japan            36) Philippines
 3) Azerbaijan          20) Jordan            37) Qatar
 4) Bahrain          21) Kazakhstan        38) Russia
 5) Bangladesh          22) Korea (North)        39) Saudi Arabia
 6) Bhutan          23) Korea (South)        40) Singapore
 7) Brunei          24) Kuwait            41) Sri Lanka
 8) Cambodia          25) Kyrgyzstan        42) Syria
 9) China          26) Laos            43) Taiwan
10) Cyprus          27) Lebanon            44) Tajikistan
11) East Timor          28) Macau            45) Thailand
12) Georgia          29) Malaysia            46) Turkmenistan
13) Hong Kong          30) Mongolia            47) United Arab Emirates
14) India          31) Myanmar (Burma)        48) Uzbekistan
15) Indonesia          32) Nepal            49) Vietnam
16) Iran          33) Oman            50) Yemen
17) Iraq          34) Pakistan

4.這裡我們選擇9中國

Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time

5.這裡我們選擇1北京時間

The following information has been given:

    China
    Beijing Time

Therefore TZ='Asia/Shanghai' will be used.
Selected time is now:    Sun Dec 30 18:00:59 CST 2018.
Universal Time is now:    Sun Dec 30 10:00:59 UTC 2018.
Is the above information OK?
1) Yes
2) No
#? yes
Please enter a number in range.

6.是否選擇以上資訊?這裡選擇1

You can make this change permanent for yourself by appending the line
    TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai

這句的意思是你可以將該配置檔案新增到/usr/bin/tzselect使其生效(暫時不予理會,系統配置完後在配置時區)

7.執行以下命令建立檔案/etc/localtime

cp -v /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

 第6.31章  如果需要,在下一節中安裝flex後,可以重建bison,並且可以通過make check來執行bison檢查。(不推薦重建)

第6.48章 Libelf是elfutils-0.173包的一部分,所以需要解壓elfutils-0.173軟體包,進行編譯

第6.61章 按書籍說明,第一條修改設定命令如下

PAGE=A4 ./configure --prefix=/usr

第6.62章 我使用manjaro安裝的grub引導lfs所以在此處不安裝grub,如果需要安裝grub到lfs筆記後面,對應章節有配置說明。

 第6.72章 

LD_LIBRARY_PATH=/tools/lib udevadm hwdb --update

每次更新硬體資訊時都需要執行此命令。

第6.79章 從二進位制檔案和庫中刪除除錯符號 按照書籍中的命令操作即可(可選)建議執行此項操作。

第6.80章 

清理執行測試剩下的一些額外檔案

rm -rf /tmp/*

退出

exit

掛載6.2.2和6.2.3章節內容

mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
if [ -h $LFS/dev/shm ]; then
  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi

chroot進入lfs系統目錄

chroot "$LFS" /usr/bin/env -i          \
    HOME=/root TERM="$TERM"            \
    PS1='(lfs chroot) \u:\w\$ '        \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin \
    /bin/bash --login

繼續執行書中所給的其他命令

第7.2章節 思路

進入sources目錄,解壓lfs-bootscripts

進入lfs-bootscripts目錄,並執行安裝。

第7.4章 第7.5章 第7.6章 第7.7章  思路 暫時執行書中所給的命令 安裝完lfs後在做相應的更改

第7.8章 第7.9章執行書中所給命令即可

第8.2章

更改為lfs所建立的分割槽到相應位置即可(這個檔案是配置lfs開機自動掛載的分割槽)

cat > /etc/fstab << "EOF"
# Begin /etc/fstab

# file system  mount-point  type     options             dump  fsck
#                                                              order
/dev/sda9     /boot             ext4    defaults            1     1
/dev/sda10    /                   ext4    defaults            1     1
/dev/sda11    /home           ext4    defaults            1     1
/dev/sda12    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

第8.3章(相當重要

配置編譯安裝linux核心

首先進入sources目錄

cd   /sources

解壓核心檔案壓縮包

tar  -xvf linux-4.18.5.tar.xz

進入核心包目錄

cd linux-4.18.5

準備編譯

make mrproper

設定預設核心配置狀態

make defconfig

設定核心

make menuconfig

找到以下選項

Device Drivers  --->
  Generic Driver Options  --->
   [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
   [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]

Kernel hacking  --->
       Choose kernel unwinder (Frame pointer unwinder)  ---> [CONFIG_UNWINDER_FRAME_POINTER]

上下鍵翻頁找到Device Drivers --->回車進入

上下鍵翻頁找到Generic Driver Options --->回車進入

按字母n鍵去掉Support for uevent helper對話方塊的×符號

按y鍵在Maintain a devtmpfs filesystem to mount at /dev對話方塊打上×符號

左右鍵找到exit,exit兩次

上下鍵翻頁找到Kernel hacking --->回車進入

上下鍵翻頁找到Choose kernel unwinder--->回車進入

向下選擇UNWINDER_FRAME_POINTER回車確定

左右鍵選擇save,兩次回車確定儲存 選擇兩次exit退出到終端。

 

如果您的主機硬體使用UEFI,請自行新增此項設定

Processor type and features  --->
   [*]   EFI stub support  [CONFIG_EFI_STUB]

 

編譯核心映像和模組

make -j(n) n為可設定同時執行的任務數量,不設定引數預設為無限(不要輕易嘗試)

本章節警告中的內容大意

如果為boot單獨分了區,請掛載boot分割槽在進行下步操作

複製一些核心的啟動檔案到boot分割槽

cp -iv arch/x86/boot/bzImage /boot/vmlinuz-4.18.5-lfs-8.3

cp -iv System.map /boot/System.map-4.18.5

cp -iv .config /boot/config-4.18.5

安裝Linux核心的文件:

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

配置linux模組載入順序

install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf

install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true

# End /etc/modprobe.d/usb.conf
EOF

第8.4章節

安裝配置grub引導

我選擇的是用manjaro安裝的grub引導進入lfs系統所以未安裝grub軟體包

這裡介紹給lfs安裝配置grub引導的過程

在第6.62章節已經安裝了grub軟體

這裡只介紹配置

1.安裝grub引導到MBR

grub-install /dev/sda

2.建立grub配置檔案

cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext4(這裡面更改為安裝lfs的分割槽的格式例如ext4)
set root=(hd0,2)  括號裡面更改為你所安裝lfs的分割槽號 例如/dev/sda2為(hd0,2)

menuentry "GNU/Linux, Linux 4.18.5-lfs-8.3" {
        linux   /boot/vmlinuz-4.18.5-lfs-8.3 root=/dev/sda2 ro(這裡的/dev/sda2更改為你所安裝lfs的分割槽號 例如/dev/sda2)
}
EOF

第9.1章節

設定系統版本及版本號執行本章節命令即可

echo 8.3 > /etc/lfs-release

cat > /etc/lsb-release << "EOF"
DISTRIB_ID="Linux From Scratch"
DISTRIB_RELEASE="8.3"
DISTRIB_CODENAME="<your name here>"(括號裡改為自己起的名字)
DISTRIB_DESCRIPTION="Linux From Scratch"
EOF

第9.3章

本章節中的提及的軟體包,將在配置blfs時,在進行安裝配置

執行下面的命令,退出chroot,解除安裝lfs的分割槽

exit

umount -v $LFS/dev/pts
umount -v $LFS/dev
umount -v $LFS/run
umount -v $LFS/proc
umount -v $LFS/sys

umount -v $LFS

umount -v $LFS/usr
umount -v $LFS/home
umount -v $LFS

如果需要本機的grub引導lfs則在root使用者下執行以下命令建立lfs的引導項

非manjaro系統需要安裝os-prober軟體包,並掛載lfs的分割槽,在執行下面命令,新增lfs的啟動項

grub-mkconfig -o /boot/grub/grub.cfg

確定新增完lfs引導項後,重啟機器進入lfs選項,即可進入lfs作業系統。