Para que o `/ dev / console` é usado?

13

Desde esta resposta para Linux: Diferença entre / dev / console, / dev / tty e / dev / tty0

A partir da documentação :

/dev/tty      Current TTY device
/dev/console  System console
/dev/tty0     Current virtual console

Nos bons velhos tempos /dev/consoleera console do administrador do sistema. E os TTYs eram dispositivos seriais dos usuários conectados a um servidor. Agora /dev/consolee /dev/tty0represente a exibição atual e geralmente são os mesmos. Você pode substituí-lo, por exemplo, adicionando console=ttyS0a grub.conf. Depois que você /dev/tty0é um monitor e /dev/consoleé /dev/ttyS0.

Por " Console do sistema ", /dev/consoleparece o arquivo de dispositivo de um terminal físico de texto, assim como /dev/tty{1..63}os arquivos de dispositivo para os consoles virtuais.

Por " /dev/consolee /dev/tty0representa a exibição atual e geralmente são os mesmos", /dev/consoleparece-me que também pode ser o arquivo de dispositivo de um console virtual. /dev/consoleparece mais do /dev/tty0que gosta /dev/tty{1..63}( /dev/tty0é o console virtual atualmente ativo e pode ser qualquer um /dev/tty{1..63}).

O que é /dev/console? Para que isso é usado?

Desempenha /dev/consoleo mesmo papel no kernel do Linux que /dev/ttyem um processo? ( /dev/ttyé o terminal de controle da sessão do processo e pode ser um pts, /dev/ttynonde né de 1 a 63 ou mais?)

A outra resposta menciona:

A documentação do kernel especifica /dev/consolecomo um dispositivo de caractere numerado 5: 1. A abertura desse dispositivo de caractere abre o console "principal", que é o último tty na lista de consoles.

"A lista de consoles" significa todos os console=itens na opção de inicialização ?

Por " /dev/consolecomo um dispositivo de caractere numerado 5: 1", significa que /dev/consoleé o arquivo do dispositivo de um terminal de texto físico, ou seja, um console do sistema? (Mas, novamente, a primeira resposta que citei acima diz que /dev/consolepode ser a mesma /dev/tty0que não é um terminal de texto físico, mas um console virtual)

Obrigado.

Tim
fonte
Eu criei algumas substituições para as páginas de manual que desapareceram anos atrás: jdebp.eu./Proposals/linux-kvt-manual-pages.html
JdeBP

Respostas:

18

/dev/consoleexiste principalmente para expor o console do kernel ao espaço do usuário. A documentação do kernel do Linux em dispositivos agora diz

O dispositivo do console,, /dev/consoleé o dispositivo para o qual as mensagens do sistema devem ser enviadas e em quais logins devem ser permitidos no modo de usuário único. A partir do Linux 2.1.71, /dev/consoleé gerenciado pelo kernel; para versões anteriores, deve ser um link simbólico para /dev/tty0um console virtual específico, como /dev/tty1um dispositivo primário ( tty*, não cu*) da porta serial , dependendo da configuração do sistema.

/dev/console, o nó do dispositivo com 5 principais e 1 menor, fornece acesso a qualquer que seja o núcleo que considere ser seu principal meio de interagir com o administrador do sistema; pode ser um console físico conectado ao sistema (com a abstração do console virtual na parte superior, para que ele possa usar tty0ou qualquer local ttyNonde N esteja entre 1 e 63), ou um console serial, ou um console hipervisor ou até um dispositivo Braille. Observe que o próprio kernel não usa /dev/console: os nós dos dispositivos são para o espaço do usuário, não para o kernel; no entanto, verifica se /dev/consoleexiste e é utilizável e configura initcom sua entrada, saída e erro padrão apontando para /dev/console.

Conforme descrito aqui, /dev/consoleé um dispositivo de caractere com um maior e um menor fixos, porque é um dispositivo separado (como um meio de acessar o kernel; não um dispositivo físico), não equivalente a /dev/tty0nenhum outro dispositivo. Isso é um pouco semelhante à situação em/dev/tty que é seu próprio dispositivo (5: 0) porque fornece recursos ligeiramente diferentes dos outros dispositivos de console ou terminal virtual.

A "lista de consoles" é realmente a lista de consoles definidos pelos console=parâmetros de inicialização (ou pelo console padrão, se não houver nenhum). Você pode ver os consoles definidos dessa maneira, olhando /proc/consoles. /dev/consolerealmente fornece acesso ao último destes :

Você pode especificar várias opções console = na linha de comando do kernel. A saída será exibida em todos eles. O último dispositivo será usado quando você abrir /dev/console.

Stephen Kitt
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
terdon
6

"O que é isso /dev/console?" é respondido na resposta anterior . Talvez essa resposta seja mais clara quando você souber as respostas para as outras duas perguntas.

Q1 "Qual é o arquivo do dispositivo que representa o próprio terminal físico?"

Não existe esse arquivo de dispositivo.

Q2 "Para que é /dev/consoleusado?"

