欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
詳解linux內存磁盤(pán)初始化技術(shù)

詳解linux內存磁盤(pán)初始化技術(shù)

(2006-09-26 19:55:53)
標簽:

雜談

linux內存初始化技術(shù)(initrd)用于支持兩階段的系統引導過(guò)程,是在系統啟動(dòng)過(guò)程中被掛載的臨時(shí)root文件系統(譯者注:這里的root文件系統是指的根文件系統)。initrd包含很多可執行程序和驅動(dòng),并允許在臨時(shí)的內存磁盤(pán)根文件系統被卸載,內存被釋放后掛載真實(shí)的root文件系統。在許多嵌入式linux文件系統中,initrd是最終的根文件系統。這篇文章主要講解了linux2.6內核的initrd技術(shù),包括在內核中的創(chuàng )建及使用。

1 什么是內存磁盤(pán)初始化?
initrd掛載優(yōu)先級高于真實(shí)根文件系統,它被邦定在內核上,做為內核啟動(dòng)過(guò)程的一部分被加載(load)。然后,做為兩階段引導過(guò)程的第一部分,內核掛載(mount)initrd,用于獲得并加載真實(shí)有效的文件系統。
為了達到這個(gè)目的,initrd包含有最起碼的目錄與程序,例如insmod,來(lái)安裝內核模塊到內核中。
對于桌面或服務(wù)器linux,initrd是臨時(shí)文件系統,它的生存周期很短,僅僅是做為到達真實(shí)根文件系統的橋梁。但對于沒(méi)有存儲設備的嵌入式系統來(lái)說(shuō),它才是永久性的根文件系統。本篇文章對這兩方面均有涉及。

2 深入分析initrd
initrd包含有必須的程序和系統文件,用于支持系統的啟動(dòng)的第二階段過(guò)程。創(chuàng )建初始化內存的方法,是隨著(zhù)你所使用的系統版本而改變的。從Fedora Core3以后,initrd就由回送設備(loop device)建立。什么是回送設備?它是一個(gè)設備驅動(dòng),允許你將一個(gè)文件掛載為塊設備,并對其文件系統做出描述。也許loop device并不存在與你的內核中,但是你能夠通過(guò)內核的配置工具(make menuconfig)打開(kāi)它。路徑是:Device Drivers-》Block Devices-》LoopBack Device support。下面為檢查命令:
# mkdir temp ; cd temp
# cp /boot/initrd.img.gz .
# gunzip initrd.img.gz
# mount -t ext -o loop initrd.img /mnt/initrd
# ls -la /mnt/initrd
#
現在,你可以通過(guò)查看/mnt/initrd的子目錄來(lái)查看initrd的內容。需要注意的是,即使你的initrd鏡像文件并不是以.gz做為后綴名,但是你同樣可以通過(guò)增加此后綴名來(lái)讓gunzip打開(kāi)它。
從Fedora Core3開(kāi)始,默認的initrd鏡像就是一個(gè)壓縮的gpio歸檔文件。除了用掛載文件的方式以外,你同樣可以通過(guò)cpio歸檔的方式來(lái)將其掛載成使用了回送設備的壓縮鏡像。你可以通過(guò)以下的指令來(lái)檢查這個(gè)cpio歸檔文件的內容:
# mkdir temp ; cd temp
# cp /boot/initrd-2.6.14.2.img initrd-2.6.14.2.img.gz
# gunzip initrd-2.6.14.2.img.gz
# cpio -i --make-directories < initrd-2.6.14.2.img
你看到的結果將是一個(gè)小型根文件系統,如下所示:

