O que é necessário para uma inicialização mínima do systemd iniciar o getty em um console virtual?

21

Para SysV init, eu preciso /etc/inittabrespawning entradas getty, o /sbin/initbinário, os binários e bibliotecas compartilhadas para o shell, login, o getty, o / segurança / stuff sombra PAM, e alguns arquivos de dispositivos.

Pois upstartpreciso dos mesmos requisitos, mas em vez de /etc/inittab, tenho alguns *.confarquivos em /etc/init: um * .conf com o start on startupqual define um nível de execução telinite um * .conf para cada tty que inicia / reaparece gettynesse tty nos níveis de execução apropriados .

De que configuração e binários eu preciso systemd init?

A documentação que encontro parece focada em como usar um sistema já instalado para iniciar e interromper serviços.

Uma lista mínima de arquivos para copiar (exceto o kernel / initrd) de uma instalação do Arch ou do fedora em execução seria adequada, mas não consigo encontrar esse tipo de informação systemd.


O que eu gostaria de saber é, pois systemd, quais arquivos são necessários e o que eles devem conter para iniciar um shell de login depois que um initramfs faz sua switch_rootchamada para o systemd /sbin/init.


Exemplo para upstartos binários e dois *.confarquivos:

Arquivo /etc/init/whatever.conf:

iniciar na inicialização
emite nível de execução
tarefa
roteiro
  telinit 2
script final

Arquivo /etc/init/tty1.conf:

iniciar no nível de execução [12345]
reaparecimento
exec / sbin / agetty -8 --noclear 38400 tty1 linux

Exemplo para sysvinitos binários e 1 arquivo conf chamado /etc/inittab:

id: 2: initdefault:
c1: 12345: respawn: / sbin / agetty 38400 tty1 linux

Agora estou atrás do systemdequivalente.

Presumo que pelo menos 1 *.servicearquivo seja necessário em algum lugar, com uma [Service]entrada contendo ExecStart=-/sbin/agetty --noclear %I linuxe Restart=always, mas o que mais é necessário?

MattBianco
fonte
Agora, há um artigo recente da base de conhecimento RedHat (754933) descrevendo a inicialização do systemd neste URL: Visão geral do systemd para RHEL 7
MattBianco
É tão deprimente ver como as pessoas explodem uma única linha de configuração em uma grande confusão e chamam isso de melhoria.
ceving 20/05/19

Respostas:

17

Primeiro de tudo, systemdnão é um unix tradicional init. Systemd é muito mais, por isso é um pouco injusto comparar os dois.

Para responder à pergunta, o que parece ser necessário são alguns binários e os seguintes arquivos de configuração:

/usr/lib/systemd/system/default.target
/usr/lib/systemd/system/basic.target
/usr/lib/systemd/system/sysinit.target
/usr/lib/systemd/system/getty.target
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/console-getty.service

emissão systemctl enable console-getty.service [email protected] cria esses links simbólicos:

/etc/systemd/system/default.target.wants/[email protected] -> / lib / systemd / system / getty @ service
/etc/systemd/system/getty.target.wants/console-getty.service -> /lib/systemd/system/console-getty.service

NOTA : Para utilizar systemdos recursos especiais para iniciar agettydinamicamente, sob demanda ao pressionar Alt+ F3e assim por diante, parece que você também deve ter pelo menos esses dois arquivos:

/etc/systemd/logind.conf
/lib/systemd/system/[email protected]

para onde [email protected]está um link simbólico [email protected].

Conteúdo dos arquivos de configuração:

A default.target, getty.target, sysinit.targetos arquivos podem estar vazios, exceto para o [Unit]tag e (provavelmente) Description=xxx.

basic.target também contém informações de dependência:

[Unidade]
Descrição = Sistema Básico
Requer = sysinit.target
Quer = sockets.target timers.target paths.target slice.target
Depois = sysinit.target sockets.target timers.target paths.target slice.target

