歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

動手制作自己的啟動盤

  (文:西電) 凡是接觸計算機久的朋友肯定都使用過DOS啟動軟盤,至於啟動軟盤的重要性大家肯定也都 清楚。在Linux底下啟動軟盤同樣重要,它不僅能測試新內核、恢復系統錯誤,而且能升級 重要的系統文件。但是在Linux下制做啟動盤不象在DOS下那麼容易,下面我就一步一步的 教大家制做自己系統的啟動軟盤。 1. Linux啟動過程簡介 一個啟動盤實際上是一個完整系統的縮影,它能夠執行一個完整系統的大部分功能。因此 ,如果想制做Linux啟動盤,你必須了解Linux系統啟動的基本過程。接下來我就先簡要介 紹一下Linux的啟動過程。 所有的PC機都是通過執行ROM中的代碼加(ext2 filesystem) readonly. 之後,系統發現init程序並執行它,init程序尋找它的配置文件/etc/inittab,並開始執 行其中的腳本,這些腳本是一些SHELL命令的組合,用來執行如下命令,如加載所需模塊、 裝載SWAP、初始化網絡、裝載fstab中列出的所有驅動器等。最後啟動一個叫getty的程序 ,它負責console和ttys之間的通信,它在顯示器上打印login提示符並激活login程序, login處理登陸的有效性並建立與用戶的對話。至此,啟動過程完畢。 2. 制做啟動盤 創建一個啟動盤首先必須創建根文件系統,由於軟盤容量有限,因此常采用壓縮的根文件 系統。下面我就詳細的介紹怎樣創建壓縮格式根文件系統。 2.1 准備 一個根文件系統必須包括支持完整Linux系統的全部東西,因此,它至少應包括以下幾項: ?基本文件系統結構 ?至少含有以下目錄:/dev, /proc, /bin, /etc, /lib, /usr, /tmp ?最基本的應用程序,如sh, ls, cp, mv等 ?最低限度的配置文件,如rc, inittab, fstab等 ?設備:/dev/hd*, /dev/tty*, /dev/fd0 ?基本程序運行所需的庫函數 由於以上所需文件遠超過1.44M,因此我們通常的做法是先准備好內容後再壓縮到軟盤中? 當用軟盤啟動時,再把文件解壓到內存中,形成一個虛擬盤(RAMDISK),通過RAMDISK控 制系統啟動。 為了能創建以上的根文件系統,你必須有一個空閒的能夠放下大約4M文件的RAMDISK。 如果你使用LILO控制啟動,先檢查一下LILO的配置文件/etc/lilo.conf中定義的RAMDISK 的大小。/etc/lilo.conf 中有一行 RAMDISK_SIZE = nnn 它決定RAMDISK可使用的最大內存為nnn,缺省情況下為4096K,對我們來說夠了,但是順便 說一下,如果你的系統只有8M內存,千萬不要使用4M的RAMDISK。再檢查一下你的系統設備 中是否有一個叫/dev/ram0或/dev/ram的設備,這是RAMDISK的設備名,如果沒有,用命令 mknod創建一個設備/dev/ram0。 2.2 創建根文件系統 Linux內核識別兩種可以直接拷貝到RAMDISK的文件系統,它們是minix 和ext2,ext2性能更好。如果你使用ext2,你會發現使用-i選項定義比缺省更多的信息節 點非常有用。mke2fs缺省情況下在1.44M的軟盤上產生360個信息節點,使用壓縮格式的根 文件系統需要更多的信息節點,所以使用如下命令創建文件系統可以創建2000個信息節點 ,一般不會用光: mke2fs -m 0 -i 2000 /dev/ram0 mke2fs將會自動判斷設備容量的大小並相應的配置自身,-m 0參數防止它給root保留空間 ,這樣會騰出更多的有用空間。接著把虛擬盤掛在節點/mnt上: mount -t ext2 /dev/ram0 /mnt 如果沒有節點/mnt,建一個。 接著是創建目錄。根文件系統最少應該有如下8個目錄: /dev ? 設備 /proc -- proc 文件系統所需目錄 /etc ? 系統配置文件 /sbin ? 重要的系統程序 /bin ? 基本應用程序 /lib ? 共享函數庫 /mnt ? 裝載其他磁盤節點 /usr ? 附加應用程序 其中/proc,/mnt和/usr在此情況下都是空的,只需要用mkdir創建它們既可。其余的目錄應 根據需要分別創建,下面我一個一個的詳細敘述。 ?/dev:/dev中含有系統不可缺少的設備文件,雖然該目錄很普通,可以用 mkdir創建, 然而目錄中的設備文件必須用mknod創建,當然也有捷徑,你可以把現有系統中/dev的文件