# ls -la
#
drwxr-xr-x 10 root root 4096 May 7 02:48 .
drwxr-x--- 15 root root 4096 May 7 00:54 ..
drwxr-xr-x 2 root root 4096 May 7 02:48 bin
drwxr-xr-x 2 root root 4096 May 7 02:48 dev
drwxr-xr-x 4 root root 4096 May 7 02:48 etc
-rwxr-xr-x 1 root root 812 May 7 02:48 init
-rw-r--r-- 1 root root 1723392 May 7 02:45 initrd-2.6.14.2.img
drwxr-xr-x 2 root root 4096 May 7 02:48 lib
drwxr-xr-x 2 root root 4096 May 7 02:48 loopfs
drwxr-xr-x 2 root root 4096 May 7 02:48 proc
lrwxrwxrwx 1 root root 3 May 7 02:48 sbin -> bin
drwxr-xr-x 2 root root 4096 May 7 02:48 sys
drwxr-xr-x 2 root root 4096 May 7 02:48 sysroot
#

一些小的,但是很有必要的程序組合能在./bin目錄下得到,包括nash(它不是一個(gè)shell,而是一個(gè)腳本解釋工具),用于加載內核模塊的insmod,以及l(fā)vm等。
上面所示目錄中,相對比較有趣的是root目錄下的初始化文件。這些文件,和傳統的linux啟動(dòng)過(guò)程中一樣,是在initrd鏡像被解壓縮到RAM中時(shí)生成的。待會(huì )我們將繼續探討這個(gè)問(wèn)題。

3 創(chuàng )建initrd的工具。
現在,讓我們回到一開(kāi)始的討論:initrd的鏡像是如何被創(chuàng )建的?在傳統的linux系統中,initrd是在linux build的時(shí)候被創(chuàng )建的。像mkinitrd這樣的許許多多的工具,都能夠用于通過(guò)必須的庫和模塊來(lái)自動(dòng)構建一個(gè)用于過(guò)渡到真實(shí)根文件系統的initrd。事實(shí)上,mkinitrd工具是一個(gè)腳本文件,因此,我們能夠很清楚得看到,這個(gè)過(guò)程是如何進(jìn)行的。同樣的,YAIRD (Yet Another Mkinitrd)工具,也允許我們自定制每一個(gè)initrd被構建的階段。

4 自己動(dòng)手,打造自定義的初始化內存盤(pán)
由于很多基于linux的嵌入式系統都沒(méi)有硬盤(pán)驅動(dòng)器,initrd也可以做為永久性的根文件系統。下面我就將告訴你們,如何創(chuàng )建一個(gè)initrd鏡像。我使用的是標準linux桌面系統,因此大家即使沒(méi)有嵌入式目標設備也可以照著(zhù)做。除了交叉編譯以外,嵌入式目標文件的構建過(guò)程是相同的。

#!/bin/bash

# Housekeeping...
rm -f /tmp/ramdisk.img
rm -f /tmp/ramdisk.img.gz

# Ramdisk Constants
RDSIZE=4000
BLKSIZE=1024

# Create an empty ramdisk image
dd if=/dev/zero of=/tmp/ramdisk.img bs=$BLKSIZE count=$RDSIZE

# Make it an ext2 mountable file system
/sbin/mke2fs -F -m 0 -b $BLKSIZE /tmp/ramdisk.img $RDSIZE

# Mount it so that we can populate
mount /tmp/ramdisk.img /mnt/initrd -t ext2 -o loop=/dev/loop0

# Populate the filesystem (subdirectories)
mkdir /mnt/initrd/bin
mkdir /mnt/initrd/sys
mkdir /mnt/initrd/dev
mkdir /mnt/initrd/proc

# Grab busybox and create the symbolic links
pushd /mnt/initrd/bin
cp /usr/local/src/busybox-1.1.1/busybox .
ln -s busybox ash
ln -s busybox mount
ln -s busybox echo
ln -s busybox ls
ln -s busybox cat
ln -s busybox ps
ln -s busybox dmesg
ln -s busybox sysctl
popd

# Grab the necessary dev files
cp -a /dev/console /mnt/initrd/dev
cp -a /dev/ramdisk /mnt/initrd/dev
cp -a /dev/ram0 /mnt/initrd/dev
cp -a /dev/null /mnt/initrd/dev
cp -a /dev/tty1 /mnt/initrd/dev
cp -a /dev/tty2 /mnt/initrd/dev

