Crie a definição de serviço.

Crie a definição de serviço.

Quero fazer o centos mostrar um tui (programa ncurses) após o boot e sem login. Não quero que o prompt de login seja exibido.

Funções do programa: configuração de rede, reinicialização, desligamento

Existe alguma maneira de conseguir isso?

Responder1

A resposta sistêmica de M. Dickey é um pouco vaga. Aqui estão os detalhes de um sistema operacional systemd.

O serviço que apresenta o prompt de login é uma instância do [email protected]modelo, [email protected]para o serviço de login, tty6por exemplo. Para substituir isso pelo seu próprio serviço em tal dispositivo terminal, você precisa fazer duas coisas.

Crie a definição de serviço.

Isso é bastante fácil:

# /etc/systemd/system/[e-mail protegido]

[Unidade]
Description=Interface de usuário personalizada em %I
Documentação=https://unix.stackexchange.com/a/318336/5132
Conflitos=getty@%I.service
Antes=getty.target

[Serviço]
ExecStart=/usr/local/sbin/my-custom-user-interface
Entrada Padrão=tty
Saída Padrão=tty
Reiniciar = sempre
ReiniciarSeg=1
UtmpIdentifier=%I
CaminhoTTY=/dev/%I
TTYRedefinir=sim
TTYVHangup = sim
TTYVTDisallocate = sim
EnviarSIGHUP=sim

[Instalar]
WantedBy = multiusuário.target

Isto é ummodelounidade de serviço, que será instanciada com o nome de um dispositivo terminal virtual do kernel como parâmetro de modelo.

Certifique-se de que seu serviço seja iniciado automaticamente no bootstrap.

Esta é a parte mais complexa.

Para começar, você precisa decidirqualdispositivo terminal virtual do kernel no qual ele será executado. Várias informações entram em jogo aqui:

  • No mundo Fedora, desde 2008, a interface gráfica do usuário usa o primeiro dispositivo terminal virtual do kernel, tty1. Você deve escolher entre não usar esse dispositivo terminal virtual e não usar (ou ajustar manualmente) a interface gráfica do usuário.
  • O logind do systemd tenta iniciar serviços de login sob demanda em terminais virtuais do kernel até o máximo definido NAutoVTsno logind.confarquivo de configuração. Isso ocorre tty1por tty6padrão.
  • Isso deixa tty7livre no mundo Fedora. Mas no mundo Debian, embora o Debian seja agora um sistema operacional systemd, a interface gráfica do usuário usa tty7. Você pode querer levar em consideração a portabilidade para o Debian.
  • O mundo systemd tenta fazer do terminal virtual do kernel nº 6 o prompt de login que está "sempre lá", aquele para o qual a memória muscular faz você pressionar Control+ Alt+ F6.

Digamos que você escolha tty5.

Você precisa impedir que o logind inicie sob demanda o [email protected], que é outro nome para [email protected], sempre que o usuário alternar para o terminal virtual do kernel nº 5. Você pode fazer isso diminuindo a NAutoVTsconfiguração logind.confde 6 para (digamos) 4.

Você precisa ter certeza de que seu serviço é iniciado automaticamente na inicialização do sistema, ou seja, que está "habilitado":

ativar systemctl[e-mail protegido]

Alternativas

Existem outras maneiras de fazer isso.

um serviço não padronizado

Em vez de [email protected]ter my-terminal-ui.servicee conectar o nome do dispositivo terminal na unidade, substituindo %Ipor (digamos) tty5.

Eu forneci isso como uma definição de modelo porque torna mais fácil fazer uma escolha diferente de tty5.

usando um dosautovt@ttyNem vez do seu próprio nome

Você pode decidir usar como nome da sua definição de serviço. Isso substituiria a instanciação do modelo./etc/systemd/system/[email protected][email protected]

A vantagem dessa abordagem é que você não precisa se preocupar em NAutoVTsativar o serviço e pode simplesmente deixar o logind para iniciar seu serviço sob demanda sempre que o usuário alternar para o terminal virtual do kernel nº 5.

