超級DIY 製作執行在記憶體中的Linux系統

2021-09-05 21:30:28 字數 3775 閱讀 1388

一般情況下,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...