我将服务器更新为 Debian wheezy 并试用了一下。过了一会儿,我想重新启动,却遇到了错误
shutdown: /run/initctl: No such file or directory
我在网上搜索了一下,发现 initctl 来自 upstart。即使它没有按照 aptitude 安装,service
sysvinit 命令仍然有效。非常感谢任何帮助。
答案1
我在网上搜索,发现 initctl 来自 upstart。
这个错误是您通过搜索引擎研究得到的,而不是通过手册页得到的。
名字其实是/run/initctl
。Upstart 有一个/sbin/initctl
。两者是完全不同的东西。前者是一个 FIFO,用于向进程 #1 发送控制命令。后者是一个程序文件。
最初,System V(Linux 的克隆版本)init
会在启动时在进程 #1 中创建一个名为 的 FIFO /dev/initctl
。诸如 之类的程序telinit
通过打开该 FIFO 并向其中写入消息来运行,进程 #1 会读取并执行该消息。
finit
Upstart、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
(例如shutdown
、halt
、telinit
等)以在那里查找它。
不过,他们只告诉了其他系统之一的开发人员。因此,当非 System Vinit
系统管理该系统时,他们仍然主要提供兼容性垫片 FIFO /dev/initctl
。如果将 System Vinit
工具与此类非 System Vinit
系统混合使用,则该工具将尝试在新位置打开 FIFO,而系统则在旧位置提供它。
现在,解决方法应该很明显了:快速符号链接就可以解决问题。
ln -s /dev/initctl /运行/initctl它会持续到下次重启(大概是当系统重启到更合理的配置时,不会混淆初始化系统,并且会尝试自己制作 FIFO)。Debian System V 软件包的维护者之一 Roger Leigh
init
在 2012 年指出了这一点。
请注意,根本不需要使用 System Vinit
工具。许多 init 系统缺少兼容性垫片 FIFO 并不是什么大问题。systemd、Upstart、nosh 和其他系统都倾向于提供他们自己的各种版本的工具,例如halt
、、等等,reboot
telinit
反正。这些工具使用各自系统的本机协议,initctl
根本不使用 FIFO。systemd 的 shims 直接与进程 #1 讨论相关的 D-Bus 协议。Upstart 的 shims 直接生成相关的 upstart 事件。nosh 的 shims 直接将相关信号发送到进程 #1。
其他答案和评论中的所有内容都可以归结为两点:
- 如果你使用
/bin/bash
进程 #1 来启动,而不是使用某个实际的 init 系统,那么当然任何地方都不会有initctl
FIFO。如前所述,它是 init 系统创建的。每次引导时都会重新创建。 - 并且是 init 系统对此作出响应。手动创建 FIFO 并
mkfifo
不能神奇地实现应该在 FIFO 的读取端监听消息的服务器. 这就是为什么实用程序随后尝试将消息发送到 FIFO 却不起作用的原因。
如何让 Debian 7 进入使用 System Vinit
工具但同时运行另一个 init 系统的状态,这又是另一回事了。这种情况完全有可能发生,尤其是当正在切换初始化系统。Debian 7 确实没有完全解决这个问题,系统可能会进入一些奇怪的状态。甚至在 Debian 8 中(就目前而言),这一切也并非一帆风顺。幸运的是,这不是你的问题。☺
进一步阅读
- 斯科特·詹姆斯·雷姆南特和詹姆斯·亨特。
initctl
(8). Ubuntu 手册页。 - 罗伯特·米兰(Robert Millan)(2011 年 8 月)。 请考虑
/dev/initctl
移至/run
. 638019. Debian 错误跟踪系统。 - 约阿希姆·尼尔森。自述。完成。
- systemd-initctl.service。 freedesktop.org。
- 罗杰·利(2012 年 1 月)。systemd:请使用 /run/initctl 实现 sysvinit 兼容性. 657979. Debian 错误跟踪系统。
- 罗伯特·米兰(2012 年 1 月)。
debian/patches/93_run_initctl.patch
。 alioth.debian.org。 halt
,,poweroff
reboot
. systemd 手册页。freedesktop.org。- 斯科特·詹姆斯残余。
reboot
(8),halt
(8),poweroff
(8). Ubuntu 手册页。
答案2
我正在确切地我在 raspbian wheezy 上运行的也是同样的问题qemu 上的 RPi 模拟器。我似乎已经解决了我特定设置的问题。它是否适合您是另一回事。我希望它能。我会诚实地说,我不确定问题是什么,或者它是如何自行解决的,但我已经记录了我所做的一切,没有遗漏任何步骤。
前言
我使用以下工具设置了一个模拟的 Raspberry Pi库姆,使用这两个指南1:
遇到问题
之上第一的使用命令启动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 登录屏幕。我登录,运行startx
。X
启动后,我运行sudo shutdown -h now
。它按预期关闭并停止,没有任何init:
错误。
结论
在没有的情况下启动(虚拟)设备init=/bin/bash
似乎可以解决问题。这是否相当于硬启动应该可以解决问题2mkfifo
,或者它是和 的组合reboot
,我不确定。我知道这不是我最好的答案,但希望它会有所帮助。
1有太多信息需要总结,以防链接失效。但是,设置与 OP 的问题基本无关。
2根据无法重启 Debian和systemd-sysv、sysvinit:在 systemd-sysv 和 sysvinit 之间切换时重启出现问题