A desvantagem é que o mecanismo de início de demanda foi projetadonão executar processos de loginem terminais virtuais do kernel não utilizados. Dessa forma, seu serviço não será executado na inicialização do sistema, mas será executado apenas na primeira vez que você ativar o terminal virtual nº 5 do kernel. Esta inicialização sob demanda pode não ser o que você deseja. Outras partes do seu sistema personalizado podem esperar que seu serviço sejajá correndodo bootstrap em diante, por exemplo.

editando umgetty@ttyN

Pessoas mergulhadas nas formas de fazer as coisas /etc/ttyse /etc/inittabveem a modificação [email protected]como a maneira de fazer as coisas. Eles executam comandos como

edição systemctl[e-mail protegido]

e adicione uma substituição que indique

[Serviço]
# Esta tarefa em branco não é um erro de impressão.
ExecStart=
ExecStart=/usr/local/sbin/my-custom-user-interface

Isto tem vários problemas.

Fazendo um serviçoque se chama gettynão executar um programa { a, min, f} gettynão é uma ideia extremamente sustentável. Daqui a alguns anos, quando você esquecer o que fez aqui, ou quando alguém vier assumir a administração de tal sistema, não será óbvio que os serviços "getty" nem sempre executam um gettyutilitário.

Não pense nisso [email protected]como um espaço paratudo o que é executado nesse terminal, para ser modificado conforme necessário. Essa não é realmente a maneira sistêmica de pensar sobre isso. [email protected]executa um programa "getty". Um serviço que executa um programa totalmente diferente que não executa nada parecido com um serviço "getty" deve ser uma definição de serviço separada por si só.

Além disso: uma definição de serviço separada permite não definir o serviço como algo parecido com um serviço "getty". A definição de serviço acima copia a maior parte do comportamento do serviço "getty", incluindotentando limpar sua tela(como o mundo quer que você faça). Mas você pode não querer, digamos, TTYReset=yesmexer utmpxem um serviço como o seu, que realmente não é um serviço de "login" e pode não querer que sua tela seja limpa de forma tão agressiva.

Além disso: É mais fácil alterar uma definição de serviço separada no futuro. Mudar de tty5(se isso não for satisfatório) para tty8é simples com o modelo acima mencionado. Apenas instancie-o tty8em vez de on tty5. É um pouco mais difícil desmarcar um conjunto de personalizações locais [email protected]e refazê-las em [email protected].

alias autovt@tty5paramy-terminal-ui@tty5

Esta é a progressão lógica da edição [email protected], como obviamente oautovt@ttyNapelidos são umo que quer que seja para ser iniciado aquimecanismo que permite substituir outras coisas porgetty@ttyN.

Mas sofre das mesmas desvantagens mencionadas acima do uso [email protected]direto do nome, pois se envolve nas tentativas do logind denão iniciar serviços de logino que pode não ser o que você deseja. Na verdade éo que quer que seja para serdemanda-começou aquipor login.

Leitura adicional

Responder2

Você pode fazer isso substituindo o programa de login usado gettypelo seu próprio programa. Por exemplo, na minha máquina Debian, as gettychamadas estão em /etc/inittab:

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

enquanto o Debian realmente usa agetty:

NAME   
       agetty - alternative Linux getty


SYNOPSIS
       agetty  [-8chiLmnsUw]  [-a  user]  [-f  issue_file] [-H login_host] [-I
       init] [-l login_program] [-t timeout] port baud_rate,...  [term]

e que pode invocar um programa diferente usando o-lopção:

   -l, --login-program login_program
          Invoke the specified login_program instead of /bin/login.   This
          allows the use of a non-standard login program (for example, one
          that asks for a dial-up password or that uses a different  pass‐
          word file).

