Linux: Diferença entre / dev / console, / dev / tty e / dev / tty0

133

Em um sistema Linux, o que é a diferença entre /dev/console, /dev/ttye /dev/tty0?

Qual é o seu uso respectivo e como eles se comparam?

Axel Fontaine
fonte
3
Você também pode estar interessado em isso
Kevin

Respostas:

93

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.

Um exercício para mostrar a diferença entre /dev/ttye /dev/tty0:

Mude para o 2º console pressionando Ctrl+ Alt+ F2. Entre como root. Digite sleep 5; echo tty0 > /dev/tty0. Pressione Entere alterne para o terceiro console pressionando Alt+ F3. Agora volte para o segundo console pressionando Alt+ F2. Digite sleep 5; echo tty > /dev/tty, pressione Entere alterne para o terceiro console.

Você pode ver que ttyé o console em que o processo inicia e tty0é sempre um console atual.

dchirikov
fonte
6
bom exercício! Ubuntu bloqueia raiz, por isso uma forma de reproduzir isso em Ubuntu é:$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
SFun28
10
@ SFun28, eu sempre usei sudo -i, e voila - um shell raiz.
André Laszlo
4
um idioma para gravar arquivos que requerem privs raiz é o eco | sudo tee / dev / tty0> / dev / null;
Peter Cordes
Droga. Quando Ī̲ escreveu unix.stackexchange.com/a/229598/80483 , un não tinha conhecimento desta resposta!
Incnis MRSI
@ SFun28: se sudo anycommandfuncionar, então sudo -iir para a raiz também funciona. Não existe um Linux / BSD / Unix em que você não possa fazer root. (Então não seria Linux / BSD / Unix mais.)
Evi1M4chine
60
  • /dev/consoleé um conjunto virtual de dispositivos que pode ser definido como parâmetro no momento da inicialização. Pode ser redirecionado para um dispositivo serial ou um console virtual e, por padrão, aponta para /dev/tty0. Quando várias console=opções são passadas para o kernel, a saída do console irá para mais de um dispositivo.

  • /dev/tty0 é o console virtual atual

  • /dev/tty[1-x]é um dos consoles virtuais para os quais você alterna control- alt- F1e assim por diante.

  • /dev/ttyé um tipo de alias para o console (físico, virtual ou pseudo-dispositivo, se houver) associado ao processo que o abre. Ao contrário dos outros dispositivos, você não precisa de privilégios de root para gravar nele. Observe também que processos como os iniciados por crone processos em lote semelhantes não podem ser utilizados /dev/tty, pois não estão associados a nenhum. Esses processos têm um ?na TTYcoluna de ps -efsaída.

jlliagre
fonte
O que você quer dizer com consultá-lo a partir desta declaração "/ dev / tty é o console usado pelo processo que o consultou"?
Ron Vince
1
@ RonVince, quero dizer, /dev/ttypode ser um dispositivo diferente, se houver, dependendo do processo que o abrir. Resposta atualizada.
Jlliagre
Obrigado. Posso saber se os processos realmente gravam / lêem para / de / dev / tty em vez de diretamente para / do arquivo de dispositivo associado a eles?
Ron Vince
@ RonVince Receio não ter certeza do que você está perguntando. Você poderia reformular isso?
Jlliagre 19/09/2015
1
@RonVince A abertura / dev / tty (não /dev/tty[1,..,n]) é o padrão Unix (e Linux) para um processo de escrever algo no terminal do usuário. A gravação direta em qualquer outro dispositivo não é portátil, mais complexo e menos confiável. Um processo não precisa saber qual é o dispositivo real ao qual o terminal do processo está conectado, o kernel já o conhece.
Jlliagre
20

/ dev / console

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/serial-console.rst

