Linux 靴子

事实证明,引导过程没有太多内容:

1. 引导加载程序在 disk,将其加载到内存中,然后启动它。
2. 内核初始化的设备和性病司机。
3. 内核挂载根文件system.
4. 内核启动init称为计划。
5. 初始化设置其余的运动过程中。
6. 最后进程init启动引导顺序的一部分,允许您登录。

确定启动过程的每个阶段对于解决启动问题和了解启动过程非常重要。 system 整体上首先,在引导加载程序上进行零输入,这是初始屏幕,或者在计算机执行开机自检后询问您是否进行以下操作时提示您 system 跑步。 做出选择后,引导加载程序会运行 Linux 内核,移交控制权 system 到内核​​。

本文摘自在这本书中,这在其他地方的内核有一个详细的讨论。 本文介绍了 内核初始化阶段,这是内核打印一堆有关硬件存在的消息的阶段。 system。 内核会在显示一条消息,表明内核已挂载内核后立即启动init。 根文件system:

VFS:安装 根目录(ext2 文件system) 只读。

不久之后,您将看到有关启动init的消息,然后是 system 服务启动消息,最后您得到某种登录提示。

注意 :在 红帽 Linux, init 注释特别明显,因为它“欢迎”你加入红帽 Linux。” 此后的所有消息都在屏幕右侧的括号中显示成功或失败。

本章的大部分处理初始化,因为它是WHERE部分你有控制的引导顺序。
初始化

init 没有什么特别之处。 它是一个程序,就像任何其他程序一样 Linux system,您会在/ sbin中找到它,以及其他 system 二进制文件。 init的主要目的是按特定顺序启动和停止其他程序。 您只需要知道此序列是如何工作的即可。

有一些不同的变化,但大多数 Linux 分布使用 System V型在这里讨论。 有些发行版使用的是类似于BSD init的简单版本,但是您不太可能遇到这种情况。

运行级别

在任何给定时间 Linux system,一组特定的进程正在运行。 这种状态 machine 称为它的运行级别,用 0 到 6 的数字表示。 system 大部分时间都花在单个运行级别上。 但是,当您关闭 mac慢慢地,init 切换到不同的运行级别以终止 system 有序的服务并告诉内核停止。 另一个运行级别是针对单用户的 mode, 稍后讨论。

获取运行级别的最简单方法是检查 init 配置文件 /etc/inittab。 查找如下所示的行:

ID:5:initdefault:

这行表示 default 运行级别 system 是 5。 inittab 文件中的所有行都采用这种形式,其中用冒号分隔的四个字段按以下顺序出现:
#唯一标识符(一个简短的字符串,如ID在前面的例子)
#适用的运行级别的数字(S)
#init应该执行的操作(在前面的示例中,该操作是设置 default 运行级别到5)
#要执行的命令(可选)

在前面的init中没有要执行的命令default 例子,因为在设置上下文中命令没有意义 default 运行级别。 在inittab中往下看一点,直到看到这样的行:

l5:5:等待等:/ /的rc.d / RC 5的的

这条线触发了大多数 system 通过rc * .d和init.d目录进行配置和服务。 您可以看到init设置为在运行级别5时执行一个名为/etc/rc.d/rc 5的命令。wait操作说明了init运行命令的时间和方式:何时运行rc 5 enter进入运行级别5,然后等待此命令完成,然后再执行其他操作。

有几种不同的动作 add初始化default 然后等待,尤其是与电源管理有关的内容,inittab(5)手册页会告诉您所有有关它们的信息。 以下几节说明了您最有可能遇到的问题。

重生

respawn 操作会导致 init 运行后面的命令,如果该命令执行完毕,则再次运行它。 您可能会在 inittab 文件中看到类似于此行的内容:

1:2345:重生:/ sbin目录/的mingetty tty1的的

盖蒂程序提供的登录提示。 上线的第一个虚拟的控制台(/ dev / tty1的),你看,当你按下ALT或CONTROL-ALT F1的F1的。 重生行动带来的登录提示回来后,你退出。

ctrlAltdel

