深入理解linux下rc.d/目录文件以及程序开机自启动

本文详细介绍了Linux系统的启动过程,从硬件自检到加载内核,再到初始化硬件设备和根文件系统。重点阐述了init进程如何读取/etc/inittab文件确定系统运行级别,并通过rc脚本启动相应程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于我日常开发使用的是fedora9,所以,就已fedora9为例。

 

 

其中,x.d为目录,其他的均为脚本可执行文件。

在讲述这几个目录以及文件的作用及关系之前,我们需要了解linux(RedHat系列)的启动顺序。

系统上电之后,会进行硬件自检,然后初始化启动bootloader,加载内核,内核被加载到内存中之后,就开始运行启动。一旦内核启动,就可以初始化硬件设备,加载根文件系统。内核转载根文件系统,初始化设备驱动以及相关数据结构之后,就会启动一个init用户级程序,完成引导进程。那么,这个init进程就回去读取/etc/inittab文件中的系统运行级别。

 

 

 

系统运行级别有0~6共7个运行级别:

 

 

#0 ——停机(不能使用)

#1——单用户模式

#2——多用户模式,但是没有NFS

#3——完全多用户模式

#4——没有使用

#5——图形界面模式

#6——重启模式(不能使用)

 

id:5:initdefault(运行模式设置)。

 

那么,init进程就会读取这个系统运行级别设置,然后运行/etc/rc.d/rc脚本。

 

通过这个脚本,然后进入rcx.d。启动相应的程序。其中rcx.d为/etc/rc.d/rcx.d(x为对应的系统运行级别)

 

/etc/rc.d/rcx.d/下的文件均为符号链接,最终绝大部分都是都是链接到/etc/rc.d/init.d下面。

到这里,我们可以知道,/etc/rc.d/init.d目录下面的都是开启启动脚本文件,用来启动相应的程序。

 


版权申明:
转载文章请注明原文出处http://blog.youkuaiyun.com/feiyinzilgd/archive/2010/07/20/5750168.aspx

并请联系谭海燕本人或者前往谭海燕个人主页留言

