是否有一种简单的方法来确定最近的Debian wheezyFedora系统正在使用哪个initsystem?我知道Fedora 21使用systemd初始化系统,但这是因为我阅读了该文本,并且因为所有相关的脚本/符号链接都存储在/etc/systemd/中。但是,我不确定例如Debian squeezeCentOS 6 or 7等。

存在哪些技术可以验证这种initsystem?

评论

由于默认安装仅具有一个初始化系统,因此dpkg -l,yum或任何软件包管理器不足以识别该初始化系统吗?

在Debian中,dpkg -l | grep systemd会给我一个答案,而dpkg -l | grep upstart却没有,所以我可以说我的Debian安装正在使用systemd而不是其他任何init系统。我并不是说这就是答案,只是测试debian pakages可以给出答案,但是我不能说红色帽子,suse或其他。我猜测如果默认情况下仅安装一个初始化系统,则查询软件包可能会给出答案。

我还应该提到还有其他初始化系统,包括BSD。

非常手工,您看不到哪个进程具有pid 1,什么字符串表示吗?对于我在此处的Ubuntu框,结果包含“ upstart”,现在只是数据收集;)

严格来说,这不是重复的。这个问题专门询问了Linux操作系统。另一个问题包括BSD,MacOS,Solaris和minix。这些答案(包括我的答案)都无法解决这些问题。有充分的理由:原本就很长的答案还会更长。另外,这当然不是问的问题。

#1 楼

您可以在系统中四处查找指示器。一种方法是检查三个目录是否存在:


/usr/lib/systemd告诉您您使用的是基于systemd的系统。
/usr/share/upstart很好地表明您正在在基于Upstart的系统上。
/etc/init.d告诉您包装盒在其历史记录中具有SysV初始化

问题是,这些启发式必须与其他数据一起考虑,不确定指标本身。我现在正在查看的Ubuntu 14.10盒具有所有三个目录。为什么?因为Ubuntu刚从该版本的Upstart切换到systemd,但是保持了Upstart和SysV的初始性以实现向后兼容性。您会看到您已经登录到CentOS 7盒子,并且知道它是systemd。您如何学习?玩转,RTFMing等。以同样的方式获得所有经验。

我意识到这不是一个令人满意的答案,但这就是在市场分散,创建非标准设计时发生的情况。这就像问您如何知道ls是否接受-C--color或根本不进行颜色输出一样。同样,答案是“经验”。

评论


@ val0x00ff:实际上这就是为什么我在上面的评论中问这个问题。开始对系统功能进行自动探测时,如果要使其真正可移植,则必须非常小心。 Ubuntu 14.10课程是您必须按照上面列出的顺序进行操作。但这并不表示Ubuntu 15.10不会做其他会破坏脚本的事情。

–沃伦·杨(Warren Young)
15年4月14日在15:27

仅存在伪像不足以声称它正在使用中。在我管理的Ubuntu服务器上,已安装systemd,但该计算机仍在使用upstart。

–sleblanc
15年4月15日在1:03

@ val0x00ff了解到的所有三个init系统都可以并且将遵守标准LSB init.d脚本(如果找到),这可能也是有用的。

– Shadur
15年4月15日在9:16

这也可以通过简单的ps -p 1命令来实现,输出应将您指向init | upstartd | systemd进程,然后将其初始化为/ sbin / init --version。

–askb
16 Mar 3 '16 at 8:20

这是一个可怕的答案。任何问题都可以用“经验”来回答,但这是谦卑的缩影。您的经验为您提供了一种算法,可用于找到该问题的答案。对于ls -c位,可能就像尝试ls -c并查看是否出错一样简单。对于这个问题,系统必须以某种方式为其自身记录将要使用的初始化系统。一些可以检查的配置文件。您的“经验”告诉您它是什么。除非您愿意分享,否则您不应该发布答案。

–丹尼尔·宾汉(Daniel Bingham)
16-10-11在18:11

#2 楼

