linux系统引导流程
1.固件:硬件和软件结合。加电自检是我们按下电源会检测硬件像cpu、内存、网卡等信息。(从硬件层次检测硬件是否可用)
- 固件设置实例:设置时间
软件时间和硬件时间:
[root@VM_0_12_centos ~]# hwclock #硬件时间 ^[[AWed 28 Mar 2018 09:22:15 PM CST -0.811743 seconds [root@VM_0_12_centos ~]# date #软件时间 Wed Mar 28 21:22:18 CST 2018
hwclock两个重要参数:
-s, --hctosys set the system time from the hardware clock -w, --systohc set the hardware clock from the current system time
hwclock --hctosys #以硬件时钟为标准修改软件时钟
hwclock --systohc #以软件时钟为标准修改硬件时钟
加入两个时钟都不正确:
修改软件时钟:
NAME date - print or set the system date and time SYNOPSIS date [OPTION]... [+FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] #修改软件时钟
修改硬件时钟:
hwclocl --set --date="9/22/96 16:45:35"
2.检测完之后跳转到mbr(主引导记录)里面读取一个很重要的数据bootloader(后续的所有工作都是bootloader完成)和partition table、magic number
grub的配置:
[root@VM_0_12_centos ~]# grep kernel -n /boot/grub2/grub.cfg 101: linux16 /boot/vmlinuz-3.10.0-514.26.2.el7.x86_64 root=/dev/vda1 ro crash kernel=auto console=ttyS0 console=tty0 panic=5 LANG=C 116: linux16 /boot/vmlinuz-3.10.0-327.el7.x86_64 root=UUID=49f819fd-e56d-48a4 -86d3-7ebe0a68ec88 ro crashkernel=auto console=ttyS0 console=tty0 panic=5 130: linux16 /boot/vmlinuz-0-rescue-f9d400c5e1e8c3a8209e990d887d4ac1 root=UUI D=49f819fd-e56d-48a4-86d3-7ebe0a68ec88 ro crashkernel=auto console=ttyS0 console =tty0 panic=5
3. bootloader载入内核:
内核的概念: (linux是一堆源码,在开机的时候会看到booting the kernel,从软件层次检测硬件是否可用)
主要作用就两个:驱动硬件(所谓驱动就是系统识别硬件,让操作系统认识硬件,从软件识别硬件是否可用)、启动完init进程其任务就完成了。
4.init进程也是linux启动的第一个进程;
init进程的任务:
解释:
init进程的pid为1,其PPID为0,PPID就是父进程ID,其父进程是内核任务调度器。
linux是一个实时系统就是将处理时间按时间分配,如果你这次时间没有处理完下次继续给你分配时间的时候再处理,这就需要一个CPU时间调度器,也就是PID为0的内核调度器。
linux中由一个进程派生出的进程成为子进程。如果一个进程的父进程死了,其子进程也不能存在。linux中父进程死掉子进程存活的进程成为孤儿进程,在linux中不允许孤儿进程的存在。linux扫描到存在孤儿进程的时候会自动将这个孤儿进程的父进程设置为init进程(PID为1的进程)。
子进程死亡,父进程应该切换和子进程之间的联系,这个子进程成为僵尸进程,J进程,这种进程也不允许存在。
5 读取/etc/inittab文件
inittab定义linux的7个运行级别
0: 关机状态(系统默认运行级别不能设为0,否则不能正常启动)
1: 单用户模式(类似于windows的安全模式),只允许root登录,用于系统维护,禁止远程登陆
2. 多用户模式。只是没有NFS服务(网路文件服务,实现文件共享),
3. 多用户模式,有NFS服务
4. 系统未使用,保留,可以让用户自定义一些启动程序。
5. X11控制台,登陆后进入图形GUI模式。与3一样是多用户模式,只是有图像界面。
6. 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。
运行级别的切换:
1.查看运行级别: (如果修改过应该是S 3)
[root@iz2ze46xi6pjjj69ailg9lz ~]# runlevel N 3
2.切换运行级别:
init [0123456Ss] 或者 telinit [0123456Ss]
实际上telnet是init的一个软连接:
[root@iz2ze46xi6pjjj69ailg9lz ~]# ll `which init` lrwxrwxrwx 1 root root 22 Aug 18 2017 /usr/sbin/init -> ../lib/systemd/systemd
例如:
telinit 3 #运行级别切换到3
另外:在centos7中,/etc/inittab现在的内容是:
# inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target # # systemd uses 'targets' instead of runlevels. By default, there are two main ta rgets: # # multi-user.target: analogous to runlevel 3 # graphical.target: analogous to runlevel 5 # # To view current default target, run: # systemctl get-default # # To set a default target, run: # systemctl set-default TARGET.target #
如果改变默认的运行级别只需要放开注解就可以。
3. inittab文件剖析:
在inittab中,所有条目采用如下格式:
id:runlevel:action:process
id:标识符,一般为两位字母或者数字(长度为1-4位即可)
run-levels:指定运行级别,可以指定多个
action:指定运行状态
process:指定要运行的脚本和命令(前面三个是process的铺垫)
action常用取值:
initdefault 指定系统常用级别
sysinit 系统启动执行process中指定的命令
wait:执行process中的指令,并等其他指令结束再运行其他命令
once:执行process中的指令,不等其结束
Ctrlaltdel:按下ctrl+AltDel时执行process的指令。
4. inittab重要的两个条目:
rc.sysinit是一个标准的shell脚本,如果我们想开机不管哪个运行级别都执行一段脚本我们可以把脚本或者命令放在/etc/rc.d/rc.sysinit里面。
inittab记录了默认级别、必须启动的脚本、电源管理、6个终端等信息。
接下来系统会照着inittab指定的运行级别的目录下的脚本:(/etc/rc.d/rc[0-6].d目录分别对应着运行级别的目录):
假入系统的缺省运行级别为3,系统会执行/etc/rc./rc3.d/目录下的脚本;
[root@iz2ze46xi6pjjj69ailg9lz rc3.d]# ll total 0 lrwxrwxrwx. 1 root root 20 Aug 18 2017 K50netconsole -> ../init.d/netconsole lrwxrwxrwx 1 root root 19 Mar 28 18:00 S01acpidtd -> /etc/init.d/acpidtd lrwxrwxrwx 1 root root 18 Mar 29 06:00 S01wipefs -> /etc/init.d/wipefs lrwxrwxrwx. 1 root root 17 Aug 18 2017 S10network -> ../init.d/network lrwxrwxrwx 1 root root 22 Sep 1 2017 S20cloudmonitor -> ../init.d/cloudmonito r lrwxrwxrwx 1 root root 15 Sep 1 2017 S50aegis -> ../init.d/aegis lrwxrwxrwx 1 root root 17 Oct 18 01:24 S80aegis -> /etc/init.d/aegis lrwxrwxrwx 1 root root 20 Sep 1 2017 S98agentwatch -> ../init.d/agentwatch lrwxrwxrwx 1 root root 16 Nov 5 11:45 S99tomcat -> ../init.d/tomcat
/etc/rc./rc3.d/下的脚本命名规则:(我们发现下面的脚本都是软连接,类似于windows的快捷方式)
S99tomcat
S代表Start,启动的时候执行脚本,开启服务(只有大写S开会启动,小写也不会启动),执行脚本的时候linux会传入一个start参数,
K代表kill: 关闭服务,执行脚本会传入一个stop参数
99代表启动级别:数字越小越优先启动,如果级别相同的话会按照创建顺序执行
tomcat:是服务名字,这个不重要
如果我们希望一个脚本开机不启动可以通过删除该运行级别下的脚本或者将脚本重新命名,不以S开头则不会启动。
[root@iz2ze46xi6pjjj69ailg9lz rc3.d]# mv ./S99tomcat s99tomcat #将以S开头的改为以小写s开头,开机也不会启动 [root@iz2ze46xi6pjjj69ailg9lz rc3.d]# ll total 0 lrwxrwxrwx. 1 root root 20 Aug 18 2017 K50netconsole -> ../init.d/netconsole lrwxrwxrwx 1 root root 19 Mar 28 18:00 S01acpidtd -> /etc/init.d/acpidtd lrwxrwxrwx 1 root root 18 Mar 29 06:00 S01wipefs -> /etc/init.d/wipefs lrwxrwxrwx. 1 root root 17 Aug 18 2017 S10network -> ../init.d/network lrwxrwxrwx 1 root root 22 Sep 1 2017 S20cloudmonitor -> ../init.d/cloudmonito r lrwxrwxrwx 1 root root 15 Sep 1 2017 S50aegis -> ../init.d/aegis lrwxrwxrwx 1 root root 17 Oct 18 01:24 S80aegis -> /etc/init.d/aegis lrwxrwxrwx 1 root root 20 Sep 1 2017 S98agentwatch -> ../init.d/agentwatch lrwxrwxrwx 1 root root 16 Nov 5 11:45 s99tomcat -> ../init.d/tomcat
注意: /etc/rc[0-6].d是/etc/rc.d/rc[0-6].d的软连接: /etc/init.d是/etc/rc.d/init.d的一个软连接
[root@iz2ze46xi6pjjj69ailg9lz etc]# ll | grep rc -rw-r--r--. 1 root root 2853 Nov 6 2016 bashrc -rw-r--r--. 1 root root 1620 Nov 6 2016 csh.cshrc lrwxrwxrwx 1 root root 11 Aug 18 2017 init.d -> rc.d/init.d -rw-r--r--. 1 root root 942 Jun 7 2013 inputrc -rw-r--r-- 1 root root 1968 Dec 17 2014 mail.rc lrwxrwxrwx 1 root root 10 Aug 18 2017 rc0.d -> rc.d/rc0.d lrwxrwxrwx 1 root root 10 Aug 18 2017 rc1.d -> rc.d/rc1.d lrwxrwxrwx 1 root root 10 Aug 18 2017 rc2.d -> rc.d/rc2.d lrwxrwxrwx 1 root root 10 Aug 18 2017 rc3.d -> rc.d/rc3.d lrwxrwxrwx 1 root root 10 Aug 18 2017 rc4.d -> rc.d/rc4.d lrwxrwxrwx 1 root root 10 Aug 18 2017 rc5.d -> rc.d/rc5.d lrwxrwxrwx 1 root root 10 Aug 18 2017 rc6.d -> rc.d/rc6.d drwxr-xr-x. 10 root root 4096 Aug 18 2017 rc.d lrwxrwxrwx 1 root root 13 Aug 18 2017 rc.local -> rc.d/rc.local -rw-r--r-- 1 root root 1982 Dec 22 2016 vimrc -rw-r--r-- 1 root root 1982 Dec 22 2016 virc -rw-r--r-- 1 root root 4479 Nov 6 2016 wgetrc
5.如果我们设置一个自启动服务程序:
ln -s
chkconfig命令
ntsysv
6.如果系统出现错误或者服务启动失败,我们如何查看:
(1)查看硬件检测的信息
dmesg
(2)如果是服务启动失败,我们可以查看linux的日志文件。(linux下的所有的日志文件都记录在:/var/log目录下)
[root@VM_0_12_centos log]# pwd /var/log [root@VM_0_12_centos log]# ll total 119848 drwxr-xr-x. 2 root root 4096 Apr 21 2016 anaconda drwxr-x---. 2 root root 4096 Mar 29 09:08 audit -rw-r--r-- 1 root root 8661 Mar 20 09:18 boot.log -rw-------. 1 root utmp 113854849 Mar 29 10:30 btmp drwxr-xr-x. 2 chrony chrony 4096 Nov 24 2015 chrony -rw------- 1 root root 1661869 Mar 29 10:43 cron -rw-r--r-- 1 root root 27765 Mar 20 09:18 dmesg -rw-r--r-- 1 root root 1 Mar 20 09:00 dmesg.old -rw------- 1 root root 1 Mar 20 09:00 grubby drwxr-sr-x 3 root systemd-journal 4096 Mar 20 09:00 journal -rw-r--r--. 1 root root 292292 Mar 29 10:35 lastlog -rw-------. 1 root root 8207 Mar 29 08:39 maillog -rw-------. 1 root root 2227855 Mar 29 10:43 messages drwxr-xr-x. 2 ntp ntp 4096 Apr 13 2017 ntpstats drwx------. 2 root root 4096 Jun 10 2014 ppp -rw------- 1 root root 333272 Mar 29 10:35 secure -rw------- 1 root root 1977368 Mar 24 03:27 secure-2018032415218 33821.gz -rw------- 1 root root 2326626 Mar 29 03:11 secure-2018032915222 64621.gz -rw-------. 1 root root 1 Mar 20 09:00 spooler -rw-------. 1 root root 1 Mar 20 09:00 tallylog drwxr-xr-x. 2 root root 4096 Apr 21 2016 tuned -rw-r--r-- 1 root root 1 Mar 20 09:00 wpa_supplicant.log -rw-rw-r--. 1 root utmp 60288 Mar 29 10:35 wtmp -rw------- 1 root root 170 Mar 28 19:11 yum.log
总结:
(1)fireware(固件)开机自检,检验硬件设备是否正常,如果正常则读取硬盘上面存放数据的第一个位置MBR(Master Boot Record)里面的bootloader
(2)BootLoader里面最重要的是存放了一个自举程序(GRUB)
(3)GRUB 载入内核(kernel) 驱动硬件、启动init进程
(4)init进程读取/etc/inittab,
首先执行脚本:/etc/rc.d/rc.sysinit (不管任何运行级别都会执行这个脚本)
然后根据initdefault查到默认的运行级别并且去/etc/rc.d/rcN.d下执行脚本,以S开头的脚本是启动服务的脚本,以K开头是关闭服务的脚本
(5)最后会建立终端,等待用户登录。显示user、name。