AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 485156
Accepted
Tim
Tim
Asked: 2018-12-01 05:50:39 +0800 CST2018-12-01 05:50:39 +0800 CST 2018-12-01 05:50:39 +0800 CST

Para que serve `/dev/console`?

  • 772

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/consoleera o console do administrador do sistema. E os TTYs eram dispositivos seriais dos usuários conectados a um servidor. Agora /dev/consolee /dev/tty0representam a exibição atual e geralmente são os mesmos. Você pode substituí-lo, por exemplo, adicionando console=ttyS0a grub.conf. Depois disso, 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}são os arquivos de dispositivo para os consoles virtuais.

Por " /dev/consolee /dev/tty0representam a exibição atual e geralmente são iguais", /dev/consoleme parece que também pode ser o arquivo do dispositivo de um console virtual. /dev/consoleparece mais /dev/tty0do 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/consoleo mesmo papel para o kernel do Linux e /dev/ttypara um processo? ( /dev/ttyé o terminal de controle do processo da sessão do processo, e pode ser um pts, /dev/ttynonde nfica 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. 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/consolecomo 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/consolepode ser a mesma /dev/tty0que não é um terminal de texto físico, mas um console virtual)

Obrigado.

linux ubuntu
  • 2 2 respostas
  • 11403 Views

2 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-12-01T06:53:32+08:002018-12-01T06:53:32+08:00

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

    O dispositivo do console, /dev/console, é o dispositivo para o qual as mensagens do sistema devem ser enviadas e no qual os 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/tty0, um console virtual específico, como /dev/tty1, ou para um dispositivo de porta serial primária ( tty*, não cu*), dependendo da configuração do sistema.

    /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 usar tty0ou 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/consoleinit/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/tty0ou 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/consolede fato fornece acesso ao último destes :

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

    • 22
  2. sourcejedi
    2018-12-01T08:26:05+08:002018-12-01T08:26:05+08:00

    "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/consoleserve?"

    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/consoleera 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?"

    Deixe-me tentar entender desta forma. /dev/tty{1..63}e /dev/pts/nsão arquivos de dispositivo que representam os próprios dispositivos (embora sejam emulações), não em relação ao processo ou kernel. /dev/tty0representa aquele em /dev/tty{1..63}que está actualmente a ser 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 de 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, confira https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console

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


    Há 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)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 bindarquivo em cada subdiretório de /sys/class/vtconsoleaparece para informar qual dispositivo vtconsole está ativo. Se eu escrever 0para 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). Escrever 1para 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 é que echo 1 > bindsó 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 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. Eu nunca precisei usar nenhuma das interfaces acima. O kernel apenas deixa i915// inteldrmfbo 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 para fbcon, rodando em cima de efifb. Mas até agora não precisei me importar com os detalhes; apenas 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/consoleserve?"

    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 tty0acessará diferentes consoles virtuais, dependendo de qual estiver ativo no momento. Para que as pessoas realmente usam tty0e, da mesma forma, o que é consoleusado no Linux?

    1. Tecnicamente, você pode ler e escrever de console/ tty0, por exemplo, executando a gettypara permitir o login em tty0. 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.

    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 este console em dois lugares diferentes. Novamente, veja man systemd-getty-generator. No entanto, systemdnão abre realmente /dev/consolepara isso.

    3. 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.

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

      Esse mecanismo é usado quando você executa um contêiner com o systemd-nspawncomando. (Acho que apenas quando você executa systemd-nspawnem um TTY, embora não possa dizer pesquisando na página de manual).

      systemd-nspawncria o contêiner /dev/consolecomo 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 devptsmontagem 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 sua 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 do espaço do usuário, semelhantes às mensagens urgentes do kernel que são impressas no console (consulte Recursos man 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 com dmesg. Assim como as mensagens geradas pelo próprio kernel, essas mensagens podem ecoar no console dependendo da configuração atual do kernel.

    • 8

relate perguntas

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • O OpenVPN auto-compilado não inicia a partir do systemd

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve