Leitor pergunta: Inicialização do Mac OS X - cadê os arquivos do init?

Augusto Campos em 22/02/2011

O Mac OS X, embora seja um UNIX, adota um sistema de configuração da inicialização bem diferente dos modelos clássicos BSD e SysV.

O leitor Tiago encaminhou a seguinte dúvida:

Augusto, você usa muito o terminal para fazer certas coisas. Você já conseguiu achar quais são os arquivos que definem o que é "levantado" no boot e qual arquivo contém as configurações de rede? Tentei usar a mesma fórmula do linux (/etc) mas não tive sucesso!! :(

A dúvida é comum, e eu também passei por ela na primeira vez que precisei fazer algo fora do padrão - no meu caso, fazer o sshd passar a operar em uma porta diferente da que ele usa por default, que é a 22.

Versões antigas do Mac OS X usavam o init padrão BSD (com o qual usuários do Slackware são bem familiarizados também), conduzido por scripts como o /etc/rc.boot.

Mas isso mudou, e as versões atuais do sistema usam o launchd como sucessor do initd (e do crond, atd, inetd e mais).

O launchd também é open source (licença Apache), mas seu modelo de configuração é radicalmente diferente dos inits do BSD e do SysV (o mais comum hoje em distribuições de Linux): a configuração do launchd, assim como a de vários outros subsistemas do Mac OS X, é feita via property lists (arquivos com a extensão plist).

Não é nada parecido com a definição na forma de scripts shell e seus arquivos de parâmetros comuns no Linux, mas a sintaxe também não é muito complicada, embora exija alguma adaptação de quem já domina o modelo tradicional e migra para o launchd.

No diretório /System/Library/LaunchDaemons você encontra as plists de vários dos serviços TCP comuns. São arquivos-texto, dê uma olhada em algum deles (como o ssh.plist) e você terá uma ideia melhor de como funciona.

Vale mencionar que o launchd é um modelo que busca a consistência - para fazer o servidor SSH passar a "ouvir" outra porta, por exemplo, o correto é mencionar no ssh.plist o nome do serviço correspondente à porta desejada (que consta no /etc/services), e não simplesmente informar o número da porta (veja um exemplo).

Mas o launchd faz bem mais do que substituir o init. Veja neste artigo do macgeekery como usá-lo para definir ações que reagem a alterações em um arquivo ou diretório, por exemplo.

Para saber mais, use man launchd e man launchctl

Comentar

Comentários arquivados

Comentário de Tiago em 25/02/2011 às 11:36:10

Sim, é pertinente. O Ubuntu tentou utilizar o mesmo sistema da Apple, mas desistiu porque ele era Licenciado numa tal de Apple alguma coisa. Era software livre, mas à lá Apple. Devido a esse fato, a Canonical desistiu da Tecnologia. Hoje a Apple modificou a licença e a tecnologia agora é sob a licença Apache. Com isso a Apple deseja facilitar o uso da tecnologia por outras pessoas, inclusive o Linux. Ou seja, não foi uma questão técnica. Foi uma questão jurídica. Eu penso assim: se um produto é sinônimo de algo, e alguma coisa é bom para esse produto, então deve ser bom para outros. Exemplificando: se câmbio automatizado (tipo iMotion ou dual logic) é bom para Lamborghini deve ser bom para o Gol. Se o sistema de iniciação é bom para o Mac, deve ser bom para o Linux. Isso porque a Apple se preocupa numa série de detalhes que o Linux ignora solenemente.

Comentário de Henrique em 03/03/2011 às 11:51:52

Em /Library/StartupItems/ pode-se usar scripts personalizados para rodar rotinas/daemons na inicialização do sistema. Aprendi quando instalei o Wireshark pela primeira vez, no ReadMe (ChmodBPF).

Comentário de Ricardo em 22/02/2011 às 16:49:36

Muito bom... É uma coisa que eu ainda não precisei, mas é sempre bom saber.

Comentário de Tiago em 23/02/2011 às 10:20:33

Muitíssimo obrigado, Augusto. Valeu mesmo.

Comentário de Ricardo Carvalho em 23/02/2011 às 11:48:46

Não sei se é um bom comentário, mas o Ubuntu durante um tempo considerou usar o launchd na distribuição, depois de algum tempo acharam o sistema meio incoveninente (e é em alguns pontos) e optaram por desenvolver algo do zero, o upstart.