Não tenho certeza se as referências a destinos que não existem como arquivos são necessárias ou não. Eles são descritos na systemd.special(7)página de manual.


console-getty.service: (Caso especial para agetty no console)

[Unidade]
Descrição = Console Getty
Depois = systemd-user-sessions.service plymouth-quit-wait.service
Antes = getty.target

[Serviço]
ExecStart = - / sbin / agetty --noclear - console de manutenção / manutenção 115200,38400,9600 $ TERM
Tipo = inativo
Reiniciar = sempre
RestartSec = 0
UtmpIdentifier = contras
TTYPath = / dev / console
TTYReset = yes
TTYVHangup = yes
KillMode = processo
IgnoreSIGPIPE = no
SendSIGHUP = yes

[Instalar]
WantedBy = getty.target

[email protected]: (configuração genérica para todos os serviços getty, exceto o console)

[Unidade]
Descrição = Getty em% I
Depois = systemd-user-sessions.service plymouth-quit-wait.service
Antes = getty.target
IgnoreOnIsolate = yes
ConditionPathExists = / dev / tty0

[Serviço]
ExecStart = - / sbin / agetty --noclear% I $ TERM
Tipo = inativo
Reiniciar = sempre
RestartSec = 0
UtmpIdentifier =% I
TTYPath = / dev /% I
TTYReset = yes
TTYVHangup = yes
TTYVTDisallocate = no
KillMode = processo
IgnoreSIGPIPE = no
SendSIGHUP = yes

[Instalar]
WantedBy = getty.target
DefaultInstance = tty1

Finalmente, você provavelmente precisará de alguns desses binários especiais (não tentei quais são cruciais):

/ lib / systemd / systemd (/ sbin / init geralmente aponta para isso)
/ lib / systemd / systemd-logind
/ lib / systemd / systemd-cgroups-agent
/ lib / systemd / systemd-user-sessions
/ lib / systemd / systemd-vconsole-setup
/ lib / systemd / systemd-update-utmp
/ lib / systemd / systemd-sleep
/ lib / systemd / systemd-sysctl
/ lib / systemd / systemd-initctl
/ lib / systemd / systemd-reply-password
/ lib / systemd / systemd-ac-power
/ lib / systemd / systemd-activar
/ lib / systemd / systemd-backlight
/ lib / systemd / systemd-binfmt
/ lib / systemd / systemd-bootchart
/ lib / systemd / systemd-bus-proxyd
/ lib / systemd / systemd-coredump
/ lib / systemd / systemd-cryptsetup
/ lib / systemd / systemd-fsck
/ lib / systemd / systemd-hostnamed
/ lib / systemd / systemd-journald
/ lib / systemd / systemd-journal-gatewayd
/ lib / systemd / systemd-journal-remote
/ lib / systemd / systemd-localed
/ lib / systemd / systemd-usinado
/ lib / systemd / systemd-modules-load
/ lib / systemd / systemd-multi-lugar-x
/ lib / systemd / systemd-networkd
/ lib / systemd / systemd-networkd-wait-online
/ lib / systemd / systemd-quotacheck
/ lib / systemd / systemd-random-seed
/ lib / systemd / systemd-readahead
/ lib / systemd / systemd-remount-fs
/ lib / systemd / systemd-resolved
/ lib / systemd / systemd-rfkill
/ lib / systemd / systemd-shutdown
/ lib / systemd / systemd-shutdownd
/ lib / systemd / systemd-socket-proxyd
/ lib / systemd / systemd-timedated
/ lib / systemd / systemd-timesyncd
/ lib / systemd / systemd-udevd
/ lib / systemd / systemd-update-done

Para resumir o processo de inicialização do systemd, acho que funciona algo como isto:

  1. systemd localiza basic.target(ou todos os *.targetarquivos?)
  2. dependências são resolvidas com base em WantedBy=, Wants=, Before=, After=... directivas na [Install]secção dos *.servicee *.targetarquivos de configuração.
  3. *.services que devem iniciar (que não são serviços "especiais"), possuem uma [Service]seção com uma ExecStart=diretiva que indica o executável para iniciar.
