如何將init程序打包進(jìn)內(nèi)核
將init程序打包進(jìn)內(nèi)核
我們先寫(xiě)一個(gè)簡(jiǎn)單的C語(yǔ)言init程序,它會(huì)在內(nèi)核的console中打印出經(jīng)典的hello world信息。
hello.c:
#include
#include
int main(int argc,char argv[])
{
printf("hello world, from initramfs.\n");
sleep(9999999);
return 0;
}
其中的sleep()函數(shù)語(yǔ)句是為了避免執(zhí)行時(shí)內(nèi)核很快打出panic的信息,并非功能上的需要。
接著把hello.c編譯成靜態(tài)連接程序:
gcc -o hello_static -static -s hello.c
命令行中的-s參數(shù)表示編譯后的程序不包含調(diào)試定位信息,目的是減少編譯出來(lái)的程序文件的大小。
再創(chuàng)建一個(gè)initramfs的構(gòu)建源文件目錄image,把hello_static程序拷入這個(gè)目錄,并改名為init。
在image目錄下,創(chuàng)建一個(gè)dev/console的設(shè)備文件,否init程序無(wú)法在內(nèi)核console中輸出信息:
mknod -m 600 dev/console c 5 1
注意,執(zhí)行這個(gè)命令需要有root權(quán)限。
好了,現(xiàn)在可以設(shè)置內(nèi)核配置參數(shù),進(jìn)行initramfs的構(gòu)建了:
在general setup配置目錄下的initramfs sources配置項(xiàng)下輸入image的路徑名,比如我的路徑就是/home/wyk/initramfs-test/image。
因?yàn)槲覀兊膇nit程 序是ELF格式的,所以內(nèi)核需要支持ELF的可執(zhí)行文件,否則啟動(dòng)這個(gè)init程序會(huì)失敗。
在內(nèi)核的 Executable file formats配置目錄下,選擇 kernel support for ELF binaries,則可使內(nèi)核支持ELF格式的可執(zhí)行文件。其
他內(nèi)核配置參數(shù)根據(jù)實(shí)際需要設(shè)置即可。
內(nèi)核配置參數(shù)設(shè)置完成后,按常規(guī)的內(nèi)核編譯方法進(jìn)行編譯,initramfs就自動(dòng)連接到編譯好的內(nèi)核映像文件中了。