Seu programa de propósito especial pode ser executado em cada "tty". Se você fizer isso, preste atenção para garantir que poderá fazer login diretamente na máquina para manutenção. Isso pode ser no modo de usuário único ou via ssh. As gettydefinições não se aplicam ao ssh.

Com o CentOS7, usando o systemd, as coisas são organizadas de forma diferente, mas o resultado final é o mesmo. Usando systemctl list-unit-files, o serviço relevante é [email protected]. Como qualquer outro serviço, este pode ser personalizado. Usando locatepara obter pistas:

/etc/selinux/targeted/modules/active/modules/getty.pp
/etc/systemd/system/getty.target.wants
/etc/systemd/system/getty.target.wants/[email protected]
/usr/lib/systemd/system/console-getty.service
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/getty.target
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/multi-user.target.wants/getty.target
/usr/lib/systemd/system-generators/systemd-getty-generator

Os arquivos /usr/lib/systemd/system/contêm as chamadas para agetty(que também possui uma página de manual no CentOS). Você pode modificá-los:

ExecStart=-/sbin/agetty --noclear --keep-baud pts/%I 115200,38400,9600 $TERM

O link simbólico /usr/lib/systemd/system/multi-user.target.wants/getty.targete seu destino getty.targetnão contêm chamadas para agetty.

CentOS6 está no meio: minha máquina tem mingettye não systemd. Na página do manual:

MINGETTY(8)                Linux Programmer's Manual               MINGETTY(8)


NAME   
       mingetty - minimal getty for consoles

SYNOPSIS
       mingetty  [--noclear] [--nonewline] [--noissue] [--nohangup] [--nohost-
       name]    [--long-hostname]     [--loginprog=/bin/login]     [--nice=10]
       [--delay=5]  [--chdir=/home]  [--chroot=/chroot] [--autologin username]
       [--loginpause] tty


DESCRIPTION
       mingetty is a minimal  getty  for  use  on  virtual  consoles.   Unlike
       agetty(8),  mingetty  is  not  suitable  for serial lines.  I recommend
       using mgetty(8) for this purpose.

Tipo agetty, pode ser personalizado:

   --loginprog /bin/login
          Change the login app.

Comece com seu arquivo de configuração:

# tty - getty
#
# This service maintains a getty on the specified device.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file tty.override and put your changes there.

stop on runlevel [S016]

respawn
instance $TTY
exec /sbin/mingetty $TTY
usage 'tty TTY=/dev/ttyX  - where X is console id'

Isso nos leva a buscar informações sobre tty.override, que segundo este

é um script que você fornece /etc/init/tty.override(mostra um exemplo de logon automático em tty1, no qual você pode ter uma ideia geral do que o script pode fazer). A $TTYvariável, aliás, está configurada /etc/init/start-ttys.conf(o initscriptspacote do qual faz parte não possui documentação detalhada).

Responder3

Então, depois de pesquisar no Google, encontrei duas soluções:

https://serverfault.com/questions/323289/replacing-tty-with-a-script-in-centos-6

e

https://www.centos.org/forums/viewtopic.php?t=2414

Finalmente cheguei ao seguinte:

1) Crie '/etc/init/launch.conf' com este conteúdo:

start on stopped rc RUNLEVEL=[2345]
stop on runlevel [S016]
respawn
console owner
exec /usr/bin/openvt -c 1 -w -f -- /usr/sbin/setup

Neste exemplo ele executa a ferramenta de configuração em modo texto

2) Edite '/etc/init/start-ttys.conf' para substituir o tty pelo lançamento:

start on stopped rc RUNLEVEL=[2345]

env ACTIVE_CONSOLES=/dev/tty[1-6]
env X_TTY=/dev/tty1
task
script
    . /etc/sysconfig/init
    for tty in $(echo $ACTIVE_CONSOLES) ; do
        [ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue
        #initctl start tty TTY=$tty
        initctl start launch TTY=$tty
    done
end script

Não sei se esta é a melhor solução, mas está funcionando e o programa de configuração é exibido após a inicialização.

informação relacionada