MattBianco
fonte
11
AFAIK a [Install]seção não é usada pela sequência de inicialização, apenas por systemctl enable. O que a inicialização analisa são os links simbólicos /etc/systemd/system/basic.target.wants/criados por systemctl enable.
Stefan Majewsky
6

systemdcria automaticamente um getty quando você alterna para os terminais, até um determinado número máximo. O padrão é 6 (para que você obtenha automaticamente um getty para alt + f1 a alt + f6). Se você deseja alterar este parâmetro, você pode editar /etc/systemd/logind.confpara alterar o NAutoVTsparâmetro para outro número (máx. 12)

Se você quer um getty para desovar mesmo se você não mudar manualmente você pode adicionar um link simbólico para /usr/lib/systemd/system/[email protected]o /etc/systemd/system/getty.target.wants/diretório:

ln -sf /usr/lib/systemd/system/[email protected] /etc/systemd/system/getty.target.wants/[email protected]

isso resultará na getty.targetnecessidade de mais um getty@serviço. Um destino é uma coleção de serviços que precisam ser gerados, a substituição de níveis de execução que suporta dependências. O destino padrão depende degetty.target

Veja em systemd FAQ no ArchWiki

edit: pesquisei um pouco mais na documentação .

Na inicialização, o systemddaemon carrega todos os sistemas no defaultdestino e suas dependências. Um destino é definido pelos arquivos

/etc/systemd/system/default.target
/usr/lib/systemd/system/default.target

Um destino possui uma lista de serviços anexados especificados por links simbólicos nos diretórios

/etc/systemd/system/default.target.wants
/usr/lib/systemd/system/default.target.wants

A /etcversão substitui os padrões de distribuição em /usr/lib. Apenas um dos .targetarquivos é necessário, enquanto nenhum diretório é necessário

gettyé apenas um dos serviços entre outros que podem ser executados por scripts init. Na distribuição que verifiquei (fedora, arch), gettyé executado de duas maneiras diferentes:

  1. Iniciado por scripts específicos para cada terminal (links para o /usr/lib/systemd/system/[email protected]arquivo no qual o nome tty é substituído pelo systemdnome do arquivo do link )
  2. Criado automaticamente, conforme necessário, logindquando o usuário alterna para um terminal virtual (semelhante à maneira como o antigo inetdtrouxe os serviços somente quando chega uma solicitação). logindé um daemon diferente distribuído com systemde lê sua configuração no /etc/systemd/logind.confarquivo

Espero que isso seja satisfatório.

pqnet
fonte
Quero saber quais arquivos são necessários e o que eles devem conter. Você poderia resumir sua resposta com uma lista de arquivos necessários e o que faz com que sejam lidos em que ordem? Faltam informações sobre o que precisa ser encontrado nesse diretório. Vou tentar elaborar um pouco minha pergunta. Obrigado!
precisa saber é o seguinte
@ MattBianco você é desnecessariamente hostil systemd. Estou pesquisando um pouco sobre isso e parece bem direto, uma vez que você entende como as coisas funcionam
pqnet
11
Sim, sou mimado pela documentação de outros projetos de código aberto. Sinto muito por parecer hostil. É frustrante que não exista um documento simples explicando o processo de inicialização. (Entendo agora que é porque o systemd não é simples.) De uma maneira bem-humorada, gostaria de comentar que talvez systemdseja hostil, como na realização de uma invasão hostil da maneira como um sistema aberto é iniciado. Isso afasta o GNU / Linux do Unix. Não estou dizendo que isso é uma coisa ruim, mas é muito diferente de como as coisas têm sido tradicionalmente. E pesquisar um pouco indica que não estou sozinha.
precisa saber é o seguinte