LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1876|回复: 21

给Archlinux添加runlevel切换机制

[复制链接]
发表于 2010-8-31 11:26:48 | 显示全部楼层 |阅读模式
如何能够让Archlinux能够根据runlevel的不同加载不同的daemon,就像其他的发行版那样

我对此问题的解决方案在8楼,大家有什么好的建议欢迎提出
发表于 2010-8-31 12:20:32 | 显示全部楼层
grub里面好像可以指定
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-31 12:49:02 | 显示全部楼层
Post by jqxl0205;2110525
grub里面好像可以指定


我的意思是如何能够根据runlevel的不同加载不同的daemon,就像其他的发行版那样
回复 支持 反对

使用道具 举报

发表于 2010-8-31 22:31:29 | 显示全部楼层
估计不行。除非自己写个/etc/rc.d/runlevel 之类的脚本自己实现不同runlevel的启动。
回复 支持 反对

使用道具 举报

发表于 2010-8-31 22:37:08 | 显示全部楼层
Post by 沈觅仁;2110581
估计不行。除非自己写个/etc/rc.d/runlevel 之类的脚本自己实现不同runlevel的启动。


不是很明白,为什么不行呢?在/etc/inittab里面不能定义运行级的daemon吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-1 00:11:13 | 显示全部楼层
Post by 沈觅仁;2110581
估计不行。除非自己写个/etc/rc.d/runlevel 之类的脚本自己实现不同runlevel的启动。


想了一下午,我也觉得必须得自己写个脚本。已经基本完成,正在调试Bug

Post by hpo3;2110583
不是很明白,为什么不行呢?在/etc/inittab里面不能定义运行级的daemon吗?

可以实现,但是很麻烦,会把这个最重要的配置文件改得凌乱不堪,而且不符合Kiss原则
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-1 11:37:28 | 显示全部楼层
呼呼,终于搞定了
我再优化优化,稍后分享出来。个人水平有限,见笑
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-1 12:12:24 | 显示全部楼层
三步曲,第一步,创建/etc/rc.runlevel,属性-rwxr-xr-x,内容如下:
#!/bin/bash
#
# /etc/rc.runlevel
# scripted by Bhoppi
#

. /etc/rc.conf
. /etc/rc.d/functions

run_hook runlevel_start

get_spec_daemons()
{
    case "$1" in
    2)
        dmlst=(${DAEMON2[@]})
        ;;
    3)
        dmlst=(${DAEMON3[@]})
        ;;
    4)
        dmlst=(${DAEMON4[@]})
        ;;
    5)
        dmlst=(${DAEMON5[@]})
        ;;
    *)
        dmlst=()
        ;;
    esac
}

runlvls="$(/sbin/runlevel)"
prelvl=${runlvls:0:1}
curlvl=${runlvls:2:3}

if in_array "$prelvl" 2 3 4 5; then
    get_spec_daemons "$prelvl"
    printhl "---- Stopping Runlevel $prelvl Daemons..."
    let i=${#dmlst[@]}
    while [ $i -gt 0 ]; do
        let i=i-1
        if [ "${dmlst[$i]#!}" = "${dmlst[$i]}" ]; then
            ck_daemon ${dmlst[$i]#@} || stop_daemon ${dmlst[$i]#@}
        fi
    done
    printhl "---- Stopping Completed"
fi

commonlvl=(35 53 23 24 25 32 34 42 43 45 52 54)
if ! in_array "$prelvl$curlvl" "${commonlvl[@]}"; then
    case "$curlvl" in
    [06])
        . /etc/rc.shutdown
        ;;
    [S1])
        . /etc/rc.single
        ;;
    [2345])
        . /etc/rc.multi
        ;;
    *)
        ;;
    esac
fi

if in_array "$curlvl" 2 3 4 5; then
    get_spec_daemons "$curlvl"
    printhl "---- Starting Runlevel $curlvl Daemons..."
    for daem in "${dmlst[@]}"; do
        if [ "${daem#!}" = "${daem}" ]; then
            if [ "${daem#@}" = "${daem}" ]; then
                start_daemon ${daem}
            else
                start_daemon_bkgd ${daem#@}
            fi
        fi
    done
    printhl "---- Starting Completed"
    run_hook runlevel_end
fi

# End of file

第二步,对/etc/inittab作少许变动,将原来的
rs:S1:wait:/etc/rc.single
rm:2345:wait:/etc/rc.multi
rh:06:wait:/etc/rc.shutdown
改为
rs:S1:wait:/etc/rc.runlevel
r2:2:wait:/etc/rc.runlevel
r3:3:wait:/etc/rc.runlevel
r4:4:wait:/etc/rc.runlevel
r5:5:wait:/etc/rc.runlevel
rh:06:wait:/etc/rc.runlevel

第三步,对/etc/rc.conf作少许改动,在原"DAEMONS=..."行的下面添加:
DAEMON2=()
DAEMON3=(@laptop-mode @gpm)
DAEMON4=(network iptables dhcpd named postgresql samba httpd vsftpd postfix sshd)
DAEMON5=(dbus @hal networkmanager kdm)
各行的意思相信不用解释了,里边的内容要根据个人需要设定
而DAEMONS中只需保留各个Runlevel共同需要的daemon

最后重启或运行init q使设置生效
回复 支持 反对

使用道具 举报

发表于 2010-9-1 13:00:52 | 显示全部楼层
可以考虑做成BSD风格或SYSV风格的
回复 支持 反对

使用道具 举报

发表于 2010-9-1 18:21:44 | 显示全部楼层
arch本来就是bsd风格的启动脚本,本就没有这一套。

你要的是SYS V风格的启动脚本。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表