• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0
            Initrd啟動(dòng)及功能分析 

            Initrd這個(gè)設(shè)計(jì)的初衷是用來(lái)加載額外內(nèi)核模塊供啟動(dòng)的??梢詤⒖?內(nèi)核文檔 Documentation/initrd.txt。 
            在加載完內(nèi)核后,如果存在initrd,則會(huì)執(zhí)行 initrd 里的 /init。(文檔里說(shuō)的是/linuxrc,在 init/do_mounts_initrd.c 里也是這個(gè),在 init/main.c 里是 /init,具體待考。) 

            進(jìn)入主題:簡(jiǎn)單說(shuō)來(lái),initrd 主要功能就一個(gè):找到根分區(qū),把權(quán)力交給主系統(tǒng)。 
            要完成這個(gè)功能,涉及的功能主要有: 
            1.有基本的程序運(yùn)行環(huán)境 
            2.檢測(cè)存儲(chǔ)設(shè)備,創(chuàng)建設(shè)備節(jié)點(diǎn) 
            3.檢測(cè)文件系統(tǒng),掛載根文件系統(tǒng) 
            4.將權(quán)力交給主系統(tǒng)的init 

            一.基本的程序運(yùn)行環(huán)境 
            initrd 主要有兩種格式: 
            1. 傳統(tǒng)的 ramdisk 
            這種格式的好處是還可以返回到 initrd,進(jìn)行些后繼的處理。 
            缺點(diǎn)是需要內(nèi)核的文件系統(tǒng)支持,通常會(huì)用 ext2,且更改較為麻煩。 
            制作方法: 
            dd if=/dev/zero of=initrd bs=1M count=8 
            mkfs.ext2 -f -m 0 initrd 
            mount -o loop initrd /path/to/ 
            在/path/to建立好initrd的系統(tǒng)后 
            umount /path/to 
            gzip initrd 

            2. cpio 格式 
            這種格式的好處是內(nèi)核原生不需要額外的文件系統(tǒng)支持,制作也比較容易。 
            制作方法: 
            cd /path/to 
            find . |cpio -o -H newc |gzip -c > ../initrd.gz 

            如果沒(méi)有特別的需要,通常使用cpio格式。 

            找到根文件系統(tǒng)的任務(wù)通常是用shell腳本來(lái)完成,主要原因是: 
            1.體積所限,通常initrd不會(huì)做很大,因?yàn)樗δ芎苊鞔_單一 
            2.方便修改,針對(duì)不同硬件/系統(tǒng)通常會(huì)做一定更改,編譯型語(yǔ)言更改起來(lái)較麻煩 

            通常使用的shell有busybox的ash,klibc的sh等。 
            busybox提供很多功能,可根據(jù)自己的需要編譯,因?yàn)橐С謚dev等,所以推薦編譯成動(dòng)態(tài)鏈接的。 
            klibc是專門(mén)設(shè)計(jì)為小巧的libc,它自帶了一些程序,體積很小巧,功能相對(duì)busybox提供的不會(huì)那么多。 
            還有相關(guān)的程序。對(duì)于很單一的應(yīng)用用它是合適的,如果想在initrd里實(shí)現(xiàn)較復(fù)雜功能,使用klibc會(huì)顯得有些捉襟見(jiàn)肘。
            對(duì)于動(dòng)態(tài)鏈接的程序,需要把相應(yīng)的庫(kù)和 helper 放進(jìn)系統(tǒng)中??捎胠dd實(shí)現(xiàn)這個(gè)功能,如: 
            $ ldd /bin/busybox 
            linux-gate.so.1 => (0xffffe000) 
            libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7f30000) 
            libm.so.6 => /lib/libm.so.6 (0xb7f0b000) 
            libc.so.6 => /lib/libc.so.6 (0xb7de1000) 
            /lib/ld-linux.so.2 (0xb7f73000) 
            我們也提供了一個(gè)程序來(lái)自動(dòng)完成這個(gè)工作,見(jiàn)文后參考。 
            對(duì)于klibc的,一般會(huì)有個(gè)庫(kù)文件,例如 /usr/lib/klibc/lib/klibc-KC4v-FjcUUw8mDjRL-kY8PS8U3E.so 
            將此文件放在相對(duì)initrd的根目錄的 /lib 目錄下即可。 

            需要的設(shè)備有: 
            mknod dev/console c 5 1 
            mknod dev/null c 1 3 
            # 如果為ramdisk,最好創(chuàng)建它 
            mknod dev/ram0 c 1 0 

            二.檢測(cè)存儲(chǔ)設(shè)備 
            早先有 devfs hotplug等來(lái)檢測(cè),或是靜態(tài)創(chuàng)建加載模塊以支持存儲(chǔ)設(shè)備如硬盤(pán),光盤(pán)等。 
            udev的出現(xiàn)使這個(gè)過(guò)程轉(zhuǎn)移到用戶空間,靈活性大大增強(qiáng),使這個(gè)過(guò)程能自動(dòng)完成。 
            對(duì)于新版的 udev (大概是>098),完成這一過(guò)程只需寫(xiě)好相應(yīng)的規(guī)則,有相應(yīng)的模塊,執(zhí)行以下命令即可自動(dòng)加載模塊并創(chuàng)建相應(yīng)的設(shè)備節(jié)點(diǎn): 
            # 掛載所需文件系統(tǒng) 
            mount -t proc none /proc 
            mount -t sysfs none /sys 
            mount -t tmpfs -o size=10M none /dev 
            # 關(guān)閉內(nèi)核消息打印 
            echo '0' > /proc/sys/kernel/printk 
            # 一些連接 
            ln -sf /proc/self/fd /dev/fd 
            ln -sf /proc/self/fd/0 /dev/stdin 
            ln -sf /proc/self/fd/1 /dev/stdout 
            ln -sf /proc/self/fd/2 /dev/stderr 
            ln -sf /proc/kcore /dev/core 
            # 啟動(dòng) udev 
            /sbin/udevd --daemon 
            /sbin/udevtrigger 
            /sbin/udevsettle 

            三.檢測(cè)文件系統(tǒng) 
            由于各系統(tǒng)和內(nèi)核的不同,掛載文件系統(tǒng)有時(shí)不像我們平時(shí)使用的那樣,會(huì)自動(dòng)探測(cè),可以使用udev或blkid來(lái)識(shí)別: 
            udev的方法: 
            # /lib/udev/vol_id -t /dev/hda5 
            xfs 
            blkid的方法: 
            # blkid 
            /dev/hda1: TYPE="ntfs" 
            /dev/hda5: LABEL="Gentoo" UUID="78460951-666e-4d29-9d9b-85e9a9b16b62" TYPE="xfs" 
            /dev/hda6: TYPE="ntfs" 
            /dev/hda8: UUID="c51d3bb4-caee-4150-ae22-7d5931db31f5" LABEL="ROOT" TYPE="reiserfs" 
            /dev/hda9: LABEL="Home" UUID="89b31278-b2a3-4626-99c5-e6ca77fe60f0" TYPE="xfs" 
            /dev/hda7: LABEL="swap" UUID="8686fb94-560c-4c87-97dd-c5f97bbb6c78" TYPE="swap" 

            另外,我們也可以使用UUID或者LABEL的方式來(lái)掛載文件系統(tǒng), 
            mount -U 
            mount -L 

            四.交權(quán)給主系統(tǒng)的init 
            實(shí)現(xiàn)方法主要有 pivot_root 和 switch_root與 run-init。 
            在這之前需要對(duì)之前掛載的虛擬文件系統(tǒng)與dev轉(zhuǎn)移到主系統(tǒng)。 
            mount --move /dev /root/dev 
            mount --move /proc /root/proc 
            mount --move /sys /root/sys 

            1.pivot_root 
            傳統(tǒng)的做法是用 pivot_root,然而 pivot_root不會(huì)自動(dòng)處理很多工作,如釋放initrd所有的內(nèi)存,執(zhí)行主系統(tǒng)的init。 
            使用方法如下: 
            cd /root 
            mkdir -p initrd 
            pivot_root . initrd 
            # 注意 /root 要是合法的設(shè)備掛載上的 如 /dev/sda1,如果不是這樣,將可能出現(xiàn)錯(cuò)誤。 
            # 目標(biāo)目錄也需要存在,其它參閱man page 
            exec chroot . sh -c 'umount /initrd; exec /sbin/init' dev/console 2>&1 
            # 如果不需要清理,也可簡(jiǎn)單的運(yùn)行 
            exec chroot . /sbin/init 

            2.switch_root/run-init 
            這兩者差別不大,前者是busybox提供的,后者是klibc的。有點(diǎn)區(qū)別的是后者可接受 - 開(kāi)頭的參數(shù)。 
            用法: 
            cd /root 
            exec switch_root . /sbin/init 
            或 
            exec run-init . /sbin/init --debug 

            至此,initrd的使命完成。 
            轉(zhuǎn)自:
            posted on 2009-11-19 16:54 chatler 閱讀(336) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux_SysAdmin
            <2009年12月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺(jué)這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺(jué)得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久精品免费网站网| 亚洲中文久久精品无码ww16| 18岁日韩内射颜射午夜久久成人| 伊人久久大香线蕉AV一区二区| 青青热久久国产久精品 | 国产成人精品久久| 久久人人爽人人爽人人AV| 国产精品久久久久天天影视| 国产精品亚洲美女久久久| 久久亚洲sm情趣捆绑调教| AV无码久久久久不卡网站下载| 国产ww久久久久久久久久| 狠狠精品久久久无码中文字幕 | 97久久综合精品久久久综合| 狠狠精品干练久久久无码中文字幕 | 久久国产免费直播| 91久久九九无码成人网站| 日韩十八禁一区二区久久| 狠狠色丁香久久婷婷综合五月| 久久强奷乱码老熟女网站| 91精品国产综合久久精品| 日本加勒比久久精品| 久久精品www人人爽人人| 久久综合久久综合亚洲| 伊人丁香狠狠色综合久久| 久久人人爽人人爽人人AV东京热 | 久久久无码精品亚洲日韩京东传媒 | 国产精品美女久久久m| 人妻无码精品久久亚瑟影视| 99久久精品国产一区二区三区| 中文字幕久久波多野结衣av| 狠狠色伊人久久精品综合网 | 久久亚洲精品人成综合网| 国产伊人久久| 777久久精品一区二区三区无码| 久久久老熟女一区二区三区| 国内精品人妻无码久久久影院导航| 久久久久一本毛久久久| 久久久久亚洲?V成人无码| 国产精品99久久久久久猫咪| 99久久无码一区人妻|