1、linux系统的组成部分:
内核:对进程、内存、网络协议栈、文件系统、驱动程序、安全功能等进行管理
根文件系统
2、运行中的系统环境分两层:
内核空间:又叫内核模式;运行内核级代码,主要实现系统调用
用户空间:又叫应用程序;运行用户级别的进程或线程。
3、内核存放的位置:
/boot:
4、rootfs:根文件系统:
有/下的必须的一些目录,/sbin,/bin,/lib,/lib64,/root,/var,/tmp,/etc,/usr,/proc,/sys,/home,等等
5、内核的设计流派:
单内核设计:把所有功能集成与同一个程序,如linux
微内核设计:每种功能使用一个单独的子系统实现,如:Windows、Solaris
6、linux内核特点:
支持模块化:所有内核模块以 ".ko"结尾(ko:kernel object)
支持模块运行时,动态装载及卸载
7、linux支持的模块有两种
.ko:kernel object,内核模块
.so:shared object,共享模块
8、内核的组成:
核心文件:/boot目录下,
模块文件:/lib/modules目录下
ramdisk文件:
核心文件:/boot目录下, [root@localhost boot]# ls /boot config-3.10.0-514.el7.x86_64 extlinux grub grub2 initramfs-0-rescue-2870a7d09372452a93f532a5bc3afdad.img initramfs-3.10.0-514.el7.x86_64.img initramfs-3.10.0-514.el7.x86_64kdump.img initrd-plymouth.img symvers-3.10.0-514.el7.x86_64.gz System.map-3.10.0-514.el7.x86_64 vmlinuz-0-rescue-2870a7d09372452a93f532a5bc3afdad vmlinuz-3.10.0-514.el7.x86_64 //核心文件,z表示压缩文件,3.10.0表示内核版本号,514表示发行号本地版本号 [root@localhost boot]# |
模块文件:位于:/lib/modules目录下,有一个与核心文件(版本号+发行号)名称一致的文件。 [root@localhost modules]# ls /lib/modules 3.10.0-514.el7.x86_64 注意:如果内核提供了多个版本,则在此目录下会有多个对应的内核模块文件 [root@localhost modules]# ls /lib/modules/3.10.0-514.el7.x86_64/ build modules.builtin modules.modesetting source extra modules.builtin.bin modules.networking updates kernel modules.dep modules.order vdso modules.alias modules.dep.bin modules.softdep weak-updates modules.alias.bin modules.devname modules.symbols modules.block modules.drm modules.symbols.bin [root@localhost modules]# |
ramdisk文件:ramdisk的作用是将内存的部分空间当做磁盘用,它是用来存放系统的临时根文件系统,去加载磁盘驱动程序,但它不是必须的。不同版本的linux存放的命名不一样。 centos5:/boot/initrd-VERSION-relase.img centos6/7:/boot/initramfs-VERSION-release.img 如:centos7: [root@localhost modules]# ls /boot/ config-3.10.0-514.el7.x86_64 extlinux grub grub2 initramfs-0-rescue-2870a7d09372452a93f532a5bc3afdad.img initramfs-3.10.0-514.el7.x86_64.img //ramdisk文件 initramfs-3.10.0-514.el7.x86_64kdump.img initrd-plymouth.img symvers-3.10.0-514.el7.x86_64.gz System.map-3.10.0-514.el7.x86_64 vmlinuz-0-rescue-2870a7d09372452a93f532a5bc3afdad vmlinuz-3.10.0-514.el7.x86_64 [root@localhost modules]# 注意:centos6/7中用initramfs代替centos5中的initrd是因为rd是基于磁盘的,本身rd已经在内存了,但是还是要缓存一次;这样做避免了双缓存,达到了提速的目的。 |
9、centos系统的启动流程:
①、POST:加点自检(检查计算硬件的基本组成部分,如cpu、内存、io等设备是否存在且正常),实现POST的代码位于主板上的ROM芯片上,不施加外部手段,是不能修改ROM的;ROM芯片中有CMOS、BIOS两种;物理的地址空间由ROM和RAM两部分组成。
②、Boot Sequence:启动过程(即引导过程)
BIOS中设置按次序查找各引导设备,第一个有引导程序(bootload)的设备即为本次启动要用到的设备
a、bootloader分类:引导加载器,用来引导程序,它本身也是一个程序。
windows的BootLoader:ntloader
linux的BootLoader:LILO(linux loader)和GRUB(grand uniform BootLoader)
GRUB:centos5/6:grub 0.x,grub legacy;
centos7:grub 1.x ,grub2
b、bootloader的作用:提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户的选定的内核装载在RAM中的特定空间中,并解压展开,然后把系统控制权移交给内核。
c、bootloader的安装位置:MBR中
MBR:master boot loader,共512字节:前446字节存放bootloader(LILO、GRUB),中64字节:存放分区表,后2字节:55AA表示mbr有效,其他值则表示mbr不可用。
d、grub各阶段作用:
stage1:bootloader
stage1_5:分区文件系统驱动
stage2:引导/boot/grub分区,由bootloader加载第二阶段(如果用mbr去加载此阶段,字节数有限制;grub可以将此阶段放在磁盘上,可以做很多菜单,因为没有空间限制),然后在去加载内核。
e、加载内核(kernel)
kernel自身初始化:
探测可识别的到所有硬件设备
加载硬件的驱动程序,有可能会借助于ramdisk加载驱动
以只读方式挂载根文件系统(rootfs)
运行用户空间的第一个应用程序(/sbin/init)
init程序类型:
centos5:sysv init,配置文件位置:/etc/inittab
centos6:upstart,配置文件位置:/etc/inittab及/etc/init/*.conf
centos7:systemd,配置文件位置:/usr/lib/systemd/system及/etc/systemd/system
f、ramdisk:linux内核特性之一
使用缓冲和缓存来加速对磁盘上的文件的访问。
initramfs取代initrd:减少缓冲次数
centos5:initrd,工具程序:mkinitrd
centos6/7:initramfs,工具程序:dracut、mkinitrd
10、总结:系统初始化流程(内核级别)
post--->boot sequence(bios中设置)--->bootloader(mbr)--->kernel(有可能借助ramdisk)--->rootfs(readonly)--->启动/sbin/init进程
11、/sbin/init
centos5:sysv init
init运行级别:为了系统的运行或维护等目的而设定的机制;共有0-6个级别。
0:关机,shutdown
1:单用户模式(single user):root用户,无需认证,维护模式
2:多用户模式(multi user):会启动网络功能,但不会启动NFS,它是维护模式
3:多用户模式(multi user):完全功能模式,文本界面,不会激活桌面系统
4:预留级别:目前无特别使用目的,但习惯以同“3”级别功能使用
5:多用户模式(multi user):完全功能模式,会启动图形界面
6:重启,reboot
默认级别:3,5
init运行级别切换:
#init N :N代表init的级别
级别查看:
#who -r
#runlevel
[root@localhost ~]# who -r
run-level 5 2017-12-31 09:27 last=3
[root@localhost ~]# runlevel
3 5
[root@localhost ~]#
centos5中:通过配置文件/etc/inittab来决定init进程来做些什么,在centos中,inittab文件中的每一行执行一种操作。
12、inittab文件配置格式:
每行定义一种action以及与之对应的process(仅适用于centos5);
inittab文件格式:id:runlevels:action:process
id:每行定义一个任务的具体标识符
runlevels:在哪些级别启动此任务,如:#,###,也可以为空,表示所有级别
action:在什么条件下启动此任务
wait:等待切换至此任务所在的级别时执行一次操作
respawn:一旦此任务终止时,就自动重启动此任务
initdefault:设定默认运行级别,此时,process可以省略
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本文件
process:具体的任务是什么,可以是程序也可以是脚本。。
inittab中action示例:
id:3:initdefault
si::sysinit:/etc/rc.d/rc.sysinit
lo0:0:wait:/etc/rc.d/rc0 //意味着去启动或关闭/etc/rc.d/rc3.d/目录下服务脚本所控制的服务(s*:表示要启动的服务,k*要停止的服务)
tty1:2345:respawn:/usr/sbin/mingetty1 //此为启动6个终端服务,如果此处删除一个,则ctrl+shift+F#就会少一个。
tty2:2345:respawn:/usr/sbin/mingetty2 //mingetty会调用login程序,打开虚拟终端程序除了mingetty之外,还有诸如getty。
tty3:2345:respawn:/usr/sbin/mingetty3
tty4:2345:respawn:/usr/sbin/mingetty4
tty5:2345:respawn:/usr/sbin/mingetty5
tty6:2345:respawn:/usr/sbin/mingetty6
13、rc脚本介绍: rc脚本的功能:接受一个运行级别数字为参数 k*:要停止的服务;k##*,##表示优先级,数字越小,越是优先关闭,依赖别的服务的服务要先关闭,被依赖的后关闭 s*:要启动的服务;s##*,##表示优先级,数字越小,越优先启动,被依赖的服务先启动,依赖别的服务的服务后启动。 rc脚本框架: for srv in /etc/rc.d/rc#.d/k*;do $srv stop done for srv in /etc/rc.d/rc#.d/s*;do $srv start done /etc/rc.d/*(或/etc/rc.d/init.d/*)脚本执行方式: 方法一:#/etc/init.d/SRV_SCRIPT {start|stop|restart|status} 方法二:service SRV_SCRIPT {start|stop|restart|status} 注意:/etc/rc.d/rc.local:开机会自动运行一次,如果不会写脚本,可将需要的命令放在此处。 chkconfig命令:管控/etc/init.d/目录下每个服务脚本在各级别下的启动或关闭状态。 查看:#chkconfig --list [name] 添加:#chkconfig --add name 删除:#chkconfig --del name 能被chkconfig添加服务的脚本定义之一: #chkconfig:LLL NN NN //脚本中定义的格式,LLL表示运行的级别,当为空时表示在所有init级别上;NN分别是关闭优先级和启动优先 #description: 修改指定的链接类型: chkconfig [--level LEVEL] name --level:指定要控制的级别,不写默认为2345 示例:#chkconfig --level 35 srv on #chkconfig --list srv 注意:下次开机起作用,当前不受影响。 正常级别下:最后启动的一个服务s99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/local脚本;因此不便或不需要写为服务脚本的程序期望开机自动运行时,直接放置于此脚本文件中即可。/etc/rc.d/rc.local的另一文件文件路径/etc/rc.local。关系如下: [root@localhost ~]# ls -l /etc/rc.local lrwxrwxrwx. 1 root root 13 Aug 29 20:05 /etc/rc.local -> rc.d/rc.local [root@localhost ~]# |
14、centos5常用的系统初始化脚本文件:/etc/rc.d/rc.sysinit) 脚本文件的功能: ①、设置主机名 ②、设置欢迎信息 ③、激活udev和selinux ④、挂载/etc/fstab文件中定义的所有文件系统 ⑤、检查根文件系统,并以读写的方式重新挂载根文件系统 ⑥、设置系统时钟 ⑦、根据/etc/sysctl.conf文件的设置,来设置内核参数 ⑧、激活lvm及软raid设备 ⑨、激活swap设备 ⑩、加载额外设备的驱动程序 11、清理操作。 |
15、总结:用户空间的启动流程
/sbin/init(通过读取/etc/inittab文件完成各种任务:设置默认运行级别--->运行系统初始化脚本,完成系统初始化--->关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务--->设置登陆终端--->启动图形终端【非必须】)
16、centos6:init程序介绍:
init程序:upstart,但依然为/sbin/init,其配置文件:/etc/init/*.conf;/etc/inittab(仅用于定义默认级别)
注意:*.conf为upstart风格的配置文件。
rcs.conf:系统初始化脚本
rc.conf:启动或关闭服务
start-ttys.conf:定义启动哪些终端服务。
17、centos7:init程序介绍
init程序:systemd,配置文件:/usr/lib/systemd/system/*;/etc/systemd/system/*
注意:在centos5/6中定义的开机启动的服务,这些服务在开机时会自动启动,但在centos7中,定义的启动服务,开机时并未启动,只有在被访问时,才会启动。所以centos7开机比较快。
同时,systemd没有init中的级别概念。
centos7完全兼容sysV脚本机制,因此,service命令依然可以使用,不过,建议使用systemctl命令来控制服务。
systemctl {start| stop |restart |status} name[.service]