No Linux, /dev/consoleé usado para mostrar mensagens durante a inicialização (e o desligamento). Também é usado para o "modo monousuário", como apontado na resposta de Stephen Kitt. Não há muito mais para fazer sentido usá-lo.

"Nos bons velhos tempos" do Unix, /dev/consoleera um dispositivo físico dedicado. Mas este não é o caso no Linux.

Evidência relacionada

1. "Qual é o arquivo do dispositivo que representa o próprio terminal físico?"

Deixe-me tentar entender dessa maneira. /dev/tty{1..63}e /dev/pts/nsão arquivos de dispositivos representando os próprios dispositivos (embora sejam emulações), não em relação ao processo ou ao kernel. /dev/tty0representa aquele em /dev/tty{1..63}que atualmente é usado por algo (talvez o kernelou processo de shell?). /dev/ttyrepresenta o terminal de controle atualmente usado por uma sessão de processo. /dev/consolerepresenta o terminal atualmente usado pelo kernel?

Qual é o arquivo do dispositivo que representa o próprio terminal físico, não em relação ao kernel ou processo?

O (s) dispositivo (s) subjacente (s) para /dev/tty{1..63}são struct con_driver. Para ver todos os drivers possíveis, consulte https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console

Não há arquivo de dispositivo para esses dispositivos subjacentes!


Existe apenas uma interface de espaço de usuário mínima para gerenciá-los.

$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device

==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device

Se você realmente quer saber mais, o (M)módulo significa . Ou seja, o dispositivo do console fictício não é fornecido por um módulo do kernel carregável; faz parte da imagem inicial do kernel (aka "builtin").

Em segundo lugar, o bindarquivo em cada subdiretório de /sys/class/vtconsoleaparece para informar qual dispositivo vtconsole está ativo. Se eu escrevo 0no ativo, ele parece mudar para o falso. (VTs da GUI parecem inalterados, mas os VTs de texto param de funcionar). Escrever 1para o manequim não o ativa. Qualquer um dos métodos funciona para voltar ao real. Se eu li o código corretamente, o truque é que ele echo 1 > binddeve funcionar apenas para drivers de console que são construídos como um módulo (?!).

Para consoles framebuffer especificamente, há mais informações sobre como vincular diferentes dispositivos framebuffer ( /dev/fb0...) a consoles virtuais específicos em https://kernel.org/doc/Documentation/fb/fbcon.txt . Isso envolve uma opção de kernel fbcon:map=ou um comando chamado con2fbmap.

É claro que os detalhes podem variar de acordo com as diferentes versões do kernel, arquiteturas, firmwares, dispositivos, drivers, etc. Nunca tive que usar nenhuma das interfaces acima. O kernel apenas deixa i915/ inteldrmfb/ como você quiser chamá-lo quando ele é carregado, substituindo, por exemplo vgacon.

Parece que minha máquina EFI nunca foi vgacon. Então, primeiro, ele usa um console fictício e, em seguida, após 1,2 segundos, ele muda para fbcon, rodando em cima de efifb. Mas até agora não precisei me importar com os detalhes; simplesmente funciona.

$ dmesg | grep -C2 [Cc]onsole
[    0.230822] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.233164] NR_IRQS: 65792, nr_irqs: 728, preallocated irqs: 16
[    0.233346] Console: colour dummy device 80x25
[    0.233571] console [tty0] enabled
[    0.233585] ACPI: Core revision 20180810
[    0.233838] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484882848 ns
--
[    1.228393] efifb: scrolling: redraw
[    1.228396] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
[    1.230393] Console: switching to colour frame buffer device 170x48
[    1.232090] fb0: EFI VGA frame buffer device
[    1.232110] intel_idle: MWAIT substates: 0x11142120
--
[    3.595838] checking generic (e0000000 408000) vs hw (e0000000 10000000)
[    3.595839] fb: switching to inteldrmfb from EFI VGA
[    3.596577] Console: switching to colour dummy device 80x25
[    3.596681] [drm] Replacing VGA console driver
[    3.597159] [drm] ACPI BIOS requests an excessive sleep of 20000 ms, using 1500 ms instead
[    3.599830] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
--
[    3.657050] e1000e 0000:00:19.0 eth0: MAC: 11, PHY: 12, PBA No: FFFFFF-0FF
[    3.657869] e1000e 0000:00:19.0 eno1: renamed from eth0
[    4.711453] Console: switching to colour frame buffer device 170x48
[    4.734356] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
[    4.778813] Loading iSCSI transport class v2.0-870.

2. "Para que é /dev/consoleutilizado?"

Você pode usar / dev / console como um dispositivo TTY. Escrever nele, por exemplo, gravará em um dispositivo subjacente específico, que também terá um número de dispositivo de caractere próprio.

Freqüentemente / dev / console está vinculado a / dev / tty0, mas às vezes pode estar vinculado a um dispositivo diferente.

Portanto, neste caso, escrever para / dev / console escreverá para / dev / tty0. Por sua vez, gravar em / dev / tty0 equivale a gravar em qualquer dispositivo / dev / ttyN atualmente ativo.

