欢迎各位兄弟 发布技术文章
这里的技术是共享的
id:5:initdefault
si::sysinit:/etc/rc.d/rc.sysinit
OS的初始化
/etc/rc.d/rc.sysinit 完成的任务
1,激活udev和selinux: (前200行,就不用读了,前面十几行还是可以看得懂的吧)
2,根据/etc/sysct.conf文件,来设定内核参数
3,设定系统时间
4,装载键映射
5,启用交换分区
6,设置主机名
7,根文件系统检测,并以读写方式重新挂载
8,激活RAID(及软RAID)和LVM设备 (额外的,除了根以外和其它的)
9,启用磁盘配额 (限定用户最多使用多少磁盘空间的,用处不大)
10,根据/etc/fstab,检查并挂载其它文件系统
11,清理过期的锁和PID文件
l0:0:wait:/etc/rc.d/rc 0
rc0.d/
K* (K是kill的意思)
stop
S* (S是start的意思)
start
链接到 /etc/rc.d/init.d , /etc/init.d 这两个指的是同一个位置,后面是前面的链接
放到里面的脚本通通称为服务脚本 服务类脚本
start 启动一个程序,或进程,一个程序可能关联多个进程,这些进程都可为称为服务类脚本
红帽遵循SysV风格
/etc/rc.d/init.d
每一个脚本至少接受4个参数
start stop restart status
还有可能 reload|configtest 这些都是属于SysV风格
(reload不重启,重读配置文件,SIGHUP,1号信号)
(configtest,检查配置文件中是不是有语法错误的)
有个命令 chkconfig : 能够指定SysV风格的这一类的服务类脚本,能够实现给它自动创建链接于rc#.d目录下
前提是这一类脚本必须有 chkconfig 和 description 这两行
/etc/rc.d/init.d下的脚本都有这两行 这类脚本就靠这样两行能够实现成为系统服务的
# chkconfig: 定义能够接受另外一个命令的控制,并自动的在对应的 rc#.d(rc0.d rc1.d等等)创建链接的 (而且K开头,S开头也能够通过一个命令来实现)
# chkconfig: 345 95 5 (# chkconfig: 2345 95 05 ,# chkconfig: 345 28 72 )
# chkconfig: runlevels SS KK
runlevels: - (中短横) 表示没有一个级别默认为S*开头的链接:创建链接的时候,默认所有都是K*开头的
三组数字:
第一组 345 用来定义默认的启动的运行级别,在哪些级别下默认是启动的 默认设定为s ( start )的级别(345表示3,4,5级别下创建S开头的,其余的创建K开头的)
第二组 95 用来定义启动的优先次序(SS两位)
第一组 5 关闭的优先次序(KK两位,为什么这里只有一位?)
当chkconfig命令来为此脚本在rc#.d目录创建链接时,runlevels 表示默认创建为S*开头的链接,除此之外的级别都默认创建为K*开头的链接
S后面的启动优先级为SS所表示的数字 K后面的关闭优先次序为KK所表示的数字
# description::用于说明此脚本的简单功能的,反斜线 \ 续行 (内容太多时,需要续行) (一般一行不超过80个字符,否则某些图形化工具显示不出来)
看上去是注释,但我们的脚本会读取这两行 ,虽然是注释,但是chkconfig 会分析这两行
命令 chkconfig
chkconfig --list 列出当前系统上的所有服务 查看所有独立守护进程类服务的启动设定
chkconfig --list SERVIE_NAME 只看某一个某一个服务
想让某个脚本,比如自己建的myservice脚本,能够创建S*开头的链接,M*开头的链接,把myservice脚本先放到 init.d目录下 然后执行下面的一行命令,这样子就自动给脚本创建几个链接了
chkconfig --add SERVICE_NAME(服务名称或脚本名称) 表示把它加到服务列表中去,chkconfig 可以控制的服务中去
chkconfig --del SERVICE_NAME(服务名称或脚本名称) 移除服务,这样就能通通移除创建的链接文件
chkconfig [ --level RUNLEVELS ] SERVICE_NAME {on|off} 修改服务的级别
--level RUNLEVELS 其实是可以省略的,如果省略的话,默认是2345,不是当前级别
像这类S开头,K开头的,在对应级别下能够实现启动和停止的这些服务 叫独立守护进程
/etc/rc.d/rc.local (/etc/rc.local):系统最后启动的一个服务,准确说,应该是执行的一个脚本
红帽5上 /etc/inittab的任务:
1)设定默认运行级别
2)运行系统初始化脚本
3)运行指定运行级别对应的目录下的脚本:S*开头的start,K*开头的stop (应该是先运行K*开头,再运行S*开头的)
4)设定Ctrl+Alt+Del组合键的操作
5)定义UPS电源在电源故障/恢复时执行的操作
6)启动虚拟终端 (2345级别)
7)启动图形终端(5级别)
守护进程的类型:
独立守护进程 (路边专卖店,)
xinetd:超级守护进程 (它是独立守护进程):是需要关联至运行级别的,代理人,只有一个
瞬时守护进程 (短暂守护进程):不需要关联至运行级别的 (大商场里面的一个店铺)
A(有人访问A时,由xinetd开启A,此人访问结束,再由xinetd关闭A)
瞬时守护进程 可以有多个
(有人访问大商场里面的某一个店铺,保守叫醒此店铺服务,服务结束后,此店铺睡觉)
[root@localhost ~]# cd /etc/rc.d/init.d/
[root@localhost init.d]# ls
[root@localhost init.d]# head acpid anacron
[root@localhost init.d]# head acpid anacron atd autofs 都有共同的两行
# chkconfig 2345 77 22 (# chkconfig 2345 77 22 加起来一般等于99,不等于99也没关系,一般先开启的后关闭,后开启的先关闭;;;先开启的服务可能被其它服务所依赖,所以关闭时,是依赖的先关闭,再关闭这个服务)(造房子的时候,先砌的砖,到拆的时候,肯定是后拆)
[root@localhost ~]# vim myservice.sh
#!/bin/bash
#
# chkconfig: 2345 77 22
# description: Test Service
LOCKFILE=/var/lock/subsys/myservice
status(){
if [ -e $LOCKFILE ]; then
echo "Running..."
else
echo "Stopped.."
fi
}
usage(){
echo "`basename $0` {start|stop|restart|status}"
}
case $1 in
start)
echo "Starting..."
touch $LOCKFILE;;
stop)
echo "Stopping..."
rm -f $LOCKFILE &>/dev/null;;
restart)
echo "Restarting...";;
status)
status;;
*)
usage;;
esac
[root@localhost ~]# chmod +x myservice.sh
[root@localhost ~]# ./myservice.sh start
Starting...
[root@localhost ~]# ./myservice.sh status
Running...
[root@localhost ~]# ./myservice.sh stop
Stopping...
[root@localhost ~]# ./myservice.sh status
Stopped..
[root@localhost ~]#
每一个服务启动后,都给它一个锁 在 /var/lock/ 和 /var/lock/subsys/ 里面看看吧
service 服务 status 通过锁文件来检查状态的
[root@localhost ~]# ls /var/lock/
dmraid irqbalance iscsi lvm subsys
[root@localhost ~]# ls /var/lock/subsys/
acpid gpm iscsid network sendmail xinetd
atd haldaemon kudzu pcscd smartd yum-updatesd
auditd hcid local portmap sm-client
autofs hidd lvm2-monitor rhsmcertd sshd
avahi-daemon ip6tables messagebus rpc.idmapd syslog
bluetooth iptables microcode_ctl rpc.statd vmware-tools
crond iscsi netfs sdpd xfs
[root@localhost ~]#
复制到 /etc/rc.d/init.d/ 目录录 (不要.sh)
[root@localhost ~]# cp myservice.sh /etc/rc.d/init.d/myservice
[root@localhost ~]# chkconfig --list
列出当前系统上的所有服务 ,每一个服务都有一个脚本名,而且显示在对应级别下
[root@localhost ~]# chkconfig --list network (只看network,进1级别,网络服务是不是会启动的)
network 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@localhost ~]#
[root@localhost ~]# cd /etc/rc.d/init.d/
[root@localhost init.d]# ls
[root@localhost init.d]# cd ..
[root@localhost rc.d]# ls
init.d rc0.d rc2.d rc4.d rc6.d rc.sysinit
rc rc1.d rc3.d rc5.d rc.local
[root@localhost rc.d]# ls rc3.d/
[root@localhost rc.d]# find ./ -name "*myservice*"
./init.d/myservice
[root@localhost rc.d]#
加入服务(就创建了S和K开头的链接文件)
[root@localhost rc.d]# chkconfig --add myservice
[root@localhost rc.d]#
[root@localhost rc.d]# find ./ -name "*myservice*"
./rc6.d/K22myservice
./rc3.d/S77myservice
./rc1.d/K22myservice
./rc5.d/S77myservice
./rc2.d/S77myservice
./rc0.d/K22myservice
./init.d/myservice
./rc4.d/S77myservice
由 # chkconfig 和 #description 这两行 控制S(开启),K(关闭)的
[root@localhost rc.d]#
移除了服务,自动创建的链接文件就没有了
[root@localhost rc.d]# chkconfig --del myservice
[root@localhost rc.d]# find ./ -name "*myservice*"
./init.d/myservice
[root@localhost rc.d]#
add 后 ,又有了链接文件
[root@localhost rc.d]# chkconfig --add myservice
[root@localhost rc.d]# find ./ -name "*myservice*"
./rc6.d/K22myservice
./rc3.d/S77myservice
./rc1.d/K22myservice
./rc5.d/S77myservice
./rc2.d/S77myservice
./rc0.d/K22myservice
./init.d/myservice
./rc4.d/S77myservice
[root@localhost rc.d]#
[root@localhost rc.d]# chkconfig --list myservice
myservice 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
不用改脚本
直接
[root@localhost rc.d]# chkconfig --level 24 myservice off (好像不修改init.d/myservice文件,重启时会失效?应该不会失效吧!)
[root@localhost rc.d]#
[root@localhost rc.d]# chkconfig --list myservice (此时2和4都关闭的)
myservice 0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:启用 6:关闭
[root@localhost rc.d]# cd /etc/rc.d/init.d
[root@localhost init.d]# ls
[root@localhost init.d]# cd ../rc3.d
[root@localhost rc3.d]# ls (看有没有rc.local 好像没有,不过没关系,马哥记错了)
[root@localhost rc3.d]# ll
[root@localhost rc3.d]# cd ..
[root@localhost rc.d]# ls
init.d rc0.d rc2.d rc4.d rc6.d rc.sysinit
rc rc1.d rc3.d rc5.d rc.local
[root@localhost rc.d]# ls -l /etc/rc.local
lrwxrwxrwx 1 root root 13 08-25 06:10 /etc/rc.local -> rc.d/rc.local
[root@localhost rc.d]#
rc.local 是系统启动执行到最后时要执行的脚本
(所有服务都启动完了,就执行它了)
不方便定义为服务的,又不会写脚本的,期望它开机能够自动执行的命令脚本,可以都写到这儿,它到最后,一定会执行一次的
[root@localhost rc.d]# vim rc.local
[root@localhost rc.d]# vim rc.local 加入这一行, 开机时自动执行
[root@localhost ~]# vim /etc/inittab
mingetty 启用终端 登录之前 mingetty命令都会启动一个终端
(ctrl+)alt (从F1到F6,可以切换,它们之间是一一对应的)
[root@localhost ~]# mingetty
[root@localhost ~]# mingetty tty7
[root@localhost ~]# mingetty tty1
[root@localhost ~]#
配置下yum
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
cdrom.repo rhel-debuginfo.repo-bak
[root@localhost yum.repos.d]# cat cdrom.repo
[Base]
name=RHEL5 CDROM Server
baseurl=file:///media/cdrom/Server
enabled=1
gpgcheck=0
[root@localhost yum.repos.d]#
[root@localhost yum.repos.d]# mount /dev/cdrom /media/cdrom/
mount: block device /dev/cdrom is write-protected, mounting read-only
[root@localhost yum.repos.d]#
[root@localhost yum.repos.d]# yum install xinetd -y
xinetd 启动后会有很多瞬时进程会被安装的
[root@localhost yum.repos.d]# chkconfig --list xinetd
chkconfig --list xinetd 级别,它不会现在有效的,不会马上启动xinetd, 只是,下一次重启电脑的时候,才有效
[root@localhost yum.repos.d]# service xinetd start
启动 xinetd: [确定]
[root@localhost yum.repos.d]#
[root@localhost yum.repos.d]# chkconfig --list
xinetd 管理的瞬时服务,没有级别的概念;但是xinetd本身是级别的概念
启动瞬时服务 不需要级别 (启动独立守护进程,也可以不需要级别,此时默认级别为2345,不是当前的系统开级的级别)
[root@localhost yum.repos.d]# chkconfig rsync on
[root@localhost yum.repos.d]#
[root@localhost yum.repos.d]# chkconfig --list