<think>好的,我现在需要帮助用户了解如何在Linux系统中实现开机自启动文件。用户提到了三个可能的途径:/etc/inittab、/etc/rc.d/rcX.d/和/etc/rc.d/rc.local。我需要确认这些方法是否有效,并给出正确的指导。 首先,我得回忆一下不同Linux发行版的启动管理机制。用户提到的这几个文件目录可能属于传统的SysVinit系统,而现代系统可能已经转向使用systemd。不过,用户可能还在使用旧系统,或者需要兼容旧方法。 关于/etc/inittab,我记得这个文件在SysVinit中用于控制init进程的行为,比如设置默认运行级别。过去可能在这里添加启动脚本,但现代系统可能不再推荐这种方式,特别是使用systemd的系统,可能已经忽略这个文件了。需要指出这一点,并建议用户避免修改它,除非确实需要。 然后是/etc/rc.d/rcX.d/目录,这里的X代表运行级别。SysVinit使用这些目录来存放不同运行级别的启动脚本链接。用户可以通过将脚本放在/etc/init.d/中,然后创建符号链接到相应的rcX.d目录,并命名以S开头加上启动顺序的数字。例如S99mystart。需要说明这种方法的步骤,以及如何正确命名链接以确保启动顺序。 接下来是/etc/rc.d/rc.local文件,这在某些系统中确实存在,用于在启动过程的最后执行用户自定义命令。但需要注意,有些系统可能需要给这个文件添加执行权限,或者启用rc-local服务(在systemd系统中)。需要提醒用户检查是否存在该文件以及如何启用服务。 同时,用户可能不知道现代Linux系统普遍使用systemd,所以应该介绍更推荐的方法,比如使用systemd服务单元。可以指导用户创建.service文件,并放在/etc/systemd/system/下,然后启用服务。这会更可靠,尤其是在使用systemd的发行版上。 还需要考虑不同发行版的差异,比如Debian系和RedHat系可能在路径上有所不同,例如/etc/rc.local可能符号链接到/etc/rc.d/rc.local。同时,要强调权限问题,脚本必须有执行权限,并且推荐使用绝对路径。 最后,总结各个方法的适用场景,指出传统方法的局限性和现代方法的优势,帮助用户根据实际情况选择合适的方式。同时,提醒用户修改系统文件时要谨慎,避免导致启动失败。</think>在Linux系统中,实现开机自启动脚本的常见方法确实包括你提到的几种传统方式,但需注意**不同Linux发行版及初始化系统(如SysVinit、systemd)的差异**。以下是详细分析: --- ### 1. **`/etc/inittab`(已过时,不推荐)** - **作用**:在传统`SysVinit`系统中,此文件定义了系统初始化时的默认运行级别(如多用户模式为3,图形界面为5)及初始进程。 - **问题**: - 现代Linux系统(如CentOS 7+、Ubuntu 16.04+)已转向`systemd`,不再依赖`/etc/inittab`。 - 直接修改此文件容易导致系统启动异常,**不建议用于添加自启动脚本**。 --- ### 2. **`/etc/rc.d/rcX.d/`目录(SysVinit方式)** - **机制**:`SysVinit`通过运行级别(如`rc3.d`对应级别3)管理服务启动顺序。目录中的文件是符号链接,指向`/etc/init.d/`下的脚本。 - **操作步骤**: 1. **编写脚本**:将自定义脚本放在`/etc/init.d/`目录,并赋予执行权限: ```bash sudo chmod +x /etc/init.d/myscript ``` 2. **创建符号链接**: ```bash # 进入目标运行级别目录(例如级别3) cd /etc/rc.d/rc3.d/ # 创建启动链接(S表示启动,数字代表优先级) ln -s ../init.d/myscript S99myscript # 关闭时运行的脚本(K开头) ln -s ../init.d/myscript K01myscript ``` - **注意事项**: - 需根据实际运行级别选择目录(`rc0.d`~`rc6.d`)。 - 优先级数字越小,执行越早(如`S01`早于`S99`)。 --- ### 3. **`/etc/rc.d/rc.local`(传统方式,需适配)** - **作用**:在系统启动的最后阶段执行用户自定义命令。 - **操作步骤**: 1. 编辑文件并添加命令: ```bash sudo nano /etc/rc.d/rc.local # 示例:启动时执行脚本 /path/to/your/script.sh ``` 2. **赋予执行权限**(某些系统默认无权限): ```bash sudo chmod +x /etc/rc.d/rc.local ``` - **问题**: - 在`systemd`系统中,需启用`rc-local`服务: ```bash sudo systemctl enable rc-local ``` --- ### 4. **现代推荐方式:`systemd`服务(主流方法)** - **步骤**: 1. 创建服务文件(如`myscript.service`): ```bash sudo nano /etc/systemd/system/myscript.service ``` 2. 写入以下内容: ```ini [Unit] Description=My Custom Script After=network.target [Service] ExecStart=/path/to/your/script.sh [Install] WantedBy=multi-user.target ``` 3. 启用服务并启动: ```bash sudo systemctl enable myscript.service sudo systemctl start myscript.service ``` --- ### **对比总结** | 方法 | 适用场景 | 优缺点 | |--------------------|----------------------------|-----------------------------------| | `/etc/rc.d/rcX.d/` | 传统`SysVinit`系统 | 灵活但配置繁琐,需手动管理优先级 | | `rc.local` | 简单命令或旧系统兼容 | 易用但可能被`systemd`忽略 | | `systemd`服务 | 现代Linux发行版(主流选择) | 标准化、支持依赖管理、日志跟踪 | --- ### **注意事项** - **权限问题**:所有脚本必须有执行权限(`chmod +x`)。 - **路径问题**:脚本中使用绝对路径,避免环境变量未加载导致的错误。 - **日志调试**:通过`journalctl -u myscript.service`(systemd)或查看`/var/log/boot.log`(传统方式)排查问题。 建议优先使用`systemd`服务,除非系统明确使用`SysVinit`。若需兼容旧系统,可结合`rc.local`和符号链接方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值