Od tej odpowiedzi do Linuksa: Różnica między / dev / console, / dev / tty i / dev / tty0
Z dokumentacji :
/dev/tty Current TTY device /dev/console System console /dev/tty0 Current virtual console
W dawnych dobrych czasach
/dev/console
była konsola administratora systemu. A urządzenia TTY były urządzeniami szeregowymi użytkowników podłączonymi do serwera. Teraz/dev/console
i/dev/tty0
reprezentują bieżący wyświetlacz i zwykle są takie same. Możesz to zmienić na przykład, dodającconsole=ttyS0
dogrub.conf
. Potem twój/dev/tty0
jest monitorem i/dev/console
jest/dev/ttyS0
.
„ Konsola systemowa ” /dev/console
wydaje się plikiem tekstowym terminala fizycznego, podobnie jak /dev/tty{1..63}
pliki urządzeń dla konsol wirtualnych.
Przez „ /dev/console
i /dev/tty0
reprezentują bieżący ekran i zwykle są takie same”, /dev/console
wydaje mi się, że może to być również plik urządzenia wirtualnej konsoli. /dev/console
wydaje się bardziej podobna /dev/tty0
niż podobna /dev/tty{1..63}
( /dev/tty0
jest obecnie aktywną konsolą wirtualną i może nią być /dev/tty{1..63}
).
Co to jest /dev/console
? Do czego jest to używane?
Czy /dev/console
odgrywa taką samą rolę dla jądra Linuksa jak /dev/tty
dla procesu? ( /dev/tty
jest terminalem kontrolnym sesji procesu i może być pkt, /dev/ttyn
gdzie n
jest od 1 do 63 lub więcej?)
W drugiej odpowiedzi wspomniano:
Dokumentacja jądra określa
/dev/console
jako urządzenie znakowe o numerze 5: 1. Otwarcie tego znaku powoduje otwarcie „głównej” konsoli, która jest ostatnim tty na liście konsol.
Czy „lista konsol” oznacza wszystkie console=
JEST W opcji bootowania ?
Czy „ /dev/console
jako urządzenie znakowe o numerze 5: 1” oznacza, że /dev/console
jest to plik urządzenia fizycznego terminala tekstowego, tj. Konsoli systemowej? (Ale znowu, pierwsza cytowana powyżej odpowiedź mówi, że /dev/console
może to być to samo, /dev/tty0
co nie jest fizycznym terminalem tekstowym, ale wirtualną konsolą)
Dzięki.
Odpowiedzi:
/dev/console
istnieje przede wszystkim w celu udostępnienia konsoli jądra przestrzeni użytkownika. Dokumentacja jądra Linuksa na urządzeniach mówi teraz/dev/console
, węzeł urządzenia z wersją główną 5 i podrzędną 1, zapewnia dostęp do wszystkiego, co jądro uważa za swój podstawowy sposób interakcji z administratorem systemu; może to być fizyczna konsola podłączona do systemu (z abstrakcyjną konsolą wirtualną na górze, dzięki czemu może używaćtty0
dowolnego miejsca,ttyN
gdzie N wynosi od 1 do 63), konsola szeregowa, konsola hiperwizora lub nawet urządzenie brajlowskie. Zauważ, że samo jądro nie używa/dev/console
: węzły urządzeń służą do przestrzeni użytkownika, a nie do jądra; sprawdza jednak, czy/dev/console
istnieje i jest użyteczny, i konfigurujeinit
się ze standardowym wejściem, wyjściem i błędem wskazującym/dev/console
.Jak opisano tutaj,
/dev/console
jest urządzeniem znakowym ze stałym durem i drugorzędnym, ponieważ jest to oddzielne urządzenie (jak w, środek dostępu do jądra; nie urządzenie fizyczne), nie równoważne/dev/tty0
ani żadne inne urządzenie. Jest to nieco podobne do sytuacji, w/dev/tty
której jest to własne urządzenie (5: 0), ponieważ zapewnia nieco inne funkcje niż inne wirtualne konsole lub urządzenia końcowe.„Lista konsol” jest rzeczywiście listą konsol zdefiniowaną przez
console=
parametry rozruchowe (lub domyślną konsolę, jeśli nie ma). Można zobaczyć zdefiniowane w ten sposób konsole, patrząc na/proc/consoles
./dev/console
rzeczywiście zapewnia dostęp do ostatniego z nich :źródło
„Co to jest
/dev/console
?” odpowiada poprzednia odpowiedź . Być może ta odpowiedź jest bardziej wyraźna, gdy znasz odpowiedzi na pozostałe dwa pytania.Pytanie 1 „Co to jest plik urządzenia reprezentujący sam fizyczny terminal?”
Nie ma takiego pliku urządzenia.
Q2 „Do czego
/dev/console
służy?”W systemie Linux
/dev/console
służy do wyświetlania komunikatów podczas uruchamiania (i zamykania). Jest również używany w „trybie pojedynczego użytkownika”, jak wskazano w odpowiedzi Stephena Kitta. Nie ma wiele innych powodów, dla których warto go używać.„W dawnych dobrych czasach” Uniksa
/dev/console
było dedykowanym urządzeniem fizycznym. Ale nie jest tak w Linuksie.Powiązane dowody
1. „Co to jest plik urządzenia reprezentujący sam fizyczny terminal?”
Podstawowymi urządzeniami
/dev/tty{1..63}
sąstruct con_driver
. Aby zobaczyć wszystkie możliwe sterowniki, sprawdź https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_consoleNie ma pliku urządzenia dla tych podstawowych urządzeń!
Interfejs przestrzeni użytkownika jest minimalny do zarządzania nimi.
Jeśli naprawdę chcesz wiedzieć więcej, oznacza modułu . To znaczy, że obojętne urządzenie konsoli nie jest dostarczane przez ładowalny moduł jądra; jest częścią początkowego obrazu jądra (inaczej „wbudowane”).
(M)
Po drugie,
bind
plik w każdym podkatalogu/sys/class/vtconsole
wydaje się informować, które urządzenie vtconsole jest aktywne. Jeśli napiszę0
na aktywnym, wydaje się, że przełączy się na atrapę. (VT z GUI wydają się nie ulegać zmianie, ale VT z tekstem przestają działać). Pisanie1
dla manekina nie aktywuje go. Każda z tych metod działa z powrotem na rzeczywistą. Jeśli poprawnie odczytam kod, sztuczka polega na tym, żeecho 1 > bind
powinna działać tylko w przypadku sterowników konsoli zbudowanych jako moduł (?!).W szczególności dla konsol framebuffer , jest więcej informacji na temat wiązania różnych urządzeń bufora ramki (
/dev/fb0
...) z konkretnymi konsolami wirtualnymi na https://kernel.org/doc/Documentation/fb/fbcon.txt . Dotyczy to opcji jądrafbcon:map=
lub wywołanej komendycon2fbmap
.Oczywiście szczegóły mogą się różnić w zależności od wersji jądra, architektury, oprogramowania układowego, urządzeń, sterowników itp. Nigdy tak naprawdę nie musiałem używać żadnego z powyższych interfejsów. Jądro pozwala
i915
/inteldrmfb
/ cokolwiek chcesz go nazwać, przejmuje kontrolę, gdy się ładuje, zastępując npvgacon
.Wygląda na to, że moja maszyna EFI nigdy nie miała
vgacon
. Tak więc po pierwsze używa fałszywej konsoli, a po drugie po 1,2 sekundach przełącza sięfbcon
na niąefifb
. Ale jak dotąd nie musiałem przejmować się szczegółami; to po prostu działa.2. „Do czego
/dev/console
służy?”Możesz używać / dev / console jako urządzenia TTY. Na przykład zapis do niego spowoduje zapisanie na konkretnym urządzeniu bazowym, które będzie miało również własny numer urządzenia znakowego.
Często / dev / console jest powiązana z / dev / tty0, ale czasami może być powiązana z innym urządzeniem.
Więc w tym przypadku pisanie do / dev / console zapisze w / dev / tty0. Z kolei zapis do / dev / tty0 jest równoznaczny z zapisem na dowolnym aktywnym urządzeniu / dev / ttyN.
Ale to rodzi interesujące pytanie. Dostęp
tty0
spowoduje dostęp do różnych konsol wirtualnych, w zależności od tego, która jest aktualnie aktywna. Czego ludzie używajątty0
i podobnie jakconsole
w Linuksie?Technicznie rzecz biorąc, możesz czytać i pisać z
console
/tty0
, na przykład uruchamiając a,getty
aby umożliwić logowanietty0
. Jest to jednak przydatne tylko jako szybki hack. Ponieważ oznacza to, że nie możesz skorzystać z wielu wirtualnych konsol Linuksa.systemd
szukasysfs
atrybutu powiązanego z urządzeniem / dev / console, aby wykryć bazowe urządzenie TTY. Pozwala tosystemd
na automatyczne odrodzenie agetty
i pozwala na zalogowanie się np. Na konsoli szeregowej, gdy użytkownik skonfiguruje konsolę jądra poprzez uruchomienie systemuconsole=ttyS0
. Jest to wygodne; pozwala to uniknąć konieczności konfigurowania tej konsoli w dwóch różnych miejscach. Znowu patrzman systemd-getty-generator
. Jednaksystemd
tak naprawdę nie otwiera się/dev/console
na to.Podczas ładowania systemu może nawet nie być jeszcze zamontowane sysfs. Ale chcesz być w stanie wyświetlać komunikaty o błędach i postępach tak szybko, jak to możliwe! Okrążamy więc do punktu 1). Jądro uruchamia PID 1 z podłączonym stdin / stdout / stderr
/dev/console
. Bardzo miło jest mieć ten prosty mechanizm od samego początku.W kontenerze systemu Linux plik at
/dev/console
może zostać utworzony jako coś innego - nie jako numer urządzenia znakowego5:1
. Zamiast tego można go utworzyć jako plik urządzenia PTS. Wtedy sensowne byłoby zalogowanie się przez ten/dev/console
plik.systemd
wewnątrz kontenera umożliwi zalogowanie się na takim urządzeniu; zobman systemd-getty-generator
.Ten mechanizm jest używany, gdy uruchamiasz kontener za pomocą
systemd-nspawn
polecenia. (Myślę, że tylko wtedy, gdy uruchamiaszsystemd-nspawn
TTY, chociaż nie mogę tego stwierdzić po przeszukaniu strony podręcznika).systemd-nspawn
tworzy kontener/dev/console
jako mocowanie powiązania urządzenia PTS z hosta. Oznacza to, że to urządzenie PTS nie jest widoczne wewnątrz/dev/pts/
kontenera.Urządzenia PTS są lokalne dla konkretnego
devpts
montażu. Urządzenia PTS stanowią wyjątek od normalnej reguły, zgodnie z którą urządzenia są identyfikowane na podstawie numeru urządzenia. Urządzenia PTS są identyfikowane przez kombinację ich numeru urządzenia i sposobudevpts
montażu.Możesz pisać pilne wiadomości do
console
/tty0
, aby pisać na bieżącej konsoli wirtualnej użytkownika. Może to być przydatne w przypadku pilnych komunikatów o błędach w przestrzeni użytkownika, podobnych do pilnych komunikatów jądra, które są drukowane na konsoli (patrzman dmesg
). Jednak nie jest to powszechne, przynajmniej po zakończeniu uruchamiania systemu.rsyslog ma jeden przykład na tej stronie , w którym wypisuje komunikaty jądra
/dev/console
; jest to bezcelowe w Linuksie, ponieważ jądro już to robi domyślnie. Jeden przykład, którego nie mogę znaleźć ponownie, mówi, że nie jest dobrym pomysłem, aby używać tego do wiadomości innych niż jądro, ponieważ jest po prostu zbyt wiele wiadomości syslog, zalewasz konsolę i przeszkadza.systemd-journald podobnie ma opcje przekazywania wszystkich dzienników do konsoli. Zasadniczo może to być przydatne do debugowania w środowisku wirtualnym. Chociaż do debugowania zwykle
/dev/kmsg
zamiast tego przekazujemy dalej . To zapisuje je w buforze dziennika jądra, dzięki czemu można je odczytaćdmesg
. Podobnie jak komunikaty generowane przez samo jądro, komunikaty te mogą być wysyłane do konsoli w zależności od bieżącej konfiguracji jądra.źródło
xconsole
aby śledzić, co się dzieje ;-). (I aby uniknąć wysyłania wiadomości bezpośrednio do bufora ramki, np. Na stacjach SPARC.)/dev/tty{1..63}
i/dev/pts/n
są plikami urządzeń reprezentującymi same urządzenia (chociaż są emulacjami), a nie w odniesieniu do procesu lub jądra./dev/tty0
reprezentuje ten, w/dev/tty{1..63}
którym jest obecnie używany przez coś (może proces jądra lub powłoki?)./dev/tty
reprezentuje terminal sterujący aktualnie używany przez sesję procesu./dev/console
reprezentuje terminal aktualnie używany przez jądro? Co to jest plik urządzenia reprezentujący sam fizyczny terminal, a nie w odniesieniu do jądra lub procesu?