把Linux放進(jìn)軟盤里
筆者的同事最近在測試AMD 64bit CPU時,遇到這樣一個問題:當(dāng)插入含有AMD官方軟件Maxpower64的軟盤后,系統(tǒng)提示不能引導(dǎo)。關(guān)于這個軟件AMD公司提供的信息很少,只知道它必須在linux環(huán)境下執(zhí)行。所以筆者打開軟盤,發(fā)現(xiàn)里面只有兩個文件:syslinux.cfg,Maxpower64,這樣問題就明確了,靠這兩個文件是無法引導(dǎo)進(jìn)入linux系統(tǒng)的,更不用說執(zhí)行Maxpower64。下面我就介紹一下如何修復(fù)這個軟件,使得它可以正常使用。
我們首先要得到一張可以引導(dǎo)進(jìn)入linux環(huán)境的軟盤,這種軟盤必須由兩部分組成,即內(nèi)核和根文件系統(tǒng)。我們首先制作一個內(nèi)核。
內(nèi)核的編譯要把內(nèi)核部分放到一張1.44MB的軟盤上去,通常要對內(nèi)核進(jìn)行壓縮,壓縮內(nèi)核的最好方法是進(jìn)行重新編譯內(nèi)核,將一些不必要的支持去掉,如對網(wǎng)絡(luò)和其它周邊設(shè)備的支持,重要的一點(diǎn)是記住內(nèi)核必須支持RAMDISK及ext2,否則系統(tǒng)不能正常引導(dǎo)。編譯之前請確認(rèn)您是以root的身份在進(jìn)行操作,否則會返回Permission Denied的提示。
首先要到合適的編譯路徑,一般路徑都在/usr/src/Linux,RH9的路徑是在/usr/src/Linux-2.4,只有在這個路徑你的命令才會生效。否則會顯示
make: *** No rule to make target 'config' , stop的錯誤提示.
如果你以前編譯過內(nèi)核,那應(yīng)當(dāng)先執(zhí)行#make mrproper 這個命令,它可以刪除以前的建構(gòu)的痕跡。如果你沒有編譯過,可以不執(zhí)行它。
接下來執(zhí)行#make menuconfig 開始配置內(nèi)核,把你認(rèn)為不需要的東西都不要編譯到內(nèi)核,比如業(yè)余電臺,csi,I20,IrDA,isdn,bluetooth.最后保存為.config后退出。
再接下來就依次執(zhí)行以下命令:
#make dep (設(shè)置依賴關(guān)系)
#make clean (準(zhǔn)備要建構(gòu)的源碼樹)
#make bzImage (建構(gòu)內(nèi)核 )
#make modules ( 配置模塊)
#make modules_install (使用配置的模塊)
#make install (把新的內(nèi)核和相關(guān)文件復(fù)制到正確的目錄)
執(zhí)行到這里,在/boot下會看到名字為vmlinuz-2.4.22custom的文件。這就是我們編譯得到的內(nèi)核。如果它的size大于1.44M,那就得重新編譯,再去掉一些不需要的東西,直到內(nèi)核小于1.44M,為了便于記憶,我們不妨將它重新命名為newkernel,接下來我們緊接著制作根文件系統(tǒng)。
根文件系統(tǒng)的制作
制作根文件系統(tǒng)前,我們先要解決一個問題:因為一個根文件系統(tǒng)要實(shí)現(xiàn)基本的功能,必須包括一些常用工具:如:sh,ls,cd,cat…… 但是常用工具會占用很多空間,要是用原來系統(tǒng)中的這些命令,就是全部用靜態(tài)編譯,不是用動態(tài)連接庫,大概也要有2MB~3MB,放不進(jìn)軟盤。因此我們我們的解決的方案是使用BusyBox工具。BusyBox 它包含了七十多種 Linux 上標(biāo)準(zhǔn)的工具程序,只需要的磁盤空間僅僅幾百 k 。在嵌入式 系統(tǒng)上常用到它 (例如 Linux Router Project 和 Debian boot floppy就使用到它)
建立 BusyBox
首先我們從官方網(wǎng)站上下載BusyBox的最新版本:busybox-1.00-rc3.tar.gz并且解開
#tar zxvf busybox-1.00-rc3.tar.gz
為了壓縮空間,我們采用靜態(tài)編譯,修改 Makefile 中的 DOSTATIC 參數(shù)為true
DOSTATIC=true
然后修改 BusyBox 中的 init.c,設(shè)定系統(tǒng)要執(zhí)行的第一個程序為: /etc/rc.d/rc.sysinit
#define INIT_SRCIPT \"/etc/rc.d/rc.sysinit\"
開始編譯BusyBox
#make
#make install
到這一步我們就得到了可執(zhí)行命令busybox
解決了這個問題后,我們可以開始制作根文件系統(tǒng)
制作根文件系統(tǒng)
首先為根文件系統(tǒng)建一個目錄叫做 floppy-Linux,然后進(jìn)入 floppy-Linux 目錄內(nèi)
# mkdir floppy-Linux
# cd floppy-Linux
然后為 root filesystem 建立一些標(biāo)準(zhǔn)的目錄
# mkdir dev etc etc/rc.d bin proc mnt tmp var
# chmod 755 dev etc etc/rc.d bin mnt tmp var
# chmod 555 proc
# ln -s sbin bin
然后進(jìn)入 /dev 目錄下建立根文件系統(tǒng)必須的一些設(shè)備文件。
建立一般終端機(jī)設(shè)備
# mknod tty c 5 0
# mkdir console c 5 1
# chmod 666 tty console
建立 VGA Display 虛擬終端機(jī)設(shè)備
# mknod tty0 c 4 0
# chmod 666 tty0
建立 RAM disk 設(shè)備
# mknod ram0 b 1 0
# chmod 600 ram0
建立 floppy 設(shè)備
# mknod fd0 b 2
# chmod 600 fd0
建立 null 設(shè)備
# mknod null c 1 3
# chmod 666 null
到這里我們就有了一個初步的小型根文件系統(tǒng),但是還需要配置一些有關(guān)的 shell script來完善它。
編輯有關(guān)的 shell script
首先進(jìn)入到 /floppy-Linux/etc/ 這個目錄下編輯 inittab,rc.d/rc.sysinit,fstab這三個文件 ,內(nèi)容分別如下:
inittab
::sysinit:/etc/rc.d/rc.sysinit
::askfirst:/bin/sh
rc.sysinit
#!/bin/sh
mount –a
fstab
proc /proc proc defaults 0 0
然后修改inittab,rc.sysinit,fstab這三個文件的權(quán)限
# chmod 644 inittab
# chmod 755 rc.sysinit
# chmod 644 fstab
配置完shell script后,我們注意到這些shell script會使用一些 /bin目錄下的命令,但是我們的/bin目錄下是空的?,F(xiàn)在我們就使用BusyBox來制作這些常用命令。
使用BusyBox制作常用命令
將busybox 復(fù)制到軟盤的/bin目錄下,并且改名為init
# cp busybox /floppy-Linux/bin/init
然后創(chuàng)建常用命令的link,具體的工作原理請參閱busybox的官方說明。
# ln -s init ls
# ln -s init cp
# ln -s init mount
# ln -s init umount
# ln -s init more
# ln -s init ps
# ln -s init sh
現(xiàn)在我們就有了所需的常用命令。
到這里我們的根文件系統(tǒng)就制作完成了,但是和內(nèi)核一樣,要把根文件系統(tǒng)部分放到一張1.44MB的軟盤上去,也要進(jìn)行壓縮,下面我們就著手壓縮它。[!--empirenews.page--]
壓縮根文件系統(tǒng)
一般我們會采取 RAM Disk 的方式實(shí)現(xiàn)。簡單的來說就是將準(zhǔn)備好的根文件系壓縮成為Ramdisk的鏡像文件,當(dāng)用軟盤啟動時,再把鏡像文件解壓到內(nèi)存中,形成一個虛擬盤(RAMDISK),通過RAMDISK控制系統(tǒng)啟動。
我們現(xiàn)在制作Ramdisk的鏡像文件
# dd if=/dev/zero of=/tmp/tmp_loop bs=1k count=2048
# losetup /dev/loop0 /tmp/tmp_loop
# mke2fs -m 0 /dev/loop0
# mount -t ext2 /dev/loop0 /mnt
# cp -a /floppy-Linux /mnt
# umount /mnt
# losetup -d /dev/loop0
# dd if=/tmp/tmp_loop | gzip -9 > /tmp/Image.gz
# rm -f /tmp/tmp_loop
# sync
這樣我們就得到了壓縮過的根文件系統(tǒng)也就是Ramdisk的鏡像文件Image.gz。
目前為止我們已經(jīng)有了內(nèi)核和壓縮過的根文件系統(tǒng).現(xiàn)在剩下的就是把它們整合在一張軟盤里面。
整合核心和根文件系統(tǒng)
根據(jù)引導(dǎo)的方式不同,有以下三種整合方案:
用grub引導(dǎo)
依次執(zhí)行:
# mke2fs /dev/fd0
# mount /dev/fd0 /mnt/floppy
# mkdir /mnt/floppy/boot
# mkdir /mnt/floppy/boot/grub
# cp /boot/grub/stage1 /mnt/floppy/boot/grub
# cp /boot/grub/stage2 /mnt/floppy/boot/grub
#grub
在 grub> 提示符處,輸入:
grub> root (fd0)
grub> setup (fd0)
grub> quit
#cp newkernel /mnt/floppy/boot
#cp Image.gz /mnt/floppy/boot
#cp /boot/grub/grub.conf /mnt/floppy/boot/grub
編輯grub.conf, 內(nèi)容如下:
timeout 10
default 0
title My little Linux
root (fd0)
kernel /boot/newkernel ro root=/dev/ram0
initrd /boot/ Image.gz
然后制作grub.conf的link文件menu.lst
#ln -s /mnt/floppy/boot/grub/grub.conf /mnt/floppy/boot/grub/menu.lst
#umount /mnt/floppy
整合完成!
用sysLinux引導(dǎo)
依次執(zhí)行:
# mkdosfs /dev/fd0
# sysLinux /dev/fd0
編輯 sysLinux 的組態(tài)檔 sysLinux.cfg,內(nèi)容如下
TIMEOUT 20
DEFAULT Linux
LABEL Linux
KERNEL newkernel
APPEND root=/dev/ram0 ro initrd=Image.gz
然后將 sysLinux.cfg、newkernel、Image.gz 拷貝到磁盤中
# mount /dev/fd0 /mnt/floppy
# cp newkernel /mnt/floppy
# cp Image.gz /mnt/floppy
# cp sysLinux.cfg /mnt/floppy
#umount /mnt/floppy
整合完成!
直接引導(dǎo)
依次執(zhí)行:
# dd if=newkernel of=/dev/fd0 bs=1k
252+1 records in
252+1 records out
在這個例子中,dd 寫入了 252 個完整記錄(records) + 1個partial record ,所以內(nèi)核占用了 253 個軟盤的 blocks 。這個數(shù)字稱為 KERNEL_BLOCKS ,請記得它,這個數(shù)字還要使用.
#rdev /dev/fd0 /dev/fd0
#rdev -R /dev/fd0 0
#rdev -r /dev/fd0 VALUE
在這里這個VALUE的值應(yīng)為16384+ KERNEL_BLOCKS(上一步dd 命令所產(chǎn)生的數(shù)值)
所以本例應(yīng)為:
#rdev -r /dev/fd0 16637
#dd if= root system file of=/dev/fd0 bs=1k seek=KERNEL_BLOCKS
在這里這個KERNEL_BLOCKS就是上一步dd 命令所產(chǎn)生的數(shù)值
所以本例應(yīng)為:dd if= Image.gz of=/dev/fd0 bs=1k seek=253
整合完成!
現(xiàn)在我們就擁有了一張可以自激活到Linux環(huán)境的軟盤。對于本例來講,想要執(zhí)行AMD官方測試軟件Maxpower64,只要將Maxpower64這個可執(zhí)行文件復(fù)制到 /bin目錄就可以了。我們可以在“使用BusyBox制作常用命令“這個階段來完成它.
# cp Maxpower64 /floppy-Linux/bin
這張軟盤會自激活到linux環(huán)境下,并顯示“#”命令提示符,我們只要執(zhí)行Maxpower64就可以了。
#/bin/Maxpower64
如果希望系統(tǒng)一開機(jī)就直接執(zhí)行Maxpower64,則需要在“編輯有關(guān)的 shell script”這個階段編輯rc.sysinit文件為:
#!/bin/sh
mount –a
/bin/Maxpower64
這樣軟盤引導(dǎo)進(jìn)入linux后會直接執(zhí)行Maxpower64而不再顯示“#”命令提示符。
小結(jié)
除了以上的方法,我們也可以通過引導(dǎo)器給內(nèi)核傳遞參數(shù)來實(shí)現(xiàn)內(nèi)核和根文件系統(tǒng)分別放置在不同的軟盤上,這樣內(nèi)核就可以再大一些,支持的功能也就越多??傊谱饕粡埌⌒蚻inux的軟盤并不困難,關(guān)鍵是要細(xì)心和耐心,此外最好能夠了解BusyBox和RAMDISK的工作原理,這對于更好的完善系統(tǒng)是有很大幫助的。