# Equate sbin with bin
pushd /mnt/initrd
ln -s bin sbin
popd

# Create the init file
cat >> /mnt/initrd/linuxrc << EOF
#!/bin/ash
echo
echo "Simple initrd is active"
echo
mount -t proc /proc /proc
mount -t sysfs none /sys
/bin/ash --login
EOF

chmod +x /mnt/initrd/linuxrc

# Finish up...
umount /mnt/initrd
gzip -9 /tmp/ramdisk.img
cp /tmp/ramdisk.img.gz /boot/ramdisk.img.gz

想創(chuàng )建initrd的話(huà),你需要首先創(chuàng )建一個(gè)空文件,將/dev/zero(0字符流)做為ramdisk.img的輸入。得到的文件大小大約是4MB(有4000個(gè)1K的塊組成)。接下來(lái),用mke2fs命令來(lái)創(chuàng )建一個(gè)使用這個(gè)空文件的ext2文件系統?,F在,這個(gè)文件就是一個(gè)ext2文件系統。ok,接下來(lái),以回路設備的形式掛載這個(gè)文件到/mnt/initrd,現在,你就在掛載點(diǎn)擁有一個(gè)代表著(zhù)ext2文件系統的目錄,并用與存放你的initrd。其他大多數的腳本語(yǔ)句都是用于實(shí)現這個(gè)功能。
下一步,就是創(chuàng )建一些必須的子目錄,用于生成你的根文件系統: /bin, /sys, /dev, 和 /pro。這里只需要少數幾個(gè)目錄,例如,沒(méi)有/lib。但是它們已經(jīng)包含了大部分功能。
如果想讓你的根文件系統發(fā)揮更大的作用,請使用 BusyBox。這個(gè)工具是一個(gè)包含了許多獨立工具的鏡像,這些獨立的工具你都能在linux中找到( ash, a等等wk, sed, insmod)。BusyBox的優(yōu)勢在于,它把它們集合在了一起,并分享了公用的部分,從而極大縮小了鏡像的體積。這對于嵌入式系統來(lái)講,是非常理想的。請將BustBox鏡像從它的源目錄中復制出來(lái),到你的/bin目錄下,這樣,很多指向BusyBox工具集的符號鏈接將被創(chuàng )建,BusyBox能確定哪一個(gè)工具將被使用,并自動(dòng)引用它。這個(gè)/bin目錄下被創(chuàng )建的鏈接的小型集合將用于對啟動(dòng)腳本的支持。
再下一步,就是一小部分特殊設備文件的創(chuàng )建。我從我的/dev文件夾中直接拷貝了出來(lái),別忘了加上-a選項來(lái)保持它們原有的屬性。
倒數第二步,就是生成linuxrc文件。在內核掛載了內存盤(pán)之后,它將搜索并執行相關(guān)的啟動(dòng)文件,如果沒(méi)有找到,內核就將linuxrc文件做為其啟動(dòng)腳本。你最好在這個(gè)文件中對環(huán)境變量做一些基本設置,例如掛載/proc文件系統等。除了/proc外,我還掛載了/sys文件系統,將消息發(fā)送給終端。最后,我調用ash并通過(guò)它和根文件系統交互。最后記住,用chmod把linuxrc文件的屬性改為可執行。
最后,你的根文件系統算是ok了?,F在它并沒(méi)有被掛載,用gzip將它壓縮,并將壓縮后的文件ramdisk.img.gz拷貝到/boot目錄下,這樣它就能被GRUB調用。
想要構建你的初始化ram盤(pán)的話(huà),你只需要調用mkird,鏡像就將自動(dòng)創(chuàng )建并拷貝到/boot目錄下。

