Em um sistema Linux, o que é a diferença entre /dev/console
, /dev/tty
e /dev/tty0
?
Qual é o seu uso respectivo e como eles se comparam?
Em um sistema Linux, o que é a diferença entre /dev/console
, /dev/tty
e /dev/tty0
?
Qual é o seu uso respectivo e como eles se comparam?
Respostas:
A partir da documentação :
/dev/tty Current TTY device
/dev/console System console
/dev/tty0 Current virtual console
Nos bons velhos tempos /dev/console
era console do administrador do sistema. E os TTYs eram dispositivos seriais dos usuários conectados a um servidor. Agora /dev/console
e /dev/tty0
represente a exibição atual e geralmente são os mesmos. Você pode substituí-lo, por exemplo, adicionando console=ttyS0
a grub.conf
. Depois que você /dev/tty0
é um monitor e /dev/console
é /dev/ttyS0
.
Um exercício para mostrar a diferença entre /dev/tty
e /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.
$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
sudo -i
, e voila - um shell raiz.
sudo anycommand
funcionar, então sudo -i
ir 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.)
/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 cron
e 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 TTY
coluna de ps -ef
saída.
/dev/tty
pode ser um dispositivo diferente, se houver, dependendo do processo que o abrir. Resposta atualizada.
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=ttyS0
e console=ttyS1
.
A documentação do kernel especifica /dev/console
como 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 init
ou "PID 1", é iniciado com /dev/console
conectado à saída padrão, erro padrão e entrada padrão.
Se nenhum dos consoles for um tty, a abertura /dev/console
retornará o erro ENODEV
("Não existe esse dispositivo"). O kernel iráimpressãoregistrar uma mensagem e iniciar init
independentemente. 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-nspawn
contêiner, o /dev/console
arquivo 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
.
O Linux TTY dispositivo nodos tty1
através tty63
sã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
é 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.