天天看點

compile Linux from scratch

預熱

LFS是什麼?

全稱Linux From Scratch, 本身并不是一個linux發行版,LFS相當于是一個廚師長,告訴你用什麼材料按照什麼樣的步驟,可以編譯出一個完整的linux系統。與之相關的還有ALFS( Automated Linux From Scratch)、BLFS(Beyond Linux From Scratch)、CLFS(Cross Linux from Scratch)、HLFS(Hardened Linux From Scratch),但本文并不涉及。

跟同樣是source based的gentoo、arch有何不同?

source based的優點是可以根據機器的架構和使用需求最優的控制和編譯整個系統和軟體,劣勢顯然就是需要大量的時間和能力。

1. LFS隻以文檔的形式存在,而gentoo和arch是真正的發行版。

2. LFS由于不是發行版,所有不提供線上軟體倉庫,所有軟體的安裝和更新都必須手動擷取源碼,自行解決依賴。gentoo有自己的配置工具、軟體包管理和源碼倉庫,軟體從源碼的更新和安裝,自動解決依賴,可定制性很強。arch提供二進制倉庫,同樣也支援源碼編譯,包管理器(pacman)效率極高,原因之一是其需要處理的依賴關系遠沒有Gentoo複雜。

3. 系統安裝難度 arch < gentoo <= LFS。

4. Arch Linux和Gentoo Linux都是滾動更新的發行版,是以在上遊軟體釋出很短時間後,其上就會有軟體包可用,LFS請參考2。

開始安裝前

筆者安裝LFS是在2016年8月9号(之後查到很多的LFS的文檔都是在8月9号當天又釋出或者更新的),選擇的是最新版本7.9-systemd,

compile Linux from scratch

,當時并沒有看到有正式版,是以下載下傳的是rc1版本。

話外音,RC是什麼?
- RC:(Release Candidate)用在軟體上就是候選版本。系統平台上就是發行候選版本。RC版不會再加入新的功能了,主要着重于除錯。
- GA:(general availability),正式釋出的版本。
- Alpha: 内測版。
- Beta:公測版。
- Gamma: 相當于RC。
- Build:主要用于區分不同時期的版本,說明這個版本是第幾次編譯的結果。
           

筆者強烈建議:

在等待下載下傳過程中,建議花一個小時把對應版本的官方文檔大體的看一遍,這一步很重要,要知道LFS大體的編譯工作流程,文檔的結構思路,防止之後編譯複制粘貼一臉懵逼。之後再花一個小時在各大網站部落格上浏覽前人的制作經曆,多在幾個巨人的肩膀上看看。筆者能夠一次性愉快的編譯好LFS,這兩步很重要,在just conding 之前,一定要 learn from others, make your mind clear.
話外音:關于主控端發行版的選擇
1. 筆者用 ubuntu14.04 LTS 編譯lfs-7.9-systemd-rc1,很成功的編譯。
2. 很多網友用centos6.5,arch成功的。
3. 同期一起編譯的小夥伴先後采用centos6.8和centos7都沒有很順利的編譯成功(不排除其他可能原因)。
4. 筆者的意見:選擇常見的、有社群支援的、你自己熟悉的就可以,理由後面說,如果沒有熟悉的或者對自己沒信心,可以跟着我選,哈哈~。~·
           

如果你已經看完了,那就可以開始正式跟着文檔一步一做了:

0. 介紹LFS。

1. 編譯前準備,磁盤與使用者。

2. temp系統的建構。

3. 開始編譯LFS。

4. linux核心定制和grub啟動

5. enjoy。

PS:第四步很坑啊,感覺LFS就負責把你帶到這裡,然後它認為你可以按照你的需求開始定制核心子產品,也沒有留一個連結告訴每個核心子產品的參數的意義,-_-||,筆者編譯好核心總是缺這個子產品缺哪個子產品,先後編譯10+次linux核心,中間也沒有找到官文關于這塊的描述,最後還是靠強大的中國網友的文檔,謝過~可以猛戳這裡

(0) 重要的話說三遍:第一章introduction千萬不要跳過^3,這一章講了LFS包含的軟體包和對應作用,以及編譯所需要使用到的軟體和版本,這也是我為什麼說不要過于糾結發行版的原因。make sure你系統上軟體的版本與LFS文檔的要求的盡量一緻,version-check,比如LFS推薦gcc4.7,但你的是5.3,要麼換一個版本,要麼檢視官文是否向下相容。很多人直接跳過這一步或者嫌麻煩根本沒去了,運氣好的話還行,不好就GG了。反正筆者認真做了,那你呢?

(1) 磁盤分區建議10G+,小白不要把boot單獨分區(因為文檔預設就是沒分boot分區,你自己分的或有些地方需要改下參數)。

(2) 第二步建構temp系統,這一步是最關鍵的,交叉工具鍊編譯好才能編譯出與宿主系統無關的LFS系統(這些工具鍊包含了:compiler(就是我們常用的gcc,g++),assembler(就是把彙程式設計式變成a.obj檔案的工具),linker(就是把很多*.obj檔案和庫檔案連結成可運作檔案a.out的工具),還有各類庫檔案(為後面編譯其它的軟體提供基礎設施),Gcc,Binutils等将會編譯至少三次,要注意每次編譯的目錄,相對目錄。如果你在中間不小心斷電關機或者重新開機(最好不要),下次進入請確定環境(交叉工具鍊的編譯全都要用lfs這個使用者):

# login as root
export LFS=/mnt/lfs
mount -v -t ext4 /dev/sdb1 $LFS ## mount your device 
su - lfs
           

(3) 到這裡正式開始建構LFS系統,該打的patch在這一步一定要打上。這一步全程都要用root使用者進行,所有的patch更新檔包一定都要打上,不幸退出請確定環境:

# login as root
LFS=/mnt/lfs
mount /dev/sdb1 /$LFS
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts -o gid=,mode=
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login
rm -rf /tmp/*
hljs-number">8
           

(4) 關于核心的config配置,并沒有什麼好的方法,主要還是考慮你機器本身的硬體情況,關于配置資訊,筆者編譯了10多次,祝好~。~可以猛戳這裡。

繼續閱讀