- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Slackware Linux init 进程由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Joe Brockmeier 研究了 Slackware Linux init 进程。他讨论了系统如何初始化服务、各种运行级别是什么,以及如何从缺省安装中添加或除去服务来定制系统.
Linux 用户正日益成熟,这意味着他们想要将系统配置成执行他们希望完成的任务。但目前 Linux 发行版通常都附带了自动配置的设备和启动服务,如 Sendmail 或 Apache。这些发行版没有考虑到的是毫不更改其缺省设置来运行服务,如 Apache -- 用户毫不知情 -- 会让黑客和利用脚本捣乱的人趁虚而入。而且这会用完本可以更好利用的系统资源 -- 比如可以用于 Quake 或您喜欢的编译器的更多处理器时间。由于缺少控制是件“糟糕的事”,因此让我们看一下 Linux 系统引导时在 init 进程期间,在所涉及的各个运行级别上都发生了什么,以及如何在系统运行时定制系统或在运行级别之间切换.
我们的示例使用 x86 平台上的 Slackware Linux 发行版(请参阅本文后面的 参考资料 )。大多数信息可用于其它 Linux 发行版,但在细节处会略有不同。尤其是,与其说 Slackware 的 init 结构类似于 System V 结构,还不如说它更类似于 BSD UNIX 结构,尽管 Slackware 的最新发行版中的程序做了一些让步,它们要将服务添加到启动,但期望这些服务是 System V 目录结构。(请参阅侧栏, “BSD 和系统 V init 脚本之间的差异”。) 。
所有进程的父代 。
当 Linux 机器引导时,究竟会发生什么?在计算机的 BIOS 完成其任务后,系统会读取硬盘(或软盘,或 CD-ROM,或 Zip 驱动器……Linux 是非常灵活的)的第一位,并会遇到引导装入程序。虽然 GRUB 和其它装入程序也逐渐变得流行,但通常这就是 Linux 装入程序 (LInux LOader),一般称作 LILO.
然后 LILO 将 Linux 内核装入内存,并开始展示它的魔力。Linux 内核初始化了诸如 SCSI 卡之类的设备,以及其它内核中内置的硬件设备。然后内核运行 init,它是除内核之外在系统运行的第一个进程。如果执行 ps ax | grep 1 ,就会看到 init 的进程 ID (PID) 是 1.
装入 init 之后,它会读取 inittab 以查看下一步做什么。 inittab 告诉 init 要进入什么运行级别,以及在哪里可以找到该运行级别的配置文件.
回页首 。
运行级别 。
运行级别是由系统上的所有服务在某个给定时间定义的(基本上是操作方式)。Linux 可以有几种操作方式:单用户方式、单用户联网方式、多用户方式、始于 X 窗口的多用户方式,等等。这部分将要说明运行级别的概念、Slackware 上有哪些运行级别,已经它们被叫作什么.
运行级别由数字或字母标明。可惜,不是所有的 Linux 发行版在各个运行级别的称呼问题上都能达成共识。在某些发行版中,运行级别 3 是使用 X 窗口登录的多用户方式。而其它的,如 Slackware,将运行级别 3 指定成使用控制台登录的多用户方式.
据我所知,所有 Linux 发行版都认同运行级别 0 是“停机”、运行级别 1 或 "S" 是单用户方式(稍后将详细说明),运行级别 6 是重新引导系统。Slackware 的运行级别如下:
运行级别 0 = 系统停机 。
运行级别 1 = 单用户方式,主要用于维护 。
运行级别 2 = 从不使用 。
运行级别 3 = 使用控制台登录的多用户方式 。
运行级别 4 = 使用 X11 会话管理器的多用户方式 (XDM, GDM, KDM) 。
运行级别 5 = 从不使用 。
运行级别 6 = 重新引导 。
运行级别 S 或 s = 单用户方式 。
这里没有记录运行级别 7 到 9,在理论上,它们适用于在需要时定制运行级别。但我还没有亲自尝试过创建一个。 BSD 和 System V init 脚本之间的差异 。
Slackware Linux 使用 BSD init 脚本说说挺容易,但这究竟表示什么?
仿真 BSD init 样式的 Linux 和 UNIX 系统有一个 /etc/rc.d/ 目录,其中每个运行级别都包含一个 init 脚本。因此,如果要查看或修改运行级别 4 的 init 脚本,应该编辑文件 /etc/rc.d/rc.4 .
另一方面,其 init 脚本基于 System V 的系统对于每个运行级别都有独立的目录。因此,如果要编辑运行级别 4 init 脚本,应查找 /etc/rc4.d/ 目录,并查找该目录中对应于要修改的服务的脚本.
这个差异导致了 Berkeley Software Distribution (BSD) UNIX 和 AT&T System V UNIX 之间的设计差异,这两者都开创了各自的 UNIX 商业版本。它们连同 Vi 以及 Emacs 一起是计算机界的激烈争论之一.
由于许多 Linux 发行版都喜欢 System V init 布局,Slackware 现在也附带了目录和 rc.sysvinit init 脚本,用于保持兼容性.
回页首 。
运行级别配置 。
如果您使用的不是 Slackware Linux,那么配置文件的结构与我谈到的结构会大不相同。除了 inittab 文件,所有 Slackware 的启动配置文件都在 /etc/rc.d/ 目录中.
缺省情况下,目录中有 5 个运行级别 rc.* 脚本,如果将 symlink 从 rc.0 加到 rc.6 ,那么可有 6 个.
运行级别 init 脚本是:
rc.0 = rc.0 文件是到 rc.6 的 symlink 。
rc.M = 多用户运行级别 2、3 和 5 的 init 脚本 。
rc.K = “管理”运行级别,单用户方式 。
rc.S = 系统初始化脚本 。
rc.4 = 运行级别 4(自动引导入所选择的 X 会话管理器)的 init 脚本 。
rc.6 = 重新引导或停止系统时由 init 执行的脚本 。
目录中的其余 rc.* 文件用于启动诸如联网、内核模块、PCMCIA、Samba、Apache、Netatalk 和 GPM 的系统服务。如果想要使某个服务(如 Apache)完全不能在任何运行级别上使用,请使用 chmod 将文件的许可权从可执行更改成不可执行。除去该文件也可以到达相同效果,但我不推荐这种做法。也许在以后某个日子您会发现要重新启用服务,但却不知道怎样做.
rc.inet1 脚本负责启动基本联网服务,如设置主机名(IP 和 DHCP)。 rc.inet2 脚本负责启动所有其它 INET 服务,如 NFS、包转发、ssh 服务器和其它联网守护程序.
所有 Slackware /etc/rc.d/rc.* 文件都是 Bash shell 脚本,都可以进行手工编辑。可是对于联网,您可能应该先尝试 netconfig 实用程序。虽然需要手工编辑 /etc/resolv.conf 来添加多个名称服务器,但是它也许能处理您想要执行的所有操作,而且它非常易于使用.
如果您是 Linux 初学者并且要修改系统,那么也许应该确保您有引导软盘,并且应该复制您所有想要编辑的 rc.* 文件。如果拿不定主意,我通常会将文件保存为 rc.*.old ,使它们变成不可执行文件。,使它们变成不可执行文件.
回页首 。
使用运行的系统 。
好,现在系统已经运行,然而您需要在单用户方式中执行一些操作 -- 该怎么做呢?本文的下一部分将说明如何在系统运行时更改运行级别,而不是通过重新引导来更改运行级别,而且还说明了为什么执行此操作以及何时执行.
回页首 。
telinit 命令:在运行的系统上更改运行级别 。
telinit 命令可以用于更改运行级别。当以 root 身份执行 telinit S (或者想要更改的任意运行级别)时,它会更改运行级别,关闭前一个运行级别,然后启动下一个.
某种程度上您正在重新引导系统的一部分。然而,关闭与重新启动服务的能力正是 Linux 最可爱的品质之一。想要更改机器的 IP 地址吗?没问题,只要进行一些更改,然后重新启动联网服务就行了。只要一切配置正确,备份和运行是如此迅速,很难分辩是否做过更改。在其它即使更改了桌面上的墙纸都必须重新引导的操作系统上,尝试一下执行此操作 :) 。
确实需要重新引导或彻底关闭 Linux 机器的唯一情况是如果正在添加或更改硬件,假设您正在使用不能热插拔的设备,或者已经中断且需要使机器脱机以修复损坏。与其它操作系统不同,对于那些不经过重新引导就无法解决问题的产品系统,我从来没有看到过重新引导解决了这些系统上的问题。我曾设法利用诸如 hdparm 的命令来挂起非生产性机器,我希望这种情况发生.
假设您想要执行一些系统维护,而这些系统维护要求系统处于单用户方式。例如,使用 hdparm 调整硬盘。第一步是 su (切换)到 root 用户.
然后执行 telinit 命令使系统进入单用户方式:
telinit S -t 60 。
自变量 "-t" 是可选的;它告诉 telinit 在真正切换到单用户方式之前等待 60 秒。然而,只要执行了该命令,登录到机器的任何人都会看到在控制台上出现一个警告,指出系统将切换运行级别或将在 60 秒内停机.
到了 60 秒时,init 会关闭单用户方式中不使用的进程,并使系统进入单用户方式。然后,将提示您输入 root 用户密码以执行系统维护.
系统进入单用户方式所使用的进程略有不同。缺省情况下,单用户方式要求 init 在控制台上调用 sulogin 命令,并要求在单用户方式中使用 root 登录.
系统进入单用户方式后,应该会看到如下的消息:
Give root password for system maintenance 。
(or type Control-D for normal startup)
执行了维护之后,可以执行以下命令来使系统回到以前的运行级别:
telinit 3 。
此命令告诉系统重新进入多用户运行级别。在此命令中可以用 "2" 或 "4" 来代替 "3"。在 Slackware 系统上,运行级别 4 将使您进入使用 X 窗口显示管理器之一的多用户方式,因此您将直接登录到 X 窗口.
如果在拥有串行电缆的串行上挂了 UPS,那么就可以让 UPS 在断电的情况下向系统发送一个信号。如果您的产品级系统有一个很大的文件系统,那么这是非常有用的。我曾看到过当没有彻底卸载 100GB RAID ext2 文件系统时(完成 fsck 需要大约 4 小时)发生了什么情况。另一方面,正确配置的 UPS 可以提醒系统断电情况,并向 telinit/init 发送 SIGPWR 信号,这会使 init 根据其配置情况将系统切换到单用户方式或者完全关闭系统.
回页首 。
关机 。
好,由于一直使用计算机,您已经觉得疲倦了,并打算到 Big Blue Room 去放松一下。幸好,您已经知道了在结束时直接按电源开关是一大禁忌,但也许还不知道关闭系统的所有方法.
在 Linux 中,可以使用“三指礼”重新引导系统:Ctrl+Alt+Del 键控顺序会向系统发送消息,通知它执行关机进程并重新启动。换句话说,除非告诉它不要那样做.
如果要禁用该键控顺序,需要注释掉 inittab 中的一行代码:
部分 Slackware inittab 。
# Script to run when going multi user. 。
rc:2345:wait:/etc/rc.d/rc.M 。
# What to do at the "Three Finger Salute". 。
#ca::ctrlaltdel:/sbin/shutdown -t5 -rf now 。
Comment out the above line to disable Ctrl+Alt+Del hotkey. 。
关机时会发生什么情况?调用 shutdown 命令可以逐步关闭系统。然而,shutdown 自身并不完成所有工作,它通知 init:应该进入运行级别 0、1 或 6.
shutdown 命令还通知所有已登录到机器上的用户:机器将关闭。在此之后将锁住 login 命令,因此没有别的人可以再启动会话.
要使用 shutdown 命令来关闭 Linux 系统,使用以下命令:
关机 。
shutdown -h now 。
如果要给用户注销和保存文件的时间,请使用以下命令:
shutdown -h -t 60 。
shutdown 命令的 "-h" 开关告诉系统在停机后彻底关机。如果在内核中启用了 APM,那么它会替您关闭电源,否则此时可以放心地按下开关.
"-t" 开关是到系统开始关机之前所需要的时间,以秒为单位。如果要放弃关机,那么使用此开关可以实现。要停止暂挂关机,输入:
shutdown -c 。
此命令将取消以前的所有 shutdown 命令。如果出于某些原因,您不想关闭系统,但却要向用户发送“系统即将关闭”的警告,那么应在 shutdown 中使用 "-k" 自变量.
知道如何使用 telinit 和 init 可以在修改 Linux 系统派上用处。本文中,我们讨论了更改运行级别和有关 Slackware Linux 发行版的 init 脚本的基础知识。在各个发行版之间,目录结构和文件位置都各不相同,但在阅读了本文之后,您应该能够掌握系统的 init 脚本,即使您使用的不是 Slackware Linux.
参考资料 。
您可以参阅本文在 developerWorks 全球站点上的 英文原文. 。
请访问 Slackware Linux 主页.
请订阅 安装、配置和定制 Slackware Linux ,这是由 Joe Brockmeier 与其他人合著的 Slackware 初学者指南.
如需附加背景知识,请阅读 "How Your Computer Boots".
请深入了解 Berkeley Software Distribution (BSD) UNIX 和 AT&T System V UNIX 以及 Vi 和 Emacs 之间的设计差异,这是计算机界的 激烈争论之一.
最后此篇关于Slackware Linux init 进程的文章就讲到这里了,如果你想了解更多关于Slackware Linux init 进程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
何时使用 init、带参数的 init 或 iOS 8 (Swift) 中的便利 init, Objective-C 中的 convenience init 等价于什么? 最佳答案 你的类将有一个必需
我正在阅读这个 First Search Program - Artificial Intelligence for Robotics 算法,我正在阅读它的 Python 代码。在这里,我们创建了一个
我觉得答案很明显,但我一直无法弄清楚,这对我来说似乎是一个反复出现的问题。基本上我想做这样的事情: extension NSData { convenience init(JSONObject
cloud-init 是在首次启动时在虚拟机上执行各种配置的包。您必须使用您的配置配置一个文件,然后将其扔到您的 VM 上,然后对其进行虚拟化。 但它究竟是如何工作的呢?用户数据如何发送到 VM,cl
我目前正在与 CoreOS 打交道,到目前为止,我认为我已经掌握了总体思路和概念。我还没有得到的一件事是执行 cloud-init . 我明白 cloud-init是一个为 CoreOS 做一些配置的
部署项目后,当客户端第一次向 TestServlet 发送请求时,服务器会创建 testServlet 对象,然后调用第一个 init() 方法(init(ServletConfig config))
是否有可能在 convenience init 中以某种方式解包可选 init? convenience init(...) { self.init?(...) ?? self.init() }
使用时 write_files使用 cloud-init,是否可以附加内容?如果是这样,如何? write_files: [ { "path": "/home/user/some-file
我对 Ansible 比较陌生,我创建了一个剧本,可以在“裸”服务器上安装 Tomcat 配置。我想知道如何解决能够更新 init.d 脚本的问题,同时避免在脚本没有更改时在剧本开始时停止服务。这是基
我打算在 iOS 中使用参数调用 init 方法中的默认 init 方法。像这样: -(id)init{ self = [super init]; if (self) {
Objective C 规范(来自 Apple)第 49 页指出每个声明实例变量的类都必须提供一个 init 方法来初始化它们 我的问题 -为什么这是必要的? NSObject 不会为实例初始化 iV
所以我有一个带有指定初始化器的类,它为每个存储的属性取值。我所有存储的属性也有一个默认值,所以我假设这个类有一个默认的初始化。 在我指定的 init 中,我调用 super.init() 问题是,如果
我对此有些困惑: class Person { var name: String var age: Int init(){ name = “Tim”
我有一个带有两个初始化方法的对象。其中一个接受 NSDictionary,另一个接受一大堆 String 变量。我想调用 NSDictionary init,然后从那里将我的字典转换为字符串,然后用我
我正在尝试为我的类创建一个方便的初始化:User。我之前为另一个类(class)做过这个,并且 - 再次创建它 - 我使用了相同的代码,只是我的用户类(class)有所不同。 这是我的用户类: imp
我已经通读了以下秘诀,它展示了一种使用 Google Cloud Endpoints 后端为 AngularJS 前端提供动力的方法: https://cloud.google.com/resourc
本文整理了Java中com.netflix.zuul.init.ZuulFiltersModule.()方法的一些代码示例,展示了ZuulFiltersModule.()的具体用法。这些代码示例主要来
我想实现一个 初始化 下功能 box.once() 在 Tarantool 中只执行一次,但是,只有在 时才对我有用初始化 已成功执行。 问题 : 如何使“onceinit”记录只有在 init 成功
如果在Xcode中创建新的游戏模板项目,则默认GameViewController将使用以下初始化程序实例化游戏场景: let scene = SKScene(fileNamed: "GameScen
我有一个 MKPolyline我要实现的 subblas NSCoding , IE。 @interface RSRoutePolyline : MKPolyline I asked a quest
我是一名优秀的程序员,十分优秀!