始终为init进程分配PID1。/proc文件系统提供了一种获取给定PID的可执行文件的路径的方法。换句话说:
>
如您所见,我的Ubuntu 14.10机器上的初始化过程是Upstart。 Ubuntu 15.04使用systemd,因此运行该命令将产生以下结果:该文件:

nathan@nathan-desktop:~$ sudo stat /proc/1/exe
  File: '/proc/1/exe' -> '/sbin/upstart'


您还可以执行该文件以了解更多信息:

nathan@nathan-gnome:~$ sudo stat /proc/1/exe
  File: '/proc/1/exe' -> '/lib/systemd/systemd'


评论


但是,RHEL 6(以及CentOS,Scientific Linux等)使用upstart,并且stat / proc / 1 / exe产生文件:'/ proc / 1 / exe'->'/ sbin / init',但不会告诉你很多。

–mattdm
15年4月14日在18:46

因此,实际上,从用例的角度来看,将EL6视为SysVInit实际上更为正确,即使它是Upstart的基础-如果要放置新服务,传统的SysVInit脚本是首选方法。

–mattdm
15年4月14日在18:55

我在Debian上也得到了'/ proc / 1 / exe'->'/ sbin / init'。

– terdon♦
15年4月15日在11:37

对于它的价值,stat / sbin / init在Ubuntu 14.04下提供文件:sbin / init

–古怪的长老
2015年5月5日15:50

这不适用于以-it / bin / bash运行的docker映像,因为bash是第一个启动的进程

–菲尔
19 Mar 1 '19 at 20:35

#3 楼

这实际上是一个相当困难的问题。主要困难之一是,人们最想这样做的地方很可能是人们正在安装或更换东西的地方。另一个问题是,已安装的系统管理工具集,当前正在运行的系统管理工具集与将在下次启动时运行的系统管理工具集之间存在细微但非常重要的区别。

确定当然,安装的是软件包管理器。但是,由于可以并排安装多个系统这一事实使情况变得复杂。

例如,在Debian Linux上,可以安装systemd软件包,但是要安装单独的systemd-sysv软件包才能使其成为活动系统。目的是可以同时安装systemd和sysvinit软件包。确实,出于这个原因,Debian Linux人群已经在Debian 8中采取了一些措施,以转向具有不同名称(/lib/sysvinit/init/lib/systemd/systemd/sbin/runit-init/sbin/minit/sbin/system-manager等)的每个程序,因为“非激活”软件包没有名称/sbin/init不会发生冲突。然后,/sbin/init是一个符号链接,指向通过“激活程序包”配置为在下次启动时运行的任何计算机。

确定当前正在运行的内容并准备好下次运行,只能使用一系列工具集来完成-特定测试,具有不同程度的误报风险和不同程度的文档记录。具体来说,要检查当前正在运行的系统管理器,实际上必须查看进程列表或系统管理器发布的各种API。但这并不是完全没有陷阱。

普通的入门者

让我们从绝对无法解决的事情开始。 >
当新贵或系统5 /proc/1/exe正在运行时,/sbin/init将指向相同的init。在某些系统上,systemd运行时也为/sbin/init。如前所述,Debian Linux人群希望转向每个具有不同名称的程序。但这是Debian特定的,远非通用的,并且无论如何以/sbin/init(由引导程序的initramfs阶段)调用程序时,并没有真正的帮助。实际上,只有Felix von Leitner的minit由Debian 8打包后才能用其自己的名称调用。

