linux操作系统自从开始启动至启动完毕需要经历几个不同的阶段,这几个阶段就叫做runlevel,同 样,当linux操作系统关闭时也要经历另外几个不同的runlevel,下面我们就准备详细介绍一下runlevel,并向您展示一些小技巧来让您的 linux系统避免不必要的重启动。 .
runlevel可以认为是系统状态,形象一点,您可以认为runlevel有点象微软的windows操作系统中的 Normal,safemode,和Command prompt only。进入每个runlevel都需要启动或关闭相应的一系列服务(services),这些服务(services)以初始化脚本的方式放置于目录 /etc/rc.d/rc?.d/或者/etc/rc?.d下面(?代表runlevel的对应序号) 。 .
在大多数的linux发行版本中,通常有8个runlevel ..
Runlevel System State
0 Halt the system # 0 - 停机(千万不能把initdefault 设置为0 )
1 Single user mode # 1 - 单用户模式
2 Basic multi user mode # 2 - 多用户,没有 NFS
3 Multi user mode # 3 - 完全多用户模式(标准的运行级)
# 4 - 没有用到
5 Multi user mode with GUI # 5 - X11 (xwindow)
6 Reboot the system
S, s Single user mode 。 # 6 - 重新启动 (千万不要把initdefault 设置为6——把被你黑掉的linux的initdefault设置为0或6也算是拒绝服务攻击噢!)
多数的桌面的linux系统缺省的runlevel是5,用户登陆时是图形界面,而多数的服务器版本的 linux系统缺省的runlevel是3,用户登陆时是字符界面,runlevel 1和2除了调试之外很少使用,runlevel s和S并不是直接给用户使用,而是用来为Single user mode作准备。 ..
linux的运行模式比起windows的启动模式的优势在于:你可以在系统空闲时使用.init工具切换你现在使用的runlevel,另外,当 你关闭或者启动linux系统时你已经不知不觉中切换你的runlevel,系统关机进程需要调用runlevel(0或6)来关闭所有正在运行中的进 程。 !
显示当前运行模式 .
刚入门时,你或许对先前和目前正在使用中的运行模式很好奇,runlevel命令可以用来显示这些信息:
$ /sbin/runlevel
3 5
runlevel命令的输出结果表明最初的运行模式是3,而现在的运行模式是5。 .
切换运行模式使用telinit命令(root用户):
$ /sbin/telinit
通常,切换运行模式的目的是重启某些应用进 程,比如XFree86,将运行模式从5切换到3将终止XFree86以及与之相关的所有进程,然后再把运行模式切换到5,XFree86就可以很干净的 启动。在做这些工作之前,请确保所有在XFree86下的工作都已经保存,用root用户:
$ /sbin/telinit 3
$ /sbin/telinit 5
在键入命令之后,你的屏幕可能会显示一些服务启动或者停止的信息。 .
在运行模式中加入启动服务 ..
要在某个运行模式中加入一个启动服务,首先要新建该服务启动脚本,然后把它放置于/etc/rc.d/init.d或者/etc/init.d /(根据你的linux版本有所不同),要将该启动脚本与运行模式关联起来,你需要这个运行模式的目录下建立一个与/etc/rc.d/init.d/下 启动脚本的symbolic link,文件名的前缀通常为SXX,XX为数字,这个数字是用来控制该运行模式下服务的启动顺序。脚本的执行顺序是按照数字大小升序执行,就是数字越小 越先执行,下面就是一个在运行模式中加入启动服务具体的例子:
$ cp myservice /etc/rc.d/init.d/
$ ln -s /etc/rc.d/init.d/myservice /etc/rc3.d/S99myservice
这样,下次以runlevel 3启动时,myservice就会自动启动。
以某个runlevel启动
你可以自己制定启动时所进入的runlevel,如果你的系统使用的是lilo,在启动命令中将相应的部分为:
LILO: linux 5
如果你使用的是GRUB,在启动时你可以按住e键进入设置模式,相应的位置显示为:
kernel /vmlinuz ro root=/dev/hda1 5
应用设置:
1,
这种也是最常用的一种
rcconf:
sudo apt-get install rcconf
root 下运行: rcconf
功能更全的:sysv-rc-conf
sudo apt-get install sysv-rc-conf
运行:sysv-rc-conf
这个改起来很简单,如下图:
2,
直接改/etc/rc0.d ~ /etc/rc6.d和/etc/rcS.d下的东西,S开头的表示启动,K开头的表示不启动,
例如:想关闭vsftpd的开机自动启动,只需sudo mv /etc/rc2.d/S20vsftpd /etc/rc2.d/K20vsftpd就可以了。
这条命令的用意就是利用mv的重命名功能。
3,chkconfig ,这种方法在redhat,Debian里面比较常用,在fedora和ubuntu里面用方法1比较简单,但是学习一下这种方法也是不错的。
但在ubuntu下这个命令没有redhat好用,老是出错.
算了,还是直接看一下redhat里面chkconfig的用法吧.
1,chkconfig --level [0123456] [service name] [on|off]
chkconfig --level 23 dhcp3-server off ----设定dhcp server服务在level2,3下关闭.
2,chkconfig --list 查看服务的自动开启状态
3,chkconfig --add 增加一个服务给chkconfig来管理,但是该服务必须在/etc/init.d内 .
例子,
1,gedit /etc/init.d/test
chkconfig:[runlevels] [start number] [stop number]
chkconfig: 23 80 70
其中start number 代表S80test
stop number 代表K70test
2,chkconfig --add test
3,chkconfig --list test
test 0:off 1:off 2:on 3:on 4:off 5:off 6:off
4,check /etc/rc.d/下的档案
find /etc/rc.d -type l | grep 'test' |sort
/etc/rc.d/rc0.d/K70test
/etc/rc.d/rc1.d/K70test
/etc/rc.d/rc2.d/S80test
/etc/rc.d/re3.d/S80test
/etc/rc.d/rc4.d/K70test
/etc/rc.d/rc5.d/K70test
/etc/rc.d/rc6.d/K70test
/etc/rc.d/rc7.d/K70test
-type l代表“连接文件”
4,chkconfig --del 删除一个给chkconfig管理的服务
5,显示目前run level 2为启动的服务
chkconfig --list | grep '3:on'
如果以上方法在Ubuntu 10.04中不起作用 ,例如mysql 和 vsftpd在按照上面设置后仍会开机启动
那么你需要做下面一些工作:
进入/etc/init/目录
cp /etc/init/
你会发现这里面有mysql.conf 和 vsftpd.conf文件
不错就是这两个文件需要稍作修改
在文件的开头都有
start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [xxxx] #xxxx是表示runlevel的级别如:2345表示runlevel 2、3、4、5
在我的vsftpd.conf中是
stop on runlevel [!2345] #表示在非2、3、4、5的runlevel就不启动
这里就是问题的关键,我们的系统是默认以runlevel 2启动的
所以我们可以把它改为
stop on runlevel [0126] #当然可以不是这样,但至少要包括2