自己動手創(chuàng)建最精簡的Linux
Linux一大亮點(diǎn)就是開源,相對于Windows我們可以在Linux上發(fā)揮更大的想象力,來親手打造擁有自己特色的Linux系統(tǒng),首先我們從打造最基本的微型的Linux系統(tǒng)入手,通過整個打造過程的體驗,你就可以將自己的完整的Linux系統(tǒng)進(jìn)行個性化設(shè)置,然自己用的Linux系統(tǒng)散發(fā)著自己的氣息,讓其更具親合力!!
下面我們就來直接操作,關(guān)于原理,會在每步中說明:
一、準(zhǔn)備階段:
硬件設(shè)施:一臺宿主機(jī)、一個空磁盤(或者數(shù)據(jù)不再使用的磁盤,1G就足夠了,如果想對自己制作的Linux進(jìn)行不斷的完善,那么就選用大點(diǎn)的光盤,文中我們將其視為sdb,根據(jù)自己實(shí)際情況進(jìn)行相應(yīng)的調(diào)整)。
1、分區(qū)、格式化我們準(zhǔn)備的磁盤
將我們準(zhǔn)備的新磁盤進(jìn)行分區(qū)(如果是數(shù)據(jù)不用的磁盤,使用dd if=/dev/zero of=/dev/sdb bc=512 count=1 將其磁盤引導(dǎo)區(qū)的數(shù)據(jù)全部進(jìn)行0覆蓋,這樣這塊磁盤也就編程了空磁盤)。
fdisk /dev/sdb 將其分為兩個區(qū)sdb1 100M 、sdb2 500M,類型為都為Linux,保存,退出
格式化分區(qū):根據(jù)自己屬主機(jī)的文件系統(tǒng)類型,進(jìn)行格式化我的為ext3,所以我格式化時加了個-j,如果自己的是ext2就不需要加-j了
mke2fs -j /dev/sdb1 mke2fs -j /dev/sdb2 #都將其格式化為ext3格式
2、掛載磁盤(掛載點(diǎn)自己選擇,但是掛載sdb1的掛載點(diǎn)名字必須為boot)
創(chuàng)建掛載點(diǎn):
mkdir -pv /mnt/{boot,myroot} mount /dev/sdb1 /mnt/boot #將sdb1掛載至/mnt/boot mount /dev/sdb2 /mnt/myroot #將sdb2掛載至/mnt/myroot
(注:當(dāng)我們掛載的這兩個分區(qū)的時候也許會出現(xiàn)分區(qū)不存在的錯誤提示,主要原因為系統(tǒng)沒能自動獲取剛剛創(chuàng)建的分區(qū)的信息,也就是/proc/partitions文件中沒有新建分區(qū)的信息,我們只需要輸入命令:partproble /dev/sdb 重讀分區(qū)信息,新建的分區(qū)信息將被寫入/proc/parttions文件,這樣就OK了)
二、打造階段:
1、準(zhǔn)備我們Linux的心臟(內(nèi)核)
查看我們宿主機(jī)中/boot目錄中的內(nèi)容,會發(fā)現(xiàn)有類似vmlinuz-2.6.18-164.el5 vmlinuz-2.6.28.10這樣帶有版本號的文件,這就是系統(tǒng)的內(nèi)核文件,我們選擇一個內(nèi)核文件,將其拷貝到我們小Linux的/boot目錄中,這樣我們的Linux就有心臟了。
命令:
cp /boot/vmlinuz-2.6.18-164.e15 /mnt/boot/vmlinuxz #將內(nèi)核改名為vlinuxz。
(注:將內(nèi)核進(jìn)行改名,不僅有利于我們接下來操作的操作還可以避免因為此處內(nèi)核名字和grub.conf文件中內(nèi)核名字的不符而引起kernel panic(內(nèi)核恐慌)問題,導(dǎo)致我們的小Linux無法啟動,此外我曾遇到過在虛擬機(jī)里用手打出的內(nèi)核名字和用Tab鍵寫出的內(nèi)核名字不符的現(xiàn)象,至今不知為何!所以我們盡可能的將我們小Linux的內(nèi)核文件名字寫的簡短一點(diǎn))
2、準(zhǔn)備我們的Linux的善意欺騙文件initrd文件。
關(guān)于initrd文件的作用,我在有一篇名為《Linux開機(jī)流程簡述》的文章中詳細(xì)說明多,建議大家去看看,對我們的小Linux管理和維修是有很大幫助的。
同樣查看宿主機(jī)的/boot目錄內(nèi)的內(nèi)容,會發(fā)現(xiàn)有類似initrd-2.6.18-164.el5.img initrd-2.6.28.10.img 這樣以initrd開頭中間是版本號,以img結(jié)尾的文件,那么這就是initrd文件了,每個版本的內(nèi)核文件,就會有一個與之版本號相對應(yīng)的initrd文件,將與我們剛才選擇的內(nèi)核版本號相對應(yīng)的initrd文件拷貝到一個新建的目錄內(nèi)改造(此處我們在/tmp目錄中創(chuàng)建一個名為test的目錄)
cp /boot/initrd-2.6.18-164.el5.img /tmp/test/
我們用查看這個文件的類型會發(fā)現(xiàn)它是一個用cpio打包,由gzip壓縮的文件,我們將其展開在當(dāng)前目錄下。
zcat initrd-2.6.18-164.el5.img | cpio -id
展開之后我們會發(fā)現(xiàn)一個init的腳本文件,將其用vim打開,將以mkrootdev -t ext3 -o defaults,ro開頭行ro后面的內(nèi)容改成sda2,保存退出,即可(sda2為我們小linux系統(tǒng)單獨(dú)運(yùn)行時根文件系統(tǒng)所在的分區(qū),在此我們告訴init進(jìn)程,真正的根文件系統(tǒng)在sda2上面,讓內(nèi)核去進(jìn)行根文件系統(tǒng)的加載,需要注意的是ro和sda2之間有一個空格)
修改 完成之后,我問就該對其進(jìn)行封裝復(fù)原了(封裝復(fù)原前***先將此目錄中的initrd-2.6.18-164.el5.img文件刪除,使用命令:rm -rf initrd-2.6.18-164.el5.img),使用命令:
find . | cpio -H newc -o | gzip -9 > /mnt/boot/initrd.gz
(注:find . 為當(dāng)前目錄的所有內(nèi)容cpio -H news -o 將目錄下的所有內(nèi)容進(jìn)行cpio打包gzip -9 打包之后進(jìn)行g(shù)zip壓縮,因為這個文件必須是壓縮的格式> /mnt/boot/initrd.gz 將打包壓縮好的文件放在/mnt/boot目錄下,并命名為initrd.gz,重命名同樣是為了方便使用 )
3、向我們小Linux磁盤安裝grub引導(dǎo)程序。(關(guān)于grub的作用在我剛剛提到的文章里有介紹,此處不再說明)
安裝命令為:
grub-install --root-directory =/mnt /dev/sda
^此處為boot目錄的父目錄
進(jìn)入/mnt/boot目錄查看是否有一個新的目錄grub,沒有的話則為安裝失敗,重新安裝,有的話直接進(jìn)入該目錄。
使用vim創(chuàng)建文件grub.conf并寫入如下內(nèi)容(注:#后為我的注釋內(nèi)容,不要寫入)
default=0 timeout=10 #此處是我們系統(tǒng)啟動是菜單選擇時間的設(shè)置,我們設(shè)置為10秒。 title MY LINUX #title是在開機(jī)操作系統(tǒng)選擇菜單中我們小Linux所顯示的名字,可任意填寫 root (hd0,0) #告訴grub我們小Linux系統(tǒng)的內(nèi)核、根文件系統(tǒng),initrd文件的所在磁盤 kernel /vmlinuz ro root=/dev/sda2 rhgb quiet #告訴grub內(nèi)核的名字及根文件系統(tǒng)所在的分區(qū) initrd /initrd.gz #告訴grub initrd文件的名字
保存退出即可。
4、為我們的小Linux系統(tǒng)創(chuàng)建簡單的根文件系統(tǒng)
進(jìn)入/etc/myroot目錄使用命令創(chuàng)建如下目錄:
mkdir -p {boot,proc,sys,dev,home,root,etc/{rc.d,sysconfig,init.d},bin,sbin,lib,usr/{bin,sbin,lib,include},var/{log,run},tmp,mnt,opt,media}
基本命令移植,將借助宿主機(jī)有關(guān)命令的庫文件,為我們的小Linux移植必須的命令(各命令的移植方法相同,在此以命令bash為例)
使用which bash 查看bash命令的位置,并將其拷貝到我們小Linux的相應(yīng)位置即可
cp /bin/bash /mnt/myroot/bin/bash
由于系統(tǒng)在啟動時不是讀取bash命令本身,而是sh,所以我們?yōu)閎ash命令創(chuàng)建一個sh鏈接(只有這個命令需要鏈接)
進(jìn)入/mnt/myroot/bin目錄
創(chuàng)建鏈接 ln -sv bash sh 然后查看該目錄將會看見sh
查看并拷貝bash命令所依賴的庫文件(沒有庫文件,命令只是個擺設(shè))
使用命令ldd /bin/bash 將顯示bash所依賴的所有庫文件,如
linux-gate.so.1 => (0x0061c000) libtermcap.so.2 => /lib/libtermcap.so.2 (0x00c8f000) libdl.so.2 => /lib/libdl.so.2 (0x00c60000) libc.so.6 => /lib/libc.so.6 (0x00b18000) /lib/ld-linux.so.2 (0x00af5000)
***個庫文件不必拷貝,下面的庫文件需一一拷貝進(jìn)小Linux對應(yīng)的目錄,例如第二個庫文件的拷貝為:cp /lib/libtermcap.so.2 /mnt/myroot/lib/libtermcap.so.2
每個命令的移植過程都是如此,此外init命令也是必須要的,其它命令可以自行選擇。
4、創(chuàng)建我們小Linux的/etc/inittab、/etc/rc.d/rc.sysinit文件(關(guān)于這兩個文件的作用在我剛剛提到的文章里有介紹,此處不再說明)
在/etc目錄下創(chuàng)建inittab文件,內(nèi)容如下:(同樣#之后為注釋內(nèi)容)
id:3:initdefault: #設(shè)定系統(tǒng)默認(rèn)啟動級別為3 si::sysinit:/etc/rc.d/rc.sysinit #讓系統(tǒng)執(zhí)行/etc/rc.d/rc.sysinit腳本
保存退出
在/etc/rc.d目錄下創(chuàng)建腳本rc.sysinit ,內(nèi)容如下
bin/bash #運(yùn)行bash命令
保存退出,并給予腳本執(zhí)行權(quán)限 chmod +x rc.sysinit
至此,最精簡Linux已經(jīng)在被我們打造出來,趕緊將含有我們勞動成果的磁盤放在其他的裸機(jī)上運(yùn)行一下吧,千萬要記住,心急吃不了熱豆腐,在取下磁盤之前一定要給宿主機(jī)足夠多的時間,將緩存中的數(shù)據(jù)卸載我們的小Linux磁盤上,不然后果可想而知!
這是個能進(jìn)行最基本的運(yùn)行的Linux,所以大家有很大的空間對其進(jìn)行不斷的完善,希望大家一步步的讓我們的小Linux“長大”!
本文原文:http://aceruser.blog.51cto.com/2772529/636981
【編輯推薦】