Linux 文件系统启动记录
1. 两个脚本
1.1 inittab
该脚本路径:/etc/inittab
基本inittab就是上述这张图这个形式,inittab是/sbin/init进程的配置文件;
语法形式:label:runlevel:action:process
1.1.1 label
id: 用来定义缺省的init运行的级别
si: 是系统初始化的进程
ln: 其中的n从1~6,指明该进程可以使用的runlevel的级别
ud:是升级进程
ca: 指明当按下Ctrl+Alt+Del时运行的进程
pf: 指当UPS表明断电时运行的进程
pr: 是在系统真正关闭之前,UPS发出电源恢复的信号时需要运行的进程
x: 是将系统转入X终端时需要运行的进程
上述例子中有使用:
- id
- si
1.1.2 运行级别
0: 关机 half
1: 单用户模式 singel user
2: 多用户模式 multi user , 不提供nfs服务 without nfs
3: 完全多用户字符模式 full multiuser text mod
4: 系统预留 officially undefined
5: 图形登录界面 graphical login
6: 重启 reboot
根据上述的runlevel情况来看,默认我们服务器都是采用level3,即支持多用户模式,且为命令行,而非图形界面;
1.1.3 action
boot: 在系统启动时运行,忽略runlevel
bootwait: 在系统启动时运行,等待init进程完成。忽略runlevel
ctrlaltdel: 当Ctrl+Alt+Del三个键同时按下时运行,把SIGINT信号发送给init。忽略runlevel
initdefault: 不要执行这个进程,它用于设置默认runlevel
kbrequest: 当init从键盘中收到信号时运行。这里要求键盘组合符合KeyBoardSigral(参见/usr/share/doc/kbd-*关于键盘组合的文档)
off: 禁止进入,因此该进程不运行
once: 每一个runlevel级别运行一次
ondemand: 当系统指定特定的运行级别A、B、C时运行
powerfail: 当init收到SIGPWR信号时运行
powerokwait: 当收到SIGPWD信号且/etc/文件中的电源状态包含OK时运行
powerwait: 当收到SIGPWD信号,并且init等待进程结束时运行
respawn: 不管何时终止都重新启动进程
sysinit: 在运行boot或bootwait进程之前运行
wait: 运行进程等待输入运行模式
我们有使用的就是sysinit和wait,也就是按照顺序执行;
1.2 fstab
该文件目录:/etc/fstab
这里的参数解析是咋玩的呢?option记录相关参数,在mount.c中被描述
pass代表不会被fsck检查,即不会做坏块查看操作;
proc和sysfs,是虚拟文件系统,可以将kernel内核中(内存)的操作状态以文件的形式提供给到用户查看
2. 挂载过程
理解完上述两个脚本后,基本建立如下认知过程:
- 系统在初始化加载内核过程中首先会将根文件系统挂载为只读形式;
- 执行/sbin/init进程执行上述inittab脚本时首先初始化根节点;
- 进行mount -a操作解析fstab脚本进行再次挂载操作
2.1 mount
mount -a 自动挂载 /etc/fstab中的内容
- 如果mount -a执行过,且fstab没有改动,则不会重新挂载
- 如果标记了noauto参数,则该条命令不会执行
查看mount实现源码:
3. 问题记录
- 将inittab中的根目录mount操作去除,放在fstab中是否可行?
答:可行,实际测试确认,在inittab中去除后,添加到fstab中可以正常mount,且权限符合预期; - 在post-build脚本中将inittab拷贝到target目录中,升级后没有用户登录程序出现
答:说明在post-build拷贝进去的与正常编译生成的有差异,没有执行getty操作,code中搜索确认:
拷贝到对应目录后向程序内部添加了用户登录程序部分: