/etc/init.d/rcS文件详解

我们找个简单的rcS文件内容,我们分析一下:

[plain]  view plain  copy
 print ?
  1. #!/bin/sh  
  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin  
  3.   
  4. runlevel=S  
  5. prevlevel=N  
  6.   
  7. umask 022  
  8.   
  9. export PATH runlevel prevlevel  
  10.   
  11. mount -a  
  12.   
  13. echo /sbin/mdev > /proc/sys/kernel/hotplug  
  14. mdev -s  
  15.   
  16. /bin/hostname -F /etc/sysconfig/HOSTNAME  
  17.   
  18. ifconfig eth0 192.168.1.10  
1.PATH=xxx

(1)首先从shell脚本的语法角度分析,这一行定义了一个变量PATH,值等于后面的字符串

(2)后面用export导出了这个PATH,那么PATH就变成了一个环境变量。

(3)PATH这个环境变量是Linux系统内部定义的一个环境变量,含义是操作系统去执行程序时会默认到PATH指定的各个目录下去寻找。如果找不到就认定这个程序不存在,如果找到了就去执行它。将一个可执行程序的目录导出到PATH,可以让我们不带路径来执行这个程序。

(4)rcS中为什么要先导出PATH?就是因为我们希望一旦进入命令行下时,PATH环境变量中就有默认的/bin /sbin /usr/bin /usr/sbin 这几个常见的可执行程序的路径,这样我们进入命令行后就可以ls、cd等直接使用了。

(5)为什么我们的rcS文件还没添加,系统启动就有了PATH中的值?原因在于busybox自己用代码硬编码为我们导出了一些环境变量,其中就有PATH。


2、runlevel=

(1)runlevel也是一个shell变量,并且被导出为环境变量。

(2)runlevel这个环境变量到底有什么用?

(3)runlevel=S表示将系统设置为单用户模式



3、umask=

(1)umask是linux的一个命令,作用是设置linux系统的umask值。

(2)umask值决定当前用户在创建文件时的默认权限。


4、mount -a

(1)mount命令是用来挂载文件系统的

(2)mount -a是挂载所有的应该被挂载的文件系统,在busybox中mount -a时busybox会去查找一个文件/etc/fstab文件,这个文件按照一定的格式列出来所有应该被挂载的文件系统(包括了虚拟文件系统)


5、PATH&runlevel

(1)我们实战发现rcS文件明明存在但是却提示不存在,问题原因就是rcS文件在windows下创建的,行尾换行符为'\r\n',多了点东西。但是因为ubuntu中的vi对行尾做了优化,所以在ubuntu中是看不出来多了东西的。但是在securecrt下一看就发现每一行末尾多出来了一个^M。

(2)这个故事告诉我们:shell脚本文件如果格式不对,运行时可能会被提示文件不存在。

(3)扩展讲一个:有时候一个应用程序执行时也会提示文件不存在,问题可能是这个程序所调用的一个动态链接库找不到。

(4)测试结果:PATH本来在busybox中就已经用代码导出过了,所以rcS中再次导出没有任何明显的现象,因此看不出什么差别;runlevel实际执行结果一直是unknown,问题在于busybox并不支持runlevel这个特性。


6、umask测试

(1)umask是022的时候,默认touch创建一个文件的权限是644

(2)umask是044的时候,默认touch创建一个文件的权限是622

(3)umask是444的时候,默认touch创建一个文件的权限是222

总结:umask的规律就是:umask值和默认创建文件的权限值加起来是666.



7、mount测试

(1)挂载时全部出错:

mount: mounting proc on /proc failed: No such file or directory

mount: mounting sysfs on /sys failed: No such file or directory

mount: mounting tmpfs on /var failed: No such file or directory

mount: mounting tmpfs on /tmp failed: No such file or directory

mount: mounting tmpfs on /dev failed: No such file or directory

(2)原因是因为根文件系统中找不到挂载点。所谓挂载点就是我们要将目标文件系统(当然这里都是虚拟文件系统)挂载到当前文件系统中的某一个目录中,这个目录就是挂载点。

(3)解决方案就是自己在制作的rootfs根目录下创建这些挂载点目录即可。

(4)验证是否挂载成功,可以看挂载时输出信息;还可以启动后去看proc和sys文件夹,如果有文件出现则证明挂载成功了,如果没东西就证明失败了。



8、mdev

(1)mdev是udev的嵌入式简化版本,udev/mdev是用来配合linux驱动工作的一个应用层的软件,udev/mdev的工作就是配合linux驱动生成相应的/dev目录下的设备文件。

(2)因为这个问题涉及到驱动,因此详细讲解要等到驱动部分。这里我们只是通过一些直观的现象来初步理解udev/mdev的工作效果。

(3)在rcS文件中没有启动mdev的时候,/dev目录下启动后是空的;在rcS文件中添加上mdev有关的2行配置项后,再次启动系统后发现/dev目录下生成了很多的设备驱动文件。

(4)/dev目录下的设备驱动文件就是mdev生成的,这就是mdev的效果和意义。



9、hostname

(1)hostname是linux中的一个shell命令。命令(hostname xxx)执行后可以用来设置当前系统的主机名为xxx,直接hostname不加参数可以显示当前系统的主机名。

(2)/bin/hostname -F /etc/sysconfig/HOSTNAME -F来指定了一个主机名配置文件(这个文件一般文件名叫hostname或者HOSTNAME)


10、ifconfig

