Desta resposta para o Linux: Diferença entre /dev/console , /dev/tty e /dev/tty0
Da documentação :
/dev/tty Current TTY device /dev/console System console /dev/tty0 Current virtual console
Nos bons velhos tempos
/dev/console
era o console do administrador do sistema. E os TTYs eram dispositivos seriais dos usuários conectados a um servidor. Agora/dev/console
e/dev/tty0
representam a exibição atual e geralmente são os mesmos. Você pode substituí-lo, por exemplo, adicionandoconsole=ttyS0
agrub.conf
. Depois disso, você/dev/tty0
é um monitor e/dev/console
é/dev/ttyS0
.
Por " console do sistema ", /dev/console
parece o arquivo de dispositivo de um terminal físico de texto, assim como /dev/tty{1..63}
são os arquivos de dispositivo para os consoles virtuais.
Por " /dev/console
e /dev/tty0
representam a exibição atual e geralmente são iguais", /dev/console
me parece que também pode ser o arquivo do dispositivo de um console virtual. /dev/console
parece mais /dev/tty0
do que parecido /dev/tty{1..63}
( /dev/tty0
é o console virtual ativo no momento e pode ser qualquer um /dev/tty{1..63}
).
O que é /dev/console
? Para que isso é usado?
Desempenha /dev/console
o mesmo papel para o kernel do Linux e /dev/tty
para um processo? ( /dev/tty
é o terminal de controle do processo da sessão do processo, e pode ser um pts, /dev/ttyn
onde n
fica de 1 a 63, ou mais?)
A outra resposta menciona:
A documentação do kernel especifica
/dev/console
como um dispositivo de caractere numerado 5:1. Abrir este dispositivo de personagem abre o console "principal", que é o último tty na lista de consoles.
A "lista de consoles" significa todos os console=
's na opção de inicialização ?
Por " /dev/console
como um dispositivo de caractere numerado 5:1", isso significa que /dev/console
é o arquivo de 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/console
pode ser a mesma /dev/tty0
que não é um terminal de texto físico, mas um console virtual)
Obrigado.
/dev/console
existe principalmente para expor o console do kernel ao espaço do usuário. A documentação do kernel Linux em dispositivos agora diz/dev/console
, o nó do dispositivo com maior 5 e menor 1, fornece acesso a qualquer coisa que o kernel considere ser seu principal meio de interação com o administrador do sistema; este pode ser um console físico conectado ao sistema ( com a abstração do console virtual na parte superior, então ele pode usartty0
ou qualquer N está entre 1 e 63), ou um console serial, ou um console de hipervisor, ou mesmo um dispositivo Braille. Observe que o kernel em si não usa : devices nodes são para userspace, não para o kernel; ele, no entanto, verifica se existe e é utilizável e configura com sua entrada, saída e erro padrão apontando para .ttyN
/dev/console
/dev/console
init
/dev/console
Conforme descrito aqui,
/dev/console
é um dispositivo de caractere com maior e menor fixos porque é um dispositivo separado (como um meio de acessar o kernel; não um dispositivo físico), não equivalente a/dev/tty0
ou qualquer outro dispositivo. Isso é um pouco semelhante à situação com o/dev/tty
qual é seu próprio dispositivo (5:0) porque fornece recursos ligeiramente diferentes do outro console virtual ou dispositivos de terminal.A “lista de consoles” é de fato a lista de consoles definida pelos
console=
parâmetros de inicialização (ou o console padrão, se não houver nenhum). Você pode ver os consoles definidos dessa maneira olhando para/proc/consoles
./dev/console
de fato fornece acesso ao último destes :"O que é
/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 de dispositivo que representa o próprio terminal físico?"
Não existe tal arquivo de dispositivo.
Q2. "Para que
/dev/console
serve?"No Linux,
/dev/console
é usado para mostrar mensagens durante a inicialização (e desligamento). Também é usado para "modo de usuário único", conforme apontado na resposta de Stephen Kitt. Não há muito mais que faça sentido usá-lo."Nos bons velhos tempos" do Unix,
/dev/console
era um dispositivo físico dedicado. Mas este não é o caso do Linux.Evidência relacionada
1. "Qual é o arquivo de dispositivo que representa o próprio terminal físico?"
O(s) dispositivo(s) subjacente(s) para
/dev/tty{1..63}
sãostruct con_driver
. Para ver todos os drivers possíveis, confira https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_consoleNão há arquivo de dispositivo para esses dispositivos subjacentes!
Há apenas uma interface de espaço de usuário mínima para gerenciá-los.
Se você realmente quer saber mais, o
(M)
significa módulo . Ou seja, o dispositivo de console fictício não é fornecido por um módulo de kernel carregável; é parte da imagem inicial do kernel (também conhecida como "builtin").Em segundo lugar, o
bind
arquivo em cada subdiretório de/sys/class/vtconsole
aparece para informar qual dispositivo vtconsole está ativo. Se eu escrever0
para o ativo, ele parece mudar para o fictício. (Os VTs da GUI parecem não ser afetados, mas os VTs de texto param de funcionar). Escrever1
para o fictício não o ativa. Qualquer um dos métodos funciona para voltar ao real. Se eu ler o código corretamente, o truque é queecho 1 > bind
só deve funcionar para drivers de console que são construídos como um módulo (?!).Para consoles de framebuffer especificamente, há mais algumas informações sobre como vincular diferentes dispositivos de framebuffer (
/dev/fb0
...) a consoles virtuais específicos em https://kernel.org/doc/Documentation/fb/fbcon.txt . Isso envolve uma opção do kernelfbcon:map=
ou um comando chamadocon2fbmap
.É claro que os detalhes podem variar de acordo com as diferentes versões do kernel, arquiteturas, firmwares, dispositivos, drivers, etc. Eu nunca precisei usar nenhuma das interfaces acima. O kernel apenas deixa
i915
//inteldrmfb
o que você quiser chamá-lo assumir quando ele carrega, substituindo, por exemplo,vgacon
.Parece que minha máquina EFI nunca teve arquivos
vgacon
. Então, em primeiro lugar, ele usa um console fictício e, em segundo lugar, após 1,2 segundos, muda parafbcon
, rodando em cima deefifb
. Mas até agora não precisei me importar com os detalhes; apenas funciona.2. "Para que
/dev/console
serve?"Você pode usar /dev/console como um dispositivo TTY. Gravar nele, por exemplo, gravará em um dispositivo subjacente específico, que também terá um número de dispositivo de caractere próprio.
Frequentemente /dev/console está vinculado a /dev/tty0, mas às vezes pode estar vinculado a um dispositivo diferente.
Portanto, neste caso, gravar em /dev/console gravará em /dev/tty0. E, por sua vez, gravar em /dev/tty0 é equivalente a gravar em qualquer dispositivo /dev/ttyN que esteja ativo no momento.
Mas isso levanta uma questão interessante. O acesso
tty0
acessará diferentes consoles virtuais, dependendo de qual estiver ativo no momento. Para que as pessoas realmente usamtty0
e, da mesma forma, o que éconsole
usado no Linux?Tecnicamente, você pode ler e escrever de
console
/tty0
, por exemplo, executando agetty
para permitir o login emtty0
. Mas isso só é útil como um hack rápido. Porque isso significa que você não pode tirar proveito dos vários consoles virtuais do Linux.systemd
procurasysfs
um atributo associado ao dispositivo /dev/console, para detectar o dispositivo TTY subjacente. Isso permitesystemd
gerar automaticamente umgetty
e permitir o login, por exemplo, em um console serial, quando o usuário configura um console do kernel inicializando comconsole=ttyS0
. Isso é conveniente; evita a necessidade de configurar este console em dois lugares diferentes. Novamente, vejaman systemd-getty-generator
. No entanto,systemd
não abre realmente/dev/console
para isso.Durante a inicialização do sistema, você pode nem ter o sysfs montado ainda. Mas você quer poder mostrar mensagens de erro e progresso o mais rápido possível! Então, circulamos até o ponto 1). O kernel inicia o PID 1 com stdin/stdout/stderr conectado a
/dev/console
. É muito bom ter esse mecanismo simples configurado desde o início.Dentro de um container Linux, o arquivo at
/dev/console
pode ser criado como algo diferente - não o caractere número do dispositivo5:1
. Em vez disso, ele pode ser criado como um arquivo de dispositivo PTS. Então faria sentido fazer login através deste/dev/console
arquivo.systemd
dentro de um contêiner permitirá o login em tal dispositivo; vejaman systemd-getty-generator
.Esse mecanismo é usado quando você executa um contêiner com o
systemd-nspawn
comando. (Acho que apenas quando você executasystemd-nspawn
em um TTY, embora não possa dizer pesquisando na página de manual).systemd-nspawn
cria o contêiner/dev/console
como uma montagem de ligação de um dispositivo PTS do host. Isso significa que este dispositivo PTS não é visível dentro/dev/pts/
do contêiner.Os dispositivos PTS são locais para uma
devpts
montagem específica. Os dispositivos PTS são uma exceção à regra normal, de que os dispositivos são identificados pelo número do dispositivo. Os dispositivos PTS são identificados pela combinação de seu número de dispositivo e suadevpts
montagem.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 do espaço do usuário, semelhantes às mensagens urgentes do kernel que são impressas no console (consulte Recursosman dmesg
). No entanto, não é comum fazer isso, pelo menos depois que o sistema terminar de inicializar.rsyslog tem um exemplo nesta página , que imprime mensagens do kernel para
/dev/console
; isso é inútil no Linux porque o kernel já fará isso por padrão. Um exemplo que não consigo encontrar novamente diz que não é uma boa ideia usar isso para mensagens não-kernel porque há muitas mensagens syslog, você inunda seu console e isso atrapalha muito.O systemd-journald também tem 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
/dev/kmsg
. Isso os salva no buffer de log do kernel para que você possa lê-los comdmesg
. Assim como as mensagens geradas pelo próprio kernel, essas mensagens podem ecoar no console dependendo da configuração atual do kernel.