一名linux愛好者,記錄構建Linux From Scratch的過程
經博客園-駿馬金龍前輩介紹,開始接觸學習lfs,用博客記錄學習筆記,如有寫的不恰當的地方,望多多指正。
筆記中只是記錄一些問題和書中表述不清晰的內容的處理辦法以及我的解決思路,僅做參考。
要實際構建lfs請結合lfs官方的書籍操作
一.lfs系列概述
1.lfs:Linux From Scratch(LFS)是一個項目,為您提供完全從源代碼構建自己的自定義Linux系統的分步說明
2.blfs:Beyond Linux From Scratch(BLFS)是一個繼續LFS書籍完成的項目。它通過提供在基本LFS系統之上安裝和配置各種軟件包的廣泛說明,幫助用戶根據需要開發系統。
3.alfs:Automated Linux From Scratch (ALFS)是一個為可擴展系統構建器和程序包安裝程序創建通用框架的項目。(自動化創建LFS系統的過程)
4.clfs:Cross Linux From Scratch(CLFS)是一個使用其他架構從源代碼構建自己的定制Linux系統的分步說明
5.hlfs:Hardened Linux From Scratch (HLFS)是一個為您提供從源完全構建您自己的定制和強化Linux系統的分步說明。基於LFS,該項目還將包含BLFS的部分內容。與這些其他項目的主要區別在於處理安全配置問題的文本數量,以及修補或替換許多用於提高安全性的軟件包。
6.livecd:LFS LiveCD專門用於提供可靠的主機系統,以便構建Linux From Scratch。因此,它可能不是您想象的“完美”Linux系統。但是,它應該為您提供足夠舒適的環境,以便您可以反過來建立自己的“完美”系統
二.lfs版本說明
1.lfs系列每本書籍都有兩個版本
一個版本是安裝並使用systemv的版本
另一個版本是安裝並使用systemd的版本
本篇筆記使用的是systemd版本書籍。
三.構建過程中使用到的網站
1.lfs書籍原版(英文)下載鏈接:http://www.linuxfromscratch.org/lfs/downloads/stable-systemd/LFS-BOOK-8.4-systemd.tar.bz2
2.文件鏡像網站匯總:http://www.linuxfromscratch.org/mirrors.html
四.使用的機器信息,系統信息,書籍信息
1.使用的機器型號:Thinkpad-L450
2.使用過的主機操作系統:deepin-15.9
3.使用lfs書籍版本lfs-book-8.4-systemd(官網英文版)
五.前期准備工作
書中第2.2章節
1.具體操作:
將書中提供的命令復制到終端(命令行)運行測試,並把得出結果與2.2章節所提供的軟件版本鏈接類型進行核對,核對無誤后可刪除創建的驗證文件。
2.所遇到過的問題與解決方案:
1.有部分軟件包未找到,按照錯誤提示的名字安裝對應的軟件包
2.未檢測到/usr/bin/yacc是bison或執行bison的小腳本的鏈接
解決辦法:
#ln -s /usr/bin/bison /usr/bin/yacc (建立鏈接)
類似問題解決思路:檢查缺失鏈接的軟件包是否安裝,如果都已經安裝,則手動建立軟鏈接:
3./bin/sh的鏈接不是bash而是dash
執行如下命令並選擇否
#dpkg-reconfigure dash
書中第2.3章節
注意:
如果不能做到在不關機的情況下一次性構建完lfs,請仔細閱讀本節內容
1.具體操作:
第1-4章節
每次重新啟動后創建環境變量:
第5章節
1.設置變量
2.掛載為lfs創建的所有分區
3.切換到lfs用戶,進行下一步的操作。4.提示對軟件包編譯過程中出現解決不了的操作失誤,首先刪除所解壓的軟件包目錄,重新解壓軟件包,切入目錄,按該軟件包書籍頁操作說明重新進行編譯。
第6-8章節
1.進入root用戶
2.設置變量
3.掛載你為lfs創建的所有分區
4.逐步完成6.2.2與6.2.3章節內容后
5.chroot進入lfs分區繼續操作。
書中第2.4章節
1.本章節開始所有操作切換為root用戶,命令如下
su
2.為lfs創建新的分區,列出我的分區方案
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465.8G 0 disk ├─sda9 8:9 0 100M 0 part /mnt/lfs/boot ├─sda10 8:10 0 50G 0 part /mnt/lfs ├─sda11 8:11 0 40G 0 part /mnt/lfs/home └─sda12 8:12 0 1G 0 part [SWAP]
3.注意事項:
1.分區使用的命令 cfdisk或fdisk
2.boot建議單獨分區。建議分100M。
3./分區必須創建,根據機器情況自行分配大小(官方建議最小分20G)。
4.home建議單獨分區,大小按需分配即可。
5.swap可以與主機系統用同一個swap分區,也可以單獨分區。
書中第2.5章節
1.創建文件系統(只介紹常用的ext4格式類型)
2.除了swap分區以外的分區,使用如下命令格式化:
#mkfs -v -t ext4 /dev/<xxx>(替換<xxx>和<yyy>為分區的名稱)
3.swap分區如果是新分區則使用如下命令格式化:
#mkswap /dev/<yyy>(替換<xxx>和<yyy>為分區的名稱)
書中第2.6章節
1.設置lfs變量,運行的命令及作用:
export LFS=/mnt/lfs(使用$LFS代替輸入/mnt/lfs目錄,每次關閉機器或終端都需要重新設置)
echo $LFS(輸出$LFS變量的內容,確保輸出為:/mnt/lfs)
2.本章節書籍中的下文內容介紹如何設置開機運行變量,不建議此項設置。
3.變量設置在每次重啟機器或者重啟終端時都需要重新設置,詳細參考2.3章節的筆記
書中第2.7章節
掛載分區
使用的命令及作用:
#mkdir -pv $LFS(在當前系統的根目錄下創建一個/mnt/lfs的目錄) #mount -v -t ext4 /dev/<yyy> $LFS(替換<yyy>為根分區位置,將根分區掛載到/mnt/lfs目錄) #mkdir -v $LFS/boot(在/mnt/lfs分區下創建boot目錄) #mount -v -t ext4 /dev/<yyy> $LFS/boot(<yyy>替換為boot分區位置,將boot分區掛載到/mnt/lfs/boot目錄) #mkdir -v $LFS/home(在/mnt/lfs目錄下創建home目錄) #mount -v -t ext4 /dev/<yyy> $LFS/home(<yyy>替換為home分區位置,將boot分區掛載到/mnt/lfs/home目錄) #/sbin/swapon -v /dev/<zzz>(替換<zzz>為分配的swap分區位置,啟用swap分區) lsblk(查看分區表是否正確)
書中本章節中的警告內容為如何設置開機自動掛載lfs的分區(不建議)
六.下載所需資源
1.在任意目錄下創建alfs目錄
mkdir alfs
2.下載所需的所有軟件包
wget https://mirror-hk.koddos.net/lfs/lfs-packages/lfs-packages-8.4.tar tar -xvf lfs-packages-8.4.tar
3.下載所需書籍(需要主機安裝subversion)
svn co http://svn.linuxfromscratch.org/LFS/tags/8.4/
4.下載alfs所需軟件包
svn co http://svn.linuxfromscratch.org/ALFS/jhalfs/trunk jhalfs-dev
七.配置jhalfs-dev
1.進入jhalfs目錄,並打開設置頁面
cd jhalfs-dev make
這里會提示缺少一些依賴,因為每台主機所缺少的依賴不同,所以不貼出依賴了,請自行按照依賴名字安裝所需依賴
2.設置第一步,選擇所使用的書籍
BOOK Settings ---> Use BOOK (Linux From Scratch systemd) ---> Use BOOK (Linux From Scratch systemd) ---> Release (Working Copy) ---> Loc of working copy (mandatory) (/8.4)(這里更改為你放置上文下載的書籍的絕對路徑) [ ] Add blfs-tool support (NEW) [ ] Add custom tools support (NEW)
3.設置第二步,選擇所使用的軟件包,和安裝位置
General Settings ---> Build Directory (/mnt/lfs) (修改為上文修改的安裝目錄建議使用官方的lfs目錄) [*] Retrieve source files Package Archive Directory (/ruanjianbaomulu)(修改為上文下載的軟件包的解壓目錄的絕對路徑) [ ] Retry on 'connection refused' failure (NEW) Number of retry attempts on download failures (20) (NEW) Download timeout (in seconds) (30) (NEW) FTP mirror (http://ftp.osuosl.org) (NEW) [ ] Run the makefile (NEW) [*] Rebuild files
4.設置第三步,構建設置
Build Settings ---> [*] Run testsuites (NEW) Test settings ---> [ ] Package management (NEW) [*] Create a log of installed files for each package [*] Strip Installed Binaries/Libraries [*] Remove libtool .la files (NEW) [ ] DO NOT use/display progress_bar (NEW)
5.設置第四步,系統服務設置
System configuration ---> [ ] Use a custom fstab file (NEW) [ ] Build the kernel (NEW) [ ] Install vim-lang package (NEW) TimeZone (Asia/Shanghai) Language (en_US.UTF-8) [*] Install the full set of locales(如果會修改腳本,請取消這個選項,自行修改腳本安裝語言環境)
Groff page size (A4) ---> Hostname (see help) (ZHUJIMINGZI) Network configuration ---> Console configuration --->
6.確定操作,創建構建文件,修改構建腳本
選擇exit后選擇yes后輸入yes,開始創建構建文件
創建完后進入構建文件目錄按照自己的配置要求修改腳本(這一步如果懂腳本的自行修改,不懂的不要修改)
7.創建構建用戶,並給sudo權限
useradd -m jhalfs_user passwd jhalfs_user visudo 再打開的文件內加入
jhalfs_user ALL=(ALL)ALL
su - jhalfs_user
8.開始安裝
make -C /mnt/build_dir/jhalfs(這個目錄修改為上文選擇的安裝目錄)
安裝過程需要輸入三次密碼,分別是:開始構建時,構建完工具鏈后,構建完所有軟件包后,
八.自動化構建完后需要的配置
1.掛載並進入系統
具體方法,參照我以前的筆記:https://www.cnblogs.com/renren-study-notes/p/10204516.html
2.設置root的密碼
passwd
3.刪除本機創建的用戶
userdel -r jhalfs_user
4.修改/etc/fstab文件
更改為lfs所創建的分區到相應位置即可(這個文件是配置lfs開機自動掛載的分區) 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 # End /etc/fstab EOF
5.引導時禁用屏幕清除
mkdir -pv /etc/systemd/system/getty@tty1.service.d cat > /etc/systemd/system/getty@tty1.service.d/noclear.conf << EOF [Service] TTYVTDisallocate=no EOF
6.禁用/ tmp的tmpfs
ln -sfv /dev/null /etc/systemd/system/tmp.mount
7.如果電腦上面是多系統,並且有windows系統,就不要使用系統硬件時間作為系統時間(會有時差)。如果沒有windows系統不需要更改。具體內容參見:我的linux時間綜述筆記地址:https://www.cnblogs.com/renren-study-notes/p/10229743.html
硬件時間設置為本地時間
cat > /etc/adjtime << "EOF" 0.0 0 0.0 0 LOCAL EOF
8.編譯安裝內核
(1)首先進入sources目錄
cd /sources
(2)解壓內核文件壓縮包
tar -xvf linux-4.18.5.tar.xz
(3)進入內核包目錄
cd linux-4.18.5
(4)准備編譯
make mrproper
(5)設置默認內核配置狀態
make defconfig
(6)設置內核也可以通過修改.config文件來進行設置
make menuconfig
(7)設置書中提供的以下選項
General setup --> [ ] Enable deprecated sysfs features to support old userspace tools [CONFIG_SYSFS_DEPRECATED] [ ] Enable deprecated sysfs features by default [CONFIG_SYSFS_DEPRECATED_V2] [*] open by fhandle syscalls [CONFIG_FHANDLE] [ ] Auditing support [CONFIG_AUDIT] [*] Control Group support [CONFIG_CGROUPS] Processor type and features ---> [*] Enable seccomp to safely compute untrusted bytecode [CONFIG_SECCOMP] Networking support ---> Networking options ---> <*> The IPv6 protocol [CONFIG_IPV6] Device Drivers ---> Generic Driver Options ---> [ ] Support for uevent helper [CONFIG_UEVENT_HELPER] [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS] [ ] Fallback user-helper invocation for firmware loading [CONFIG_FW_LOADER_USER_HELPER] Firmware Drivers ---> [*] Export DMI identification via sysfs to userspace [CONFIG_DMIID] File systems ---> [*] Inotify support for userspace [CONFIG_INOTIFY_USER] <*> Kernel automounter version 4 support (also supports v3) [CONFIG_AUTOFS4_FS] Pseudo filesystems ---> [*] Tmpfs POSIX Access Control Lists [CONFIG_TMPFS_POSIX_ACL] [*] Tmpfs extended attributes [CONFIG_TMPFS_XATTR] Kernel hacking ---> Choose kernel unwinder (Frame pointer unwinder) ---> [CONFIG_UNWINDER_FRAME_POINTER]
(8)如果您的主機硬件使用UEFI,請自行添加此項設置
Processor type and features ---> [*] EFI stub support [CONFIG_EFI_STUB]
(9)設置調整完保存退出即可
(10)編譯內核映像和模塊
make -j8
(11)安裝配置模塊
make modules_install
(12)復制一些內核的啟動文件到boot分區
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-4.18.5-lfs-8.3-systemd
cp -iv System.map /boot/System.map-4.18.5
cp -iv .config /boot/config-4.18.5
(13)安裝Linux內核的文檔:
install -d /usr/share/doc/linux-4.18.5 cp -r Documentation/* /usr/share/doc/linux-4.18.5
(14)配置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
(15)返回sources目錄並刪除包目錄
cd $LFS/sources rm -rf linux-4.18.5
9.安裝配置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 ext2 set root=(hd0,2) 括號里面更改為你所安裝lfs的分區或boot分區 例如/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) } (如果boot單獨分區,則把這里的/boot刪除。)
EOF
多系統引導文件示例:
cat > /boot/grub/grub.cfg << "EOF" # Begin /boot/grub/grub.cfg set default=0 set timeout=5 menuentry "GNU/Linux, Linux 4.18.5-lfs-8.3" { insmod ext2 set root=(hd0,5) linux /vmlinuz-4.18.5-lfs-8.3 root=/dev/sda6 ro } menuentry 'Manjaro Linux'{ insmod ext2 set root='hd0,msdos9' linux /vmlinuz-4.19-x86_64 root=/dev/sda10 ro initrd /intel-ucode.img /initramfs-4.19-x86_64.img } menuentry 'Windows 7 (on /dev/sda1)'{ insmod ntfs set root='hd0,msdos1' chainloader +1 } EOF
10.設置系統版本及版本號
cat > /etc/os-release << "EOF"
NAME="Linux From Scratch" VERSION="8.3-systemd" ID=lfs PRETTY_NAME="Linux From Scratch 8.3-systemd" VERSION_CODENAME="<your name here>"(括號里改為自己起的名字) EOF echo 8.3-systemd > /etc/lfs-release cat > /etc/lsb-release << "EOF" DISTRIB_ID="Linux From Scratch" DISTRIB_RELEASE="8.3-systemd" DISTRIB_CODENAME="<your name here>"(括號里改為自己起的名字) DISTRIB_DESCRIPTION="Linux From Scratch" EOF
11.修改網絡配置
1.刪除靜態ip文件和/etc/resolv.conf文件
rm -rf /etc/resolv.conf rm -rf /etc/systemd/network/10-eth-static.network
2.新建resolv.conf文件和hosts文件
cat > /etc/resolv.conf << "EOF" # Begin /etc/resolv.conf domain <Your Domain Name> nameserver 8.8.8.8 nameserver 8.8.4.4 # End /etc/resolv.conf EOF
cat > /etc/hosts << "EOF" # Begin /etc/hosts 127.0.0.1 localhost 127.0.1.1 <FQDN> <HOSTNAME> ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters # End /etc/hosts EOF
12.運行下面的命令,退出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
重啟進入lfs系統
reboot
附錄
如果需要本機的grub引導lfs則在root用戶下運行以下命令創建lfs的引導項
需要安裝os-prober軟件包,並掛載lfs的分區,在運行下面命令,添加lfs的啟動項
grub-mkconfig -o /boot/grub/grub.cfg
確定添加完lfs引導項后,重啟機器進入lfs選項,即可進入lfs操作系統。