(1)有时候我们希望开机后进入命令行时ip地址就是一个指定的ip地址(譬如192.168.1.30),这时候就可以在rcS文件中ifconfig eth0 192.168.1.30


<think>好的,用户现在问的是关于/etc/inittab的问题。我需要先回忆一下这个文件的作用和相关知识。记得在传统的SysV init系统中,/etc/inittab是用来控制系统初始化过程和运行级别的配置文件。但现在很多Linux发行版已经转向使用systemd,所以这个文件可能已经不再被使用了。 首先,用户可能是在使用较旧的系统,或者在学习一些传统系统的管理知识,所以需要解释清楚这个文件的历史背景和现状。要说明哪些发行版可能还在使用它,比如Slackware或者一些特定的嵌入式系统,而主流的如Ubuntu、Fedora等已经改用systemd。 接下来需要详细解释/etc/inittab的结构和各个字段的含义,比如标识符、运行级别、动作、命令。用户可能需要知道如何修改运行级别或者添加自定义启动项。还要提到默认的运行级别配置,通常设置为3或5,以及如何修改。 另外,用户可能遇到问题,比如系统启动后进入错误的运行级别,这时候需要指导如何检查和修改/etc/inittab中的配置。同时要提醒用户,如果他们的系统使用systemd,修改这个文件是无效的,应该使用systemctl命令来管理目标(target)。 还要注意用户可能的误解,比如在基于systemd的系统中试图通过修改/etc/inittab来改变运行级别,这时候需要明确指出这种方法是不可行的,并引导他们使用正确的systemd命令。 最后,总结一下这个文件的重要性以及当前的使用情况,帮助用户理解在何时需要关注这个文件,何时应该转向新的初始化系统。确保回答结构清晰,分点说明,同时给出实际的配置示例和命令,帮助用户更好地理解和应用。</think>--- ##### **`/etc/inittab` 文件详解** `/etc/inittab` 是 **传统 SysV init 初始化系统** 的核心配置文件,用于定义系统启动时的运行级别(Runlevel)和关联进程。不过在现代 Linux 发行版中(如使用 `systemd` 的系统),该文件已被废弃。以下是详细解析: --- ##### **1. 文件作用** - **核心功能**: 定义系统启动时的默认运行级别,并控制不同运行级别下需要启动的服务和进程。 - **适用场景**: 仅适用于使用 **SysV init** 作为初始化系统的发行版(如旧版 CentOS、Debian 等)。 **注意**:基于 `systemd` 的系统(如 Ubuntu 18.04+、Fedora 等)已不再依赖此文件。 --- ##### **2. 文件结构解析** `/etc/inittab` 由多个条目组成,格式为: ```bash id:runlevels:action:command ``` - **字段说明**: | 字段 | 含义 | |-------------|----------------------------------------------------------------------| | `id` | 条目标识符(1~4个字符),唯一标识一个条目(如 `si::sysinit:/etc/init.d/rcS`)。 | | `runlevels` | 指定生效的运行级别(如 `2345` 表示运行级别2、3、4、5时触发)。 | | `action` | 定义执行条件(如 `sysinit` 表示系统初始化阶段执行)。 | | `command` | 需要执行的命令或脚本路径(如 `/sbin/getty 38400 tty1`)。 | --- ##### **3. 关键条目示例** - **默认运行级别设置**: ```bash id:5:initdefault: # 默认运行级别为5(图形界面模式) ``` - 运行级别范围:`0`(关机)、`1`(单用户)、`2~5`(多用户,不同配置)、`6`(重启)。 - **系统初始化脚本**: ```bash si::sysinit:/etc/init.d/rcS # 系统启动时执行初始化脚本 ``` - **终端控制台启动**: ```bash 1:2345:respawn:/sbin/getty 38400 tty1 # 在tty1启动登录界面(respawn表示进程终止后自动重启) ``` --- ##### **4. 常见操作** - **查看当前运行级别**: ```bash runlevel # 输出示例:N 5 (当前为运行级别5) ``` - **临时切换运行级别**: ```bash init 3 # 切换到运行级别3(多用户文本模式) ``` - **修改默认运行级别**: 编辑 `/etc/inittab` 中的 `initdefault` 行(例如将 `id:5` 改为 `id:3`)。 --- ##### **5. 现代系统的替代方案** 对于使用 `systemd` 的系统(如 Ubuntu 22.04、CentOS 7+): - **运行级别对应关系**: | SysV Runlevel | systemd Target | 描述 | |---------------|----------------------|--------------------| | 0 | `poweroff.target` | 关机 | | 1 | `rescue.target` | 救援模式 | | 3 | `multi-user.target` | 多用户文本模式 | | 5 | `graphical.target` | 图形界面模式 | | 6 | `reboot.target` | 重启 | - **管理命令**: ```bash systemctl isolate graphical.target # 切换到图形界面模式 systemctl set-default multi-user.target # 设置默认启动为文本模式 ``` --- ##### **6. 注意事项** - **兼容性问题**: 在 `systemd` 系统中修改 `/etc/inittab` 无效,需使用 `systemctl` 命令。 - **历史遗留系统**: 嵌入式设备或旧服务器可能仍依赖此文件(如 OpenWRT、Slackware)。 --- ##### **总结** - **`/etc/inittab`** 是 SysV init 系统的核心配置文件,用于管理运行级别和启动进程。 - **现代系统** 已转向 `systemd`,通过 `target` 替代运行级别概念。 - **若需操作此文件**:先确认系统初始化类型(通过 `ps -p 1` 查看是 `init` 还是 `systemd`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值