5 測試自定義的初始化RAM盤(pán)。
你擁有的新的initrd鏡像是在/boot目錄下,因此,下一步就是要用你默認的內核來(lái)測試它。ok,現在你可以先重新啟動(dòng)你的linux系統,當GRUB引導畫(huà)面出現時(shí),按下C鍵,打開(kāi)GRUB的命令行工具?,F在,你就能通過(guò)GRUB確定啟動(dòng)專(zhuān)門(mén)的內核和initrd鏡像。內核命令是允許你定制內核文件的,而initrd命令則允許你指定專(zhuān)門(mén)的initrd鏡像文件。當它們都被指定之后,通過(guò)啟動(dòng)命令來(lái)啟動(dòng)內核,如下所示:

GNU GRUB version 0.95 (638K lower / 97216K upper memory)

[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ESC at any time exits.]

grub> kernel /bzImage-2.6.1
[Linux-bzImage, setup=0x1400, size=0x29672e]

grub> initrd /ramdisk.img.gz
[Linux-initrd @ 0x5f2a000, 0xb5108 bytes]

grub> boot

Uncompressing Linux... OK, booting the kernel.

在內核啟動(dòng)之后,它開(kāi)始檢查initrd鏡像是否可用,如果答案是確定的,那么就作為根文件系統加載并掛載它。下面就是這個(gè)特殊啟動(dòng)過(guò)程的結尾:

...
md: Autodetecting RAID arrays
md: autorun
md: ... autorun DONE.
RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 file system).
Freeing unused kernel memory: 208k freed
/ $ ls
bin etc linuxrc proc sys
dev lib lost+found sbin
/ $ cat /proc/1/cmdline
/bin/ash/linuxrc
/ $ cd bin
/bin $ ls
ash cat echo mount sysctl
busybox dmesg ls ps
/bin $ touch zfile
/bin $ ls
ash cat echo mount sysctl
busybox dmesg ls ps zfile

當啟動(dòng)之后,可以通過(guò)ash來(lái)進(jìn)入命令模式。在本例中,我探究了根文件系統并向你演示了,你能通過(guò)新建文件來(lái)寫(xiě)入這個(gè)文件系統。只需要注意,第一步是要創(chuàng )建linuxrc。

6 通過(guò)初始化內存盤(pán)啟動(dòng)
現在,大家已經(jīng)看到了如何構建并使用一個(gè)自定制的初始化內存盤(pán),這一節則用于介紹,內核是如何辨認initrd并將其作為它的根文件系統掛載的。我將涉及一些boot chain中的主要的函數并對發(fā)生的事件做出解釋。
像GRUB這樣的boot loader,通常會(huì )確認即將加載的內核并復制該內核鏡像與任何相關(guān)聯(lián)的initrd到內存中,你可以在你linux內核源程序目錄下的./init子目錄中找到這些功能實(shí)現。
在內核與initrd鏡像被解壓縮和復制到內存后,內核被調用。此時(shí),開(kāi)始各種各樣的初始化過(guò)程,最終,你會(huì )發(fā)現自己處于init/main.c:init() (subdir/file:function)。這個(gè)函數實(shí)現了很多的子系統初始化。在這里,要調用init/do_mounts.c:prepare_namespace(),用來(lái)準備命名空間(掛載dev 文件系統, RAID, 或者md, devices, 以及, 最后的initrd)。通過(guò)對 init/do_mounts_initrd.c:initrd_load()的調用,最終完成對initrd的加載。
initrd_load()調用init/do_mounts_rd.c:rd_load_image(),來(lái)決定是否通過(guò)調用init/do_mounts_rd.c:identify_ramdisk_image()來(lái)加載內存盤(pán)鏡像。后面這個(gè)函數通過(guò)檢查內核的編號來(lái)確定文件究竟是是minux,etc2,romfs,cramfs,還是gzip格式,直到返回initrd_load_image后,init/do_mounts_rd:crd_load()又被調用。這個(gè)函數負責分配空間給內存盤(pán),并進(jìn)行校驗計算,解壓縮,最后將內存盤(pán)鏡像加載到內存中。此時(shí),你就已經(jīng)擁有了一個(gè)適合于掛載的,在塊設備中的initrd鏡像。
現在,通過(guò)調用init/do_mounts.c:mount_root()將這個(gè)塊設備做為root掛載。ok,根設備就被創(chuàng )建了,接下來(lái)調用的函數是init/do_mounts.c:mount_block_root(),此函數又調用fs/namespace.c:sys_mount()來(lái)掛載真實(shí)的根文件系統并對其進(jìn)行chdir操作。
最后,會(huì )返回到啟動(dòng)函數中,并調用init/main.c:run_init_process。調用的結果是,初始化進(jìn)程開(kāi)始(在這里是通過(guò)/linuxrc)。linuxrc可以是一個(gè)可執行程序,也可以是腳本(只要腳本解釋器能夠正常解釋它)。
函數調用的層次關(guān)系可以從下表中看出。并不是所有與復制、掛載初始化內存盤(pán)的函數都被列舉出來(lái),這里僅僅是大概的,對整體基本流程的回顧:
init/main.c:init
init/do_mounts.c:prepare_namespace
init/do_mounts_initrd.c:initrd_load
init/do_mounts_rd.c:rd_load_image
init/do_mounts_rd.c:identify_ramdisk_image
init/do_mounts_rd.c:crd_load
lib/inflate.c:gunzip
init/do_mounts.c:mount_root
init/do_mounts.c:mount_block_root
init/do_mounts.c:do_mount_root
fs/namespace.c:sys_mount
init/main.c:run_init_process
execve

