科技進步到今天,軟驅開始慢慢退出市場,取而代之的是優盤。優盤和軟盤相比,不但在容量上要大很多,而且在速度上也快了許多。以往建在軟盤上的Linux由于受限于1.4MB的容量,所以多數被用來做小型路由器、防火墻之類的應用。而今天有了幾十MB、幾百MB甚至上GB的優盤后,就完全可以提供小型的HTTP、郵件等需要更大存儲空間的服務了。想想看用戶只要把這個特制的優盤插入電腦的USB接口,就可以啟動一個小型的Linux系統。這個系統已經有了路由、HTTP和郵件等功能,只需快速設置一下IP等參數就可以開始工作了。這就相當于用戶隨身帶著一臺Linux服務器,方便極了。
要制作優盤Linux,首先在硬件上要滿足以下條件:
1.優盤帶有啟動功能;
2.主板支持USB設備啟動(如USBZip啟動)。
有了合適的硬件條件后,用戶就可以開始動手制作優盤Linux了。以下所有工作都在Linux環境下完成,筆者的軟硬件環境如下:
軟件環境:Federa Linux 1.0,系統采用GRUB做引導程序;
硬件環境:P42.0GHz、主板Intel 845、內存512MB、兩個80GB硬盤(hda、hdb)和帶啟動功能的128MB優盤。
下面就開始介紹優盤Linux的制作過程。
分區和格式化
首先,將已經設置為帶啟動功能的優盤插入USB接口,使用下面的命令對其進行分區和格式化:
# fdisk /dev/sda
其中/dev/sda設備指用戶的優盤。如果用戶的機器中還有其它的SCSI設備,那么可能是/dev/sdb等。用戶使用“fdisk”刪除優盤原來的所有分區,并將128MB的空間都分成一個Linux基本分區。接下來用戶要將其格式化為Ext2文件系統,可以使用以下命令:
# mkfs.ext2 /dev/sda1
安裝GRUB
有了已經格式化好的Ext2的文件系統,接下來用戶就可以在這個文件系統上安裝Linux的引導程序GRUB了。
首先,要將格式化好的優盤上的文件系統掛載到當前的Linux系統中。命令如下:
# mount /dev/sda1 /usb
接著,要建立GRUB所需要的目錄,并將當前使用的Linux系統中的GRUB相關文件(/boot/grub/目錄下的stage1和stage2)復制到優盤的/usb/boot/grub下。命令如下:
# mkdir /usb
# mkdir /usb/boot
# mkdir /usb/boot/grub
# cp /boot/grub/stage* /usb/boot/grub/
然后,使用“grub”命令將GRUB引導程序安裝在優盤上。具體可以參考如下:
grub> root (hd2,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd2)
Checking if “/boot/grub/stage1” exists... yes
Checking if“/boot/grub/stage2”exists... yes
Checking if“/boot/grub/e2fs_stage1_5”exists... no
Running“install /boot/grub/stage1 (hd2) /boot/
grub/stage2 p /boot/grub/grub.conf”... suclearcase/" target="_blank" >cceeded
Done.
grub>quit
上面操作中的像“(hd2)”這樣的參數可能隨用戶機器的硬盤數量和分布情況的差異會有所不同。在安裝完GRUB后,還要對其進行配置。用戶在優盤的/usr/boot/grub目錄下創建grub.conf文件,命令如下:
# vi /usb/boot/grub/grub.conf
grub.conf文件的內容如下:
default=0
timeout=10
title My USB Linux
root (hd0,0)
kernel /vmlinuz
保存退出,GRUB配置完成。此時可以測試用優盤啟動機器,會看到GRUB的啟動畫面和選項“My USB Linux”了。
注意在測試優盤啟動時,將兩個硬盤的電源線都要拔掉,因為在上面的grub.conf中設定的根分區是hd0。
編譯內核
首先用戶要根據用途考慮使用哪一個版本的內核。比如要使用Iptables來建立防火墻,那就一定要選擇2.4以上的版本。但要記住,版本并不是越高越好。選定內核的版本后,從kernel.org上下載對應的源碼。在動手配置內核之前,還要對內核的源碼做一個小小的修改。從內核的源碼樹中找到init目錄下的do_mounts.c文件,請根據自己的源碼版本做類似下面的修改:
* Allow the user to distinguish between failed open
* and bad superblock on root device.
*/
- printk (“VFS: Cannot open root device“%s”or %s”,
+ printk (“VFS: Cannot open root device“%s”or %s”,
retrying in 1 second.", root_device_name, kdevname (ROOT_DEV));
- printk (“Please append a correct “root=”boot option”);
- panic(“VFS: Unable to mount root fs on %s”,
- kdevname(ROOT_DEV));
+ printk (“You may need to append a correct“root=”boot option”);
+ printk (“or wait for the root device to become ready.”);
+
+ /* wait 1 second and try again,
+ * allowing time for hubs/devices to become ready */
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(HZ);
+ goto retry;
)
panic(“VFS: Unable to mount root fs on %s”, kdevname(ROOT_DEV));
做這一步修改是考慮到,通常在Linux啟動過程中,內核解壓運行完成后,會加載root分區,然后執行root分區上的init腳本。當用戶使用硬盤時,硬盤的初始化速度很快。在內核運行完成之前,因為硬盤已經準備就緒了,所以內核可以順利加載硬盤上的root分區。然而優盤初始化速度要比硬盤慢多了。這樣就會出現內核啟動完成后,因優盤還沒有完成初始化而導致root分區無法被加載的現象。所以要想使用優盤啟動Linux就需要延長內核加載root分區的等待時間,辦法就是對系統內核初始化代碼do_mounts.c作類似上面的修改。
當然還有其它的解決辦法,比如在內核啟動時,先將一個臨時的root分區設在RAM disk上,然后等待幾秒鐘,在優盤差不多初始化完成后再繼續啟動。這種方法就要選上對“RAM disk”的支持,而且還要修改initrd.img文件等。所以除非用戶想同時用RAM disk做一些其它的用途(如運行特定程序或加載其它的驅動),否則就不建議使用這種方法。
在完成源碼的修改后,就可以開始配置內核了。在配置過程中將所有需要的功能和驅動都編譯進內核中去。注意要將一些不必要的模塊去掉,比如聲卡和顯卡驅動等。還要特別注意對網絡方面的支持要廣泛一些,要盡量將可能遇到的網卡的驅動編譯進內核。
常見的USB芯片類型有EHCI、OHCI和UHCI三種。因為對于常見的PC機主板來說一般使用的是UHCI芯片的USB控制器,所以在USB設備的配置中,要對應的選上對“UHCI Alternate Driver (JE) support”的支持。另外,還要選上“Preliminary USB device filesystem”。因為在Linux中,優盤等類似設備都是被模擬成SCSI硬盤而進行訪問。以下是執行“make menuconfig”命令配置內核時關于USB的選項實例,可供參考:
<*> Support for USB
[ ] USB verbose debug messages
--- Miscellaneous USB options
[*] Preliminary USB device filesystem
--- USB Host Controller Drivers
<*> UHCI Alternate Driver (JE) support
< > OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
--- USB Device Class drivers
<*> USB Mass Storage support
[ ] USB Mass Storage verbose debug
[ ] Freecom USB/ATAPI Bridge support
[ ] ISD-200 USB/ATA Bridge support
[ ] Microtech CompactFlash/SmartMedia support
細心完成內核配置后,最后就是編譯內核了。內核的編譯方法大家應該很熟悉了,通常是使用“make mrproper”、“make menuconfig”、“make dep”、“make clean”和“make bzImage”等指令來編譯。
編譯完成后,新的內核就是arch/i386/boot/目錄中的bzImage文件,將其復制到優盤上,命名如下:
# cp arch/i386/boot/bzImage /usb/vmlinuz
編譯成功的內核通常不會超過1MB。在實際制作優盤Linux的過程中,定制內核是非常關鍵的。很多人失敗在這個地方。通常要多次嘗試,才能生成適合的內核。
目錄和文件
內核啟動后,要加載root文件系統。在Linux中,root文件系統中包含了系統必須的目錄、設備文件、可執行文件和配置文件等。
首先創建系統必需的目錄,示意如下:
# mkdir bin etc etc/rc.d proc tmp var dev mnt
# chmod 755 bin etc etc/rc.d tmp var dev mnt
# chmod 555 proc
接著要用“mknod”命令在dev目錄下建立一些基本的設備文件,不可從原系統/dev目錄中復制。具體請參考下列實例命令:
# cd dev
# mknod tty c 5 0
# mknod console c 5 1
# chmod 666 tty console
# mknod tty0 c 4 0
# chmod 666 tty0
# mknod ram0 b 1 0
# chmod 600 ram0
然后生成一些常用命令和工具,比如sh、ls、cd和ifconfig等。用戶可以使用原來系統中的這些命令,不過要對應地將其所用到的動態連接庫也復制到優盤上,或者是重新進行靜態編譯,然后將二進制文件復制到優盤上。這些過程都不輕松,如果想研究Linux,或者是想在優盤Linux上使用Glibc的話,可以自己動手來做一下。對于大多數人,可以使用BusyBox工具箱來做這件事。BusyBox提供了一個很小的可執行程序busybox。用戶通過鏈接它可以為系統提供ls、rm、cp和init等多種命令。busybox的安裝過程很簡單。在Fedora Linux中已經自帶,用戶也可以自行下載源碼來編譯安裝。安裝完后,可以將busybox產生的文件復制到優盤中,具體可以參考其官方網站http:// www.busybox.net上的說明。
最后,還要建立一些配置文件,比如/etc/rc.d/inittab、/etc/rc.d/rc.sysinit和/etc/fstab等。下面是這幾個文件的簡單實例,僅供參考:
1./etc/rc.d/inittab
::sysinit:/etc/rc.d/rc.sysinit
::askfirst:/bin/sh
2./etc/rc.d/rc.sysinit
#!/bin/sh
mount -a
3./etc/fstab
proc /proc proc defaults 0 0
完成上面這些工作之后,就可以測試這個小型的優盤Linux了。
在啟動時,先是GRUB引導,接下來就是內核解壓和初始化,然后調用/sbin/init,由init來調用/etc/inittab中的各種程序運行(比如加掛各種分區等),最后在console上啟動一個Shell程序,這樣就完成了啟動。如果在啟動中遇到問題,還要反復進行修改和測試,這中間的過程就要靠自己去摸索了。
優盤Linux的應用
創建和定制完Linux系統所需的目錄結構和文件之后,就已經完成了一個小型的Linux系統了。這個小型的Linux系統主要可以有以下幾個方面的應用。
做為應急盤
當Linux系統故障時,可以用這個優盤啟動系統,然后將原系統的硬盤掛進文件系統,進行診斷和修復。盤中可以放入一些常用的診斷工具和軟件。
提供應用服務
此時這個小型的Linux系統本身已經可以提供路由和防火墻等功能了。不過用戶還可以加入其它的應用服務,這要視用戶自己的需要而定。比如一個Web開發人員,可以裝上MySQL、Apache、PHP和CVS等服務。這些服務可以先在其它的Linux上靜態編譯好,然后將其復制到優盤上。
其它
優盤還可以有其它的用途,比如作為密匙盤,為Linux的啟動或應用程序提供訪問控制認證等。(T111)
原文轉自:http://www.anti-gravitydesign.com