linux一大亮點就是開源,相對於Windows我們可以在linux上發揮更大的想象力,來親手打造擁有自己特色的linux系統,首先我們從打造最基本的微型的linux系統入手,通過整個打造過程的體驗,你就可以將自己的完整的linux系統進行個人化,然自己用的linux系統散發著自己的氣息,讓其更具親合力!!
下面我們就來直接操作,關於原理,會在每步中說明:
一、準備階段:
硬體設施:一台宿主機、一個空磁碟(或者資料不再使用的磁碟,1G就足夠了,如果想對自己製作的linux 進行不斷的完善,那麼就選用大點的光碟片,文中我們將其視為sdb,根據自己實際情況進行相應的調整)。
1、分區、格式化我們準備的磁碟
將我們準備的新磁碟進行分區(如果是資料不用的磁碟,使用dd if=/dev/zero of=/dev/sdb bc=512 count=1 將其磁碟引導區的資料全部進行0覆蓋,這樣這塊磁碟也就編程了空磁碟)。
fdisk /dev/sdb 將其分為兩個區sdb1 100M 、sdb2 500M,類型為都為linux ,儲存,退出
格式化分區:根據自己屬主機的檔案系統類型,進行格式化我的為ext3,所以我格式化時加了個-j,如果自己的是ext2就不需要加-j了
mke2fs -j /dev/sdb1 mke2fs -j /dev/sdb2 都將其格式化為ext3格式
2、掛載磁碟(掛載點自己選擇,但是掛載sdb1的掛載點名字必須為boot)
建立掛載點:mkdir -pv /mnt/{boot,myroot}
mount /dev/sdb1 /mnt/boot 將sdb1掛載至/mnt/boot
mount /dev/sdb2 /mnt/myroot 將sdb2掛載至/mnt/myroot
(註:當我們掛載的這兩個分區的時候也許會出現分區不存在的錯誤提示,主要原因為系統沒能自動擷取剛剛建立的分區的資訊,也就是/proc/partitions檔案中沒有建立分區的資訊,我們只需要輸入命令:partproble /dev/sdb 重讀分區資訊,建立的分區資訊將被寫入/proc/parttions檔案,這樣就OK了)
二、打造階段:
1、準備我們linux的心臟(核心)
查看我們宿主機中/boot目錄中的內容,會發現有類似vmlinuz-2.6.18-164.el5 vmlinuz-2.6.28.10這樣帶有版本號碼的檔案,這就是系統的核心檔案,我們選擇一個核心檔案,將其拷貝到我們小linux的/boot目錄中,這樣我們的linux就有心臟了。命令:cp /boot/vmlinuz-2.6.18-164.e15 /mnt/boot/vmlinuxz 將核心改名為vlinuxz。
(註:將核心進行改名,不僅有利於我們接下來操作的操作還可以避免因為此處核心名字和grub.conf檔案中核心名字的不符而引起kernel panic(核心恐慌)問題,導致我們的小linux無法啟動,此外我曾遇到過在虛擬機器裡用手打出的核心名字和用Tab鍵寫出的核心名字不符的現象,至今不知為何!所以我們儘可能的將我們小linux的核心檔案名稱字寫的簡短一點)
2、準備我們的linux的善意欺騙檔案initrd檔案。
關於initrd檔案的作用,我在有一篇名為《Linux開機流程簡述》的文章中詳細說明多,建議大家去看看,對我們的小linux管理和維修是有很大協助的。
同樣查看宿主機的/boot目錄內的內容,會發現有類似initrd-2.6.18-164.el5.img initrd-2.6.28.10.img 這樣以initrd開頭中間是版本號碼,以img結尾的檔案,那麼這就是initrd檔案了,每個版本的核心檔案,就會有一個與之版本號碼相對應的initrd檔案,將與我們剛才選擇的核心版本號碼相對應的initrd檔案拷貝到一個建立的目錄內改造(此處我們在/tmp目錄中建立一個名為test的目錄)
cp /boot/initrd-2.6.18-164.el5.img /tmp/test/
我們用查看這個檔案的類型會發現它是一個用cpio打包,由gzip壓縮的檔案,我們將其展開在目前的目錄下。
zcat initrd-2.6.18-164.el5.img | cpio -id
展開之後我們會發現一個init的指令檔,將其用vim開啟,將以mkrootdev -t ext3 -o defaults,ro開頭行ro
後面的內容改成sda2,儲存退出,即可(sda2為我們小linux系統單獨運行時根檔案系統所在的分區,在此我們告訴init進程,真正的根檔案系統在sda2上面,讓核心去進行根檔案系統的載入,需要注意的是ro和sda2之間有一個空格)
修改 完成之後,我問就該對其進行封裝複原了(封裝複原前最好先將此目錄中的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 . 為目前的目錄的所有內容
cpio -H news -o 將目錄下的所有內容進行cpio打包
gzip -9 打包之後進行gzip壓縮,因為這個檔案必須是壓縮的格式
> /mnt/boot/initrd.gz 將打包壓縮好的檔案放在/mnt/boot目錄下,並命名為initrd.gz,重新命名同樣是為了方便使用 )
3、向我們小linux磁碟安裝grub引導程式。(關於grub的作用在我剛剛提到的文章裡有介紹,此處不再說明)
安裝命令為:grub-install --root-directory =/mnt /dev/sda
^此處為boot目錄的父目錄
進入/mnt/boot目錄查看是否有一個新的目錄grub,沒有的話則為安裝失敗,重新安裝,有的話直接進入該目錄。
使用vim建立檔案grub.conf並寫入如下內容(註:#後為我的注釋內容,不要寫入)
default=0
timeout=10 #此處是我們系統啟動是菜單選擇時間的設定,我們設定為10秒。
title MY LINUX #title是在開機作業系統選擇菜單中我們小linux所顯示的名字,可任意填寫
root (hd0,0) #告訴grub我們小linux系統的核心、根檔案系統,initrd檔案的所在磁碟
kernel /vmlinuz ro root=/dev/sda2 rhgb quiet #告訴grub核心的名字及根檔案系統所在的分區
initrd /initrd.gz #告訴grub initrd檔案的名字
儲存退出即可。
4、為我們的小linux系統建立簡單的根檔案系統
進入/etc/myroot目錄使用命令建立如下目錄:
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}
基本命令移植,將藉助宿主機有關命令的庫檔案,為我們的小linux移植必須的命令(各命令的移植方法相同,在此以命令bash為例)
使用which bash 查看bash命令的位置,並將其拷貝到我們小linux的相應位置即可
cp /bin/bash /mnt/myroot/bin/bash
由於系統在啟動時不是讀取bash命令本身,而是sh,所以我們為bash命令建立一個sh連結(只有這個命令需要連結)
進入/mnt/myroot/bin目錄
建立連結 ln -sv bash sh 然後查看該目錄將會看見sh
查看並拷貝bash命令所依賴的庫檔案(沒有庫檔案,命令只是個擺設)
使用命令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)
第一個庫檔案不必拷貝,下面的庫檔案需一一拷貝進小linux對應的目錄,例如第二個庫檔案的拷貝為:cp /lib/libtermcap.so.2 /mnt/myroot/lib/libtermcap.so.2
每個命令的移植過程都是如此,此外init命令也是必須要的,其它命令可以自行選擇。
4、建立我們小linux的/etc/inittab、/etc/rc.d/rc.sysinit檔案(關於這兩個檔案的作用在我剛剛提到的文章裡有介紹,此處不再說明)
在/etc目錄下建立inittab檔案,內容如下:(同樣#之後為注釋內容)
id:3:initdefault: #設定系統預設啟動層級為3
si::sysinit:/etc/rc.d/rc.sysinit #讓系統執行/etc/rc.d/rc.sysinit指令碼
儲存退出
在/etc/rc.d目錄下建立指令碼rc.sysinit ,內容如下
bin/bash #運行bash命令
儲存退出,並給予指令碼執行許可權chmod +x rc.sysinit
至此,最精簡linux已經在被我們打造出來,趕緊將含有我們勞動成果的磁碟放在其他的裸機上運行一下吧,千萬要記住,心急吃不了熱豆腐,在取下磁碟之前一定要給宿主機足夠多的時間,將緩衝中的資料卸載我們的小linux磁碟上,不然後果可想而知!
這是個能進行最基本的啟動並執行linux,所以大家有很大的空間對其進行不斷的完善,希望大家一步步的讓我們的小linux“長大”!
本文出自 “redhat” 部落格