控件API文件/dev/initctl的存在并不特定于System 5 init。 systemd具有一个(非进程#1)systemd-initctl服务器来为此提供服务。 Joachim Nilsson的finit也可以使用。 (只是为了使事情变得更加有趣,在Debian上,它现在位于/run/initctl。有关详细信息,请参见https://superuser.com/a/888936/38062。) rc,对于前两个情况是为了向后兼容。它的存在并不表示存在任何给定的系统。

检测系统5 /etc/init.d/



具有讽刺意味的是,如https://unix.stackexchange.com上所述。 / a / 196197/5132,在Debian Linux上至少用于检测系统5 init缺失的一种方法是init的缺失。但是:


这是Debian打包/etc/inittab之类的东西的副作用。
总体问题的一部分是,如果使用System 5 /etc/inittab,则/etc/inittab会卡住在过去的任何时候,因为卸载软件包不会删除其配置文件。 (这对于Debian 8来说是一个很大的问题,因为Debian 7中有几个软件包是通过将条目添加到init来安装自身的。)
这是一个反向测试。 br />
为了以“官方”方式将systemd作为正在运行的系统管理器进行检查,请检查/etc/inittab的存在。这是一个目录,位于/run/systemd/system中,systemd本身在引导时创建,而其他系统管理员则不太可能创建。

但这不太可能。此检查已被破坏,因为uselessed也会创建此目录。

其他非官方的检查将不起作用:


systemd通过以下方式发布了整个RPC API: D-Bus,甚至包含版本名称和编号;但是:


臭名昭著的“接口稳定性保证”未涵盖此问题,明天或一时可能会改变。 shim。
uselessed也是如此。


/run的存在同样无法得到保证,并且也被uselessed重复。

检测nosh

nosh中的/run/systemd/private创建一个system-manager目录。但这也具有等效的systemd检查的缺点。文件系统,并且首先没有RPC API。
nosh /run/system-manager通常在system-manager处具有一个API套接字,但是可以在其他系统管理器下运行nosh服务管理器;因此,这不能告诉一个进程#1正在运行哪个系统管理器。无论如何,它不会自行设置名称。无论调用了什么。
service-manager/run/service-manager/control(如果已安装systemd兼容垫片)和system-control version(如果已安装新贵兼容垫片)发出的nosh版本字符串的存在仅表明该工具集的存在,因为这些工具不查询正在运行的系统。

检测新贵

Upstart自己的systemctl version通过D-Bus进行API调用,并且官方检查是要检查一个人是否可以运行initctl version,并且其输出在某处包含字符串“ upstart”。

但是,就像systemd API一样:


不能保证API会在明天出现或一时兴起。
不能保证某些兼容垫片不存在或将来将不存在。的确,已经有一个兼容垫片。 nosh有一个新贵兼容包,为新贵initctlinitctlinitctlstart命令提供垫片。幸运的是(尽管这是故意的),stop填充程序不会发出“ upstart”一词。
root ~ #initctl version
nosh version 1.14
root ~ #




评论


对于无用的与systemd不兼容的信息,该怎么办?对该站点进行简短的查看似乎表明它是一个“缩减的systemd”。

–Random832
15年4月14日在20:29

+1,但有几点麻烦:1)/etc/init.d的存在确实并没有告诉您SysVinit是主要的init系统,但确实告诉您您不在传统的BSD机器上。排除所有其他选项后,将其放在检查清单的最后。 2)以某种方式无用的模拟系统不一定是一个问题。如果您要确定是否要安装* .service文件,而不要使用init脚本,则可以将systemd与无用的块一起检查。如果您试图使用故意没有提供的无用功能之一,那么这就是一个问题。

–沃伦·杨(Warren Young)
2015年4月15日在9:36



如果仔细看,您会发现问题并没有扩展到BSD。 ☺

– JdeBP
15年4月15日在12:02

@JdeBP:是的,但这是因为这是一个眨眼的问题,这就是为什么会有这么多赞成的答案。对于这个问题,确实没有一个简单而好的答案。 “正确”的答案将取决于为什么人们真正提出这个问题以及适用什么条件。指出现有答案失败的漏洞是值得的。它使我想起了早期的Autoconf文档,该文档将您推向了if test x“ $ y” =“ x”而不是if [-z“ $ y”],因为后者在原始的Bourne shell上不起作用。在争取广泛的可移植性时,您需要了解所有陷阱。

–沃伦·杨(Warren Young)
2015年4月15日18:25



