一:概念
Linux系统初始化介绍
在Linux操作系统中,系统初始化(System init)是整个系统启动过程中的重要组成部分。它包括了引导加载程序(bootloader)引导操作系统、内核初始化、用户空间初始化以及启动关键服务等步骤。在这个过程中,init进程扮演着关键角色,负责管理系统中的进程、服务以及处理系统级别的事件。
1. 传统的SysVinit
传统的Unix和Linux系统通常使用SysVinit作为初始化系统。SysVinit是基于运行级别(runlevel)的初始化系统,通过不同的运行级别确定系统启动时需要运行的服务和进程。在SysVinit中,系统会根据运行级别执行相应的初始化脚本,启动必要的服务和进程。虽然SysVinit功能简单,但在很长一段时间内被广泛应用。
2. Systemd
随着技术的发展,一些Linux发行版开始采用更先进的初始化系统,如Systemd。Systemd不仅负责启动系统中的进程和服务,还提供了更多功能,如并行启动服务、动态加载单元、系统日志管理等。相较于传统的SysVinit,Systemd具有更快的启动速度和更灵活的配置选项,被认为是一个更加现代化和全面的初始化系统。
3. 嵌入式中的BusyBox的init
BusyBox是一个精简的工具箱,集成了许多常用的Unix工具,通常用于嵌入式系统或资源受限的环境中。在一些嵌入式Linux系统中,BusyBox的init实现被用作系统的初始化进程。
BusyBox的init实现通常被用来替代传统的SysVinit或Systemd,它负责启动系统中的其他进程、监控它们的状态以及处理系统级别的事件。虽然BusyBox的init功能相对较简单,但在一些嵌入式系统中足以满足需求,并且能够有效地利用系统资源。
在BusyBox中,/etc/inittab 文件是一个配置文件,用于定义系统初始化时的行为和动作。它包含了系统重启、挂起以及虚拟控制台设置等内容。如果缺少/etc/inittab 文件,BusyBox会使用默认的配置来进行系统初始化。
下面是一些/etc/inittab 文件可以定义的内容:
-
系统重启和挂起设置:/etc/inittab 文件可以指定系统在何种情况下需要进行重启或挂起操作,以及如何处理这些操作。
-
虚拟控制台设置:/etc/inittab 文件可以定义虚拟终端(tty1 到 tty4)的启动shell动作。这些虚拟终端可以让用户在系统中切换不同的终端会话。
-
其他初始化动作:除了上述功能外,/etc/inittab 文件还可以定义其他系统初始化时需要执行的动作,例如启动特定的服务或程序。
如果系统中缺少虚拟控制台设备文件,例如 tty1
到 tty4,BusyBox 在初始化时可能会报错,因为它无法创建这些虚拟终端。这些虚拟终端对于系统管理和用户交互非常重要,因此确保这些设备文件存在是很关键的。
在 BusyBox 的 /etc/inittab 文件中,通常包含以下字段:
- id:用于标识条目的唯一ID。
- runlevels:指定进程应该在哪些运行级别下启动。
- action:指定在指定运行级别下如何执行进程。
- process:要启动的进程或命令。
在 BusyBox 的 /etc/inittab 文件中,action 字段用来指定下面表中可应用到进程的动作之一。这些动作包括:
sysinit | 为init提供初始化命令行的路径 |
respawn | 如果进程终止,立即重新启动该进程。 |
askfirst | 类似respawn,不过它的主要用途是减少系统上执行的终端应用程序的数量。它将会促使init在控制台上显示“Please press Enter to active this console”的信息,并在重新启动之前等待用户按下enter键 |
wait | 告诉init必须等到相应的进程完成后,才启动下一个进程。 |
once | 仅启动一次该进程,而且不会等待它完成,如果进程退出,则不会重新启动。 |
ctratldel | 当按下Ctrl+Alt+Delete组合键时,执行相应的进程 |
shutdown | 当系统关机时,执行相应的进程 |
restart | 当init重新启动时,执行相应的进程,通常此处所执行的进程就是init本身 |
boot | 系统引导时启动的进程。 |
bootwait | 系统引导时启动的进程,等待其终止后再启动下一个进程。 |
off | 禁用该进程,不启动它。 |
ondemand | 按需启动,只有当需要时才启动该进程。 |
initdefault | 设置默认的运行级别。 |
最常见的:
::sysinit::在系统初始化时执行的任务。
::respawn::启动一个进程,并在其终止后自动重新启动。
::askfirst::在执行进程之前要求用户确认。
::once::执行一次性进程。
二:修改inittab文件
1.查看自己当前是哪个串口设备
# cat /proc/cmdline
noinitrd root=/dev/mtdblock2 rootfstype=yaffs2 rootflags=inband-tags console=ttyS0,115200n8 rdinit=/sbin/init mem=64M
ttyS0就是我当前的串口设备。
2.打开串口登录加密的注释:
# Put a getty on the serial port
ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GENERIC_SERIAL
sbin下的getty是Linux下的一个开启和设置终端的命令,进行终端的开启、终端初始化、设置终端。
3.把有类似如下的,全部注释掉
注意:如果不需要串口登录密码,注释串口需要加密后。一定要打开以下类似的注释!否则不可与shell终端交互
::respawn:-/bin/sh 保持一个 shell 进程在后台运行,以便用户可以通过 shell 与系统进行交互。
::askfirst:-/bin/sh 询问用户是否要启动一个 shell 进程,用户可以选择是或否
tty3::askfirst:-/bin/sh 在第 3 个虚拟终端上询问用户是否要启动 shell 进程。用户可选择是或否
或者:
# Start an "askfirst" shell on the console (whatever that may be)
::once:-/bin/sh
上面这个没注释的报错情况:
输入用户名和密码后,会卡顿,这种出现的情况应该是被抢占,不能接收串口数据,具体情况我不是特别的了解。
4.增加密码
命令行下敲入passwd
我这里的密码为root,设定密码并确认密码后,reboot重新启动
重启后就会需要用户名跟密码。
如果需要重新登录,输入:exit