关机:/run/initctl:没有此文件或目录

关机:/run/initctl:没有此文件或目录

我将服务器更新为 Debian wheezy 并试用了一下。过了一会儿,我想重新启动,却遇到了错误

shutdown: /run/initctl: No such file or directory

我在网上搜索了一下,发现 initctl 来自 upstart。即使它没有按照 aptitude 安装,servicesysvinit 命令仍然有效。非常感谢任何帮助。

答案1

我在网上搜索,发现 initctl 来自 upstart。

这个错误是您通过搜索引擎研究得到的,而不是通过手册页得到的。

名字其实是/run/initctl。Upstart 有一个/sbin/initctl。两者是完全不同的东西。前者是一个 FIFO,用于向进程 #1 发送控制命令。后者是一个程序文件。

最初,System V(Linux 的克隆版本)init会在启动时在进程 #1 中创建一个名为 的 FIFO /dev/initctl。诸如 之类的程序telinit通过打开该 FIFO 并向其中写入消息来运行,进程 #1 会读取并执行该消息。

finitUpstart、Joachim Nilsson和 systemd等系统提供兼容性垫片在 中创建 FIFO /dev/initctl,监听消息,并将 System V 概念中的命令转换为 finit/Upstart/systemd 等效命令。因此,期望 System Vinit程序正在运行的工具仍然可以打开该 FIFO 并向其写入命令。(不过,并非所有 init 系统都提供此类垫片。如果你问 Debian System Vinit人员,他们会告诉你这是一个记录不全的内部 API,不属于 System V 软件包的程序实际上不应该使用它。)

几年前,Debian System V 的init开发人员决定将 FIFO 从 移至/dev/initctl/run/initctl因此,他们将其更改init为在那里创建它,并更改了其附带的所有工具init(例如shutdownhalttelinit等)以在那里查找它。

不过,他们只告诉了其他系统之一的开发人员。因此,当非 System Vinit系统管理该系统时,他们仍然主要提供兼容性垫片 FIFO /dev/initctl。如果将 System Vinit工具与此类非 System Vinit系统混合使用,则该工具将尝试在新位置打开 FIFO,而系统则在旧位置提供它。

现在,解决方法应该很明显了:快速符号链接就可以解决问题。

ln -s /dev/initctl /运行/initctl
它会持续到下次重启(大概是当系统重启到更合理的配置时,不会混淆初始化系统,并且会尝试自己制作 FIFO)。Debian System V 软件包的维护者之一 Roger Leighinit在 2012 年指出了这一点。

请注意,根本不需要使用 System Vinit工具。许多 init 系统缺少兼容性垫片 FIFO 并不是什么大问题。systemd、Upstart、nosh 和其他系统都倾向于提供他们自己的各种版本的工具,例如halt、、等等,reboottelinit反正。这些工具使用各自系统的本机协议,initctl根本不使用 FIFO。systemd 的 shims 直接与进程 #1 讨论相关的 D-Bus 协议。Upstart 的 shims 直接生成相关的 upstart 事件。nosh 的 shims 直接将相关信号发送到进程 #1。

其他答案和评论中的所有内容都可以归结为两点:

  • 如果你使用/bin/bash进程 #1 来启动,而不是使用某个实际的 init 系统,那么当然任何地方都不会有initctlFIFO。如前所述,它是 init 系统创建的。每次引导时都会重新创建。
  • 并且是 init 系统对此作出响应。手动创建 FIFO 并mkfifo不能神奇地实现应该在 FIFO 的读取端监听消息的服务器. 这就是为什么实用程序随后尝试将消息发送到 FIFO 却不起作用的原因。

如何让 Debian 7 进入使用 System Vinit工具但同时运行另一个 init 系统的状态,这又是另一回事了。这种情况完全有可能发生,尤其是当正在切换初始化系统。Debian 7 确实没有完全解决这个问题,系统可能会进入一些奇怪的状态。甚至在 Debian 8 中(就目前而言),这一切也并非一帆风顺。幸运的是,这不是你的问题。☺

进一步阅读

答案2

我正在确切地我在 raspbian wheezy 上运行的也是同样的问题qemu 上的 RPi 模拟器。我似乎已经解决了我特定设置的问题。它是否适合您是另一回事。我希望它能。我会诚实地说,我不确定问题是什么,或者它是如何自行解决的,但我已经记录了我所做的一切,没有遗漏任何步骤。

前言

我使用以下工具设置了一个模拟的 Raspberry Pi库姆,使用这两个指南1

  1. 在 OS X 上安装 QEMU, 进而;
  2. QEMU – 轻松模拟 Raspberry Pi(Linux 或 Windows!)

遇到问题

之上第一的使用命令启动qemu(注意使用init=/bin/bash

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2013-09-25-wheezy-raspbian.img

系统启动后,我发现就像 OP 一样,该halt命令无法运行,而是出现错误:

init: /run/initctl: No such file or directory

然后我就跑了(感谢我收到错误标志“init: /dev/initctl: 没有这样的文件”

mkfifo /run/initctl

这会阻止No such file or directory错误,但仍然没有关闭系统,而是给出错误

 init: timeout opening/writing control channel /run/initctl. 

我比较了/run/initctl刚刚创建的与我工作的 RPi 上的,ls -l /run/initctl它们看起来完全相同:

prw------- 1 root root 0 Jan 1 1970 /run/initctl

可能的解决方案

我继续导游的步骤,不管怎样,在之后reboot -f。现在我相信下一步就是修复发生的地方。我以“正常”启动启动了 qemu RPi,离开了init=/bin/bash

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2013-09-25-wheezy-raspbian.img

Wheezy 启动进入raspi-config。我只是更改了 pi 用户的密码和主机名,然后点击,系统重新启动。然后我再次启动 qemu RPi

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2013-09-25-wheezy-raspbian.img

它启动到 tty 登录屏幕。我登录,运行startxX启动后,我运行sudo shutdown -h now。它按预期关闭并停止,没有任何init:错误。

结论

在没有的情况下启动(虚拟)设备init=/bin/bash似乎可以解决问题。这是否相当于硬启动应该可以解决问题2mkfifo ,或者它是和 的组合reboot,我不确定。我知道这不是我最好的答案,但希望它会有所帮助。


1有太多信息需要总结,以防链接失效。但是,设置与 OP 的问题基本无关。

2根据无法重启 Debiansystemd-sysv、sysvinit:在 systemd-sysv 和 sysvinit 之间切换时重启出现问题

相关内容