Linux系统引导过程
Linux引导总览:
Linux引导过程:
加电自检-->MBR扇区-->GRUB配置(/boot/grub/grub.conf)
-->root(hd0,0) kernel(/boot/vmlinuz) initrd(boot/initrd-....img) -->/etc/inittab: /etc/rc.d/rc.sysinit /etc/rc.d/rc 级别 (initdefault默认级别) -->/etc/rcX.d/快捷方式 --> /etc/rc.d/init.d/服务脚本 S99local-->/etc/rc.local(自定义开机脚本) mingety tty1-tty6-->login-->验证用户配置(passwd、shadow)-->/bin/bash--?>用户正常执行命令
Linux系统启动流程
POST-->BIOS(Boot Sequence)-->MBR(bootloader,446)-->Kernel-->initrd-->(ROOTFS)/sbin/init(/etc/inittab)
说明:
Boot Sequence(启动次序):决定了到哪去找操作系统所在的位置 bootloader:根据MBR的分区表查找活动分区,也就意味着找到操作系统所在那个分区,并加载那个分区上的内核
//如果第一个分区没有bootloader,就会去第二个分区找;如果第一个分区有bootloader,但bootloader损坏了,就不会到其他分区找bootloader 一般而言,bootloader获得控制权以后,BIOS基本上就退出了;bootloader获得控制权以后,就会去加载磁盘分区用户所选定的内核,
此时把kernel装载入内存,在内存中完成解压缩,而后将控制权转交给kernel, 这时bootloader就退出了;Kernel就获得整体硬件的控制权
启动引导开机顺序
(1)主机加电自检,加载BIOS硬件信息 (2)读取MBR的引导文件(grub,lilo) (3)引导linux内核 (4)运行第一个进程init(进程号永远为1) (5)进入相应的运行级别 //运行级别0 1 2 3 4 5 6 (6)运行终端,输入用户名密码
或者:
1.BIOS初始化 2.引导程序 3.内核初始化 4.init开始并进入运行级别 4.1执行/etc/rc.d/rc.sysinit脚本 4.2执行/etc/rc.d/rc and /etc/rc.d/rc[0-6].d/下的脚本 4.3执行/etc/rc.d/rc.local脚本 4.4进入虚拟控制台Virtual consoles 4.5进入图形界面
BIOS初始化
1.侦测外围设备 2.选择引导设备 读取和执行引导设备的第一个扇区,即MB
编辑/etc/grub.conf
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root # initrd /initrd-[generic-]version.img #boot=/dev/vda default=0 ##启动顺序,从0开始排序 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz #表示第一个硬盘的第一个分区 hiddenmenu title CentOS 6 (2.6.32-642.el6.x86_64) #加载内核 root (hd0,0) kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=tty0 console=ttyS0,115200n8 initrd /initramfs-2.6.32-642.el6.x86_64.img
#ro :以只读方式挂载根分区
:卷标
rootnoverify :不校验
chainloader +1:读取硬盘的第一个扇区
给grub加密:
文件:
default=0 # 设定默认启动的title的编号,从0开始 timeout=5 # 等待用户选择的超时时长,单位是秒 splashimage=(hd0,0)/grub/splash.xpm.gz # grub的背景图片 hiddenmenu # 隐藏菜单 password redhat password --md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG. title Red Hat Enterprise Linux Server (2.6.18-308.el5) # 内核标题,或操作系统名称,字符串,可自由修改 root (hd0,0) # 内核文件所在的设备;对grub而言,所有类型硬盘一律hd,格式为(hd#,N);hd#, #表示第几个磁盘;最后的N表示对应磁盘的分区; kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet # 内核文件路径,及传递给内核的参数;虽然是/boot/的文件,但是是通过grub访问的 initrd /initrd-2.6.18-308.el5.img # ramdisk文件路径 password --md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG. title Install Red Hat Enterprise Linux 5 root (hd0,0) kernel /vmlinuz-5 ks=http://172.16.0.1/workstation.cfg ksdevice=eth0 noipv6 initrd /initrd-5 password --md5 $1$FSUEU/$uhUUc8USBK5QAXc.BfW4m.
内核初始化
1.设备检测 2.设备驱动初始化 3.只读方式挂载根分区系统 4.加载init程序
按ctrl+alt+del后3秒重启
市电停电后,由ups发出指令让计算机2分钟后关机
发电了,结束关机动作
用2345级别进入系统可以得到1-6tty终端
1.在执行此脚本之前,3级别和5级别是一模一样的 2.如果把5改成3,通过5或3进来都会进入字符界面
系统启动后执行的最后一个脚本:/etc/rc.d/rc.local;跟用户无关;这个脚本执行后才会进入登录界面
Linux运行级别
默认包括7种运行级别
0:halt 1: single user mode, 直接以管理员身份切入, s,S,single 2:multi user mode, no NFS 3: multi user mode, text mode 4:reserved 5: multi user mode, graphic mode 6: reboot
INIT进程
Linux内核加载执行 /sbin/init程序
系统中第一个进程,进程ID始终为1
主配置文件:/etc/inittab
/etc/inittab记录格式
id:runlevels:action:process
或者:
[设置项目]:[runlevel]:[init操作行为]:[命令项目]
id:runlevels:action:process
id: 标识符
runlevels: 在哪个级别运行此行;
action: 在什么情况下执行此行;
process: 要运行程序;
行动类别
initdefault: 设定默认运行级别
sysinit: 系统初始化
wait: 等待级别切换至此级别时执行
respawn: 一旦程序终止,会重新启动
配置文件:
[root@localhost ~]# vim /etc/inittab //进入设置启动级别 id:5:initdefault: //设置系统默认启动的级别 ca::ctrlaltdel:/sbin/shutdown -t3 -r now //三键重启比较危险,所以在编辑第32行时要在ca前面加#号屏蔽掉这条命令
/etc/rc.d/rc.sysinit完成的任务:
1、激活udev和selinux; 2、根据/etc/sysctl.conf文件,来设定内核参数; 3、设定时钟时钟; 4、装载键盘映射; 5、启用交换分区; 6、设置主机名; 7、根文件系统检测,并以读写方式重新挂载; 8、激活RAID和LVM设备; 9、启用磁盘配额; 10、根据/etc/fstab,检查并挂载其它文件系统; 11、清理过期的锁和PID文件;
读明白/etc/rc.d/rc.sysinit脚本
##: 关闭或启动的优先次序,数据越小越优先被选定
先关闭以K开头的服务,后启动以S开头的服务;
切换运行级别
设置默认级别
默认级别千万不要设置为 0 4 6
查看当前的运行级别
#runlevel 5 3
切换到指定的运行级别
#init 3
其他初始化配置
/etc/rc.d/rc.sysinit脚本
由init进程调用执行
设置网络时钟、加载文件系统等一系列工作
/etc/rc.d/rc脚本
由init进程调用执行
根据运行级别参数,加载/终止相关服务
/etc/rc.d/rc.local脚本
由rc脚本调用执行
保存用户定义的需开机后自动执行的命令
RHEL6的系统开机的过程:
1. 加载BIOS的硬件信息、进行自我测试,并依据设定获得第一个可开机的设备; 2. 读取并执行第一个开机设备内MBR的boot Loader(grub等程序); 3. 依据boot loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序; 4. 内核启动init; 5. 系统初始化:(/etc/init/rcS.conf exec /etc/rc.d/rc.sysinit); 6. init找到/etc/inittab文件,确定默认的运行级别(X) (/etc/init/rcS.conf exec telinit $runlevel); 7. 触发相应的runlevel事件(/etc/init/rc.conf exec /etc/rc.d/rc $RUNLEVEL); 8. 开始运行/etc/rc.d/rc,传入参数X; 9. /etc/rc.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本; 10. /etc/rcX.d/中的脚本按事先设定的优先级依次启动; 11. 最后执行/etc/rc.d/rc.local; 12. 加载终端或X-Window 接口。
解决修改错误配置的方法:
1、在grub界面时输入e 2、选中第二行输入e 3、最后输入1/single/s(单用户级别)——
单用户级别可绕过验证,不会去读/etc/inittab这个文件