进行初始化:重新启动命令到底是如何工作的?

进行初始化:重新启动命令到底是如何工作的?

我正在尝试编写一个 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);
        .
        .
        .

相关内容