一般情況下,linux系統啟 動過程是,寫在mbr上的bootloader載入核心,然後載入初啟環境,即initrd;在initrd中,一般有個叫init或linuxrc的腳 本(或elf檔案),該程序啟動後,會先讀取/etc/inittab下的內容,這是乙個初始化表,用以確定執行/etc/rc.d下的哪個rc腳 本,rc指令碼執行完畢後,檔案系統基本上就得到所有的硬體資訊了,進而載入真正的根分割槽。現在要做的是——將initrd作為根分割槽,這樣,要做的事情主 要有四點:1.建立乙個空間比較大的ramdisk ,2.用busybox生成檔案系統中必備的命令,用它的主要原因是占用空間小,3.新增或修改dev和etc下的檔案,4.考慮新增一些應用程式,比如 ssh等。
作業系統:slackware12,核心版本:2.6.21.5-smp
1.建立乙個空間比較大的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 //掛載
... ... //修改其中的內容
#gzip -9 ramdisk //重新壓縮
2.用busybox生成檔案系統中必備的命令
#endif」這段**。
執行#make menuconfig,根據網上的文章所說,主要需要注意兩個地方,一是選中「將busybox編譯成靜態連線的可執行檔案」,二是選中「不使用系統的 usr目錄」,另外還要留意一下,選中的預設shell是什麼。然後執行make命令,就會在_install目錄下生成一些檔案,將它們拷貝到 ramdisk中待用。
3.新增或修改dev和etc下的檔案
在ramdisk下,
mkdir dev etc root usr var tmp proc mnt
先說說dev的,
可以將編譯環境的dev下所有檔案拷貝過去,#cp -a /dev/* ramdisk/dev ;也可以採用busybox/examples/bootfloppy下的mkdevs.sh指令碼生成裝置檔案。
再說說etc下的檔案,這個比較麻煩,我現在也沒完全弄清楚,呵呵。我當前的辦法是——將編 譯環境的etc下所有檔案整體拷貝過去,然後用busybox/example/下的inittab覆蓋ramdisk/etc下的inittab檔案。 這個新的inittab檔案忽略了runlevel,也不需要使用者登陸的使用者名稱和密碼,只需要乙個rcs指令碼(在busybox/examples /bootfloppy/etc中)。修改/etc/fstab內容,改為:
/dev/ram0 / ext3 defaults 1 1 devpts /dev/pts devpts gid=5,mode=620 0 0 proc /proc proc defaults 0 0
4.改寫lilo
在lilo.conf中新增
image = /boot/vmlinuz
initrd=/boot/test_kern/ramdisk.gz
label = test
執行#lilo -v -c /etc/lilo.conf -s /boot
至此,ramdisk製作完成,具備基本執行環境,載入網絡卡驅動後能連線網路,但是還不能ssh登陸。
5.考慮新增一些應用程式,比如ssh等
我現在的做法是,將sshd,ssh等命令和etc下的相關檔案拷貝過來,缺少的庫用執行ldd的方法檢視,然後拷貝到lib下,dev下還有random和unrandom檔案要拷貝,還有var下需要建立empty和run目錄。
起初,在ramdisk 上執行的系統上執行/etc/rc.d/rc.sshd start時提示「privilege separation user sshd does not exist」。問題原因是uid未知(etc的所有檔案是從原編譯環境拷貝的),執行passwd命令時會發生錯誤,提示「unknown uid 0」。解決辦法是新增lib檔案
libnss_compat.so.2
libnsl.so.1
libnss_nis.so.2
libnss_files.so.2
我又新增了bash等程式,這樣/lib下有以下這些檔案:
-rwxr-xr-x 1 root root 131484 2008-01-25 10:15 ld-linux.so.2* -rwxr-xr-x 1 root root 23512 2008-01-25 10:14 libacl.so.1* -rwxr-xr-x 1 root root 12324 2008-01-25 10:15 libattr.so.1* -rwxr-xr-x 1 root root 1528742 2008-01-28 10:33 libc.so.6* -rwxr-xr-x 1 root root 25250 2008-01-28 10:33 libcrypt.so.1* -rwxr-xr-x 1 root root 13506 2008-01-28 10:33 libdl.so.2* -rwxr-xr-x 1 root root 96480 2008-01-28 19:09 libnsl.so.1* -rwxr-xr-x 1 root root 35494 2008-01-28 19:09 libnss_compat.so.2* -rwxr-xr-x 1 root root 45552 2008-01-28 19:10 libnss_files.so.2* -rwxr-xr-x 1 root root 41045 2008-01-28 19:10 libnss_nis.so.2* -rwxr-xr-x 1 root root 110796 2008-01-25 10:14 libpthread.so.0* -rwxr-xr-x 1 root root 77439 2008-01-28 10:30 libresolv.so.2* -rwxr-xr-x 1 root root 34905 2008-01-25 10:13 librt.so.1* -rwxr-xr-x 1 root root 10280 2008-01-25 12:38 libtermcap.so.2* -rwxr-xr-x 1 root root 12537 2008-01-28 10:31 libutil.so.1* drwxr-xr-x 3 root root 1024 2008-01-28 10:37 modules/
程序在記憶體中的執行情況
一,程序在記憶體中的總結 上圖並不代表記憶體分布位址次序 1,區,存放程式的二進位制 2,常量區,他的生命週期和會從初始化開始到程式結束。例如,char str hello world 字串就存放在常量區。如下程式可以正常輸出 char fun char p hello word return p ...
linux下C可執行檔案在記憶體中的分配
c原始檔各部分內容與可執行檔案的對映關係 c可執行檔案與記憶體的對映關係 bss段 bss段 bss segment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。資料段 資料段 data s...
Java成員變數的初始化和在記憶體中的執行機制
一 成員變數介紹 成員變數包括 例項變數 不以static修飾 和類變數 以static修飾 二成員變數的初始化和執行機制 1 片段 class person public string name public static int eyenum person p1 new person a per...