Quando o
kernel auto-inicializa (foi carregado em memória, começa a rodar e inicializa todos os dispositivos e estruturas de dados), ele finaliza as suas tarefas na inicialização do sistema ao iniciar o programa de nível de usuário init. O
init é sempre o primeiro processo do sistema (o seu número de processo é sempre igual a 1).
O kernel procura pelo init em alguns diretórios que vêm sendo usados historicamente para isso, porém a localização correta no
Linux é o /sbin/init. Caso o kernel não consiga encontrá-lo, ele executará o programa /bin/sh e caso isso também falhe, a inicialização do sistema é abortada.
Quando o init começa, o sistema finaliza o processo de inicialização ao executar uma série de tarefas administrativas, como a checagem dos sistemas de arquivos, limpeza do /tmp (inicia vários serviços e inicialização do getty para cada terminal e console virtual através dos quais os usuários serão autorizados a acessar o sistema).
Após o sistema ter sido adequadamente inicializado, o init reinicia o getty para cada terminal após a saída do usuário do sistema (permitindo que o próximo usuário possa acessar o sistema). Além disso, o init "adota" também todos os processos órfãos: quando um processo inicia um processo filho e é finalizado antes dele, imediatamente o processo restante torna-se filho do init. Isso é importante por várias razões técnicas, por isso é bom conhecer para entender as listas de processos e a árvore de processos.
Há poucas variantes disponíveis do init. Muitas distribuições do Unix usam o
sysvinit (escrito por Miquel Van Smoorenburg), o qual é baseado no init do System V. As versões BSD do UNIX tem um init diferente. A diferença reside nos níveis de execução: presentes no System V, mas não no BSD (pelo menos tradicionalmente). Essa diferença não é essencial e nós examinaremos somente o sysvinit.