今天為大家介紹的是制作unix啟動盤圖文教程,系統(tǒng)奔潰是很多的用戶會遇到的問題,也是大家不愿意看到的,這是使用做unix啟動盤可以幫大家解決這些問題,今天為大家介紹制作unix啟動盤圖文教程是希望大家可以更好的解決系統(tǒng)奔潰的現(xiàn)象。
一、制作一個顯示hello world的啟動linux
一、 initramfs 是什么
當內核啟動時,會從這個打包文件中導出文件到內核的 rootfs 文件系統(tǒng),然后內核檢查 rootfs 中是否包含有 init 文件,如果有則執(zhí)行 它,作為 PID 為 1 的第一個進程。這個 init 進程負責啟動系統(tǒng)后續(xù)的工作,包括定位、掛載“真正的”根文件系統(tǒng)設備(如果有的話)。如果內核沒有在 rootfs 中找到 init 文件,則內核會按以前版本的方式定位、掛載根分區(qū),然后執(zhí)行/sbin/init 程序完成系統(tǒng)的后續(xù)初始化工作。
二、構建第一個 initramfs : hello world
從 C 語言開始,學習計算機編程語言的第一個程序幾乎都是 hello world,因此我們也構建一個最簡單 的 hello world 式的 initramfs,以說明 initramfs 的基本構建方法。 initramfs 的靈魂是 init 文件(或者叫程序,因為它會被內核第一個執(zhí)行),我們先寫一個簡單的 init 程序,它會在內核的 console 中打印出經典的 hello world 信息。
hello.c:
#include
#include
int main(int argc,char argv[])
{
printf("hello world, from initramfs./n");
sleep(9999999);
return 0;
}
其中的 sleep()函數語句是為了避免執(zhí)行時內核很快打出 panic 的信息,并非功能上的需要。
接著把 hello.c 編譯成靜態(tài)連接程序:
gcc -o hello_static -static -s hello.c
命令行中的-s 參數表示編譯后的程序不包含調試定位信息,目的是減少編譯出來的程序文件的大小。
再創(chuàng)建一個 initramfs 的構建源文件目錄 image,把 hello_static 程序拷入這個目錄,并改名為
init。
在 image 目錄下,創(chuàng)建一個 dev/console 的設備文件,否 init 程序無法在內核 console 中輸出信息:
mknod -m 600 dev/console c 5 1
注意,執(zhí)行這個命令需要有 root 權限。
我的練習目錄是這樣的/home/fjb/home/test/initramfs/t1。我在t1目錄下建立了image目錄。其中sudo mkdo -m 600 dev/console c 5 1 這個命令是創(chuàng)建一個設備文件,-m mode, --mode=mode 為新建立的文件設定模式,就象應用命令chmod一樣,以后仍然使用缺省模式建立新目錄。 dev/console是要創(chuàng)建的設備,即一個控制臺設備,我們后面在啟動linux時其顯示的信息會用上這個控制臺,我們可以在image目錄下先建立dev目錄(mkdir dev),c表示是字符設備,5和1是主次版本號。注意在ubuntu上要用超級用戶權限才可以建立。
這樣在t1目錄下就有了hello.c、hello_static文件和image目錄,在image目錄里有init文件和dev目錄,在dev目錄下有console設備文件。
好,現(xiàn)在可以構建initramfs了。
首先是配置linux。我把linux-2.6.31.tar.bz2拷貝到/home/fjb/test/initramfs/目錄下,運行tar -xvf linux-2.6.31.tar.bz2進行解壓,在initramfs目錄下生成一個linux-2.6.31目錄,里面有l(wèi)inux的源代碼(linux的下載可以在https://kernel.org/pub/linux/kernel/ 的2.6目錄里下載)。
進入linux-2.6.31目錄,運行make menuconfig,會出現(xiàn)如下圖的配置畫面:
在general setup的配置目錄下的選上Initial RAM filesystem and RAM disk (initramfs/initrd) support選項,選上的話,旁邊的中括號會有個*,然后在下面輸入/home/fjb/home/test/initramfs/t1/image,如下圖:
因為我們的 init 程 序是 ELF 格式的,所以內核需要支持ELF 的可執(zhí)行文件,否則啟動這個 init 程序會失敗。在內核的 Executable file formats 配置目錄下,選擇 kernel support for ELF binaries,則可使內核支持 ELF 格式的可執(zhí)行文件。其他內核 配置參數根據實際需要設置即可,不過,為了減少內核編譯時間,可參考這篇文章
三、適合CLFS臨時系統(tǒng)的最簡內核配置
我的host系統(tǒng)是32位的,無法使用chroot方式構建CLFS系統(tǒng),只能先交叉編譯出一個最小的臨時系統(tǒng),然后以BOOT方式完成CLFS系統(tǒng)的構建。在CLFS BOOK中,對臨時系統(tǒng)的內核的配置有下面的警告:
Warning
Here a temporary cross-compiled kernel will be built. When configuring it, select the minimal amount of options required to boot the target machine and build the final system. I.e., no support for sound, printers, etc. will be needed.
Also, try to avoid the use of modules if possible, and don't use the resulting kernel image for production systems.
那么,怎樣得到一個適合CLFS臨時系統(tǒng)的最簡內核配置呢?
(1)首先,用內核的 allnoconfig 配置目標,得到一個最最基本的內核配置。即,執(zhí)行下面的命令:
make ARCH=x86_64 CROSS_COMPILE=${CLFS_TARGET}- allnoconfig
內核的 allnoconfig 配置目標會把所有的內核選項都設置為no,也就是把它們既不編譯進內核,也不編譯成模塊。有了這個最基本的配置,我們再添加CLFS臨時系統(tǒng)所必須的配置項:再執(zhí)行
make ARCH=x86_64 CROSS_COMPILE=${CLFS_TARGET}- menuconfig
命令,按下面的步驟添加其他的配置——
(2)按CLFS BOOK的建議,把 Executable file formats 下的ELF 和 emulations for 32bit ELF 選項編譯進內核。
(3)在 Processor type and features 下面,選擇合適的CPU類型。例如,我的CPU類型是Intel EM64T
(4)選擇PCI/PCI-Express支持,位于Bus options (PCI, PCMCIA, EISA, MCA, ISA) 配置目錄下。
(5)加入對根文件系統(tǒng)所在磁盤控制器的驅動,詳細方法可參考:https://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type-blog-itemid-280649.html。例如,我的機器的配置是:
Device Driver
|---->SCSI device support
|---->SCSI disk support
|----->SCSI low-level drivers
|---->Serial ATA (SATA) support
|---->intel PIIX/ICH SATA support
(6)加入Ext2文件系統(tǒng)的支持:在 File systems 配置目錄下,選擇 Second extended fs support。如果根文件系統(tǒng)是Ext3,則選擇 Ext3 journalling file system support。
(7)為了是 Udev 正常工作,需要內核支持 Unix domain sockets。此配置選項位于 Networking 配置目錄中的 Networking support ---> Networking options 下。
(8) 使內核支持 /proc 虛擬文件系統(tǒng)和 tmpfs 文件系統(tǒng): File systems ---> Pseudo filesystems ---> /proc file system support / Virtual memory file system support (former shm fs)
(9)支持 swap 分區(qū): General setup ---> Support for paging of anonymous memory (swap)
(10)支持 RTC 設備: Device Drivers ---> Character devices ---> Enhanced Real Time Clock Support
(11) 為了充分發(fā)揮我的雙核CPU的能力,我又加入了對SMP的支持: Processor type and features ---> Symmetric multi-processing support。這一特性,對CLFS系統(tǒng)來說,并不是必須的。
這樣一個最簡的內核配置,編譯出來的內核映像文件的大小只有744KB,但卻能完全滿足CLFS系統(tǒng)后續(xù)的構建工作需要。
由于我的31內核配置和他的有些不一樣,我就把sata和ata硬盤等的選項都選上了,(第一次制作,還不清楚很多選項,沒辦法了)。
之后我們就可以保存選項,然后運行make bzImage之后在運行make就ok了(編譯比較長時間,慢慢等吧,我沒有咖啡泡,只能跑去吃飯了)。
二、實驗環(huán)境的搭建
試驗 initramfs 需要經常重啟系統(tǒng),所以使用 CPU 模擬器是不錯的選擇。我們可以選用 qemu,它支持直接啟動 linux 內核,無需在模擬器中安裝 OS。
如果在在命令行上用qemu的話會有問題,那是qemu的一個bug,對于27后的內核支持不好,在運行后會出現(xiàn)apic的錯誤,如果要用命令行上用qemu的話,運行qemu -kernel linux-2.6.31/arch/i386/boot/bzImage -append noapic -hda /dev/zero可以禁止內核的apic。這樣就不會有這個問題。但這里有個更好的方法是用Qemu Luancher,既簡單又方便好用。
在Linux系統(tǒng)下安裝圖形化的QEMU
QEMU是一款經典的CPU模擬器軟件,但它是命令行方式程序,參數眾多,使用起來不是很方便。QEMU有一個圖形化的前端程序qemu-laucher,可方便地設置QEMU的命令行參數。
我的系統(tǒng)是Debian 4.0 Amd64,軟件庫中已包含了qemu-laucher,可以方便地安裝。安裝完整的圖形化QEMU環(huán)境,需要安裝下面的軟件包:
qemu:QEMU主程序
qemu-launcher:圖形化的QEMU啟動器
kqemu-common:QEMU的加速模塊程序
qemuctl:QEMU的運行時選項的設置程序,可作為qemu-laucher 的插件程序。
安裝完成后,在 Application/Accessories 系統(tǒng)菜單下,添加了qemu-laucher 的啟動項。
我還有一個openSuse 10.3 的系統(tǒng),遺憾的是,它的軟件庫中沒有包含qemu-laucher,無法直接安裝。
ubuntu就方便了,在新立得里就可以把這些全裝上了。裝完后會生成一個菜單:應用程序-》附件-》Qemu Launcher。點擊一個菜單啟動 Qemu Launcher,如下圖。
其中,由于我們在啟動linux時需要硬盤,雖然我們不是必須,但為了啟動不出錯,我們可以New一個disk出來,如上圖的Hand disk 0,我建了一個100M的虛擬硬盤t1。
然后點擊linux boot選項,勾上Boot Linux kernel directly選項,在下面的Kernel image中找到我們剛才生成的bzImage文件,在 linux-2.6.31/arch/i386/boot/bzImage文件夾里。在Initial RAM disk選擇中選擇我們剛才生成的那個硬盤。好了,到此我們已可以啟動我們剛才建立的linux了,點擊Launch可以運行我們的linux了(記得點擊Save按鈕,不然下次啟動Qemu Launcher時又的重新去找那些文件)。
內核輸出一堆內核運行信息后,最后打出了 hello world, from initramfs。如下圖:
三、什么是initramfs
1.initramfs 的前世今生
1.1什么是 rootfs 和 ramfs 所有的 2.6 版本 linux 內核都有一個特殊的文件系統(tǒng) rootfs,是內核啟動的初始始根文件系統(tǒng), initramfs 的文件會復制到 rootfs。如果把 initramfs 比作種子,那么 rootfs 就是 它生長的土壤。大部分 linux 系統(tǒng)正常運行后都會安裝另外的文件系統(tǒng),然后忽略 rootfs。rootfs 是 ramfs 文件系統(tǒng)的一個特殊實例。ramfs 是一種非常簡單的文件系統(tǒng),是基于內存的文件系統(tǒng)。ramfs 文件系統(tǒng)沒有容量大小的限制,它可以根據需要動態(tài)增加容量。ramfs 直接利用了內核的磁盤高速緩存機制。所有的文件的讀寫數據都會在內存中做高速緩存(cache),當系統(tǒng)再次使用文件數據時,可以直接從內存中讀寫,以提 供系統(tǒng)的 I/O 性能。高速緩存中的寫入數據會在適當的時候回寫到對應的文件系統(tǒng)設備(如磁盤等)中,這時它的狀態(tài)就標識為clean,這樣系統(tǒng)在必要時可 以釋放掉這些內存。ramfs 沒有對應文件系統(tǒng)設備,所以它的數據永遠都不會回寫回去,也就不會標識為 clean,因此系統(tǒng)也永遠不會釋放 ramfs 所占 用的內存。因為 ramfs 直接使用了內核已有的磁盤高速緩存機制,所以它的實現(xiàn)代碼非常小。也由于這個原因, ramfs 特性不能通過內核配置參數刪除,它是內核的天然特性。
1.2ramfs 不是 ramdisk
ramdisk 是在一塊內存區(qū)域中創(chuàng)建的塊設備,用于存放文件系統(tǒng)。ramdisk 的容量是固定的,不能象
ramfs 一樣動態(tài)增長。ramdisk 需要內核的文件系統(tǒng)驅 動程序(如 ext2)來操作其上的數據,而ramfs 則是內核的天然特性,無需額外的驅動程序。ramdisk 也象其他文件系統(tǒng)設備一樣,需要在塊設
備和 內存中的磁盤高速緩存之間復制數據,而這種數據復制實際不必要的。
1.3從 ramfs 派生的文件系統(tǒng) tmpfs
ramfs 的一個缺點是它可能不停的動態(tài)增長直到耗盡系統(tǒng)的全部內存,所以只有 root 或授權用戶允許
使用 ramfs。為了解決這個問題,從 ramfs 派生出了 tmpfs 文件系統(tǒng),增加了容量大小的限制,而且允
許把數據寫入交換分區(qū)。由于增加了這兩個特性,所以 tmpfs 允許普通用戶使用。關于 tmpfs 文件系統(tǒng)更多的信息,可以看內核源碼中的 Documentation/filesystems/tmpfs.txt 文檔。
綜上所述,initramfs 是一種 ramfs 文件系統(tǒng),在內核啟動完成后把它復制到 rootfs 中,作為內核初始的根文件系統(tǒng),它的任務是掛載系統(tǒng)真正的根文件系統(tǒng)。這就是 initramfs 的前世今生。
四、使用busybox構建
busybox 號稱是嵌入式 Linux 中的瑞士軍刀——小巧、功能齊 全。它把許多常用的 Linux 命令都集成到一個單一的可執(zhí)行程序中,只用這一個可執(zhí)行程序(即 busybox)加上 Linux 內核就可以構建一個基本的 Linux 系統(tǒng)。busybox 程序非常小巧,包含全部命令可執(zhí)行文件大小也只有 750 多。busybox 是完全模塊化的,可以很容易地在編譯時增加、 刪除其中包含的命令。
由于 busybox 的這些特點,它廣泛應用于 LiveCD、應急修復盤、安裝盤等系統(tǒng)中。我們也是以它為基礎,構建 initramfs 。
4.1編譯busybox
我們可以去https://busybox.net 上下載最新的busybox源碼,我在上面下載的是最新的busybox-1.15.2.tar.bz2版本。把它解壓到initramfs目錄下,可以用make menuconfig進行配置,另外兩個配置命令是
make allyesconfig——最大配置
make allnoconfig——最小配置
這里用 make defconfig 做缺省配置。
用make CONFIG_PREFIX=<安裝目錄> install 命令安裝。如果在命令行中省略 CONFIG_PREFIX 變量的賦值,則會安裝缺省值 ./_install 目錄下。CONFIG_PREFIX 可以在 make menuconfig 的配置界面中修改。
在busybox-1.15.2目錄下運行
make defconfig
make CONFIG_PREFIX=/home/fjb/home/test/initramfs/t1/image install
那么我們就可以把busybox安裝在image目錄下了,image目錄下會多出幾個文件夾和文件,如下圖:
缺省配置下,busybox 動態(tài)鏈接到 glibc,所以要把它用到的動態(tài)庫復制到 initramfs 的構建目錄中。用 ldd 命令查看 busybox 用到了哪些動態(tài)庫文件及相應的文件路徑,然后把它們復制到相應的目錄下即可。
在image/bin 目錄下,我們運行
ldd busybox
得到的結果如下:
linux-gate.so.1 => (0x00137000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x009ce000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00138000)
/lib/ld-linux.so.2 (0x00f04000)
我們可以在image下建立lib目錄,把這幾個苦拷貝到lib目錄下。
這里要注意了,我在這里就浪費了很多時間。
首先: linux-gate.so.1這個庫我們是找不到的,因為linux下根本沒有這個庫,具體來說就google一下咯,上面有解釋,一句話,這個不需要。
libm.so.6、 libc.so.6和/ld-linux.so.2這三個其實在/lib目錄下,在/lib/tls/i686/cmov/下也有。他們都是鏈接文件,剛開始我用cp命令拷貝他們,拷貝他們的鏈接文件也可以順這鏈接找到原文件并拷貝過去,但在最后啟動的時候老是提示/bin/sh: error while loading shared libraries: /libm.so.6: cannot open shared object file: No such file or directory
我在網上找了很久也沒找到答案,明明在在image/lib目錄下有這個庫,為什么老是提示說找不到呢,最后沒辦法,只好老老實實的把libm.so.6、 libc.so.6和/ld-linux.so.2這三個庫所鏈接的文件ld-2.10.1.so、libc-2.10.1.so、libm-2.10.1.so拷貝到lib目錄下,然后建立這三個文件的鏈接文件:
ln -s ld-2.10.1.so ld-linux.so.2
ln -s libc-2.10.1.so libc.so.6
ln -s libm-2.10.1.so libm.so.6
這樣后,最后啟動成功,具體什么原因我還沒去弄清楚,望知道的朋友告訴我,謝謝!
4.2在 image 下創(chuàng)建必要的目錄和設備文件
在image目錄下運行
mkdir proc etc sys mnt
生成proc etc sys mnt這4個目錄。
hello world 已經創(chuàng)建了 console 設備文件,我們再用
mknod -m 600 dev/null c 1 3
命令創(chuàng)建另一個基本的設備文件。
4.3制作一個最簡單的linux系統(tǒng)
我們可以試著做一個最簡單的可運行的 linux 系統(tǒng)了:
首先刪除image目錄下的init文件,然后在image目錄下寫個init 的腳本,過程如下:
(1)在 image 目錄下寫一個最簡單的 init 腳本。
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
/bin/sh
(2)為 init 腳本設置可執(zhí)行權限,否則內核不會去執(zhí)行它。
chmod +x init
(3)有些 busybox 配置中,mdev 命令需要讀取/etc/mdev.conf 文件,為了避免出錯信息,我們創(chuàng)建一個空文件。
touch etc/mdev.conf
(4)在內核源碼目錄下,執(zhí)行
make
命令,重新編譯內核,生成新的 initramfs。
好了,在 QEMU 模擬環(huán)境下啟動這個新的內核,系統(tǒng)初始化后,會進入 SHELL 環(huán)境。在這個 SHELL 環(huán)境下,試驗一些常用命令,看看是否可以正常運行。我的運行如下圖所示:
上一步創(chuàng)建的簡單 linux 系統(tǒng)在進入 SHELL 環(huán)境時,會打出下面這一句出錯信息:
/bin/sh: can't access tty; job controll off
雖然不影響使用,但終究不夠完美。產 生這個錯誤的原因是我們的 SHELL 是直接運行在內核的 console 上的,而 console 是不能提供控制終端(terminal)功能的,所以必須把 SHELL 運行在 tty 設備上,才能消除這個錯誤。解決問題的辦法是使用正規(guī) init 機制,在執(zhí)行 SHELL 前打開 tty 設備。
另外,這個簡單系統(tǒng)的 reboot、halt 等命令是不起作用的,也必須通過 init 方式解決。
我們可以嘗試在這個linux下運行tty這個命令,它打印出/dev/console,這說明它是運行在console上的。
4.4 busybox 的缺省 init 模式
busybox 支持 init 功能,當系統(tǒng)沒有/etc/inittab 文件時,它有一套缺省的模式,按下面配置執(zhí)行:
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
如果 busybox 檢測到/dev/console 不是串口控制臺,init 還要執(zhí)行下面的動作:
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh
我們試試這種模式是否可以解決我們的問題。
說明一下,上面說的/etc/inittab是image/etc/inittab文件。并且是busybox工作。好了,我們開始下一個實驗。將init腳本后面的/bin/sh那行刪除,并在etc目錄下建立init.d目錄,再把init文件移到etc/init.d目錄下更名為rcS
mv init etc/init.d/rcS
重新編譯內核,生成新的 initramfs
用 QEMU 試驗一下新編譯的內核。我的Qemu運行如下圖:
系統(tǒng)啟動后,會打出一句話“please press Enter to active this console”——感覺還不錯。但是按下回車鍵后,系統(tǒng)依然會打出錯誤信息“-/bin/sh:
can't access tty; job controll off ”。用 tty 命令看看當前的終端設備文件名:
# tty
/dev/console
它還是 console,不是 tty 設備,所以問題沒有解決。不過,reboot 和 halt 命令倒是可以正常工作了。
經過驗證,busybox 的缺省 init 模式無法滿足我們的要求,我們還是要寫 inittab,定制自己的 init 初始化流程。
4.5 busybox 的 inittab 文件格式說明
要寫自己的 inittab,需要理解 busybox 的 inittab 文件格式。
busybox 的 inittab 文件與通常的 inittab 不同,它沒有 runlevel 的概念,語句功能上也有限制。 inittab 語句的標準格式是
:::
各字段的含義如下
:
id 字段與通常的 inittab 中的含義不同,它代表的是這個語句中 process 執(zhí)行所在的 tty 設備,內容就是/dev 目錄中 tty 設備的文件名。由于是運行 process 的 tty 設備的文件名,所以也不能象通常的inittab 那樣要求每條語句 id 的值唯一。
:
busybox 不支持 runlevel,所以此字段完全被忽略。
:
為下列這些值之一:
sysinit, respawn, askfirst, wait,once, restart, ctrlaltdel, shutdown
其 含義與通常的 inittab 的定義相同。特別提一下 askfirst,它的含義與 respawn 相同,只是在運
行 process 前,會打出一句話 “please press Enter to active this console”,然后等用戶在
終端上敲入回車鍵后才運行 process。
:
指定要運行的 process 的命令行。
4.6編寫inittab
理解了 busybox 的 inittab 格式,我們就可以寫 mini linux 的 inittab:
::sysinit:/etc/init.d/rcS
tty1::askfirst:/bin/sh
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh
tty5::askfirst:/bin/sh
tty6::askfirst:/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
把這個文件放到 image 的 etc 目錄下。為了執(zhí)行 reboot 命令時避免提示找不到/etc/fstab 文件,我們再在 etc 目錄下創(chuàng)建一個空文件
touch fstab
在image/etc目錄下建立inittab文件,并將上面的內容寫入這個文件。那么etc里的文件內容就如下了:fstab init.d inittab
做好了這些,就可以重新編譯內核,生成新的 initramfs 了。在 QEMU 試驗環(huán)境下驗證新生成的 linux,系統(tǒng)運行正常,而且象通常的 linux 系統(tǒng)一樣,用 ALT+F1~F6 鍵可以在 6 個終端間切換。 注意:要在qemu里點擊鼠標才可以用 ALT+F1~F6 鍵進行終端間切換。要釋放鼠標,可以同時按住ctrl+alt并移動鼠標。
4.7配置內核支持initrd
到目前為止,我們的 initramfs 都由內核編譯系統(tǒng)生成的,并鏈接到內核中。其實我們也可以用 cpio 命令生成單獨的 initramfs,與內核編譯脫鉤,在內核運行時以 initrd 的形式加載到內核,以增加靈活性。首 先配置內核使用單獨的 initrd:在 Device Driver / Block device / 配置目錄下,選擇 RAM filesystem and RAMdisk ( initramfs/initrd ) support 配置項;再到 General Setup 配置目錄項下,將 initramfs source file(s) 配置項原有的內容清空。然后把內核源碼樹的 usr 目錄下已由內核編譯生成的 initramfs 文件 initramfs_data.cpio.gz 拷貝到 ~/initramfs-test 目錄下,我們先直接用這個文件試驗一下 initrd 方式的 initramfs 的效果。最后,執(zhí)行 make 命令重新編譯內核后,在 QEMU 試驗環(huán)境中,把 initrd 配置框(linux 配置框的下面)的內容 寫為
~/initramfs-test/initramfs_data.cpio.gz,指定 initrd 的文件路徑。
好了,試驗一下新的 initrd 方式的 initramfs 吧,效果跟先前的完全一樣。
以下是我做的步驟,因為我在根據《精通initramfs構建step by step》文后制作,由于里面說的不是很清楚,并且在Qemu Launch上的選項也沒有,所以花了比較多的時間,并且我也把其中一些沒有的步驟加上,多做實驗,多了解一下。
先做個實驗。
到general setup中,RAM filesystem and RAMdisk ( initramfs/initrd ) support選項下的的Initramfs source file(s)的內容清空。然后make,只好在啟動Qemu Launch。
然后你會看到什么,我這里的啟動后的界面如下圖:
以上便是制作unix啟動盤圖文教程,由于我們沒有指定設備,所以啟動到這里就沒了,可以參考啟動上面的信息。并且我們生成的bzImage文件也小了很多。我這里只有1.2M,原來的要2.2M。
掃一掃 生活更美好