走進(jìn)Linux 操作系統(tǒng)
; 文件系統(tǒng)基本要求 linux文件系統(tǒng)的結(jié)構(gòu)上文已經(jīng)給出,我們這里著手搭建一個(gè)精簡的文件系統(tǒng),它包含最基本的目錄以及文件,配置文件也盡量修改簡潔明了。下面列出文件系統(tǒng)必須包含的內(nèi)容。 文件系統(tǒng)最小需要包含/dev 、/proc、/bin 、/sbin 、etc 、/lib 、/usr 、/tmp 等目錄 需要一組基本命令 支持上述命令的運(yùn)行庫函數(shù),其中也包括編譯內(nèi)核產(chǎn)成的模塊 必須的設(shè)備文件 一些必要的配置文件我們要做地就是按部就班地生成和拷貝以上內(nèi)容,唯一地要就就是你要夠心細(xì)。創(chuàng)建根文件系統(tǒng)內(nèi)容 我們先來建立一個(gè)將包含根文件系統(tǒng)內(nèi)容的新目錄“rootfs”(mkdir /rootfs),然后開始在其中生成(拷貝)根文件系統(tǒng)需要地所有目錄和文件。 第一步當(dāng)然是在rootfs目錄下建立根目錄下地必要地子目錄啦,用一行命令就可完成mkdir dev,proc,bin,etc,lib,usr,tmp,sbin ?! 〉诙娇截惸阈枰拿?。比如你需要 ls 命令,你先確定它在系統(tǒng)中的位置whereis ls (發(fā)現(xiàn)在/bin/ls目錄下),然后將該命令拷貝到你工作目錄下相同的目錄結(jié)構(gòu)下 cp /bin/ls /workdir/bin/ls,但是僅僅拷貝命令文件還不夠,還必須考被該命令所用到的動(dòng)態(tài)共享庫文件。如何發(fā)現(xiàn)命令用到了那些動(dòng)態(tài)共享庫呢?很簡單,利用ldd /bin/ls 可以察看命令使用的共享庫,顯示在輸出右列的就是被用到的共享庫文件(名字中有so)?!”热缭谖业南到y(tǒng)上,該操作輸出為: libtermcap.so.2 => /lib/libtermcap.so.2 (0x4001f000) libacl.so.1 => /lib/libacl.so.1 (0x40023000) libc.so.6 => /lib/libc.so.6 (0x40029000) libattr.so.1 => /lib/libattr.so.1 (0x40149000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 我們要做的是將命令要用到的庫文件按照它的目錄結(jié)構(gòu)拷貝到我們工作目錄下的/lib或/lib/i386。(用戶所用到的命令多集中在/bin和/sbin下,另外一些腳本會(huì)用到一些出現(xiàn)在/usr/bin和/usr/sbin下的文件,如果你要使用這些腳本,不用說這些命令和它們要用的庫都不能少)。但是這些文件并非我們實(shí)際想要的,它門只是實(shí)際庫文件的一個(gè)符號(hào)鏈接,系統(tǒng)只所以要使用符號(hào)鏈接,是為了便于庫文件升級(jí)換代時(shí)不影響使用它的應(yīng)用程序。因此我們單單拷貝符號(hào)鏈接是沒有意義,同時(shí)也必須將符號(hào)鏈接指向的實(shí)際庫文件一同拷貝到workdir/lib錄下面去?! ?lib目錄下還有一個(gè)重要目錄就是modules目錄,它里面包含了內(nèi)核編譯產(chǎn)生模塊,對于不同版本的模塊存放在以版本號(hào)命名的文件中。要們可別忘了拷貝這個(gè)目錄到我們的新系統(tǒng)中?! ≡谠紩r(shí)期/lib下的這些庫就足夠用了,但現(xiàn)在的linux系統(tǒng)對安全多了許多要求,尤其是系統(tǒng)從安全性考慮,增加了許多驗(yàn)證手段,因此往往你還必須具有和安全驗(yàn)證相關(guān)的庫。這些庫不會(huì)在命令中直接使用,但卻間接地要被系統(tǒng)的安全框架利用到,多數(shù)都是由配置文件中說明如何關(guān)聯(lián),安全框架通過查看配置文件,選擇調(diào)用具體地驗(yàn)證庫(這些配置文件后問會(huì)提及)。安全框架方面話題,我們不多說,有興趣的可以查查 pam 和 nss等的用法。在這里我們不管它三七二十一將在/lib/security/下和pam相關(guān)地庫和/lib下nss相關(guān)地所有l(wèi)ibnss*庫都考到我們地/lib下的/security下和/lib下。雖然很笨,但確省事。 linux系統(tǒng)將那些會(huì)被多數(shù)應(yīng)用程序頻繁使用的庫函數(shù),多數(shù)都不會(huì)以靜態(tài)的方式編譯連接到應(yīng)用程序中,而是采取動(dòng)態(tài)庫的方式,集中存儲(chǔ)管理。這樣如果多各程序都用到某個(gè)共享庫,那么該庫文件只被調(diào)入內(nèi)存一次,駐留在內(nèi)存一個(gè)拷貝,因此利用共享庫大大節(jié)約了空間,縮減了執(zhí)行文件提及。當(dāng)然天下沒有免費(fèi)的午餐,雖然共享庫相比靜態(tài)庫靈活,但卻學(xué)要而外的路徑搜索,而且調(diào)入時(shí)間也更耗時(shí) 鏈接文件是unix風(fēng)格操作系統(tǒng)提供的一個(gè)特色之一,其中具體又可分為軟鏈接和硬鏈接。軟鏈接又稱為符號(hào)鏈接,其實(shí)就該文件唯一的內(nèi)容就是包含實(shí)際額外文件系統(tǒng)的路徑。硬鏈接則是和被鏈接文件共享索引節(jié)點(diǎn)的(索引節(jié)點(diǎn)概念如果還不清楚,那么自己去找找吧)。因此符號(hào)鏈接怕得是實(shí)際文件被刪除和轉(zhuǎn)移,那么符號(hào)鏈接仍然存在但不再有效了;相反硬鏈接刪除源文件直會(huì)使索引節(jié)點(diǎn)記數(shù)減少,不會(huì)破壞硬鏈接文件的。 第三步建立設(shè)備文件,這點(diǎn)很重要但卻不費(fèi)事。由于linux繼承了unix將設(shè)備抽象成特殊文件來使用和管理,所以要想使用系統(tǒng)的外設(shè),比如軟硬盤,時(shí)鐘,系統(tǒng)終端,甚至內(nèi)存也可以作以為其制作相應(yīng)的文件來訪問。因此我們要建立系統(tǒng)可能用到的所有設(shè)備對應(yīng)的設(shè)備文件。至于你具體需要哪些設(shè)備文件不能一概而論,你可以打開/dev/目錄看看保準(zhǔn)里面文件多地讓你炫目。不過也別怕多數(shù)都是些廢物,就我們要建立的實(shí)驗(yàn)系統(tǒng)來說用道的設(shè)備文件就屈指可數(shù):console 控制臺(tái)設(shè)備,tty* 是由控制臺(tái)管理的虛擬(我們用ctrl-[1-7]切換的就是這個(gè)設(shè)備),sda1 scsi接口設(shè)備 (因?yàn)槲业膌inux是運(yùn)行在vware虛擬機(jī)上,而vmware虛擬機(jī)使用的存儲(chǔ)設(shè)備是虛擬的scsi硬盤,所以需要這個(gè)文件。它的用法和使用標(biāo)準(zhǔn)ide硬盤沒什么兩樣),ram 內(nèi)存虛擬盤設(shè)備(以后我們的系統(tǒng)就運(yùn)行在內(nèi)存虛擬盤中),null 空設(shè)備(是一個(gè)非常有用的字符設(shè)備文件,送入這個(gè)設(shè)備的所有東西都被忽略。如果將任何程序的輸出結(jié)果重定向到/dev/null,則看不到任何輸出信息),zero 零設(shè)備 (讀取這個(gè)設(shè)備,只會(huì)得到空的內(nèi)容,所以有時(shí)為了獲得高壓縮率,需要對某空間用全零添充往往就會(huì)用到它)initrd 這是一個(gè)特殊的字符設(shè)備,它被用來從用戶空間向系統(tǒng)內(nèi)核發(fā)送切換運(yùn)行級(jí)別的信息,屬于一個(gè)虛擬字符設(shè)備(比如你向改變運(yùn)行級(jí)別的init 1-6命令,都試通過該設(shè)備傳達(dá)到內(nèi)核的),關(guān)于虛擬字符設(shè)備作為用戶向內(nèi)核發(fā)命令的利器作用你可看看這個(gè)文章?! ∶鞔_了你需要那些設(shè)備文件,可以依次利用mknod命令建立需要的設(shè)備文件。建立過程中需要的參數(shù)。你可以通過ls – la /dev/設(shè)備名 命令來查看以下設(shè)備屬于塊設(shè)備還是子符號(hào)設(shè)備,察看主從設(shè)備號(hào)獲得。如果你覺得煩,就用拷貝命令直接從標(biāo)準(zhǔn)系統(tǒng)地/dev/目錄下拷貝這些文件吧,不過要配合參數(shù)-r否則,你靠過來的可使文件的整個(gè)內(nèi)容而不僅僅是設(shè)備文件了。如果那樣可就如同把自己往自己衣服口袋里塞,你是永遠(yuǎn)賽不進(jìn)去的?! inux系統(tǒng)將設(shè)備分為塊設(shè)備和字符設(shè)備,塊設(shè)備可以隨機(jī)訪問(b),字符設(shè)備只能按順序訪問c。另外一個(gè)設(shè)備控制器可以控制多個(gè)設(shè)備,所以有主設(shè)備號(hào)和從設(shè)備號(hào)之分。主設(shè)備號(hào)對應(yīng)驅(qū)動(dòng),從設(shè)備號(hào)用來區(qū)分具體設(shè)備。 第四步需要建立系統(tǒng)運(yùn)行需要的配置文件或腳本了。我們還是從簡出發(fā),拷貝標(biāo)準(zhǔn)系統(tǒng)的有用文件,然后針對需要進(jìn)行修修改改。我們試驗(yàn)系統(tǒng)將以多任務(wù)多用戶環(huán)境使用,因此需要登陸密碼,也有分組能力,所以需要passwd和group文件,如果系統(tǒng)使用shadow功能隱藏密碼,那么還需要文件shadow。登陸首先執(zhí)行init文件,它可需要不少配置文件呀。首當(dāng)其沖的便是inittab文件,該文件規(guī)定了許多系統(tǒng)運(yùn)行的基本功能(具體內(nèi)容參見)。下一步init先執(zhí)行rc.sysinit腳本來初始化系統(tǒng),其中會(huì)使用到fstab配置文件,它包含了系統(tǒng)啟動(dòng)后掛載的文件系統(tǒng)和目錄,對于我們試驗(yàn)系統(tǒng)來說只有兩項(xiàng)一個(gè)是將/dev/ram作為根文件系統(tǒng)安裝到/下,另一個(gè)是將proc文件系統(tǒng)安裝到/proc目錄下。init執(zhí)行完rc.sysinit后依照inittab中定義的運(yùn)行級(jí)別進(jìn)入對應(yīng)的/etc/rc.d/執(zhí)行其中s開頭的服務(wù)運(yùn)行腳本。不羅嗦了,細(xì)節(jié)內(nèi)容別問我了,去看man init吧。你要做的就是把/etc/下initab,rc.sysinit和rc.d目錄的所有東西拷貝到你對應(yīng)系統(tǒng)里。我們實(shí)驗(yàn)系統(tǒng)運(yùn)行級(jí)別為3,只啟動(dòng)網(wǎng)絡(luò)服務(wù)服務(wù),因此可以把除了s*network外的s腳本都刪除。(當(dāng)然你也可以改變系統(tǒng)默認(rèn)的啟動(dòng)流程,讓它執(zhí)行你自己的初始化腳本,這點(diǎn)只需要載inittab中修改 “sysinit:xxx“中的腳本名稱)。執(zhí)行了上述初始化和服務(wù)后,系統(tǒng)最后運(yùn)行rc.local文件,這里你可以放一些你希望開機(jī)執(zhí)行的命令,我們這里放一句“ ok you are welcome !!!”為你進(jìn)入系統(tǒng)前的問候?! ×硗庖赖顷懯莑ogin往往要使用pam驗(yàn)證模塊認(rèn)證用戶,所以pam的配置文件也最好拷貝到新系統(tǒng)。很多系統(tǒng)還會(huì)用到nss(名稱服務(wù)開關(guān),這個(gè)服務(wù)來幫助客戶機(jī)器或應(yīng)用程序獲得網(wǎng)絡(luò)信息,可從本地或從網(wǎng)絡(luò)某處取得——從dns或nis等。諸如getxbyy()等函數(shù)都往往會(huì)用到這種服務(wù),用戶登陸時(shí)login很可能就要使用,這取決于你libc的版本),所以/etc/nsswitch.conf需要拷貝,至于如何使用去看man nsswitch.conf吧。剩下你還要靠被terminfo/termcap文件,它們對設(shè)置term終端環(huán)境變量有用。拷貝modules.conf,它包含了有關(guān)模塊信息,我們實(shí)驗(yàn)系統(tǒng)中的modules.conf中僅僅給pcnet32.o 起了個(gè)別名而已。說的我口渴,不說了有什么疑問自己去找資料吧。 差不多完了,對了別忘了吧/root/目錄下的那些.開頭的用于bash配置的隱藏文件也考到新系統(tǒng)的如root下,這些都是bash的環(huán)境參數(shù)等東西?! 〗Y(jié)束動(dòng)作。ldconfig –r workdir/rootfs(試驗(yàn)文件系統(tǒng)目錄) 建立庫文件路徑緩存 ,從此命令再使用動(dòng)態(tài)連接庫時(shí)就不必指定目錄了,因?yàn)樗鼈兊穆窂蕉急痪彺媪?。(ldconfig 要用動(dòng)態(tài)庫配置文件ld.so.conf,試驗(yàn)系統(tǒng)中置空它好了) 安裝根文件系統(tǒng)——內(nèi)核和root文件系統(tǒng)綁定 別混淆,剛剛我們做的是文件系統(tǒng)應(yīng)該包含的文件。具體文件系統(tǒng)現(xiàn)在才開始做。上面說了需要在系統(tǒng)未來的宿主盤上制作文件系統(tǒng)——進(jìn)行格式化。如果你手頭沒有實(shí)際設(shè)備,linux提供給你另外兩種變通方法 : ramdisk和loop設(shè)備(回環(huán)設(shè)備) 。利用loop設(shè)備可以將文件虛擬成 |
<< Linux 串口截止閥的分類以及特點(diǎn) >>