getty / mingetty login automático 16.04

0

Eu tenho um nfsroot criado a partir de 14.04 que estou reconstruindo usando 16.04. Meu nfsroot é compartilhado por três sistemas chamados pc1, pc2 e pc3. Existem 3 contas de usuário correspondentes chamadas pc1, pc2 e pc3 também.

Quando esses sistemas são inicializados, eles automaticamente efetuam login e, subsequentemente, executam um script de login bash.

Em 14.04 eu substituí o mingetty no meu arquivo tty1.conf upstart da seguinte forma:

# tty1 - getty
#
# This service maintains a getty on tty1 from the point the system is
# started until it is shut down again.

start on stopped rc RUNLEVEL=[2345] and (
        not-container or
        container CONTAINER=lxc or
        container CONTAINER=lxc-libvirt)

stop on runlevel [!2345]

respawn
#exec /sbin/getty -8 38400 tty1
script
    exec /sbin/mingetty --autologin 'cat /proc/sys/kernel/hostname' --noclear tty1
end script

Isso funcionou muito bem em 14.04 para os meus propósitos. Ele pega o nome do host de / proc e usa isso como o nome de login.

O que estou tentando fazer é replicar o mesmo comportamento em 16.04, mas agora usando o systemd.Para fazer isso, modifiquei /etc/systemd/system/getty.target.wants. Especificamente eu mudei o ExecStart:

ExecStart=-/sbin/agetty -a $HOSTNAME --noclear %I $TERM

No entanto, ao ler os documentos do systemd e usar algum google-fu, aprendi que não posso usar backticks ou substituição de variáveis de ambiente na linha ExecStart. Eu testei hard coding em uma conta de usuário e ela funciona corretamente, mas não consigo descobrir como fazer a mesma coisa que estava fazendo anteriormente com o updart no systemd.

Eu também tentei usar um script pequeno para essa finalidade, alterando a linha ExecStart para:

ExecStart=/bin/sh -c "/usr/bin/autogetty.sh"

O script autogetty.sh é um script simples que permite obter o nome do host e alimentá-lo para a mingetty. No entanto, não parece funcionar. Eu acho que o problema pode ser que, para o serviço, o tipo está ocioso e da minha pesquisa on-line precisa ser garfo. Eu ainda tenho que tentar modificar o tipo de serviço ainda.

Eu gostaria de saber o "caminho certo" para fazer isso. Até agora eu estou apenas tentando fazer as coisas funcionarem, e mesmo que eu faça funcionar, não tenho certeza se é a melhor maneira de fazer isso.

Obrigado.

    
por SimonSays 11.05.2016 / 10:19

1 resposta

0

Idéias erradas e erros

% bl0ck_qu0te%

Você aprendeu uma mentira. O doco não diz isso de fato. Você pode usar a substituição de variáveis de ambiente (com uma sintaxe que é sutilmente diferente da maioria dos shells Unix). É simplesmente o caso que não há variável de ambiente HOSTNAME para substituir . Os processos de serviço não são gerados com essa configuração de variável de ambiente.

Os arquivos da unidade são parametrizáveis, e o parâmetro %H se expande para o nome do host (dinâmico), como era no ponto no passado em que a unidade foi carregada do arquivo.

% bl0ck_qu0te%

Bom. Não. Essa é a coisa errada a fazer. Apenas altere o protocolo de notificação de prontidão para forking se o seu serviço realmente implementar esse protocolo. Não faça isso como um kludge porque você erroneamente fez um programa que se bifurca sem uma boa razão.

Porque é exatamente isso que você fez. O /bin/sh desnecessário está forçando um filho a executar autogetty.sh , que acaba sendo um segundo processo de shell executando esse script de shell. O segundo processo de shell é então forking para executar mingetty como neto. Isso não corresponde ao protocolo de prontidão de bifurcação, pois depende do fork seguido por exit no pai .

Leve uma lição do mundo dos daemontools: Os serviços são executados, não gerados. O programa que você executa como ExecStart deve ser o processo de serviço, não algo que gera o processo de serviço.

O caminho certo

O jeito certo de configurar isso é:

  • Substitua uma instância específica do modelo, para o dispositivo de terminal específico, não para o modelo inteiro.
  • Use %H para obter o nome do host em ExecStart . Ou use %m e a ID da máquina como nomes de sua conta de usuário.
  • Invoque as coisas corretamente:
    • Basta executar agetty diretamente para obter melhores resultados. Você não precisa realmente de nenhum script para a tarefa como descrito em tudo.
    • Se você, no entanto, optar por inserir um script wrapper supérfluo:
      • Não use /bin/sh -c scriptfile . Basta criar scriptfile executável, com um interpretador de scripts especificado corretamente e executá-lo diretamente.
      • Certifique-se de que seu script use exec para se tornar o processo getty do daemon.

Leitura adicional

por JdeBP 18.05.2016 / 16:36