ctrlaltdel操作可控制 system 在虚拟控制台上按CONTROL-ALT-DELETE时执行的操作。 在大多数 systems,这是使用shutdown命令的某种重启命令。

SYSINIT

sysinit操作是init启动时应首先运行的第一件事, enter在任何运行级别。

如何在运行级别的进程开始

您现在准备好学习如何启动 system 服务,就在您可以登录之前。 回顾一下先前的inittab行:

l5:5:等待等:/ /的rc.d / RC 5的的

这个小行会触发许多其​​他程序。 RC代表执行命令,你会听到人们提到脚本,程序或服务的命令。 所以,这些命令在哪里呢?

对于运行级别5,在此示例中,命令可能在/etc/rc.d/rc5.d或/etc/rc5.d中。 运行级别1使用rc1.d,运行级别2使用rc2.d,依此类推。 您可能会发现以下内容 items 在rc5.d目录中:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
(S20)logoutd S89cron

的RC 5命令启动程序在这个运行级别目录运行北京时间命令:

S10sysklogd家
S12kerneld家
S15netstd_init家
S18netbase家
...
S99sshd家

注意每个命令中的开始参数。 命令名称中的 S 表示该命令应在开始时运行 mode, 和数字(00 到 99)决定 rc 在序列中的何处开始命令。

RC * D命令shell脚本,通常启动程序在/ sbin或/ usr / sbin目录。 通常情况下,你可以弄清楚什么命令实际上是通过寻找小于或寻呼机另一个程序的脚本。

您可以手动启动其中一项服务。 例如,如果您想手动启动httpd Web 服务器程序,则运行S99httpd start。 同样,如果您需要在 mac开启后,您可以在 rc * .d 目录中使用 stop 参数运行命令(例如,S99httpd stop)。

某些 rc*.d 目录包含以 K 开头的命令(用于“kill”或停止 mode). 在这种情况下,rc 运行带有 stop 参数而不是 start 的命令。 您最有可能在关闭的运行级别遇到 K 命令 system 下来。

Add删除和删除服务

如果您想 add、删除、修改rc*.d目录下的服务,需要仔细查看里面的文件。 一个长列表揭示了这样的结构:

lrwxrwxrwx。 。 。 S10sysklogd - > .. / init.d /的sysklogd的
lrwxrwxrwx。 。 。 S12kerneld - > .. / init.d /的核心模式
lrwxrwxrwx。 。 。 S15netstd_init - > .. / init.d /的netstd_init
lrwxrwxrwx。 。 。 S18netbase - > .. / init.d /的netbas的
...

rc*.d 目录中的命令实际上是 init.d 目录中文件的符号链接,通常位于 /etc 或 /etc/rc.d 中。 Linux 发行版包含这些链接,以便它们可以对所有运行级别使用相同的启动脚本。 这种约定绝不是一项要求,但它通常会使组织更容易一些。

为了防止 init.d 目录中的命令之一在特定运行级别中运行,您可能会考虑删除相应 rc * .d 目录中的符号链接。 这确实有效,但如果您犯了错误并且需要将链接放回原处,您可能无法记住链接的确切名称。 因此,您不应该删除 rc * .d 目录中的链接,而是, add 链接名称开头的下划线 (_),如下所示:

MV S99httpd _S99httpd

在启动时,rc忽略_S99httpd,因为它不是以S或K开头。此外,原始名称仍然很明显,如果您需要手动启动它,则可以快速访问该命令。

至 add 一个服务,你必须像其他人一样在 init.d 目录中创建一个脚本,然后在正确的 rc * .d 目录中创建一个符号链接。 编写脚本的最简单方法是检查 init.d 中已有的脚本,复制一份您理解的脚本,然后修改该副本。

什么时候 add在启动服务时,请确保在启动顺序中选择合适的位置来启动服务。 如果服务启动得太快,它可能无法工作,因为它依赖于其他一些服务。 对于非必要服务,大多数 systems administrators 更喜欢 90 年代的数字,在大多数服务之后 system.

Linux 发行版通常带有一个命令来启用和禁用 rc * .d 目录中的服务。 例如,在 Debian 中,命令是 update-rc.d,在 Red Hat 中 Linux,命令是chkconfig。 图形用户界面也可用。 使用这些程序有助于保持启动目录一致并有助于升级。