7 無(wú)盤(pán)啟動(dòng)的應用
同很多嵌入式系統的啟動(dòng)一樣,本地磁盤(pán)(軟驅或者光驅?zhuān)τ趩?dòng)內核和內存盤(pán)根文件系統來(lái)說(shuō),并不是必須的。DHCP工具能被用于確認網(wǎng)絡(luò )參數,例如大家熟悉的IP抵制和子網(wǎng)掩碼等。此外,TFTP能被用于將內核鏡像以及初始化內存盤(pán)鏡像傳送到本地設備。一旦傳輸完成,linux內核就能被啟動(dòng)以及掛載initrd,和本地鏡像啟動(dòng)的過(guò)程一樣。

8 讓你的initrd盡可能小
當你在構建嵌入式系統時(shí),總是希望initrd的鏡像盡可能小,恩,這里將提供一些小技巧。首先就是使用BusyBox。前面已經(jīng)提到過(guò),BusyBox包含了很多較大的工具,通常體積都以MB計算,但是它成功得將自己的體積控制在幾百KB的范圍內。
在本例中,BusyBox鏡像使用的是靜態(tài)鏈接,因此不需要提供任何庫文件。但是,如果你需要得到標準的C庫文件來(lái)滿(mǎn)足自己的二進(jìn)制程序,除了大體積的glibc庫,你有其他更好的選擇。第一個(gè),小體積的uClibc庫,是專(zhuān)門(mén)用于有空間限制的,標準C庫的縮水版本。另一個(gè)適用于有空間限制環(huán)境的庫是dietlib。記住,你需要在自己的嵌入式系統中,用這些庫重新編譯你的二進(jìn)制程序。雖然使用它們會(huì )帶來(lái)一些附加的工作,但是,是值得的。

9 總結
初始化內存盤(pán)技術(shù)被創(chuàng )建的最初目的,是為了讓內核通過(guò)一個(gè)臨時(shí)的根文件系統來(lái)過(guò)渡到最終的根文件系統。initrd對于嵌入式linux系統同樣是很有用處的:它能做為一個(gè)非持續性的根文件系統掛載到內存盤(pán)中。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
手把手帶你自制Linux系統之六 編譯內核及busybox完成系統定制
Embedded Linux Primer
自制簡(jiǎn)單的Linux
ramdisk
Linux 初始 RAM 磁盤(pán)(initrd)概述
Initrd啟動(dòng)及功能分析
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久