Linux From Scratch 的一些心得
2024-07-21 02:36:51
供稿:網(wǎng)友
摘要
相信大家肯定聽說過LFS(linux From Scratch)大家有沒有自己搞過呢?我花了一個多星期的課余時間,在我的Celeron 366上搞了起來,這個是我工作完成后的一些心得,大家可以做個參考
這個階段工作的主要參考是《Linux From Scratch》這份文檔,下面是這份文檔中講的思路,也是我工作的步驟。我對每一步解釋一下。
1. 兩個非凡符號:$LFS,SUBs:
$LFS開始是用命令eXPort LFS=/mnt/lfs定義的,后來在用戶的.bash_PRofile中用LFS=/mnt/lfs來定義的,因為《LFS》中所有軟件編譯中都用到-prefix=$LFS/static/確定靜態(tài)系統(tǒng)的安裝位置。
SUBs是用來衡量時間的,編譯Bash時用的時間為1SUBs,這樣,編譯每一個軟件的時候,你就可以預料所用的時間了。
2. 劃出一個空的分區(qū),建立一個新的用戶:
劃出新的分區(qū)是用來存儲兩個系統(tǒng)的,中間平臺(一個靜態(tài)的編譯平臺)和目標系統(tǒng)(LFS)。這個空間最小是1G,建議在2G以上,這樣就不必編譯完一個軟件就刪除源碼了。
在創(chuàng)建中間平臺的時候要注重不要用root賬號來工作,萬一敲錯一個命令,你裝的原來的系統(tǒng)就不行了。但是要保證新開的賬號能訪問新畫出的空間中的所有資源。
3. 格式化分區(qū),創(chuàng)建目錄:
用ext2分區(qū)格式,格式化新的分區(qū),掛載到/mnt/lfs目錄下面。創(chuàng)建目錄/mnt/lfs/static和/mnt/lfs/static/src,這兩個目錄分別是中間平臺的根目錄和中間平臺的源代碼目錄。中間平臺的所有內(nèi)容都將放在目錄/mnt/lfs/static中。我的分區(qū)結(jié)構(gòu)如下圖:
4. 編譯靜態(tài)開發(fā)平臺:
把Bash-2.05a、Binutils-2.13、Bzip2-1.0.2Diffutils-2.8.1、Fileutils-4.1、Findutils-4.1、Gawk-3.1.1、GCC-3.2、Grep-2.5、Gzip-1.2.4a、Make-3.80、Patch-2.5.4、Sed-4.0、Sh-utils-2.0、Tar-1.13、Texinfo-4.2、Textutils-2.1、Util-linux-2.11w這些軟件的源代碼復制到/mnt/lfs/static/src/目錄中,用自己原來系統(tǒng)上的Gcc進行編譯。
為什么沒有Glibc?因為所有的軟件在編譯的時候都是靜態(tài)編譯的。
為什么要這么多軟件,不是只要Gcc嗎?因為我們configure配置腳本中用到了這些軟件。在《LFS》中每個軟件的后面會有Installation Dependencies,這里就列出了編譯,安裝這個軟件所要用到了其他工具。
configure過程中一般會用到下列選項:
--enable-static-link告訴編譯器,這個程序用靜態(tài)連接。
--prefix=$LFS/static告訴安裝腳本,這個程序的安裝位置。
LDFLAGS=-all-static設(shè)置Gcc的環(huán)境變量,讓其靜態(tài)連接。
make CC="gcc -static -s"設(shè)置Gcc的環(huán)境變量,讓其靜態(tài)連接。
--disable-nls:我不是很懂,大概是禁止編譯器以國際標準編譯(原文:This option disables internationalization (also known as i18n). We don't need this for our static programs and nls often causes problems when you're linking statically.)
編譯過程按照《LFS》上面講的一步一步走,一般沒有什么問題,當在下一步(chroot以后)出現(xiàn)自己編譯的東西不能用時,多數(shù)情況是這里靜態(tài)編譯出的問題,解決辦法是按照說明重新靜態(tài)編譯,安裝一次(哪個軟件不行,重裝哪個),也可以看源碼中的README或INSTALL說明文檔,自己選擇編譯時候的參數(shù)。
5. 用上一步得到的靜態(tài)編譯平臺制作目標系統(tǒng)(LFS)
首先是改變根目錄,用chroot命令。這樣,在當前控制臺看來,原來的/mnt/lfs/就成了現(xiàn)在的根目錄,這個時候所有運行的軟件都在/static/bin/下面(下面提到的“/”沒有非凡說明指原來系統(tǒng)上的“/mnt/static/”。所以chroot以后,至少要使環(huán)境變量PATH=/static/bin/
改變“/”下所有文件和目錄的組權(quán)限、擁有權(quán)限為0、0(指root),并在根目錄下創(chuàng)建必要的文件夾,注重有些文件夾創(chuàng)建以后要改變權(quán)限,因為做出來的LFS不是只有root來使用。同時創(chuàng)建passwd、group文件,將來的LFS系統(tǒng)的組、用戶信息就在這兩個文件里。
接下來就是創(chuàng)建必要的設(shè)備,這里有一個編好的腳本MAKEDEV,只要運行一下就行了,常用到的設(shè)備都給建好了。假如發(fā)現(xiàn)自己機器上的某些設(shè)備這里沒有考慮到,可以自己用mknod命令來建。
最后就是安裝下列軟件:
Linux-2.4.19、Man-pages-1.53、Glibc-2.2.5、GCC-3.2、Zlib-1.1.4、Findutils-4.1、Gawk-3.1.1、Ncurses-5.3、Vim-6.1、M4-1.4、Bison-1.75、Less-378、Groff-1.18.1、Textutils-2.1、Sed-4.0、Flex-2.5.4a、Binutils-2.13、Fileutils-4.1、Sh-utils-2.0、Gettext-0.11.5、Net-tools-1.60、Perl-5.8.0、Linux threads-2.2.5 man pages、Texinfo-4.2、Autoconf-2.54、Automake-1.7.1、Bash-2.05a、File-3.39、LiBTool-1.4.2、Bin86-0.16.3、Bzip2-1.0.2、Ed-0.2、Kbd-1.08、Diffutils-2.8.1、E2fsprogs-1.29、Grep-2.5、Gzip-1.2.4a、Man-1.5k、Lilo-22.2、Make-3.80、Modutils-2.4.21、Netkit-base-0.17、Patch-2.5.4、Procinfo-18、Procps-3.0.4、Psmisc-21.2、Shadow-4.0.3、Sysklogd-1.4.1、Sysvinit-2.84、Tar-1.13、Util-linux-2.11w、LFS-Bootscripts-1.10
這些軟件不是一定要裝的,有些你不要的話,完全可以不裝。
但是上面提到的是很基本的東西,最好是裝上。同時,你假如想裝其他自己想要裝的軟件完全可以現(xiàn)在裝上去,比如說KDE桌面系統(tǒng)。
這些軟件在編譯過程中都使用了動態(tài)連接,在這些軟件安裝以前安裝了Glibc-2.2.5,下面的軟件都使用了這個庫賴動態(tài)連接的。
軟件安裝完,要記住修改一些配置文件來配置這些軟件的工作。
6. 創(chuàng)建或修改啟動過程中用到的配置文件:
這里要修改的配置文件主要是:
/etc/sysconfig/clock、/etc/sysconfig/network、/etc/hosts、/etc/sysconfig/network、/etc/sysconfig/network-devices/ifconfig.eth*
7. 讓你的LFS啟動起來:
首先創(chuàng)建/etc/fstab文件,系統(tǒng)啟動時,這個文件告訴系統(tǒng)要掛載哪個文件系統(tǒng),要掛載哪個分區(qū)。
其次就是編譯一個內(nèi)核,編譯內(nèi)核沒有什么非凡的,知道你要什么功能,你的機器上有什么,就可以編譯了。
我用的系統(tǒng)引導器是Grub(可能現(xiàn)在更多的Linux用戶用的是這個引導器)要硬到你的LFS有兩種方法:
1) 把內(nèi)核放到原來系統(tǒng)中的/boot/中,不用在新的分區(qū)上裝引導器,配置一下menu.lst就可以啟動了。
2) 在新的分區(qū)上安裝Grub,把內(nèi)核放在LFS系統(tǒng)中的/boot/中,配置一下新安裝的Grub。
我用的是第一種方法。
8. 清理現(xiàn)場:
現(xiàn)在,我們的LFS已經(jīng)能啟動起來了,大功告成。/static/下面的內(nèi)容已經(jīng)沒有什么用了(要是以后還想再搞LFS可以放在那里)。刪掉/static/里面的內(nèi)容以后,大概還有640MB(包括內(nèi)核193MB)
具體列表如下:
bin 13400kb
dev 56kb
home 4kb
lost+found 16kb
opt 60kb
root 28kb
static 248644kb
usr 613000kb
->src 193284kb
->bin 40464kb
->include 16376kb
->lib 257328kb
->local 75656kb
->sbin 1588kb
->share 96424kb
->.....
boot 3284kb
sbin 8768kb