init comes first
Keywords: sag

Next: Configuring init to start Up: init Previous: init

# `init` comes first

`init` is one of those programs that are absolutely essential to the operation of a Linux system, but that you still can mostly ignore. A good Linux distribution will come with a configuration for `init` that will work for most systems, and on these systems there is nothing you need to do about `init` . Usually, you only need to worry about `init` if you hook up serial terminals, dial-in (not dial-out) modems, or if you want to change the default run level.

When the kernel has started itself (has been loaded into memory, has started running, and has initialized all device drivers and data structures and such), it finishes its own part of the boot process by starting a user level program, `init` . Thus, `init` is always the first process (its process number is always 1).

The kernel looks for `init` in a few locations that have been historically used for it, but the proper location for it (on a Linux system) is `/sbin/init` . If the kernel can't find `init` , it tries to run `/bin/sh` , and if that also fails, the startup of the system fails.

When `init` starts, it finishes the boot process by doing a number of administrative tasks, such as checking filesystems, cleaning up `/tmp` , starting various services, and starting a `getty` for each terminal and virtual console where users should be able to log in (see chapter 8).

After the system is properly up, `init` restarts `getty` for each terminal after a user has logged out (so that the next user can log in). `init` also adopts orphan processes: when a process starts a child process and dies before its child, the child immediately becomes a child of `init` . This is important for various technical reasons, but it is good to know it, since it makes it easier to understand process lists and process tree graphs.

There are a few variants of `init` available. Most Linux distributions use `sysvinit` (written by Miquel van Smoorenburg), which is based on the System V `init` design. The BSD versions of Unix have a different `init` . The primary difference is run levels: System V has them, BSD does not (at least traditionally). This difference is not essential. We'll look at `sysvinit` only.

Next: Configuring init to start Up: init Previous: init