Debian中的rc.local

在Debian中没有在linux发行版中比较通用的rc.local文件。如果我们要在系统启动时加入自定义行为我们可以自己制作一个rc.local文件。
通过对比几种和通用rc.local文件等效的实现方式,我觉得下面这种实现方式最简单实用:
(参考文献1)
1.    在/etc/init.d中建立一个文件,可任意取名,比如rc.local,注意文件第一行应为#!/bin/sh或#!/bin/bash。
   两种方式实现上面功能:a.     touch /etc/init.d/rc.local
                                                      cd /etc/init.d
                                                      vi rc.local
                                               b.    cd /etc/init.d
                                                      vi rc.local
      需要注意的是生成的文件一定要在/etc/init.d下。
2.    编辑想要自定义的行为
3.    给新编辑文件设置可执行属性。
        chmod +x rc.local
4.    更新系统的启动设置,在别的方法中是在各个运行级别手工建立符号连接。此方法利用了Debian的一个集成工具update-rc.d。实际是一回事,只不过使用集成工具不容易出错,而且方便。
        我们此时要使用的update-rc.d的使用格式:update-rc.d ScriptName start|stop NN runlevel runlevel ... .
        关于update-rc.d具体的的说明可以查看它的man页。
        需要注意的是两件事:
            第一    ScriptName是在/etc/init.d/下的脚本文件名称,这也是上面第一步中强调生成的文件一定要在/etc/init.d中的原因。同时,这也
                        说明执行update-rc.d命令的时候当前目录是什么是无所谓的。
            第二    一定要注意在命令最后要以一个句号(“ .”)结束,否则命令出错。
        举例来说,我们可以执行下面这个命令:
                 update-rc.d rc.local start 98 2 3 4 5 .
        这个命令会在rc2.d、rc3.d、rc4.d、rc5.d中加入相应的S98rc.local符号连接。以后系统启动到2,3,4,5这四个运行级别的时候就会运行
    rc.local脚本了。

另外,上面将rc.local设定为98号的原因是,Debian在安装时默认生成了S99rmnologin符号连接。用man和help都查不到关于rmnologin的说明。在 www.linuxsir.org 的Debian版中查到一个文章(文献5),看了之后觉得rmnologin应该是用来删除系统在启动时生成的nologin文件的。如果nologin文件存在,则只能由root身份登陆到系统,普通用户无法登陆。系统默认将rmnologin放到最后,我觉得还是不要动它为好,所以rc.local就只能当倒数老二了。

