首先說明的是:我是基於Linux From Scratch - Version 7.7-systemd來做的,宿主系統為CentOS 7(虛擬機器裡面)。在LFS過程中用的協助檔案是:https://linux.cn/lfs/LFS-BOOK-7.7-systemd/index.html (看這份文檔時,一定要注意區分"l"和"1",我有好幾次因為沒看清楚導致編譯出錯;另外就是文檔中"--"寫的看起來像"—",大家要留個神),同時也和官方英文的手冊對照的看,因為單看英文太耗費時間了,剛好也有人將7.7版本的翻譯了出來。不過直接照著上面的步驟做的話會遇到些問題,先把問題記錄下來。
先說明一些協助命令,後面可能需要:
<1> make命令
make all: Make all the top-level targets the makefile knows about
make clean: Delete all files that are normally created by running make
make distclean: Delete more files than 'make clean' does. For example, this would delete configuration files or links that you would normally create as preparation for compilation, even if the makefile itself cannot create these files.
make install: Copy the executable file into a directory that users typically search for commands; copy any auxiliary files that the executable uses into the directories where it will look for them.
make check:
make test: Perform self tests on the program this makefile builds.
<2> http://www.linuxfromscratch.org/hints/downloads/files/errors.txt 這個網頁的內容能夠幫你定位一些常見的問題,對於協助你排查錯誤還是很有協助的,在LFS過程中,我也從中受益過。
---------------------------------------------------------------------------------分割線----------------------------------------------------------------------------------------------
下面起,是我碰到的一些問題
(1)在3.1節的時候有如下命令:
wget --input-file=wget-list --continue --directory-prefix=$LFS/sources
該命令用來將 wget-list 中連結指向的檔案下載至$LFS/sources目錄下(也就是將下載地址打包成一個 wget-list 檔案),然而,一開始我們並沒有wget-list這個檔案,因此需要在上述命令之前先準備好wget-list檔案。命令如下:
wget http://www.linuxfromscratch.org/lfs/downloads/stable-systemd/wget-list
這樣,就會將 wget-list 檔案下載至目前的目錄。
(2)在5.4節編譯第一個軟體包Binutils-2.25時,執行./configure沒有問題,但是執行make後出現了問題,錯誤輸出資訊如下:
... ...
config.status: creating po/Makefiles.in
config.status: executing depfiles commands
config.status: executing libtool commands
config.status: executing default-1 commands
config.status: executing bfd_stdint.h commands
config.status: executing default commands
make[3]: Leaving directory `/mnt/lfs/sources/binutils-build/bfd/po'
make[3]: Entering directory `/mnt/lfs/sources/binutils-build/bfd/po'
make[3]: Nothing to be done for `info'.
make[3]: Leaving directory `/mnt/lfs/sources/binutils-build/bfd/po'
make[3]: Entering directory `/mnt/lfs/sources/binutils-build/bfd'
make[3]: Nothing to be done for `info-am'
make[3]: Leaving directory `/mnt/lfs/sources/binutils-build/bfd'
make[2]: *** [info-recursive] Error 1
make[2]: Leaving directory `/mnt/lfs/sources/binutils-build/bfd'
make[1]: *** [all-bfd] Error 2
make[1]: Leaving directory `/mnt/lfs/sources/binutils-build'
make: *** [all] Error 2
百度一下發現http://my.oschina.net/sukai/blog/222350 也碰到了相同的問題,然而其解決辦法是:
sed -i -e 's/@colophon/@@colophon/' -e 's/doc@cygnus.com/doc@@cygnus.com/' ../binutils-2.25/bfd/doc/bfd.texinfo
開啟bfd.texinfo檔案發現,裡面的@@colophon及doc@@cygnus.com都是正確的,不需要更改,因此本人懷疑這種方法的可行性。這裡我採用的解決方案是:安裝texinfo(用來讀寫和轉換info文檔)
yum -y install texinfo.x86_64
再次編譯後發現不再報錯了,接著make install也沒有出現問題,Binutils-2.25就這樣安裝好了。
(3)在6.17節安裝gcc-4.9.2時,首先要說明的是安裝這個包真的需要很多時間(主要耗在check上,當進行make -k check的時候建議你還是先洗洗睡吧,得要個6、7個小時),協助檔案有幾個地方需要注意下:
<1>為/lib建立符號連結時: ln -sv ../usr/bin/cpp /lib 改為: ln -sv ../../usr/bin/cpp /lib (這個問題譯者有註明,我在此也再提醒下)
<2>增加相容符號連結啟用編譯器時進行連結時間最佳化時:
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/4.9.2/liblto_plugin.so /usr/lib/bfd-plugins/ 改為:
ln -sfv ../../usr/libexec/gcc/$(gcc -dumpmachine)/4.9.2/liblto_plugin.so /usr/lib/bfd-plugins/
<3>驗證新的連結器在使用正確的搜尋路徑時:
grep 'SEARCH.*/usr/lib' dummy.log | sed 's|: |\n|g' 要注意SEARCH後面還有一個小點(.),這在翻譯後的協助檔案中不容易看出來,當然在英文的手冊上是很明顯的。
總之,安裝gcc-4.9.2主要還是要有耐心,中間時間真的要很久,當然你可以選擇跳過 make -k check這一步,這會節省很多時間,問題也應該不大。不過一步一步做過來,體驗一下抓狂的感覺,也不失為LFS的樂趣。
(4)在6.52節安裝Groff的時候,在第一步配置時,文檔中程式為:
PAGE=<paper_size> ./configure --prefix=/usr
那麼在我們實際操作的時候可別跟上面寫一樣,實際上我們要將程式中的 <paper_size>替換成我們希望的頁面大小,比如 letter 或 A4 .如:
PAGE=A4 ./configure --prefix=/usr
(5)在6.59節安裝kmod時,最後一步建立符號連結
ln -sv ../bin/kmod /sbin/$target 應該改為 ln -sv /bin/kmod /sbin/$target 因為根本就沒有../bin/kmod檔案,因此本人懷疑其書寫有錯誤
(6)和上面一樣,在6.63節安裝systemd的時候
ln -sfv ../bin/systemctl sbin/${tool} 改為 ln -sfv /bin/systemctl sbin/${tool}
ln -sfv ../lib/systemd/systemd /sbin/init 改為 ln -sfv /lib/systemd/systemd /sbin/init (這個很重要,別寫錯了,後面第八點有說明)
(7)同樣,在6.69節安裝vim的時候,最後建立軟連結時:
ln -sv ../vim/vim74/doc /usr/share/doc/vim-7.4 應改為 ln -sv /usr/share/vim/vim74/doc /usr/share/doc/vim-7.4 理由同上面的(5)、(6)
(8)在8.4節使用GRUB設定啟動的時候,其中製作grub.cfg這一檔案時,仿照文檔我寫的程式為:
因為文檔中是假設根分區為sda2的,根據其說明,裝置編號從0開始,因此 sda2為(hd0,2),然而我的虛擬機器中sda是屬於宿主系統的,LFS被安裝在(即根分區為) sdb1,因此我照貓畫虎 sdb1 為 (hd1,1)。然並卵,當編譯完核心後,啟動LFS系統的時候要麼出現: error:hd1 cannot get C/H/S value 要麼就是VFS: unable to mount root fs on unknown block(0,0),各種baidu,google後還是沒能解決問題,最後沒辦法,只能自己硬上了,直接參考宿主系統的grub.cfg:
更改後的LFS的 grub.cfg 為:
結果證明 all right,LFS 製作成功。謝天謝地。因此可以看出完全按照LFS手冊來也是會出錯的,對於上面的第八條我再做下說明如下:
<1>在LFS-7.7-systemd中安裝的GRUB是GRUB2,GRUB2的裝置編號是從0開始的,而分區編號從1開始,因此sda2用(hd0,2)表示,sdb1用(hd1,1)表示。這可以參考 http://blog.chinaunix.net/uid-20801390-id-1839224.html 瞭解到。
<2> error: hd1 cannot get C/H/S value 其中C/H/S 分別代表 Cylinder、Header、Sector;即柱面、磁頭和扇區,通過這三者將磁碟分割(有點類似微積分裡面的將圓柱微分),從而進行磁碟的定址。而上面的意思是說 hd1 不能得到 C/H/S 值,應該是說沒辦法定址到 hd1,也就是說不存在 hd1,而只有hd0,因此在set root=(hd1,1)的時候寫成hd1會出錯(純屬個人推測,不一定正確) 。
<3>在啟動的時候出現了一個小插曲,出現了錯誤: Starting init: /sbin/init exists but couldn't execute it (error -13),尋找資料 http://free-electrons.com/blog/debugging-init-failures/ 後發現原來是 /sbin/init 沒有執行許可權。然後就從宿主系統 chroot查看到原來 /sbin/init 是一個連結檔案(沒錯,就是上面第六條提到的),按理說該連結是指到/lib/systemd/systemd檔案的,然而當時不知咋的被我寫成了 /lib/systemd/system,很不湊巧,這是個目錄。修改這個錯誤後就OK了。這LFS過程中,類似這樣自己寫錯導致的錯誤發生了好多回 ,眼都哭瞎了。
<4>在最後進入製作成功登入系統的時候,結果發現不知是忘了密碼還是咋地,登不進去。本來想用單一使用者模式登進去改root密碼的,發現直接在 grub 介面 按 “c” 鍵進入grub命令列模式,然後在 linux /boot/vmlinuz-3.19-lfs-7.7-systemd root=/dev/sda1 ro 的後面加 single 或者 1 ,進去後卻還是要求輸入密碼,還是原來的介面,根本不是單一使用者模式。沒辦法,只能通過再一次登宿主系統,通過 chroot 的方式改 root 密碼了,一切 OK 了。
最後曬一下製作後的LFS吧:
這是核心載入過程:
這是登入後,以後我們就可以在 -bash-4.3# 後面輸入命令了:
做完LFS後並不是說要告一段落了,而僅僅意味著一個開始。