Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why kthread have pid 2 and systemd have PID 1?

In the systemd environment, when I performed ps -auxf, I see that the kthread has PID of 2 while systemd has PID 1 assigned.

So, who assigns PID 2 to kthread and why is it getting PID 2 when kthread is what that calls systemd?

like image 639
Adit Ya Avatar asked Sep 03 '15 13:09

Adit Ya


1 Answers

I don't think that kthreadd is starting init (in your case symlinked to systemd).

init is started by the kernel initialization. kthreadd is started just after. See this kernel threads wikipage, and, for Linux 4.2, its file init/main.c, function rest_init, near lines 397, where you see:

/*
 * We need to spawn init first so that it obtains pid 1, however
 * the init task will end up wanting to create kthreads, which, if
 * we schedule it before we create kthreadd, will OOPS.
 */
kernel_thread(kernel_init, NULL, CLONE_FS);
numa_default_policy();
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);

So kthreadd is not starting init, but both are started in the kernel before being scheduled, so before starting their execution.

The static kernel_init function (lines 930 - 975 of init/main.c) has notably:

if (execute_command) {
    ret = run_init_process(execute_command);
    if (!ret)
        return 0;
    panic("Requested init %s failed (error %d).",
          execute_command, ret);
}
if (!try_to_run_init_process("/sbin/init") ||
    !try_to_run_init_process("/etc/init") ||
    !try_to_run_init_process("/bin/init") ||
    !try_to_run_init_process("/bin/sh"))
    return 0;

so is setting up the init process (à la execve(2)....) and has hardwired /sbin/init etc...

And the init process has pid 1 for ages (since primordial Unix of the 1970s, and also in old Linux 1.x kernels without kernel threads). It is a strong Unix convention (on which probably a lot of software depends). You can use systemd as your init process, but you could also use sysvinit or simply bash (it is sometimes useful to pass init=/bin/bash to the kernel thru GRUB for repairing purposes) or something else (e.g. runit)

like image 109
Basile Starynkevitch Avatar answered Oct 20 '22 18:10

Basile Starynkevitch