將init程序打包進內核
我們先寫一個簡單的C語言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()函數語句是為了避免執行時內核很快打出panic的信息,並非功能上的需要。
接著把hello.c編譯成靜態連接程序:
gcc -o hello_static -static -s hello.c
命令行中的-s參數表示編譯後的程序不包含調試定位信息,目的是減少編譯出來的程序文件的大小。
再創建一個initramfs的構建源文件目錄image,把hello_static程序拷入這個目錄,並改名為init。
在image目錄下,創建一個dev/console的設備文件,否init程序無法在內核console中輸出信息:
mknod -m 600 dev/console c 5 1
注意,執行這個命令需要有root權限。
好了,現在可以設置內核配置參數,進行initramfs的構建了:
在general setup配置目錄下的initramfs sources配置項下輸入image的路徑名,比如我的路徑就是/home/wyk/initramfs-test/image。
因為我們的init程 序是ELF格式的,所以內核需要支持ELF的可執行文件,否則啟動這個init程序會失敗。
在內核的 Executable file formats配置目錄下,選擇 kernel support for ELF binaries,則可使內核支持ELF格式的可執行文件。其
他內核配置參數根據實際需要設置即可。
內核配置參數設置完成後,按常規的內核編譯方法進行編譯,initramfs就自動連接到編譯好的內核映像文件中了。