A seqüência de inicialização do linux / unix tem muitos estágios, e há muitas referências e respostas neste site que explicam os detalhes. Mas para resumir;
Eventualmente, o kernel é carregado com drivers para que o disco e os dispositivos possam ser usados, e então inicia o processo com um pid
(id do processo) de 1.
Tradicionalmente, este programa era um programa chamado init
, mas hoje existem vários programas mais recentes ( systemd
ou upstart
). Depende da sua distribuição e versão, qual deles é usado.
Iniciar é um processo em camadas.
Existe um conceito de escalonamento dos níveis de execução (1,2,3,4,5,6 ...) e o programa de inicialização alternará entre esses níveis automaticamente ou em estágios (para que o usuário possa obter controle).
- sendo a etapa inicial (modo de usuário único),
- modo multiusuário,
- multi usuário com rede
- modo GUI ...
- .. 6., ...
Estes níveis de execução não são fixos em pedra, eles dependem da distribuição e do programa de inicialização sendo usados (init, systemd, ...) e convenção.
Os níveis também dependem de como o padrão de start-up / shutdown escalonado foi projetado. (pense, o linux é usado em roteadores, telefones android, servidores e desktops, todos com requisitos diferentes).
Para transgredir de um nível de execução para outro, vários outros programas (serviços), como ligação (para DNS), rede, roteamento, servidores da web, ... são iniciados ou interrompidos, e bash
pode ser usado para executar um script específico que inicia ou interrompe um serviço.
Eventualmente, você precisa fazer o login, seja em um console ou em uma interface gráfica, e você pode solicitar seu nome de usuário e senha.
Vamos pegar uma rota simples e dizer que você está em um console não gráfico, e o programa login
está solicitando sua autenticação. Quando você passar, ele irá ler qual shell está configurado para o nome de usuário digitado em /etc/passwd
e iniciá-lo, com entrada e saída definidas para o seu console e então você tem o prompt e pode começar a fazer o seu trabalho. Então, neste cenário,
init starts -> login which starts -> bash
Assim, todo processo é filho do primeiro processo (pode ser mais preciso dizer que todo processo tem o pid 1 como ancestral). No exemplo acima, login
irá exec
do shell, substituindo o processo de login pelo bash, o id do processo não é alterado. Quando você olha com ps
, parece que o bash foi iniciado pelo init porque seu pai pid é 1, mas havia uma cadeia de eventos.
Não há nada que esteja realmente impedindo pid 1
de começar o bash no console (se o pid 1 puder descobrir o que o console está nesse ponto) e isso se resume a como a sequência de inicialização foi projetada. (Eu tive que fazer isso uma vez, mas não é uma prática normal).