提示: 最常见的一种 Linux install问题是配置不正确的 XFree86 服务器时断时续,使 system 在控制台上无法使用。 要停止此行为,请启动到单用户 mode 并更改您的运行级别或运行级别服务。 在您的 rc*.d 目录或 /etc/inittab 中寻找包含 xdm、gdm 或 kdm 的内容。

控制初始化

有时,您需要给 init 一点提示,告诉它切换运行级别、重新读取 inittab 文件,或者只是为了 shut down 此 system。 因为init始终是 system,其进程ID始终为1。

你可以控制的init使用telinit。 例如,如果你想要切换到的runlevel 3的,使用这个命令:

telinit的3的

切换运行级别时,init 会尝试终止新运行级别的 inittab 文件中不存在的任何进程。 因此,更改运行级别时应该小心。

当您需要 add 或者删除重生作业或对 inittab 文件进行任何其他更改,您必须将更改告知 init 并使其重新读取该文件。 有些人使用kill -HUP 1 来告诉init 执行此操作。 这种传统方法适用于大多数版本的 Unix,只要您输入正确。 但是,您也可以运行以下 telinit 命令:

使用telinit q

也可以使用 telinit s 切换到单用户 mode.

关闭

初始化还控制 system 关闭并重新启动。 正确的方法 shut down a Linux mac关键是使用shutdown命令。

有两种使用关机的基本方法。 如果您停止 system,它关闭 mac放松并保持下来。 为了使 mac立即停止,使用以下命令:

现在关机-H

在大多数情况下 modern mac与合理的最新版本相吻合 Linux, 停止会切断电源 mac嗨。 您也可以重新启动 mac嗨。 要重新启动,请使用 -r 而不是 -h。

关机过程需要几秒钟。 您永远不应该重置或关闭电源 mac在这个阶段打哈欠。

在前面的例子中,现在是时候 shut down. 这个参数是强制性的,但有很多方法可以指定它。 如果你想要 mac要在将来的某个时间关闭,一种方法是使用 + n,其中 n 是关闭在执行其工作之前应该等待的分钟数。 对于其他 options,看关机(8)手册页。

制作 system 在10分钟内重新启动,运行以下命令:

执行shutdown-r + 10

On Linux, 关机通知任何登录的人 machine 正在下降,但它几乎没有什么实际作用。 如果您指定的时间不是现在,shutdown 会创建一个名为 /etc/nologin 的文件。 当该文件存在时, system 禁止除超级用户以外的任何人登录。

什么时候 system 关闭时间终于到了,shutdown告诉init切换到运行级别0来停止,并切换到运行级别6来重新启动。 初始化时 enters运行级别0或6,将执行以下所有操作,您可以通过查看rc0.d和rc6.d中的脚本来进行验证:

1。 初始化杀死每一个过程,它可以(因为它会转换成任何其他runlevel时)。

#最初的rc0.d / rc6.d命令运行并锁定 system 文件到位并做好关闭的其他准备工作。
# 接下来的 rc0.d/rc6.d 命令卸载所有文件system除了根以外。
# 进一步的rc0.d/rc6.d命令重新挂载根文件system 只读。
# 还有更多 rc0.d/rc6.d 命令将所有缓冲数据写入文件system 与同步程序。
#的最终rc0.d / rc6.d的命令告诉内核重启或停止使用reboot,halt或关机程序。

对于每个运行级别,重新引导和停止程序的行为都不同,从而可能引起混乱。 通过 default, 这些程序使用 -r 或 -h 调用关闭 options,但如果 system 已经处于暂停或重启运行级别,程序告诉内核立即关闭自己。 如果你真的想关闭你的 mac匆匆忙忙(不考虑因无序关闭造成的任何可能的损坏),请使用 -f 选项。

作为科技爱好者,我从2006年开始在StealthSettings.com上愉快地撰写文章。我在操作系统方面有丰富的经验,包括macOS、Windows和Linux,还熟悉编程语言和博客平台(WordPress),以及在线商店平台(WooCommerce、Magento、PrestaShop)。

发表评论