参考文献:
1. Debian Rc.local Equivalent
2. rc.local-DebianWiki
3. debian-rc.local
4. rc.local in debian
5. http://www.linuxsir.org/bbs/showthread.php?t=95352&highlight=rmlogin
<think>好的,我现在需要帮助用户了解Linux系统中的rcrcS和rc.local文件之间的区别和用途。用户可能有一定的Linux基础,但可能对这些启动脚本的具体作用不太清楚。首先,我需要回忆这些文件的历史背景和它们在系统启动过程中的角色。 首先,rc文件通常与System V初始化系统相关,如SysVinit。它可能指的是/etc/rc.d目录中的脚本,这些脚本控制不同运行级别的服务启动和停止。而rcS可能指的是SysVinit中的启动脚本,特别是与单用户模式或系统初始化阶段相关的脚本rc.local则是一个在系统启动的最后阶段执行的脚本,通常用于用户自定义命令。 接下来,我需要考虑用户可能的使用场景。用户可能是在配置系统启动项,或者希望添加自定义启动命令,但不清楚该修改哪个文件。也可能在升级到使用systemd的系统后,发现rc.local不再生效,需要调整。 用户没有明确提到系统版本,但现代Linux系统多采用systemd,所以需要对比传统SysVinit和systemd的处理方式。例如,在systemd中,rc.local可能需要启用服务文件才能生效,而传统的/etc/rc.local可能默认不再执行。 需要解释每个文件的具体位置、执行顺序以及如何正确使用它们。例如,rc.local在SysVinit中是/etc/rc.local,而在systemd中可能作为服务单元存在。还要提到权限问题,比如确保rc.local有执行权限,否则可能不会运行。 用户可能遇到的常见问题包括:为什么rc.local没有执行?如何在systemd中启用rc.localrcrcS的区别是什么?需要解答这些问题,并提供解决步骤,比如检查服务状态、查看日志等。 另外,需要注意安全性问题,比如不建议在rc.local中放置重要服务,而是推荐使用systemd服务单元。同时,提供示例代码,如如何创建rc.local文件,或如何启用systemd的rc-local服务。 最后,要确保回答结构清晰,分点说明每个文件的用途、执行顺序、配置方法和注意事项。可能使用表格对比,或者步骤说明,帮助用户理解不同方法的优缺点和适用场景。</think>在Linux系统中,`rc`、`rcS` 和 `rc.local` 是系统启动过程中的关键脚本文件,主要用于初始化服务和用户自定义任务。以下是它们的详细区别、用途及实际配置方法: --- ### **1. `rc` 脚本** #### **核心作用** - **传统System V Init系统**的核心组件,负责按运行级别(Runlevel)启动或停止服务。 - **运行级别对应**:不同运行级别(如0-6)对应不同用途(关机、单用户、多用户图形界面等)。 #### **文件位置与结构** - **目录结构**: ```bash /etc/rc.d/rc0.d/ # 运行级别0(关机) /etc/rc.d/rc3.d/ # 运行级别3(多用户命令行) /etc/rc.d/rc5.d/ # 运行级别5(多用户图形界面) ``` - **脚本命名规则**: - `S##ServiceName`:启动服务(如`S01network`)。 - `K##ServiceName`:终止服务(如`K05httpd`)。 #### **执行逻辑** - **触发命令**:`init` 进程根据运行级别调用 `/etc/rc.d/rc` 脚本,按顺序执行对应目录中的`S/K`脚本。 --- ### **2. `rcS` 脚本** #### **核心作用** - **SysVinit系统**中用于系统初始化阶段的脚本(**单用户模式**或系统启动早期阶段)。 - **执行顺序**:在系统内核加载后、运行级别切换前执行,完成基础硬件配置(如挂载文件系统、加载内核模块)。 #### **文件位置** - **主脚本**: ```bash /etc/init.d/rcS # Debian/Ubuntu /etc/rc.d/rc.sysinit # Red Hat/CentOS ``` - **关键任务**: - 挂载 `/proc`, `/sys`, `/dev` 等虚拟文件系统。 - 加载驱动模块。 - 检查并挂载根文件系统。 --- ### **3. `rc.local` 脚本** #### **核心作用** - 在系统启动过程的**最后阶段**执行用户自定义命令(如启动非服务类程序、设置环境变量)。 - **历史背景**:传统System V Init的遗留设计,现代systemd系统通过兼容层支持。 #### **文件位置与配置** - **默认路径**: ```bash /etc/rc.local # 脚本文件(需可执行权限) ``` - **启用方法(systemd系统)**: 1. 创建或编辑 `/etc/rc.local`: ```bash #!/bin/bash echo "Hello from rc.local" > /tmp/rc.log exit 0 ``` 2. 赋予执行权限: ```bash sudo chmod +x /etc/rc.local ``` 3. 启用服务: ```bash sudo systemctl enable rc-local sudo systemctl start rc-local ``` #### **验证执行** - 查看日志: ```bash journalctl -u rc-local # systemd日志 cat /tmp/rc.log # 验证输出 ``` --- ### **4. 三者的执行顺序与关系** | **阶段** | **执行内容** | |-------------------|------------------------------------------| | 内核启动 | 加载驱动、初始化硬件 | | `rcS`/`rc.sysinit`| 基础系统初始化(挂载文件系统、加载模块) | | 运行级别切换 | 根据默认运行级别执行对应`rc`脚本 | | `rc.local` | 最后执行用户自定义命令 | --- ### **5. 现代systemd系统的变化** - **替代方案**:`rc.local` 的功能被 `systemd服务单元` 取代。 - **兼容性处理**: - `rc-local.service` 单元文件调用 `/etc/rc.local`。 - **查看服务状态**: ```bash systemctl status rc-local ``` - **推荐做法**:直接编写systemd服务文件(更可靠且易管理): ```bash # 示例服务文件:/etc/systemd/system/mycustom.service [Unit] Description=My Custom Script After=network.target [Service] ExecStart=/usr/local/bin/myscript.sh [Install] WantedBy=multi-user.target ``` --- ### **6. 常见问题与解决** | **问题** | **解决方案** | |------------------------------|------------------------------------------| | `rc.local` 未执行 | 检查执行权限、`rc-local`服务是否启用 | | 脚本执行顺序冲突 | 使用systemd的`After/Before`定义依赖关系 | | 传统脚本在systemd系统失效 | 转换为systemd服务或使用兼容层 | --- ### **总结** | **脚本** | **适用场景** | **现代替代方案** | |------------|-----------------------------|--------------------------| | `rc` | 按运行级别管理服务(SysVinit)| `systemd target` | | `rcS` | 系统早期初始化 | `systemd早期引导服务` | | `rc.local` | 用户自定义启动命令 | `systemd服务单元` | **建议**: - 新系统优先使用 `systemd` 管理启动任务。 - 遗留脚本迁移时注意权限和依赖关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值