一、Linux组成
Linux:kernel+rootfs
kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
rootfs:程序和glibc
库:函数集合,function,调用接口(头文件负责描述)
过程调用:procedure,无返回值
函数调用:function
程序:二进制执行文件
内核设计流派
单内核(monolithic kernel):Linux
把所有功能集成于同一个程序
微内核(micro kernel):Windows, Solaris
每种功能使用一个单独子系统实现
Linux内核特点:
支持模块化:.ko(内核对象)rpm -ql kernel|grep ext4.ko
如:文件系统,硬件驱动,网络协议等
支持内核模块的动态装载和卸载
rpm -qi kernel
内核组成部分:系统驱动存放位置(3个位置)
核心文件:/boot/vmlinuz-VERSION-release(光盘自带)
ramdisk:辅助的伪根系统
CentOS 5: /boot/initrd-VERSION-release.img
CentOS 6,7: /boot/initramfs-VERSION-release.img(光盘里无此文件,作用是读取数据块)
模块文件:/lib/modules/VERSION-release
二、CentOS6启动流程
Paste_Image.png
1.加载BIOS的硬件信息,获取第一个启动设备
2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息
3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
4.核心执行init程序,并获取默认的运行信息
5.init程序执行/etc/rc.d/rc.sysinit文件
6.启动核心的外挂模块
7.init执行运行的各个批处理文件(scripts)
8.init执行/etc/rc.d/rc.local
9.执行/bin/login程序,等待用户登录
10.登录之后开始以Shell控制主机
系统初始化
post→mbr→grub (1stage→stage1.5→stage 2)/boot/grub→/boot/grub/grub.conf→
kernel /vmlinuz.XXX root= → /boot/initramfs|/boot/initrd.`uname -r`.img
------------------------------------------------
init初始化
/sbin/init --/etc/inittab ---/etc/rc.d/rc.sysinit(/etc/fstab)---
/etc/rc#.d/K,S ---/etc/rc.d/rc.local --/bin/login
POST
加电自检,是BIOS功能的一个主要部分
ROM:检查硬件,断电丢不了
RAM:有电池
bootloader:引导加载器,引导程序
MBR:446——bootloader;64——分区表;2——55AA
GRUB:
primary boot loader:
df -Th
1st stage 446字节,容量小,不能存放ext4.ko驱动
1.5 stage 存放并加载ext.ko驱动,解压缩
secondary boot loader:
2nd stage 还要加载ext.ko驱动(boot和分区的fs可能不同),启动分区文件
kernel
自身初始化
探测可识别到的所有硬件设备
加载硬件驱动程序(借助于ramdisk加载驱动、本身无ext.ko驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init
1.5阶段的解压缩(过程)
cd /boot;ls
cp initramfs-VERSION-release.img /app
cd /app
mv initramfs-VERSION-release.img initramfs-VERSION-release.img.gz
gzip -d initramfs-VERSION-release.img.gz
file initramfs-VERSION-release.img 查询文件格式(cpio格式)
cpio -tv < initramfs-VERSION-release.img
cpio -tv < initramfs-VERSION-release.img |grep ext4.ko
证明/boot/grub/目录下的文件可以移除(过程)
cd /boot/grub/;ls 此时的文件都是备份文件,可以移动或删除
mv * /app/
mv /app/grub.conf /app/splash.xpm.gz . 保留文件grub.conf(配置文件)和splash.xpm.gz(图形界面)
reboot
三、启动流程
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱动;
ramdisk --> ramfs 提高速度
CentOS 5:模拟磁盘——initrd——速度慢
工具程序:mkinitrd
CentOS 6,7:模拟文件系统——initramfs——速度快
工具程序:mkinitrd, dracut
系统初始化:
POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init(systemd)
ramdisk文件的制作
(1)mkinitrd命令(通用)
为当前正在使用的内核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
(2)dracut命令(6,7可用)
为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
实验:删除并恢复文件/boot/initramfs-VERSION-release.img
(1)救援模式→shell进程
(2)chroot /mnt/sysimage 必须切根
(3)cd /boot
(4)mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
(5)cat /boot/grub/grub.conf;ls /boot; 两个文件中的文件名要相同才可以;
(6)grub -install /dev/sda(可以省略)
(7)sync...exit
四、系统启动流程
rpm -ql /sbin/init
init程序的类型
(1)SysV:init,CentOS 5之前
配置文件:/etc/inittab
(2)Upstart:init,CentOS6
配置文件:/etc/inittab,/etc/init/*.conf
(3)Systemd:systemd,CentOS 7
配置文件:/usr/lib/systemd/system
/etc/systemd/system
/sbin/init CentOS6之前
运行级别:为系统运行或维护等目的而设定;0-6:7个级别
0:关机
1:单用户模式(root自动登录), single, 维护模式
2: 多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启
默认级别:3, 5
切换级别:init#
查看级别:runlevel; who -r
init初始化
init读取其初始化文件:/etc/inittab
初始运行级别(RUN LEVEL)
系统初始化脚本
对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X
五、CentOS 5的inittab文件
配置文件:/etc/inittab
每一行定义一种action以及与之对应的process
id:runlevel:action:process
action:
wait: 切换至此级别运行一次
respawn:此process终止,就重新启动之(设置再生程序:mingetty 会自动调用login程序)
initdefault:设定默认运行级别;process省略
sysinit:设定系统初始化方式,此处一般为指定
/etc/rc.d/rc.sysinit
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
ctrl+alt+shift:快捷键---(多长时间后)自动关机
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc0
l1:1:wait:/etc/rc.d/rc1...
l6:6:wait:/etc/rc.d/rc6
实验:增加终端tty
增加新终端,reboot才会生效;
实验:centos5:/etc/inittab文件里的id行的5更改为6---死循环---解决方案
按任意键---在光标行(grub行)最后加3---进入3模式后,vim /etc/inittab---6更改为5即可;
实验:破解root口令(centos5/6)
开机倒计时界面,按a---选择第一行,按a---光标所在行最后加1/S/s/single---进入界面后,passwd更改口令即可;
六、CentOS 6 /etc/inittab和相关文件
/etc/inittab
设置系统默认的运行级别
id:3:initdefault:
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf
/etc/rc.d/rc.sysinit: 系统初始化脚本
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作
说明:rcN --> 意味着读取/etc/rc.d/rcN.d/
K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
for srv in /etc/rc.d/rcN.d/K*; do
$srvs top
done
for srv in /etc/rc.d/rcN.d/S*; do
$srvs tart
done
K/S+次序号+服务名称;
K---关机;S---开机;
Paste_Image.png
(1)正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;
(2)不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中;
(3)/etc/rc.d/rc.local在指定运行级别脚本后运行;
(4)可以根据情况,进行自定义修改;
cat /etc/rc.d/init.d/functions
借鉴centos5的文件,完成作业
编写服务脚本/root/bin/testsrv.sh,完成如下要求
(1) 脚本可接受参数:start, stop, restart, status
(2) 如果参数非此四者之一,提示使用格式后报错退出
(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
考虑:如果事先已经启动过一次,该如何处理?
(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
考虑:如果事先已然停止过了,该如何处理?
(5) 如是restart,则先stop, 再start
考虑:如果本来没有start,如何处理?
(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAMEis running...”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped...”
其中:SCRIPT_NAME为当前脚本名
(7)在所有模式下禁止启动该服务,可用chkconfig和service命令管理
七、chkconfig命令
ntsysv命令
更改当前模式;
mv S05... K95... (数字不是随便写的、考虑其依赖的服务)
ntsysv --level=3 更改3模式
开机启动---[*]---S开头
开机不启动---[]---K开头
(1)查看服务在所有级别的启动或关闭设定情形:
chkconfig [--list] [name]
(2)添加:
SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)
chkconfig --add name
(3)删除:
chkconfig --del name
(4)修改指定的链接类型
chkconfig [--level #] name <on|off|reset>
--level #: 指定要设置的级别;省略时表示2345
chkconfig --list atd
chkconfig --level 23 atd on
不同服务---不同模式---不同状态
cat /etc/rc.d/init.d/sshd
chkconfig行的S开头数字越大越好,原因是可能会依赖其他的服务,开机次序排到后面最好;
Paste_Image.png
Paste_Image.png
自定义:开机后自动运行的脚本---可以放在/etc/rc.d/rc5.d/rc.local文件里;
实验:创建服务脚本
cd /etc/init.d 存放服务脚本
思路:
步骤一:创建服务脚本
vim testsrv
#!/bin/bash
#chkconfig: - 58 20
#disciption:this is a testing script(5---必须写正确;6---不要求;建议写)
start(){
echo testsrv is starting...
touch /app/testsrv.pid
}
stop(){
echo testsrv is stoping
rm -f /app/testsrv.pid
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
[ -e /app/testsrv.pid ] && echo testsrv is running || echo testsrv is stopped
;;
*)
echo "Usage:`basename $0` start|stop|status"
esac
步骤二:测试是否成功
chkconfig --add testsrv
chkconfig --level 345 testsrv on
chkconfig --list testsrv
chkconfig --del testsrv
chkconfig --list testsrv
chkconfig testsrv on(on---开机启动;off---开机不启动)
ll /etc/rc0.d/*testsrv*
ll /etc/rc5.d/*testsrv*
八、xinetd管理的服务
service 命令:手动管理服务
service 服务 start|stop|restart
service --status-all 查看当前所有服务的状态
chkconfig --list 开机状态
chkconfig sshd on; service sshd start; 开机启动;当前启动 (先chkconfig,再service;)
例
service atd stop
/etc/init.d/atd stop
独立服务(访问量大的服务):独立定义;
非独立服务(访问量少的服务):利用xinetd管理;xinetd本身是一个独立服务;
瞬态(Transient)服务——被xinetd进程所管理——进入的请求首先被xinetd代理(超级守护进程)
centos6 默认无xinetd服务
配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
与libwrap.so文件链接
telnet-server(不安全、不加密、不常用) 此安装包依赖于xinetd服务;
安装telnet-server包过程中,xinetd也被安装;
chkconfig --list 最下方可以看到xinetd服务;
(1)安装
yum -y install telnet-server
(2)更改配置文件
vim /etc/xinetd.d/telnet: disable=yes更改为disable=no
或者
chkconfig telnet on
此时,xinetd服务并不知道telnet服务启动了;
(3)重启xinetd服务
service xinetd status 刚安装的服务是不会马上被启动的
service xinetd start
grep telnet /etc/services 查看端口(23)
ss -ntl 查看端口
ss -ntlp
(4)xinetd只是监听,真正接受用户访问的还是telnet本身
ps aux|grep telnet
centos7上操作: 安装telnet;telnet 192.168.128.129(centos6 ip)
telnet---不能用root口令; 连接时,用普通用户口令;
centos6上操作: iptables -vnL; iptables -F;
ss -ntlp
某些服务(例如:ftp)可以调成独立服务或者非独立服务;
ftp——光盘安装或者网络自动安装;
centos7: 可以看做都是非独立服务---按需激活---systemd---所以启动快
网友评论