alfs學習筆記-自動化構建lfs系統

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

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

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

一.lfs系列概述

1.lfs:Linux From Scratch(LFS)是一個項目,爲您提供徹底從源代碼構建本身的自定義Linux系統的分步說明vim

2.blfs:Beyond Linux From Scratch(BLFS)是一個繼續LFS書籍完成的項目。它經過提供在基本LFS系統之上安裝和配置各類軟件包的普遍說明,幫助用戶根據須要開發系統。windows

3.alfs:Automated Linux From Scratch (ALFS)是一個爲可擴展系統構建器和程序包安裝程序建立通用框架的項目。(自動化建立LFS系統的過程)安全

4.clfs:Cross Linux From Scratch(CLFS)是一個使用其餘架構從源代碼構建本身的定製Linux系統的分步說明bash

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.掛載並進入系統

具體方法,參照我之前的筆記:http://www.javashuo.com/article/p-ukrkemiy-eg.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時間綜述筆記地址:http://www.javashuo.com/article/p-toedddtb-en.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操做系統。

相關文章
相關標籤/搜索