linux初始化内存盘卡住,Linux系统内存磁盘初始化技术详细解析
轉(zhuǎn)自:http://m.zol.com.cn/article/1271270.html?via=index
Linux內(nèi)存初始化技術(shù)(initrd)用于支持兩階段的系統(tǒng)引導(dǎo)過程,是在系統(tǒng)啟動(dòng)過程中被掛載的臨時(shí)root文件系統(tǒng)(譯者注:這里的root文件系統(tǒng)是指的根文件系統(tǒng))。initrd包含很多可執(zhí)行程序和驅(qū)動(dòng),并允許在臨時(shí)的內(nèi)存磁盤根文件系統(tǒng)被卸載,內(nèi)存被釋放后掛載真實(shí)的root文件系統(tǒng)。在許多嵌入式linux文件系統(tǒng)中,initrd是最終的根文件系統(tǒng)。這篇文章主要講解了linux2.6內(nèi)核的initrd技術(shù),包括在內(nèi)核中的創(chuàng)建及使用。
1 什么是內(nèi)存磁盤初始化?
0
initrd掛載優(yōu)先級(jí)高于真實(shí)根文件系統(tǒng),它被邦定在內(nèi)核上,做為內(nèi)核啟動(dòng)過程的一部分被加載(load)。然后,做為兩階段引導(dǎo)過程的第一部分,內(nèi)核掛載(mount)initrd,用于獲得并加載真實(shí)有效的文件系統(tǒng)。
為了達(dá)到這個(gè)目的,initrd包含有最起碼的目錄與程序,例如insmod,來安裝內(nèi)核模塊到內(nèi)核中。
對(duì)于桌面或服務(wù)器linux,initrd是臨時(shí)文件系統(tǒng),它的生存周期很短,僅僅是做為到達(dá)真實(shí)根文件系統(tǒng)的橋梁。但對(duì)于沒有存儲(chǔ)設(shè)備的嵌入式系統(tǒng)來說,它才是永久性的根文件系統(tǒng)。本篇文章對(duì)這兩方面均有涉及。
2 深入分析initrdL
initrd包含有必須的程序和系統(tǒng)文件,用于支持系統(tǒng)的啟動(dòng)的第二階段過程。創(chuàng)建初始化內(nèi)存的方法,是隨著你所使用的系統(tǒng)版本而改變的。從Fedora Core3以后,initrd就由回送設(shè)備(loop device)建立。什么是回送設(shè)備?它是一個(gè)設(shè)備驅(qū)動(dòng),允許你將一個(gè)文件掛載為塊設(shè)備,并對(duì)其文件系統(tǒng)做出描述。也許loop device并不存在與你的內(nèi)核中,但是你能夠通過內(nèi)核的配置工具(make menuconfig)打開它。路徑是: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
#
現(xiàn)在,你可以通過查看/mnt/initrd的子目錄來查看initrd的內(nèi)容。需要注意的是,即使你的initrd鏡像文件并不是以.gz做為后綴名,但是你同樣可以通過增加此后綴名來讓gunzip打開它。
從Fedora Core3開始,默認(rèn)的initrd鏡像就是一個(gè)壓縮的gpio歸檔文件。除了用掛載文件的方式以外,你同樣可以通過cpio歸檔的方式來將其掛載成使用了回送設(shè)備的壓縮鏡像。你可以通過以下的指令來檢查這個(gè)cpio歸檔文件的內(nèi)容:
# 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
你看到的結(jié)果將是一個(gè)小型根文件系統(tǒng),如下所示:
# 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è)腳本解釋工具),用于加載內(nèi)核模塊的insmod,以及l(fā)vm等。
上面所示目錄中,相對(duì)比較有趣的是root目錄下的初始化文件。這些文件,和傳統(tǒng)的linux啟動(dòng)過程中一樣,是在initrd鏡像被解壓縮到RAM中時(shí)生成的。待會(huì)我們將繼續(xù)探討這個(gè)問題。
3 創(chuàng)建initrd的工具。
現(xiàn)在,讓我們回到一開始的討論:initrd的鏡像是如何被創(chuàng)建的?在傳統(tǒng)的linux系統(tǒng)中,initrd是在linux build的時(shí)候被創(chuàng)建的。像mkinitrd這樣的許許多多的工具,都能夠用于通過必須的庫和模塊來自動(dòng)構(gòu)建一個(gè)用于過渡到真實(shí)根文件系統(tǒng)的initrd。事實(shí)上,mkinitrd工具是一個(gè)腳本文件,因此,我們能夠很清楚得看到,這個(gè)過程是如何進(jìn)行的。同樣的,YAIRD (Yet Another Mkinitrd)工具,也允許我們自定制每一個(gè)initrd被構(gòu)建的階段。
4 自己動(dòng)手,打造自定義的初始化內(nèi)存盤
由于很多基于linux的嵌入式系統(tǒng)都沒有硬盤驅(qū)動(dòng)器,initrd也可以做為永久性的根文件系統(tǒng)。下面我就將告訴你們,如何創(chuàng)建一個(gè)initrd鏡像。我使用的是標(biāo)準(zhǔn)linux桌面系統(tǒng),因此大家即使沒有嵌入式目標(biāo)設(shè)備也可以照著做。除了交叉編譯以外,嵌入式目標(biāo)文件的構(gòu)建過程是相同的。
#!/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的話,你需要首先創(chuàng)建一個(gè)空文件,將/dev/zero(0字符流)做為ramdisk.img的輸入。得到的文件大小大約是4MB(有4000個(gè)1K的塊組成)。接下來,用mke2fs命令來創(chuàng)建一個(gè)使用這個(gè)空文件的ext2文件系統(tǒng)。現(xiàn)在,這個(gè)文件就是一個(gè)ext2文件系統(tǒng)。ok,接下來,以回路設(shè)備的形式掛載這個(gè)文件到/mnt/initrd,現(xiàn)在,你就在掛載點(diǎn)擁有一個(gè)代表著ext2文件系統(tǒng)的目錄,并用與存放你的initrd。其他大多數(shù)的腳本語句都是用于實(shí)現(xiàn)這個(gè)功能。
下一步,就是創(chuàng)建一些必須的子目錄,用于生成你的根文件系統(tǒng): /bin, /sys, /dev, 和 /pro。這里只需要少數(shù)幾個(gè)目錄,例如,沒有/lib。但是它們已經(jīng)包含了大部分功能。
如果想讓你的根文件系統(tǒng)發(fā)揮更大的作用,請(qǐng)使用 BusyBox。這個(gè)工具是一個(gè)包含了許多獨(dú)立工具的鏡像,這些獨(dú)立的工具你都能在linux中找到( ash, a等等wk, sed, insmod)。BusyBox的優(yōu)勢(shì)在于,它把它們集合在了一起,并分享了公用的部分,從而極大縮小了鏡像的體積。這對(duì)于嵌入式系統(tǒng)來講,是非常理想的。請(qǐng)將BustBox鏡像從它的源目錄中復(fù)制出來,到你的/bin目錄下,這樣,很多指向BusyBox工具集的符號(hào)鏈接將被創(chuàng)建,BusyBox能確定哪一個(gè)工具將被使用,并自動(dòng)引用它。這個(gè)/bin目錄下被創(chuàng)建的鏈接的小型集合將用于對(duì)啟動(dòng)腳本的支持。
再下一步,就是一小部分特殊設(shè)備文件的創(chuàng)建。我從我的/dev文件夾中直接拷貝了出來,別忘了加上-a選項(xiàng)來保持它們?cè)械膶傩浴?/p>
倒數(shù)第二步,就是生成linuxrc文件。在內(nèi)核掛載了內(nèi)存盤之后,它將搜索并執(zhí)行相關(guān)的啟動(dòng)文件,如果沒有找到,內(nèi)核就將linuxrc文件做為其啟動(dòng)腳本。你最好在這個(gè)文件中對(duì)環(huán)境變量做一些基本設(shè)置,例如掛載/proc文件系統(tǒng)等。除了/proc外,我還掛載了/sys文件系統(tǒng),將消息發(fā)送給終端。最后,我調(diào)用ash并通過它和根文件系統(tǒng)交互。最后記住,用chmod把linuxrc文件的屬性改為可執(zhí)行。
最后,你的根文件系統(tǒng)算是ok了。現(xiàn)在它并沒有被掛載,用gzip將它壓縮,并將壓縮后的文件ramdisk.img.gz拷貝到/boot目錄下,這樣它就能被GRUB調(diào)用。
想要構(gòu)建你的初始化ram盤的話,你只需要調(diào)用mkird,鏡像就將自動(dòng)創(chuàng)建并拷貝到/boot目錄下。
總結(jié)
以上是生活随笔為你收集整理的linux初始化内存盘卡住,Linux系统内存磁盘初始化技术详细解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人分享:一些学者实用的网站
- 下一篇: 传智播客html视频教程(第六季) 杨中