
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, tty6
por 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
NAutoVTs
nologind.conf
arquivo de configuração. Isso ocorretty1
portty6
padrão. - Isso deixa
tty7
livre no mundo Fedora. Mas no mundo Debian, embora o Debian seja agora um sistema operacional systemd, a interface gráfica do usuário usatty7
. 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 NAutoVTs
configuração logind.conf
de 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.service
e conectar o nome do dispositivo terminal na unidade, substituindo %I
por (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@tty
Nem 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 NAutoVTs
ativar 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@tty
N
Pessoas mergulhadas nas formas de fazer as coisas /etc/ttys
e /etc/inittab
veem 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
} getty
nã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 getty
utilitá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=yes
mexer utmpx
em 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 tty8
em 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@tty5
paramy-terminal-ui@tty5
Esta é a progressão lógica da edição [email protected]
, como obviamente oautovt@tty
Napelidos são umo que quer que seja para ser iniciado aquimecanismo que permite substituir outras coisas porgetty@tty
N.
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
- https://unix.stackexchange.com/a/194218/5132
- https://unix.stackexchange.com/a/233855/5132
- https://unix.stackexchange.com/a/236959/5132
- https://unix.stackexchange.com/a/316279/5132
- Jonathan de Boyne Pollard (2015).
/etc/inittab
é uma coisa do passado.. Respostas dadas com frequência.
Responder2
Você pode fazer isso substituindo o programa de login usado getty
pelo seu próprio programa. Por exemplo, na minha máquina Debian, as getty
chamadas 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-l
opçã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 getty
definiçõ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 locate
para 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.target
e seu destino getty.target
não contêm chamadas para agetty
.
CentOS6 está no meio: minha máquina tem mingetty
e 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 $TTY
variável, aliás, está configurada /etc/init/start-ttys.conf
(o initscripts
pacote 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.