1.Linux系统组成
1)内核
1.内核功能:进程管理,内存管理,网络协议栈,文件系统,驱动程序,安全功能
2.进程间通信IPC(Inter process communication)分类
1)消息队列,semerphor,shm共享内存等
2)socket,不同主机间通信
2)根文件件系统
2.运行中的系统环境分类:
1)内核空间:内核代码(系统调用)
2)用户空间:应用程序(进程或线程)
ps:根文件系统中最重要的文件:init
3.内核设计流派:
1)单内核设计:把所有功能集成于一个程序,例如linux
2)微内核设计:每种功能使用一个单独的子系统实现,例如Windows,Solaris
4.Linux内核的特点:
1)支持模块化:内核中的功能 .ko文件(kernel object)
2)支持模块运行时动态装载或卸载
3.Linux内核组成部分:
1)核心文件:/boot/vmlinuz-version-release (release为local version发行号)
[root@grub6 init]# ls /boot
config-2.6.32-696.el6.x86_64 initramfs-2.6.32-696.el6.x86_64.img System.map-2.6.32-696.el6.x86_64
efi lost+found vmlinuz-2.6.32-696.el6.x86_64
grub symvers-2.6.32-696.el6.x86_64.gz
2)ramdisk(临时根文件系统):其将内存中的一部分当做磁盘使用,使内核可以加载/boot下根文件系统设备的相关驱动程序,达到挂载根文件系统的目的
1.Centos5:/boot/initrd-verson-release.img
2.Centos6,7:/boot/initramfs-version-release.img
ps:由于ramdisk其本身即在内存空间中。当在centos5中将ramdisk当做磁盘中的文件进行读取,可能会被再次缓存,形成双缓存。在Centos6,7中,ramdisk被当做文件系统即不会发生这种状况。
3)模块文件:/lib/modules/version-release
1.POST加电自检:由ROM芯片上的CMOS进行,常见的CMOS为BIOS
2.BIOS(芯片中的代码):Basic input Output System
ps:ROM(加载自检程序)及RAM都为可被CPU访问的内存空间
1.Boot Sequence(启动过程):按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备
2.bootloader:引导加载器,程序
1)Windows:ntloader
2)Linux:
1.LILO:Linux Loader
2.GRUB:Grand Uniform Bootloader
1)GRUB 0.X:grub legacy,基础grub
2)GRUB 1.X:grub2,第二版grub
ps:boot loader无法驱动lvm,软raid类高级设备,因为bootloader太小,所有一般内核应该放在基本磁盘分区上
3.MBR(Master Boot Record)引导加载器共512bytes:
1)446bytes:bootloader
2)64bytes:fat(文件系统分配表)
3)2bytes:55AA(确认有效信息)
4.GRUB引导加载器:
1)bootloader:1st stage;
2)Partition:filesystem driver,1.5stage
3)Partition:/boot/grub,2nd stage
ps:grub将引导加载分成四个阶段
1.第一阶段,装载bootloader,实现装载第二阶段
2.由第二阶段提供相关的接口,
3.将内核加载至内存中
5.bootloader功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中特定空间,解压,展开,而后把系统控制权移交给内核
1.自身初始化:
1.探测可识别到的所有硬件设备
2.加载硬件驱动程序(可能借助于ramdisk加载驱动)
3.以只读方式挂载根文件系统
4.运行用户空间的第一个应用程序:/sbin/init
2.init程序的类型:
1.Centos 5:SysV init
1)配置文件:/etc/inittab
2.Centos 6:Upstart
1)配置文件:/etc/init/*.conf(为了兼容5,/etc/inittab也存在)
3.Centos 7:Systemd
1)配置文件:/usr/lib/systemd/system;/etc/systemd/system
3.ramdisk(安装完操作系统后,自行创建):
1)linux内核的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
2)Centos 5:initrd,工具程序为mkinitrd
3)Centos 6,7:initramfs,工具程序为dracut(也兼容mkinitrd,实际也为调用dracut程序)
4)由Centos5到6,7:ramdisk --> ramfs(提速机制)
1.系统初始化流程(内核级别)
1.POST:加电自检,检测硬件设备是否存在并且能够正常运行。
2.BootSequence:通过BIOS决定哪个设备为引导加载设备。
3.Bootloader(MBR):引导加载器,将用户选择好的系统或内核装载至RAM的特定空间中。
4.kernel初始化:借助ramdisk,完成对真正根文件系统相关设备驱动程序的加载。
5.rootfs:避免操作系统bug,以只读方式挂载根文件系统。
6.运行/sbin/init
1.由于init程序是用户空间第一个启动的程序,其余进程都为其子进程,所以其为用户空间最重要的程序。
2.运行级别:为了系统的运行或维护等目的而设定的机制
0-6:共7个级别
0级别,关机,shutdown;0级别
1级别,单用户模式(single user),root用户,无需认证,维护模式;
2级别,多用户模式(multi user),会启动网络功能,但不会启动NFS(网络文件系统,维护模式)
3级别,多用户模式(multi user),完全功能模式,文本界面
4级别,预留级别,目前无特别使用目的,单习惯以同3级别功能使用
5级别,多用户模式(multi user),完全功能模式,图形界面
6级别,重启,reboot
3.运行级别切换及查看
1)运行模式一般默认级别:3,5
2)级别切换:init #,例如init 5
3)级别查看:who -r命令或runlevel
1.init配置文件:/etc/inittab
2.配置文件格式:
每行定义一种action以及与之对应的process
id:runlevels:action:process
1.id:一个任务的标识符
2.runlevels:在哪些级别启动此任务,也可以为空,表示所有级别
3.action:在什么条件下启动此任务
1)wait:等待切换至此任务所在的级别时执行一次
2)respawn:一旦此任务终止,就自动重新启动之
3)initdefault:设定默认运行级别,此时process省略
4)sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
4.process:任务
3.举例:
1)id:3:initdefault:(设定默认启动级别为3)
2)si::sysinit:/etc/rc.d/rc.sysinit(启动任一级别时,设定系统初始化)
1.rc脚本:实现在指定级别下,自动启动或关闭设置好的服务(rc各级别脚本为/etc/init.d/*服务脚本的符号链接)
I0:0:wait:/etc/rc.d/rc 0
I1:1:wait:/etc/rc.d/rc 1
.
.
I6:6:wait:/etc/rc.d/rc 6
2./etc/rc.d目录下有个对应级别的rc脚本,并且每个对应脚本下有K开头及S开头的文件
1)K*:要停止的服务;K##*,其中##代表优先级,数字越小,越优先被关闭,依赖的服务先关闭,之后关闭被依赖的服务
2)S*:要启动的服务,S##*,其中##代表优先级,数字越小,越先被启动,被依赖的服务先被启动,之后启动依赖的服务
[root@kasumi ~]# ls /etc/rc.d/
init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit
[root@kasumi ~]# ls /etc/rc.d/rc3.d/
K01smartd K61nfs-rdma K92pppoe-server S13cpuspeed S26haldaemon
K02oddjobd K69rpcsvcgssd K95firstboot S13irqbalance S26udev-post
K05wdaemon K73winbind K99rngd S13rpcbind S28autofs
K10psacct K74ntpd S01sysstat S15mdmonitor S55sshd
K10saslauthd K75ntpdate S02lvm2-monitor S22messagebus S80postfix
K15svnserve K75quota_nld S05rdma S23NetworkManager S82abrtd
K30spice-vdagentd K76ypbind S08ip6tables S24nfslock S83abrt-ccpp
K50dnsmasq K84wpa_supplicant S08iptables S24rpcgssd S90crond
K50kdump K87restorecond S10network S25blk-availability S95atd
K50snmpd K88sssd S11auditd S25cups S99certmonger
K50snmptrapd K89netconsole S11portreserve S25netfs S99libvirt-guests
K60nfs K89rdisc S12rsyslog S26acpid S99local
3.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
4./etc/rc.d/rc.local文件
1).正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d/下某脚本,而是链接至/etc/rc.d/rc.local(/etc/rc.local),因此,不便或不需要写为服务脚本的程序期望开机能自动运行,直接放置于此脚本文件中即可。
[root@kasumi ~]# ls /etc/rc.d/
init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit
[root@kasumi ~]# ll /etc/rc.d/rc3.d/ | grep "rc.local"
lrwxrwxrwx. 1 root root 11 4月 27 00:46 S99local -> ../rc.local
1./etc/init.d/testsrv编写测试服务文件
[root@kasumi init.d]# vim /etc/init.d/testsrv
#!/bin/bash
#testing service script
#chkconfig:2345 50 60 "此行为设定:2345(runlevel,chkconfig添加后自动为no) 50(启动优先级) 60(关闭优先级)"
#description:testing service
srv=$(basename $0)
if [ $# -lt 1 ];then
echo "Usage: $srv {start|stop|status|restart}"
exit 1
fi
if [ "$1" == "start" ];then
echo "start $srv finished"
elif [ "$1" == "stop" ];then
echo "stop $srv finished"
elif [ "$1" == "restart" ];then
echo "restart $srv finished"
elif [ "$1" == "status" ];then
if pidof $srv &> /dev/null;then
echo "$srv is running"
else
echo "$srv is stopped"
fi
else
echo "Usage: $srv {start|stop|status|restart}"
exit 2
fi
2./etc/init.d/*脚本执行方式
1)/etc/init.d/srv_script {start|stop|restart|status}
[root@kasumi ~]# /etc/init.d/testsrv start
start testsrv finished
[root@kasumi ~]# /etc/init.d/testsrv stop
stop testsrv finished
[root@kasumi ~]# /etc/init.d/testsrv status
testsrv is stopped
[root@kasumi ~]# /etc/init.d/testsrv eeee
Usage: testsrv {start|stop|status|restart}
[root@kasumi ~]# echo $?
2
2)service srv_script {start|stop|restart|status}
"service命令即为调取/etc/init.d/*脚本"
[root@kasumi ~]# service testsrv start
start testsrv finished
[root@kasumi ~]# service testsrv stop
stop testsrv finished
[root@kasumi ~]# service testsrv status
testsrv is stopped
[root@kasumi ~]# service testsrv
Usage: testsrv {start|stop|status|restart}
[root@kasumi ~]# echo $?
1
ps:/etc/rc.d/init.d/*也可执行服务脚本,其为/etc/init.d/*符号链接文件
1.chkconfig命令:管控/etc/init.d/每个服务脚本在各个级别下的启动或关闭状态,向/etc/rc.d/下各个级别对应文件添加,S或K开头的的对应服务文件
2.查看:chkconfig --list [name]
3.添加:chkconfig --add name:
[root@kasumi ~]# chkconfig --add testsrv
[root@kasumi ~]# ls /etc/rc.d/rc0.d/ | grep "testrv"
[root@kasumi ~]# ls /etc/rc.d/rc0.d/ | grep "testsrv"
K60testsrv
[root@kasumi ~]# ls /etc/rc.d/rc2.d/ | grep "testsrv"
S50testsrv
[root@kasumi ~]# ls /etc/rc.d/rc5.d/ | grep "testsrv"
S50testsrv
[root@kasumi ~]# ls /etc/rc.d/rc6.d/ | grep "testsrv"
K60testsrv
能被添加的服务的脚本定义格式之一:
#!/bin/bash
#
# chkconfig: LLL(runlevel,添加后自动为on)NN(启动优先级) NN(关闭优先级)
# description:
ps:由于其服务脚本设定2345级别,chkconfig命令添加后自动启动
,其为S开头文件,016级别则为K开头文件
4.删除:chkconfig --del name:
[root@kasumi ~]# chkconfig --del testsrv
5.修改制定的链接类型:chkconfig [--level LEVEL] name {on|off|reset}
1)- -level LEVELS:指定要控制的级别;默认为2345
[root@kasumi ~]# chkconfig --list testsrv
testsrv 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@kasumi ~]# chkconfig --level 23 testsrv off
[root@kasumi ~]# chkconfig --list testsrv
testsrv 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭
1.当前运行级别的对应服务开启或关闭之后,会启动相应终端
tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6
1)mingetty会调用login程序
2)打开虚拟终端的程序除了mingetty之外,还有诸如getty等
1.系统初始化脚本:/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.清理操作
1.用户空间的启动流程:/sbin/init(配置文件:/etc/inittab)
1.设置默认运行级别(id:3:initdefault)
2.运行系统初始化脚本,完成系统初始化(si::sysinit:/etc/rc.d/rc.sysinit)
3.关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 (l3:3:wait:/etc/rc.d/rc 3)
4.设置登陆终端
5.若为5级别,启动图形终端
1.init程序:upstart,但依然为/sbin/init,其配置文件:/etc/init/*.conf;/etc/inittab(仅用于定义默认运行级别)
ps:*.conf为upstart分割的配置文件
[root@kasumi ~]# ls /etc/init/*.conf
/etc/init/ck-log-system-restart.conf /etc/init/rcS.conf
/etc/init/ck-log-system-start.conf /etc/init/rcS-emergency.conf
/etc/init/ck-log-system-stop.conf /etc/init/rcS-sulogin.conf
/etc/init/control-alt-delete.conf /etc/init/readahead-collector.conf
/etc/init/init-system-dbus.conf /etc/init/readahead.conf
/etc/init/kexec-disable.conf /etc/init/readahead-disable-services.conf
/etc/init/plymouth-shutdown.conf /etc/init/serial.conf
/etc/init/prefdm.conf /etc/init/splash-manager.conf
/etc/init/quit-plymouth.conf /etc/init/start-ttys.conf
/etc/init/rc.conf /etc/init/tty.conf
1)rcS.conf:系统初始化脚本
2)rc.conf:启动关闭服务
3)start-ttys.conf:启动终端
1.init程序:systemd,配置文件:/usr/lib/systemd/system/*;/etc/systemd/system/*
2.其完全兼容SysV脚本机制,因此,service命令依然可以使用,但是建议使用systemctl命令来控制服务
systemctl {start|stop|restart|status} name[.service]