拷貝過來,然後刪除不必要的文件。命令cp -dpR /dev /mnt會拷貝/dev整個目錄但不拷貝文件內容,dp開關保證鏈結文件仍然不變,不會拷貝鏈 結所指原文件,而且屬性不變。 必須注意的是,每一個設備文件占用一個信息節點,而軟盤上節點數是有限的,因此有必 要刪除沒用的設備文件。例如,如果你沒有SCSI設備,刪除所有的以sd開頭的文件。如果 你不想使用串口設備,刪除所有以cua開頭的文件。不過記住一定要保留console, kmem, mem, null, ram, tty1等文件。 ?/etc:這個目錄中含有一些必不可少的系統配置文件,那麼到底哪些文件是必需的,哪 些可有可無呢?告訴你一個小竅門,用命令ls ?ltru,該命令會根據最後使用日期反列 一下目錄/etc中的文件,如果一些文件很長時間沒有被進入過,基本上可以從你的啟動盤 中刪去。 我的啟動盤中含有不到15個配置文件,大致可分為3部分: 啟動盤中必須含有的文件 ?rc.d/* -- 系統啟動腳本 ?fstab ? 列出要登陸的文件系統 ?inittab ? 包含啟動過程參數 而且這些文件都是最簡單的。rc應該包括: #!/bin/sh /bin/mount -av /bin/hostname yjy fstab應包括: /dev/ram0 / ext2 defaults /dev/fd0 / ext2 defaults /proc /proc proc defaults inittab包括: id:2:initdefault: si::sysinit:/etc/rc 1:2345:respawn:/sbin/getty 9600 tty1 2:23:respawn:/sbin/getty 9600 tty2 整理系統所需文件 ?passwd ? 用戶名和目錄. ?group ? 用戶組 ?shadow ? 用戶加密密碼 如果你覺得這不安全,就把passwd和shadow刪掉,這樣只有root可以進入系統。 (3)偶爾使用的文件,可根據自己的實際情況選擇。 ?/bin和/sbin:該目錄中包含有必不可少的應用程序,如ls, mv, cat,你可以根據自己 的需要選擇,不過一定要記住包括以下程序:init, getty,login, mount,運行你的rc的 外殼shell。 ?/lib: 該目錄中包含有你的啟動盤啟動過程中所需要的共享函數庫,如果缺少必須的函 數庫,系統會停止啟動或出現一大堆錯誤信息,所以一定要注意。 幾乎所有的程序都需要libc庫,列一下目錄/lib中的libc: % ls -l /lib/libc* -rwxr-xr-x 1 root root 4016683 Apr 16 18:48 libc-2.1.1.so* lrwxrwxrwx 1 root root 13 Apr 10 12:25 libc.so.6 -> libc-2.1.1.so* libc.so.6的6表示版本號,它指向的文件才是你真正需要的。 查看每一個程序使用的函數庫,用命令ldd,如: % ldd /sbin/mke2fs libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000) libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000) libuuid.so.1 => /lib/libuuid.so.1 (0x40028000) libc.so.6 => /lib/libc.so.6 (0x4002c000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 輸出右邊的庫都是必須的,有的可能是鏈結文件。 在/lib目錄下你還必須有函數庫裝載器,這個裝載器或是ld.so (對 a.out 庫) 或是 ld-linux.so (對 ELF 庫)。新版本的ldd一般會告訴你所需庫的加載器。 把裝載器和庫拷貝到/lib後,在仔細檢查一遍,一定保證沒有遺漏。 2.3 模塊 如果你有一個模塊化的內核,你還得必須考慮需要加載的模塊,它們都位於/lib/modules, 你可以把不是很重要的模塊放到別的盤上,當系統啟動後在加載,這樣會節省啟動盤的空 間。 2.4 打包 一旦你完成了上述工作,卸下虛擬盤,拷貝到一個文件中,然後壓縮。 umount /mnt dd if=/dev/ram0 bs=1k gzip -v9 > rootfs.gz 壓縮結束後,你就擁有了一個壓縮的根文件系統,不過你得檢查它的大小,如果大了,你還得去掉一些東西。

3. 選擇內核   在你完成了制做壓縮的根文件系統後,下一步就是選擇或自己創建一個內核。多數情 況下,你可以拷貝現有系統的內核,但是有些情況下,你不得不自己另外創建一個。最可 能出現的問題就是容量限制:如果你想做單張的啟動盤,盤中最大的文件往往是內核,所 以你必須想方設法壓縮 內核的體積。要想壓縮內核體積,創建它時就得把不必要的功能去掉,如去掉對網絡的支 持和對不必要設備的支持,但是一定要記住保留內核對RAMDISK和ext2的支持,否則你的啟 動盤將不能工作。還有就是要記住把對你備份所用設備的支持加到內核中去,因為啟動盤 的最大用處就是檢測和修復損壞的系統,如果你沒有把對備份設備的支持加到內核中去, 你將沒有辦法修復損壞的系統,只能再重裝Linux。   創建新內核的方法我就不在此敘述了,如有問題,請查閱相關資料。重建完內核後記 住用“make zImage”壓縮內核。 4. 整合   有了根文件系統和內核之後,最後的工作就是把它們整合在一起。   先檢查總文件的大小,如果超出1.44M,就得考慮重新創建所需或用兩張磁盤,即使用 兩張磁盤,你的根文件系統也得小於1.44M。   接著就是確定是用LILO控制啟動還是直接用拷貝到盤上的內核控制啟動。用LILO的好 處是你能增加支持初始化硬件的參數到內核中,缺點是較復雜且占用珍貴的磁盤空間,不 過我還是建議使用LILO控制系統啟動。下面我就介紹用LILO的過程,直接用拷貝到盤上的 內核控制啟動的方法就 不作敘述了。   用LILO控制啟動首先就得寫一個LILO配置文件,以下是一個最簡單的配置文件,但是 已經夠用了。   boot =/dev/fd0   install =/boot/boot.b   map =/boot/map   read-write   backup =/dev/null   compact   image = KERNEL   label = Bootdisk   root =/dev/fd0   參數說明見相關資料。然後把它命名為bdlilo.conf。    接下來就是創建一個內核文件系統。把一張干淨的軟盤插入軟驅,在上面創建ext2文 件系統。   mke2fs -i 8192 -m 0 /dev/fd0 50   “-i 8192”表示每8192位創建一個信息節點。接著登陸系統:   mount /dev/fd0 /mnt   rm -rf /mnt/lost+found   mkdir /mnt/{boot,dev}   刪去目錄/ lost+found,創建兩個目錄/boot和/dev。   再拷貝現有系統中的到目錄/dev中,   cp -R /dev/{null,fd0} /mnt/dev   接著拷貝啟動加載器boot.b到目錄/boot中,   cp /boot/boot.b /mnt/boot   最後,拷貝你創建的配置文件bdlilo.conf和內核到內核文件系統的根目錄下,   cp bdlilo.conf KERNEL /mnt   現在,根文件系統所需所有文件都准備就緒了,你可以運行它了,運行結果應該沒有 錯誤,否則就應該仔細檢查一下。最終的文件目錄應該如下所示: --------------------------------------------------------------------------------   total 361   1 -rw-r--r-- 1 root root 176 Jan 10 07:22 bdlilo.conf   1 drwxr-xr-x 2 root root 1024 Jan 10 07:23 boot/   1 drwxr-xr-x 2 root root 1024 Jan 10 07:22 dev/   358 -rw-r--r-- 1 root root 362707 Jan 10 07:23 vmlinuz   boot:   total 8   4 -rw-r--r-- 1 root root 3708 Jan 10 07:22 boot.b   4 -rw------- 1 root root 3584 Jan 10 07:23 map   dev:   total 0   0 brw-r----- 1 root root 2, 0 Jan 10 07:22 fd0   0 crw-r--r-- 1 root root 1, 3 Jan 10 07:22 null   接著設置內核鏡像文件中的ramdisk的偏移量以指出如何確定定位根文件系統。該指示 詞可以通過命令rdev來設置,它的內容含義如下所示:   bits 0-10: ramdisk開始的偏移量, 在1024 byte數據塊中

  bits 11-13: 不用   bit 14: ramdisk加載的提示標記   bit 15: 加載根文件系統之前提示標記   如果位15被設置,當系統盤啟動時將會提示你准備好另一張軟盤,如果你的啟動盤是 兩張的話,這個設置很有用。   對於使用單張和兩張啟動盤的用戶,ramdisk的偏移量是不同的: 如果你的啟動盤只有一張,那麼壓縮的根文件系統會被放置在內核之後,因此偏移量將會 是第一個空閒的數據塊,bit 14 應設置為1,bit 15設置為0。例如,如果你的啟動盤根文 件系統起始於數據塊253(十進制),你的ramdisk偏移量應該是253 + 214 = 253 + 16384 = 16637。 如果你的啟動盤有兩張,那麼你的根文件系統起始於第二張盤的0數據塊,所以偏移量是0 ,bit 14 應設置為1,bit 15應設置為1,最終值為 214 + 215 = 49152。   計算好偏移量後,用命令rdev ?r進行設置,記住用十進制:   rdev -r /mnt/vmlinuz 偏移量   設置完後,從/mnt卸下軟盤。   最後一步是傳輸根文件系統,分兩種情況: ?如果你的內核於根文件系統在同一張軟盤上,用加選項seek的命令dd傳輸, dd if=rootfs.gz of=/dev/fd0 bs=1k seek=內核數據塊數。 ?如果根文件系統位於第二張軟盤上,移走第一張軟盤,插入第二張盤,然後傳輸根文件 系統dd if=rootfs.gz of=/dev/fd0 bs=1k。 ∽:啬悖愕南低稱 動盤已經做好了,剩下?就是測試你的啟動盤的正確性了,如果 有問題,對不起,你還得從頭再來。   現在許多Linux的發行套件中都有廠家做好的啟動盤,它們的制做原理和以上我介紹的 大同小異,但是它們常常用許多不同的技巧,因為它們要面對更多的硬件和各種可能發生 的情況。大家可以拿一張來慢慢研究,你會從中學到很多知識。   最後祝大家都能作出一張稱心如意的啟動盤,讓你的linux永保青春。



  現在許多Linux的發行套件中都有廠家做好的啟動盤,它們的制做原理和以上我介紹的 大同小異,但是它們常常用許多不同的技巧,因為它們要面對更多的硬件和各種可能發生 的情況。大家可以拿一張來慢慢研究,你會從中學到很多知識。   最後祝大家都能作出一張稱心如意的啟動盤,讓你的linux永保青春。



的情況。大家可以拿一張來慢慢研究,你會從中學到很多知識。   最後祝大家都能作出一張稱心如意的啟動盤,讓你的linux永保青春。



Copyright © Linux教程網 All Rights Reserved