我正在尝试编写一个 init,但无法弄清楚重新启动\断电的事情。显然reboot只是一个到systemctl的链接? (我正在使用 arch)那么这是如何工作的呢?init poweroff
作品之类的,但是reboot
/poweroff
似乎只是链接到systemctl
答案1
许多程序的行为有所不同,具体取决于调用它们的名称。类似systemctl
检查 的值,argv[0]
如果是reboot
则行为不同systemctl
。你可以看到这被发挥到了极致忙碌盒,这是一个单个二进制文件,通过将所有命令符号链接到单个二进制文件来提供几乎整个(最小)用户空间busybox
。
您可以使用 shell 脚本执行完全相同的操作:
#!/bin/bash
if [[ $0 =~ foo ]]; then
echo "running foo action"
elif [[ $0 =~ bar ]]; then
echo "running bar action"
else
echo "running default action"
fi
假设这是multicall.sh
,如果我们这样设置:
ln -s multicall.sh foo
ln -s multicall.sh bar
然后看到:
$ ./foo
running foo action
$ ./bar
running bar action
$ ./multicall.sh
running default action
特别是systemctl
,逻辑是实现的这里:
int systemctl_dispatch_parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
assert(argv);
if (invoked_as(argv, "halt")) {
arg_action = ACTION_HALT;
return halt_parse_argv(argc, argv);
} else if (invoked_as(argv, "poweroff")) {
arg_action = ACTION_POWEROFF;
return halt_parse_argv(argc, argv);
} else if (invoked_as(argv, "reboot")) {
if (kexec_loaded())
arg_action = ACTION_KEXEC;
else
arg_action = ACTION_REBOOT;
return halt_parse_argv(argc, argv);
.
.
.