这个问题并没有完全满足我们的要求,它不能满足我们希望以一个庞大的答案涵盖该站点涵盖的每个操作系统的问题,而只能将其限制在提问者实际打算使用的几个Linux系统上。没有简单的答案,不是因为这个问题并没有问您要谈论的操作系统,而是因为这是一件困难的事情(而不仅仅是系统管理工具集)。我在上面写过,你会发现的。 ☺

– JdeBP
15年4月15日在19:28

#4 楼

在基于RPM的系统上,您可以查询RPM数据库以查看哪个软件包提供了/sbin/init。例如:

fedora:~$ rpm -qf /sbin/init
systemd-216-24.fc21.x86_64

centos:~$ rpm -qf /sbin/init
upstart-0.6.5-12.el6_4.1.x86_64

opensuse:~$ rpm -qf /sbin/init
systemd-sysvinit-44-10.1.1.i586


如果只需要软件包名称而不是版本,则可以将--qf选项添加到RPM(“ queryformat”,不要与另一个带有一个连字符的-qf,意思是“查询:文件”),例如:rpm --qf '%{name}\n' -qf /sbin/init。 />
ubuntu:~$ dpkg -S /sbin/init
upstart: /sbin/init


而且,大多数程序包管理器将具有类似的命令。当然,那您需要知道您的发行版使用的软件包管理器,这可能只是将一个问题换成另一个。

此外,在某些发行版中,dpkg可能不是正确的文件at,最有可能是因为在内核命令行上给出了/sbin/init。另一种可能是,init=/something/else是一个符号链接,该符号链接由负责在init系统之间切换的某些帮助程序包拥有,而不是直接由其中任何一个系统拥有。在Arch上可能是其中一种或两种情况(尽管我现在没有方便检查的Arch框)。

评论


哇,我不知道-S选项。这为initsystem提供了更多见解。谢谢一群!

–华伦丁·巴杰拉米(Valentin Bajrami)
15年4月14日在17:02

“而且,在某些发行版中,/ sbin / init可能不是正确的文件,...”因此,也许完整的答案是执行ps -p1或查看/ proc / 1来识别程序进行查询。 (当然,如果合适,请使用readlink。)

–斯科特
2015年4月14日17:12
@Scott是的,尽管我认为在实践中查看/ sbin / init应该可以为大多数基于rpm和dpkg的发行版找到正确的答案,但是其他人可能仍然需要自己的特殊包装。我赞成不要仅仅为了理论而进行不必要的复杂性工程。 (不过,如果您有一个很好的示例发行版,我会改变主意!)

–mattdm
15年4月14日在18:51

@mattdm好吧,我只是在回应您关于init = / something / else的最后一段。

–斯科特
15年4月14日在18:52

#5 楼

您也可以从程序中使用已定义的API。 Systemd随附libsystemd,可以检查它是否可以成功连接到正在运行的systemd实例。

评论


有点鸡和蛋。至少没有systemd组件的系统上不会存在该库。您必须使用类似autoconf之类的东西,该东西可以首先检查库的存在。

–沃伦·杨(Warren Young)
15年4月14日在18:27

该库将存在,因为程序需要它。在Debian中,这一直是一个巨大的争议,但是最后,似乎大多数人都接受了libsystemd也将出现在sysv系统上的目的,正是为了允许程序找出systemd是否处于活动状态。

–西蒙·里希特(Simon Richter)
2015年4月14日在18:29

您不会在CentOS 5或FreeBSD机器上找到它。我也期待一个可能是5年的世界,因此人们不再试图阻止潮流,但是今天,您绝对不能指望能够盲目地与libsystemd联系。

–沃伦·杨(Warren Young)
15年4月14日在18:53

好吧,如果它在构建时不可用,则只需假设该平台没有systemd。考虑到开发人员的态度,systemd除了Linux之外几乎不可能用于任何其他产品。

–西蒙·里希特(Simon Richter)
15年4月15日在5:09