1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      超級DIY:制作運行在內(nèi)存中的Linux系統(tǒng)

      更新時間: 2008-02-19 09:05:15來源: 粵嵌教育瀏覽量:607

         一般情況下,linux系統(tǒng)啟動過程是,寫在MBR上的bootloader加載內(nèi)核,然后加載初啟環(huán)境,即initrd;在initrd中,一般有個叫init或linuxrc的腳本(或ELF文件),該進程啟動后,會先讀取/etc/inittab下的內(nèi)容,這是一個初始化表,用以確定執(zhí)行/etc/rc.d下的哪個RC腳本,RC腳本執(zhí)行完畢后,文件系統(tǒng)基本上就得到所有的硬件信息了,進而加載真正的根分區(qū)。現(xiàn)在要做的是——將initrd作為根分區(qū),這樣,要做的事情主要有四點:1.創(chuàng)建一個空間比較大的Ramdisk ,2.用busybox生成文件系統(tǒng)中必備的命令,用它的主要原因是占用空間小,3.添加或修改dev和etc下的文件,4.考慮添加一些應用程序,比如ssh等。

       

      操作系統(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)容,改為:

       

       

      /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

      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下有以下這些文件:

       

       

      -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/

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 日韩AV一在线不卡免费 | 中出国产丝袜熟女 | 综合久久久综合欧美98 | 在线观看网站深夜网址 | 日韩AV激情在线观看 | 一本到在线观看视频 |