Linux的启动流程分析:
启动流程一览
加载BIOS 的硬件资讯与进行自我测试,并依据配置取得第一个可启动的装置;
读取并运行第一个启动装置内MBR 的boot Loader (亦即是grub, spfdisk 等程序);
依据boot loader 的配置加载Kernel ,Kernel会开始侦测硬件与加载驱动程序;
在硬件驱动成功后,Kernel会主动呼叫init 程序,而init 会取得run-level 资讯;
init 运行/etc/rc.d/rc.sysinit 文件来准备软件运行的作业环境(如网络、时区等);
init 运行run-level 的各个服务之启动(script 方式);
init 运行/etc/rc.d/rc.local 文件;
init 运行终端机模拟程序mingetty 来启动login 程序,最后就等待使用者登陆啦;
BIOS, boot loader 与kernel 加载:
BIOS, 启动自我测试与MBR
Boot Loader 的功能
提供菜单:使用者可以选择不同的启动项目,这也是多重启动的重要功能!
加载核心文件:直接指向可启动的程序区段来开始操作系统;
转交其他loader:将启动管理功能转交给其他loader 负责。
加载核心侦测硬件与initrd 的功能
第一支程序init 及配置档/etc/inittab 与runlevel:
Run level:运行等级有哪些
0 - halt (系统直接关机)
1 - single user mode(单人维护模式,用在系统出问题时的维护)
2 - Multi-user, without NFS(类似底下的runlevel 3,但无NFS 服务)
3 - Full multi-user mode(完整含有网络功能的纯文字模式)
4 - unused (系统保留功能)
5 - X11 (与runlevel 3 类似,但加载使用X Window)
6 - reboot (重新启动)
/etc/inittab 的内容与语法
[配置项目]:[run level]:[init 的动作行为]:[命令项目]
init 的处理流程
使用/etc/rc.d/rc.sysinit 进行系统初始化
由於runlevel 是5 ,因此只进行『l5:5:wait:/etc/rc.d/rc5』,其他行则略过
配置好[ctrl]+[alt]+[del] 这组的组合键功能
配置不断电系统的pf, pr 两种机制;
启动mingetty 的六个终端机(tty1 ~ tty6)
最终以/etc/X11/perfdm -nodaemon 启动图形介面啦!
init 处理系统初始化流程(/etc/rc.d/rc.sysinit):
取得网络环境与主机类型:
读取网络配置档/etc/sysconfig/network ,取得主机名称与默认通讯闸(gateway) 等网络环境。
测试与挂载内存装置/proc 及U盘装置 /sys:
除挂载内存装置/proc 之外,还会主动侦测系统上是否具有usb 的装置,若有则会主动加载 usb 的驱动程序,并且尝试挂载usb 的文件系统。
决定是否启动SELinux :
我们在第十七章谈到的SELinux 在此时进行一些检测,并且检测是否需要帮所有的文件重新编写标准的SELinux 类型(auto relabel)。
启动系统的乱数产生器
乱数产生器可以帮助系统进行一些口令加密演算的功能,在此需要启动两次乱数产生器。
配置终端机(console) 字形:
配置显示於启动过程中的欢迎画面(text banner);
配置系统时间(clock) 与时区配置:需读入/etc/sysconfig/clock 配置值
周边设备的侦测与Plug and Play (PnP) 参数的测试:
根据核心在启动时侦测的结果(/proc/sys/kernel/modprobe ) 开始进行ide / scsi / 网络/ 音效等周边设备的侦测,以及利用以加载的核心模块进行PnP 装置的参数测试。
使用者自订模块的加载
使用者可以在/etc/sysconfig/modules/*.modules加入自订的模块,则此时会被加载到系统当中
加载核心的相关配置:
系统会主动去读取/etc/sysctl.conf 这个文件的配置值,使核心功能成为我们想要的样子。
配置主机名称与初始化电源管理模块(ACPI)
初始化软件磁盘阵列:主要是透过/etc/mdadm.conf 来配置好的。
初始化LVM 的文件系统功能
以fsck 检验磁碟文件系统:会进行filesystem check
进行磁碟配额quota 的转换(非必要):
重新以可读写模式挂载系统磁碟:
启动quota 功能:所以我们不需要自订quotaon 的动作
启动系统虚拟乱数产生器(pseudo-random):
清除启动过程当中的缓存文件:
将启动相关资讯加载/var/log/dmesg 文件中。
启动系统服务与相关启动配置档(/etc/rc.d/rc N & /etc/sysconfig)
使用者自订启动启动程序(/etc/rc.d/rc.local)
根据/etc/inittab 之配置,加载终端机或X-Window 介面
启动过程会用到的主要配置档:/etc/modprobe.conf,/etc/sysconfig/*
Run level 的切换:init[0-6]
核心与核心模块:
核心:/boot/vmlinuz 或/boot/vmlinuz-version;
核心解压缩所需RAM Disk:/boot/initrd (/boot/initrd-version);
核心模块:/lib/modules/version/kernel 或/lib/modules/$(uname -r)/kernel;
核心原始码:/usr/src/linux 或/usr/src/kernels/ (要安装才会有,默认不安装)
核心模块与相依性:
/lib/modules/$(uname -r)/kernel
lib/modules/$(uname -r)/modules.dep
depmod
核心模块的观察:
多少模块:lsmod
模块名称(Module);
模块的大小(size);
此模块是否被其他模块所使用(Used by)。
模块的资讯:modinfo
核心模块的加载与移除:
insmod 则完全由使用者自行加载一个完整档名的模块
rmmod 移除模块
核心模块的额外参数配置:/etc/modprobe.conf
Bootloader: Grub:
boot loader 的两个stage:Stage1:运行boot loader 主程序,Stage2:主程序加载配置档
grub 的配置档/boot/grub/menu.lst 与菜单类型
grub 对磁碟的代号配置与Linux 不同,主要透过侦测的顺序来给予配置。如(hd0) 及(hd0,0) 等。
menu.lst 内每个菜单与titile 有关,而直接指定核心启动时,至少需要kernel 及initrd 两个项目
menu.lst 内配置loader 控制权移交时,最重要者为chainloader +1 这个项目。
若想要重建initrd ,可使用mkinitrd 处理
重新安装grub 到MBR 或boot sector 时,可以利用grub shell 来处理。
启动过程的问题解决:
忘记root 口令的解决之道:
重新启动!一定要重新启动!怎么重开都没关系;
在启动进入grub 菜单后,(1)在你要进入的菜单上面点'e' 进入详细配置;(2)将光棒移动到kernel 上方并点'e' 进入编辑画面;(3)然后出现如下画面来处理:
重点就是那个特殊字体的咚咚啦!按下[enter] 再按下b 就能够启动进入单人维护模式了。
进入单人维护模式后,系统会以root 的权限直接给你一个shell ,此时你就能够运行『passwd 』这个命令来重建root 的口令啦!然后直接『init 5 』就可以切换成为X 窗口介面罗!就是这么简单。
init 配置档错误:
grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet init=/bin/bash
BIOS 磁碟对应的问题(device.map)
因文件系统错误而无法启动:/etc/fstab
利用chroot 切换到另一颗硬盘工作