Mas isso levanta uma questão interessante. O acesso tty0acessará diferentes consoles virtuais, dependendo de qual está ativo no momento. Para que as pessoas realmente usam tty0e da mesma forma que são consoleusadas no Linux?

  1. Tecnicamente, você pode ler e gravar em console/ tty0, por exemplo, executando a gettypara permitir o login tty0. Mas isso é útil apenas como um hack rápido. Porque isso significa que você não pode tirar proveito dos vários consoles virtuais do Linux.

  2. systemdprocura sysfsum atributo associado ao dispositivo / dev / console, para detectar o dispositivo TTY subjacente. Isso permite systemdgerar automaticamente um gettye permitir o login, por exemplo, em um console serial, quando o usuário configura um console do kernel, inicializando com console=ttyS0. Isso é conveniente; evita a necessidade de configurar esse console em dois lugares diferentes. Mais uma vez, veja man systemd-getty-generator. No entanto, systemdnão é realmente aberto /dev/consolepara isso.

  3. Durante a inicialização do sistema, talvez você nem tenha o sysfs montado ainda. Mas você deseja poder mostrar mensagens de erro e progresso o mais rápido possível! Então, circulamos para o ponto 1). O kernel inicia o PID 1 com stdin / stdout / stderr conectado /dev/console. É muito bom ter esse mecanismo simples configurado desde o início.

  4. Dentro de um contêiner Linux, o arquivo em /dev/consolepode ser criado como algo diferente - não o número do dispositivo do caractere 5:1. Em vez disso, ele pode ser criado como um arquivo de dispositivo PTS. Então, faria sentido fazer logon nesse /dev/consolearquivo. systemddentro de um contêiner permitirá o login em um dispositivo desse tipo; veja man systemd-getty-generator.

    Este mecanismo é usado quando você executa um contêiner com o systemd-nspawncomando (Acho que apenas quando você executa systemd-nspawnum TTY, embora não seja possível pesquisar na página de manual).

    systemd-nspawncria o contêiner /dev/consolecomo uma montagem de ligação de um dispositivo PTS a partir do host. Isso significa que este dispositivo PTS não é visível /dev/pts/dentro do contêiner.

    Os dispositivos PTS são locais para uma devptsmontagem específica . Os dispositivos PTS são uma exceção à regra normal, que os dispositivos são identificados pelo seu número de dispositivo. Os dispositivos PTS são identificados pela combinação do número do dispositivo e da devptsmontagem.

  5. Você pode gravar mensagens urgentes em console/ tty0, para gravar no console virtual atual do usuário. Isso pode ser útil para mensagens de erro urgentes no espaço do usuário, semelhantes às mensagens urgentes do kernel que são impressas no console (consulte man dmesg). No entanto, não é comum fazer isso, pelo menos uma vez que o sistema tenha finalizado a inicialização.

    O rsyslog possui um exemplo nesta página , que imprime mensagens do kernel para /dev/console; isso não faz sentido no Linux, porque o kernel já o fará por padrão. Um exemplo que não consigo encontrar novamente diz que não é uma boa ideia usá-lo para mensagens que não são do kernel, porque há muitas mensagens syslog, você inunda seu console e isso atrapalha demais.

    O systemd-journald também possui opções para encaminhar todos os logs para o console. Em princípio, isso pode ser útil para depuração em um ambiente virtual. Embora, para depuração, geralmente encaminhamos para o /dev/kmsginvés. Isso os salva no buffer de log do kernel para que você possa lê-los com dmesg. Como as mensagens geradas pelo próprio kernel, essas mensagens podem ser exibidas no console, dependendo da configuração atual do kernel.

sourcejedi
fonte
Como complemento ao ponto 2, costumava ser comum (não apenas no Linux) executar xconsolepara acompanhar o que estava acontecendo ;-). (E para evitar que as mensagens sejam gravadas diretamente no buffer de quadros, por exemplo , nas estações SPARC).
Stephen Kitt
@StephenKitt quando usei o SUSE Linux pela primeira vez, acho que ele iniciou o xconsole ou o criou para que você possa iniciá-lo no menu principal da área de trabalho ou algo assim - não me lembro exatamente, mas já o vi :-).
sourcejedi
Deixe-me tentar entender dessa maneira. /dev/tty{1..63}e /dev/pts/nsão arquivos de dispositivos representando os próprios dispositivos (embora sejam emulações), não em relação ao processo ou ao kernel. /dev/tty0representa aquele em /dev/tty{1..63}que atualmente é usado por algo (talvez processo de kernel ou shell?). /dev/ttyrepresenta o terminal de controle atualmente usado por uma sessão de processo. /dev/consolerepresenta o terminal atualmente usado pelo kernel? Qual é o arquivo do dispositivo que representa o próprio terminal físico, não em relação ao kernel ou processo?
Tim
@Tim "/ dev / tty0 substitui o do /dev/tty{1..63} que atualmente é usado por algo (talvez processo de kernel ou shell?)" - kernel.
sourcejedi
Qual é o arquivo do dispositivo que representa o próprio terminal físico, não em relação ao kernel ou processo?
Tim