操作系統(tǒng):SlackWare12,內(nèi)核版本:2.6.21.5-smp
1.創(chuàng)建一個空間比較大的Ramdisk
#dd if=/dev/zero of=/tmp/ramdisk bs=1k count=92160
#losetup /dev/loop2 /tmp/ramdisk
#mkfs.ext2 /dev/loop2
#mount -t ext2 /dev/loop2 /mnt
可以向/mnt下寫東西了,然后
#umount /mnt
以后修改時,可以這樣用
#gunzip ramdisk.gz //將initrd解壓
#mount -o loop ramdisk /mnt //掛載
... ... //修改其中的內(nèi)容
#gzip -9 ramdisk //重新壓縮
2.用busybox生成文件系統(tǒng)中必備的命令
下載一個比較新的busybox,首先需要修改源代碼,否則會在編譯時出現(xiàn)因未采用uclibc編譯而產(chǎn)生的錯誤。打開applets/applets.c文件,注釋掉“
#if ENABLE_STATIC && defined(__GLIBC__) && !defined(__UCLIBC__)
#warning Static linking against glibc produces buggy executables
#warning (glibc does not cope well with ld --gc-sections).
#warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
#warning Note that glibc is unsuitable for static linking anyway.
#warning If you still want to do it, remove -Wl,--gc-sections
#warning from top-level Makefile and remove this warning.
#endif”這段代碼。
執(zhí)行#make menuconfig,根據(jù)網(wǎng)上的文章所說,主要需要注意兩個地方,一是選中“將busybox編譯成靜態(tài)連接的可執(zhí)行文件”,二是選中“不使用系統(tǒng)的usr目錄”,另外還要留意一下,選中的默認SHELL是什么。然后執(zhí)行make命令,就會在_install目錄下生成一些文件,將它們拷貝到ramdisk中待用。
3.添加或修改dev和etc下的文件
在ramdisk下,
mkdir dev etc root usr var tmp proc mnt
先說說dev的,
可以將編譯環(huán)境的dev下所有文件拷貝過去,#cp -a /dev/* ramdisk/dev ;也可以采用busybox/examples/bootfloppy下的mkdevs.sh腳本生成設備文件。
再說說etc下的文件,這個比較麻煩,我現(xiàn)在也沒完全弄清楚,呵呵。我當前的辦法是——將編譯環(huán)境的etc下所有文件整體拷貝過去,然后用busybox/example/下的inittab覆蓋ramdisk/etc下的inittab文件。這個新的inittab文件忽略了runlevel,也不需要用戶登陸的用戶名和密碼,只需要一個rcS腳本(在busybox/examples/bootfloppy/etc中)。修改/etc/fstab內(nèi)容,改為:
|
4.改寫lilo
在lilo.conf中添加
image = /boot/vmlinuz
initrd=/boot/test_kern/ramdisk.gz
label = test
append="mem=600M ramdisk=92160 root=/dev/ram0 rw"
執(zhí)行#lilo -v -C /etc/lilo.conf -s /boot
至此,Ramdisk制作完成,具備基本運行環(huán)境,加載網(wǎng)卡驅動后能連接網(wǎng)絡,但是還不能ssh登陸。
5.考慮添加一些應用程序,比如ssh等
我現(xiàn)在的做法是,將sshd,ssh等命令和etc下的相關文件拷貝過來,缺少的庫用執(zhí)行l(wèi)dd的方法查看,然后拷貝到lib下,dev下還有random和unrandom文件要拷貝,還有var下需要建立empty和run目錄。
起初,在Ramdisk 上運行的系統(tǒng)上執(zhí)行/etc/rc.d/rc.sshd start時提示“privilege separation user sshd does not exist”。問題原因是uid未知(etc的所有文件是從原編譯環(huán)境拷貝的),執(zhí)行passwd命令時會發(fā)生錯誤,提示“unknown uid 0”。解決辦法是添加lib文件
libnss_compat.so.2
libnsl.so.1
libnss_nis.so.2
libnss_files.so.2
我又添加了bash等程序,這樣/lib下有以下這些文件:
|