linux系统启动流程
内核的设计结构
单内核:linux(线程–lwp轻量级进程)
微内核:windows(支持真正意义上的多线程)
单内核:很多功能驱动都集成在一起
微内核:内核很小,功能单一。模块化
linux为了适应众多用户的不同硬件需求,linux内核在设计上采用模块化设计。可以动态加载模块。
核心模块:ko 内核所独有的。
共享对象:so
红帽的系统下内核的模块在/lib/modules/内核版本号命名的目录
模块之间也存在依赖关系。
例如:/lib/modules/3.10.0-327.el7.x86_64/kernel/放的是内核模块。50多MB
内核名称 vmlinuz-x.x.xx /boot/vmlinuz-x.x.xx 内核 1.9MB
pc-linux
POST–>BIOS(启动顺序去哪找启动位置)–>MBR
(bootloader,446字节)–>kernel(探测基本的硬件)–>initrd–>/sbin/init
详细启动过程
bootloader(MBR)是个程序
linux的bootloader
LILO:linux loader 不支持硬盘超过1个g的
GRUB:GRadn Unitied bootloader
MBR太小,所以GRUB分成两段
第一阶段是为了引导第二段,在MBR 中
第1.5阶段 识别不同类型的文件系统。是的多个文件。
第二阶段是引导操作系统的
后两个阶段在/boot/grub目录下,grub也有配置文件,开机启动项,双系统的启动顺序,开启图片….
bootload是将内核和initrd一起装进内核。
init /sbin/int 二进制的可执行程序 (用户空间的主导程序)
内核启动之前没有加载文件系统,而内核又存放在文件系统之上。
/ 根所在的分区,又叫rootfs
内核装载根文件系统
内核要使用文件系统 ,就要有设备驱动和文件系统模块
内核靠驱动识别硬件,为了适应安装到不同平台的需要,就需要大量的驱动。在安装操作系统的时候生产了一个包含该平台设备驱动的中间层临时的文件系统(不能同时存在两个根但是根是可以切换的)。使得内核可以识别根文件系统然后加其他模块。 整个过程就是根切换。
这临时文件系统其实是一个文件,安装操作系统时生成的,只不过内核能够将其再内存中展开为一个模拟的文件系统(红帽5上通常被称为ramdisk,红帽6上成为ramfs)。
ramdisk–>initrd centos5
制作工具:mkinitrd
ramfs–>initramfs centos6、7
制作工具:dracut,mkinitrd
chroot 命令
可以实现根切换,将一个临时的目录切换为根,在该目录下必须存在/bin/bash,以及bash需要的库文件,复制过去即可保持原有的文件层级结构。就可以在命令界面下切换过去。
用户也可以实现根切换,与内核的根切换还是不完全一样。
内核根切换,使用的命令也不一样,内核切换时将三个目录带了过来,/proc,/sys,/dev
[root@localhost ~]# ldd /bin/bash
linux-vdso.so.1 => (0x00007fffb9f05000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f81904ef000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f81902eb000)
libc.so.6 => /lib64/libc.so.6 (0x00007f818ff29000)
/lib64/ld-linux-x86-64.so.2 (0x00007f819072f000)
[root@localhost ~]# tree /test/ /test/ ├── bin └── lib64 ├── ld-linux-x86-64.so.2 ├── libc.so.6 ├── libdl.so.2 └── libtinfo.so.5 [root@localhost ~]# chroot /test bash-4.2# bash-4.2# bash-4.2#
init
级别不同,运行的服务不同。
linux 有运行级别之称 0-6
0:halt
1:单用户模式,直接以管理员的身份进入,不需要密码。
2:多用户模式,有网络功能,但是不启用nfs
3:正常的多用户模式,test mode 命令行模式
4:保留级别
5:图形模式
6:reboot
init运行在那个级别取决于配置文件,/etc/inittab
定义了默认运行级别
centos
grub
可以在启动界面编辑grub的配置。以指定的级别启动。例如进入1级别,单用户模式(又叫维护模式)。
grub修改配置文件也可以加密码。使用grub-md5-crypt命令生成加密的密码放到grub的配置文件中即可。
在配置文件中加入 password –md5 密码
显示当前运行级别
who -r
runlevel
查看内核release号
uname -r
grub损坏如何修复。
先人为破坏MBR中的bootloader 硬盘的前446字节
dd if=/dev/zero of=/dev/sda count=1 bs=400
sync
修复grub,就是从新安装grub
1、使用grub命令
grub>root (hd0,0) 设置kernel所在的分区。(设置后有提示)
grub> setup (hd0) 安装到kernel所在的设备上
2、安装grub
grub-install –root-directory=/ 这里的根指的是boot的父目录
给其他设备安装grub,首先设备要有分区表,并且boot目录已经挂在了分区。
grub配置文件损坏了如何修复
启动系统后会自动进入grub命令模式
grub>find
grub>root
grub>kernel
grub>initrd
grub>boot
kernel初始化过程
1、探测
2、驱动初始化(从initrd文件中载入驱动模块(centos6以后都是使用initramfs文件))
initramfs-2.6.32-642.el6.x86_64.img
3、以只读方式挂载根文件系统
4、装载第一个进程init(PID:1)
系统初始化流程(内核级别):post–>读取bios中启动次序–>bootloader–>kernel和ramdisk–>装在根文件系统–>/sbin/init
/sbin/init;(/etc/inittab)
cenos5之前的: SysV int
配置文件:/etc/inittab
centos6以后使用另外一种版本的init---upstart;ubuntu开发的init程序,可以并行启动多个服务。 upstart是对sysv init改进的。 配置文件:/etc/init/*.conf centos7:systemd;另一种init程序。可以并行启动多个服务。(比较优秀) 配置文件:/usr/lib/systemd/system /etc/systemd/system
以centos5为例讲解sysvinit
运行级别:为了系统的运行或维护等目的而设定的机制 0-6:7个级别 0: 关机 1: 单用户模式(single user),root用户,无须认证;维护模式 2: 多用户模式(multl user),会启动网络功能,但不会启动NFS;维护模式 3: 多用户模式(multl user),完全功能模式,文本界面 4: 预留级别;目前无特别使用目的,但习惯以同3级别功能使用 5: 多用户模式(multl user),图形界面。完全功能 6: 重启,reboot 默认级别3、5、 级别切换 init # 级别查询 who -r runlevel
init
/sbin/init /etc/inittab 以cenos5为例 /etc/inittab 每行定义一种action以及与之相对应的process id:runlevel:action:process id:一个任务的标识符 runlevel:在那些级别下启动次任务,为空表示所有级别 action:在什么条件下启动次任务 process:指具体的任务,一个程序或脚本。 action: wait:等待切换至次任务所在的级别时执行一次。 respawn:此任务终止时就会自动启动 initdefault:设定默认运行级别;此时process省略 sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本 10:0:wait:/etc/rc.d/rc 3 /etc/rc.d/rc 脚本的作用。 意味着去启动或关闭/etc/rc.d/rc3.d目录下的服务脚本所控制的服务 所有以k开头的都是要停止的服务 所有以s开头的都是要启动的服务 脚本执行的顺序是先关闭k的后启动s的 k后面的数字只的是优先级。glob风格排序。 服务之间也有依赖关系。所以启动和关闭的顺序不一样。 centos6为例: [root@yangyouwei ~]# ls /etc/init/ ###这个目录是/etc/inittab的文件的切片。 ck-log-system-restart.conf rcS.conf ck-log-system-start.conf rcS-emergency.conf ck-log-system-stop.conf rcS-sulogin.conf control-alt-delete.conf readahead-collector.conf init-system-dbus.conf readahead.conf kexec-disable.conf readahead-disable-services.conf plymouth-shutdown.conf serial.conf prefdm.conf splash-manager.conf quit-plymouth.conf start-ttys.conf rc.conf tty.conf [root@yangyouwei ~]# ls /etc/init.d ####这个文件是init的脚本 abrt-ccpp firstboot messagebus portreserve sandbox abrtd functions mysqld postfix saslauthd abrt-oops haldaemon netconsole pppoe-server single acpid halt netfs psacct smartd atd htcacheclean network quota_nld spice-vdagentd auditd httpd NetworkManager rdisc sshd autofs ip6tables nfs rdma sssd blk-availability iptables nfslock restorecond svnserve bluetooth irqbalance nfs-rdma rngd sysstat certmonger kdump ntpd rpcbind udev-post cpuspeed killall ntpdate rpcgssd wdaemon crond lvm2-lvmetad oddjobd rpcidmapd winbind cups lvm2-monitor openct rpcsvcgssd wpa_supplicant dnsmasq mdmonitor pcscd rsyslog ypbind 每个程序基于事件驱动来编写的。
/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目录下存放的脚本
[root@yangyouwei ~]# ls /etc/rc.d/
init.d rc0.d rc2.d rc4.d rc6.d rc.sysinit
rc rc1.d rc3.d rc5.d rc.local
对应系统启动级别的脚本 相应目录下的以k开头的脚本是在该级别下要停止的脚本 以s开头的是要在该级别下运行的脚本。
/etc/rc.d/init.d/(链接)—>/etc/init.d/
chkcofig –add 创建的链接
服务类脚本
start
Sysv风格 :/etc/rc.d/init.d下面的脚本要支持以下参数
start|stop|restart|status
reload|configtest
都有一下的行 # chkconfig: 2345 13 99 ###定义默认启动的级别,启动的优先次序,关闭的优先次序 如果定义启动级别为 - 表示都是k。 # description: 描述该脚本的简单功能 设置启动和关闭优先级时,应考虑依赖关系。依赖的先启动,后关闭。 运行级别下的脚本执行顺序 当chkconfig命令来为此脚本在rc#.d目录创建链接时,runlevels表示默认创建为s*开头的链接。除此自外的级别默认创建为k*开头的链接。s后面的启动优先级为ss所表示的数字‘k后面关闭优先次序为kk所表示的数字。 这两行必须有#号
创建脚本后需要放到/etc/init.d/目录下,运行一下
chkconfig –add SERVICENAME
SERVICENAME 服务脚本的名称不带.sh
chkconfig: 2345 13 99 执行chkconfig –add 时,在指定级别里添加s开头的链接,其他级别的均为k
chkconfig 使用方法
SYNOPSIS
chkconfig [–list] [–type type][name] 列出(指定/所有)服务各个级别的状态
chkconfig –add name 添加服务
chkconfig –del name 删除服务
chkconfig –override name
chkconfig [–level levels] name 修改 相应系统运行级别下的启动还是关闭
chkconfig [–level levels] [–type type] name
服务脚本,通过chkcofing加入服务后,就可以通过service SERVICENAME stop|start… 控制服务
如果没有能力写服务脚本还可以将要运行的服务命令直接写在/etc/rc.d/rc.local中
[root@yangyouwei ~]# cat /etc/rc.d/rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff.
系统初始化脚本:/etc/rc.d/rc.sysinit
1、设置主机名
2、设置欢迎信息
3、激活udev和selinux
4、挂在/etc/fstab文件中定义的所有文件系统
5、检测根文件系统,如果没有问题以读写方式挂在
6、设置系统始终;读取硬件时钟,通过脚本实现
7、根据/etc/sysctl.conf文件来设置内核参数
8、激活lvm及软RAID设备
9、激活个swap设备
10、加载额外设备的驱动程序
11、清理操作
总结用空间的启动流程
/sbin/init(/etc/inittab)
init的配置文件inittab的任务
设置默认运行级别–>运行系统初始化脚本,完成系统初始化–>关闭对应级别下要停止的服务,启动对应级别下要开启的服务–>设置登陆终端
centos6启动流程
centos6以后使用另外一种版本的init—upstart;ubuntu开发的init程序,可以并行启动多个服务。
upstart是对sysv init改进的。
init程序: 为了兼容init,其执行主程序依然叫init /sbin/init 配置文件:/etc/init/*.conf /etc/inittab(仅用于定义系统默认启动级别)
centos7启动流程
init程序 systemd 配置文件 /usr/lib/systemd/system/* /etc/systemd/system/* 默认的服务都不启动,当访问那个服务,那个服务才启动。 兼容centos6的服务 /etc/init.d/下的服务 systemd 的服务脚本放在 /usr/lib/systemd/system 设置系统默认启动级别 systemctl set-default TARGET.target
完全兼容sysv脚本机制;因此,service还是可以使用。不过建议使用systemctl来控制服务;
systemctl {start|stop|restat|status} name[.service]
原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/44968