根檔案系統(一)最小根檔案系統的構成

2021-10-04 12:03:50 字數 4826 閱讀 1665

應用程式位於根檔案系統,核心為了使用應用程式,需要掛接根檔案系統,本節分析乙個最小根檔案系統的組成,在下節講解如果建立乙個最小根檔案系統

核心分析時,有如下呼叫過程

rest_init    

kernel_init(通過建立執行緒呼叫)

prepare_namespace

mount_root/*掛接根檔案系統*/

init_post

sys_open((const char __user *)"/dev/console", o_rdwr, 0)/*開啟控制台*/

run_init_process/*呼叫應用程式*/

在mount_root掛接好檔案系統後,系統會呼叫init_post,完成以下工作:

1、以讀寫方式開啟終端,返回檔案描述符為0

sys_open((const char __user *) "/dev/console", o_rdwr, 0)

2、將檔案描述符為0的檔案複製兩份,其描述符分為別1、2,這三個檔案是標準輸入、輸出、錯誤流,都指向終端/dev/console

(void) sys_dup(0);

(void) sys_dup(0);

3、若execute_command不為空,執行相應的應用程式

if (execute_command)
其中execute_command在下面這個函式中賦值

static int __init init_setup(char *str)

__setup("init=", init_setup);

其中str通過命令列引數init=***指定

4、如果execute_command為空,則執行

run_init_process("/sbin/init");
5、如果/sbin/init執行不成功,執行

run_init_process("/etc/init");
6、如果/etc/init執行不成功,執行

run_init_process("/bin/init");
7、如果/bin/sh執行不成功,執行

run_init_process("/bin/sh");
上述五個程式段至多有乙個執行成功,執行成功後程式不會再返回;如果都執行不成功,則會列印錯誤並停止程式的執行

/sbin/init程序與ls、cp等命令都是應用程式

在虛擬機器中輸入命令:

ls -l /bin/ls
可以看到ls鏈結到busybox,/sbin/init和/bin/cp等也一樣

而init程序是系統執行的第乙個應用程式,它會讀取解析配置檔案、執行配置檔案指定的應用程式

分析busybox原始碼,找到init/init.c的init_main函式

1、設定訊號量signal,例如:設定了ctrlaltdel_signal訊號,按下ctrl+alt+del會執行某些動作

signal(sighup, exec_signal);

signal(sigquit, exec_signal);

signal(sigusr1, shutdown_signal);

signal(sigusr2, shutdown_signal);

signal(sigint, ctrlaltdel_signal);

signal(sigterm, shutdown_signal);

signal(sigcont, cont_handler);

signal(sigstop, stop_handler);

signal(sigtstp, stop_handler);

2、控制台初始化:

console_init();

3、解析配置

if (argc > 1

&& (!strcmp(ar**[1], "single") || !strcmp(ar**[1], "-s") || lone_char(ar**[1], '1'))

) else

在parse_inittab中

①:以唯讀方式開啟配置檔案

file = fopen(inittab, "r");
②:如果沒有inittab,使用預設配置

if (file == null)
new_init_action會建立乙個鍊錶節點,用傳入引數填充,並加入到init_action_list鍊錶中,便於後面的呼叫

鍊錶節點結構的定義如下:

struct init_action ;
其中:

action:執行時間

pid:程序號

command:執行程式

terminal:終端

在example/inittab中有說明inittab的格式::::

id:會以/dev/id的格式被使用於終端

runlevels:一般忽略

action:執行時間

process:可執行程式/指令碼

根據上述格式可以得出缺省配置檔案內容如下:

::ctrlaltdel:reboot

::shutdown:umount -a -r

::restart:init

tty2::askfirst:-/bin/sh

tty3::askfirst:-/bin/sh

tty4::askfirst:-/bin/sh

::sysinit:/etc/init.d/rcs

③:解析配置檔案,最終呼叫new_init_action函式執行應用程式

while (fgets(buf, init_buffs_size, file) != null)  else 

action = strchr(runlev, ':');

if (action == null || *(action + 1) == '\0') else

command = strchr(action, ':');

if (command == null || *(command + 1) == '\0') else

for (a = actions; a->name != 0; a++)

new_init_action(a->action, command, id);

break;

}} if (a->name == 0)

}

④:處理完畢,關閉檔案

fclose(file);

4、解析完配置後,根據action依次執行的應用程式

run_actions(sysinit);

run_actions(wait);

run_actions(once);

while (1)

}wpid = waitpid(-1, null, wnohang);

} }

執行應用程式的函式是run_actions,分析run_actions:

如果傳入命令的action是sysinit、wait、ctrlaltdel、shutdown、restart之一,建立程序執行命令,等命令執行完畢,刪除命令節點並返回

如果傳入命令的action是once,建立程序執行命令,不等待執行完畢,直接刪除命令節點並返回

如果傳入命令的action是respawn、askfirst之一,;;對於action是askfirst的命令,會先在標準輸出列印一段字串然後等待使用者輸入回車鍵後才執行命令

for (a = init_action_list; a; a = tmp)  else if (a->action & (sysinit | wait | ctrlaltdel | shutdown | restart)) 

waitfor(a, 0);

delete_init_action(a);

} else if (a->action & once) else if (a->action & (respawn | askfirst))

}} }

總結:1、掛接根檔案系統後,核心會開啟/dev/console,執行init程序

2、init程序中會執行如下工作:

①:設定訊號量

②:控制台初始化

③:解析配置檔案

④:執行配置檔案所規定的應用程式

故最小根檔案系統必須有/dev/console,init程序,配置檔案inittab,配置檔案所執行的應用程式

為了執行printf等應用程式,還需要一些必要的庫

為了應對配置檔案中id沒有設定的情況,還需要空裝置/dev/null

為了使用ls、cp等應用程式,可以移植busybox,busybox內也提供了init程序

也就是說乙個最小根檔案系統可以由以下內容組成:

①:/dev/console、/dev/null

②:busybox

③:必要的庫

④:配置檔案inittab

⑤:配置檔案所規定的應用程式

建立最小根檔案系統

建立最小根檔案系統 1 dev console dev null 2 init busybox sbin init 是到busybox的鏈結 3 etc inittab 配置檔案 4 配置檔案指定的應用程式 5 c庫 編譯busybox 命令工具集ls cp make menuconfig 配置完後...

建立最小根檔案系統

最小的根檔案系統至少得包括以下內容 a dev console b dev null c init 由busybox編譯安裝產生 d etc inittab e 配置檔案制定的應用程式 f libc庫檔案 1 busybox配置安裝配置安裝之後,得到如下目錄 bin linuxrc sbin usr...

製作最小根檔案系統

1.dev console dev null 2.init程序 一般 於busybox 3.etc inittab 4.配置檔案指定的程式 5.c庫 1.解壓busybox tar xjf busybox 1.20.0.tar.bz2 2.配置 make menuconfig 設定交叉編譯選項cro...