为什么 `init 0` 会导致 Arch 安装时出现“多余参数”?

为什么 `init 0` 会导致 Arch 安装时出现“多余参数”?

我习惯了调用init 0shutdown的老方法。不好,我知道;但是当我在新的 Arch 安装上尝试它时,我得到了这个:

# init 0
Excess Arguments

这让我很困惑,因为我认为systemd应该支持运行级别?查看手册页,它提到了这一点:

为了与 SysV 兼容,如果 systemd 被称为 init 并且 PID 不为 1,它将执行 telinit 并传递所有未修改的命令行参数。这意味着 init 和 telinit 在从正常登录会话调用时基本上是等效的。有关详细信息,请参阅 telinit(8)。

我只是使用了错误的语法还是我完全误解了systemd

更多初始化/系统信息

# command -v init
/usr/bin/init

# file /bin/init
/usr/bin/init: symbolic link to ../lib/systemd/systemd

# /lib/systemd/systemd --version
systemd 234
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN default-hierarchy=hybrid
# command -v telinit
/usr/bin/telinit

# file /bin/telinit
/bin/telinit: symbolic link to systemctl

# systemctl --version
systemd 234
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN default-hierarchy=hybrid

一般系统信息

# uname -a
Linux arch 4.12.5-1-ARCH #1 SMP PREEMPT Fri Aug 11 12:40:21 CEST 2017 x86_64 GNU/Linux

# bash --version
GNU bash, version 4.4.12(1)-release (x86_64-unknown-linux-gnu) 

答案1

为了与 SysV 兼容,[...]
系统234
[…]-SYSVINIT […]

您构建的 systemd 没有兼容性选项,因此手册中描述的兼容性行为不会出现。

答案2

据我从你的符号链接中可以看出,这就是问题所在。

如果你init是一个符号链接,systemd那么你需要看看 systemd 可以得到什么作为参数。

systemd [OPTIONS...]

Starts up and maintains the system or user services.

  -h --help                      Show this help
     --test                      Determine startup sequence, dump it and exit
     --no-pager                  Do not pipe output into a pager
     --dump-configuration-items  Dump understood unit configuration items
     --unit=UNIT                 Set default unit
     --system                    Run a system instance, even if PID != 1
     --user                      Run a user instance
     --dump-core[=BOOL]          Dump core on crash
     --crash-vt=NR               Change to specified VT on crash
     --crash-reboot[=BOOL]       Reboot on crash
     --crash-shell[=BOOL]        Run shell on crash
     --confirm-spawn[=BOOL]      Ask for confirmation when spawning     processes
     --show-status[=BOOL]        Show status updates on the console during bootup
     --log-target=TARGET         Set log target (console, journal, kmsg, journal-or-kmsg, null)
     --log-level=LEVEL           Set log level (debug, info, notice, warning, err, crit, alert, emerg)
     --log-color[=BOOL]          Highlight important log messages
     --log-location[=BOOL]       Include code location in log messages
     --default-standard-output=  Set default standard output for services
     --default-standard-error=   Set default standard error output for services

所以问题是你实际上没有真实的init,而只是一个链接的systemd

答案3

有一个额外的软件包“systemd-sysvcompat”,之后您可以sysvinit 0(也许还有 telinit) - 但随后您再次需要这个 inittab,并且 Slackware 14.2 的停止/关闭/重新启动(那里没有 systemd)并没有说服我。

/usr/bin/sysvinit与“旧”init 大小相同,里面写着:GCC: (GNU) 4.9.2,并且[email protected](我知道这个名字!他写了 sysvinit!)。所以这是 sysv-init。他们只需要重新命名它。在包中它被称为/usr/bin/init。

唉,可怜的伊尼特!就这样被人推来推去!


re:6:once:/sbin/reboot 

这是我用 启动时使用的 inittab init=/usr/bin/sysvinit。 /sbin/reboot 是...systemctl 的链接!好吧,它有效,但我并不是说继续......(不是我的发明,我发现它就像 archlinux 安装的那样)

相关内容