No Linux, o console do kernel pode ser configurado usando a console= opção de inicialização . O código do kernel que chama printk()pode gravar mensagens nele, por exemplo, quando um dispositivo é carregado ou ocorre um erro. Essas mensagens também são armazenadas em buffer pelo kernel. (Veja também dmesg). Quando um dispositivo do console é encontrado e iniciado, ele recebe todas as mensagens armazenadas em buffer anteriormente.

Você pode passar console=várias vezes para configurar vários consoles, e as mensagens serão gravadas em todos eles. Aparentemente, você pode selecionar apenas um console de cada "tipo": você não pode usar ambos console=ttyS0e console=ttyS1.

A documentação do kernel especifica /dev/consolecomo um dispositivo de caracteres numerado (5,1). A abertura desse dispositivo de caractere abre o console "principal", que é o último tty na lista de consoles. O primeiro processo que não é do kernel, chamado initou "PID 1", é iniciado com /dev/consoleconectado à saída padrão, erro padrão e entrada padrão.

Se nenhum dos consoles for um tty, a abertura /dev/consoleretornará o erro ENODEV("Não existe esse dispositivo"). O kernel iráimpressãoregistrar uma mensagem e iniciar initindependentemente. Para um exemplo de console do kernel que não é um dispositivo tty, consulte netconsole, ou meu console favorito, a impressora de linha .

Você também pode ver uma lista de tty consoles lendo /sys/class/tty/console/active. A documentação do systemd indica que o primeiro dispositivo mostrado é o console principal. A lista está realmente na ordem inversa da linha de comando do kernel. A documentação atual do kernel afirma incorretamente que o último dispositivo mostrado é o console principal ou "ativo". Por alguma razão, é possível pesquisar este arquivo em busca de alterações (caso os dispositivos do console sejam removidos?).

Dentro de um systemd-nspawncontêiner, o /dev/consolearquivo padrão é substituído por um dispositivo pseudo-terminal (PTY). Estes seriam melhor descritos como dispositivos de terminal virtual. Eles são criados dinamicamente e também são usados ​​para implementar emuladores de terminal gráficos como o GNOME Terminal e para acesso remoto como ssh.

/ dev / tty0

O Linux TTY dispositivo nodos tty1 através tty63são terminais virtuais. Eles também são chamados de VTs ou consoles virtuais. Eles simulam vários consoles na parte superior do driver de dispositivo do console físico. Somente um console virtual é mostrado e controlado por vez. O terminal ativo pode ser alternado, por exemplo, usando chvt, ou Ctrl + Alt + F1, através de quantas teclas de função você tiver.

Você também pode ler e gravar no VT atual usando /dev/tty0. tty0é o console comum do kernel, por exemplo, se você não selecionou um explicitamente. "O sistema procura primeiro uma placa VGA [que é o que os VTs executam] e depois uma porta serial". Você também pode definir o console para uma VT específica, por exemplo console=tty1.

"Se você não possui uma placa VGA em seu sistema, a primeira porta serial se tornará automaticamente o console". Um "console serial" como ttyS0é provavelmente a alternativa mais comum tty0. Não é possível usar o sistema VT em cima de um console serial.

/ dev / tty

/dev/ttyé um dos três arquivos de dispositivo padrão especificados pelo POSIX ( /dev/é um dos três nomes de diretório especificados pelo POSIX). Abri-lo é equivalente a abrir o terminal de controle do processo atual. O terminal de controle é definido quando um processo abre pela primeira vez um terminal, pelo menos no Linux . Por exemplo, em init, ele se referiria a /dev/console.

A separação do terminal de controle é uma das etapas tradicionalmente necessárias para iniciar um processo em segundo plano, por exemplo, um daemon de log do sistema . As etapas para se tornar um processo em segundo plano são terrivelmente complexas, mas, para ser específico, a etapa que se desconecta do terminal de controle é a chamada do sistema de conjunto. Em sistemas mais modernos, o sistema init, por exemplo, systemd inicia o serviço sem nenhum terminal de controle em primeiro lugar.

sourcejedi
fonte