Do czego służy `/ dev / console`?

13

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/consolebyła konsola administratora systemu. A urządzenia TTY były urządzeniami szeregowymi użytkowników podłączonymi do serwera. Teraz /dev/consolei /dev/tty0reprezentują bieżący wyświetlacz i zwykle są takie same. Możesz to zmienić na przykład, dodając console=ttyS0do grub.conf. Potem twój /dev/tty0jest monitorem i /dev/consolejest /dev/ttyS0.

Konsola systemowa/dev/consolewydaje się plikiem tekstowym terminala fizycznego, podobnie jak /dev/tty{1..63}pliki urządzeń dla konsol wirtualnych.

Przez „ /dev/consolei /dev/tty0reprezentują bieżący ekran i zwykle są takie same”, /dev/consolewydaje mi się, że może to być również plik urządzenia wirtualnej konsoli. /dev/consolewydaje się bardziej podobna /dev/tty0niż podobna /dev/tty{1..63}( /dev/tty0jest 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/consoleodgrywa taką samą rolę dla jądra Linuksa jak /dev/ttydla procesu? ( /dev/ttyjest terminalem kontrolnym sesji procesu i może być pkt, /dev/ttyngdzie njest od 1 do 63 lub więcej?)

W drugiej odpowiedzi wspomniano:

Dokumentacja jądra określa /dev/consolejako 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/consolejako urządzenie znakowe o numerze 5: 1” oznacza, że /dev/consolejest to plik urządzenia fizycznego terminala tekstowego, tj. Konsoli systemowej? (Ale znowu, pierwsza cytowana powyżej odpowiedź mówi, że /dev/consolemoże to być to samo, /dev/tty0co nie jest fizycznym terminalem tekstowym, ale wirtualną konsolą)

Dzięki.

Tim
źródło
Stworzyłem zastępstwa dla stron podręcznika, które zaginęły lata temu: jdebp.eu./Proproje/linux-kvt-manual-pages.html
JdeBP

Odpowiedzi:

18

/dev/consoleistnieje przede wszystkim w celu udostępnienia konsoli jądra przestrzeni użytkownika. Dokumentacja jądra Linuksa na urządzeniach mówi teraz

Urządzenie konsolowe /dev/console, to urządzenie, na które należy wysyłać komunikaty systemowe i na których logowanie powinno być dozwolone w trybie pojedynczego użytkownika. Począwszy od Linuksa 2.1.71, /dev/consolejest zarządzany przez jądro; we wcześniejszych wersjach powinien to być symboliczny link do /dev/tty0konkretnej konsoli wirtualnej, takiej jak /dev/tty1lub do podstawowego ( tty*, nie cu*) urządzenia portu szeregowego , w zależności od konfiguracji systemu.

/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ć tty0dowolnego miejsca, ttyNgdzie 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/consoleistnieje i jest użyteczny, i konfiguruje initsię ze standardowym wejściem, wyjściem i błędem wskazującym /dev/console.

Jak opisano tutaj, /dev/consolejest 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/tty0ani ż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/consolerzeczywiście zapewnia dostęp do ostatniego z nich :

Możesz podać wiele opcji console = w wierszu poleceń jądra. Dane wyjściowe pojawią się na wszystkich z nich. Ostatnie urządzenie będzie używane po otwarciu /dev/console.

Stephen Kitt
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
terdon
6

„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/consolesłuży?”

W systemie Linux /dev/consolesł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/consolebył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?”

Pozwól, że spróbuję to zrozumieć. /dev/tty{1..63}i /dev/pts/nsą plikami urządzeń reprezentującymi same urządzenia (chociaż są emulacjami), a nie w odniesieniu do procesu lub jądra. /dev/tty0reprezentuje ten, w /dev/tty{1..63}którym jest obecnie używany przez coś (może jądrolub proces powłoki?). /dev/ttyreprezentuje terminal sterujący aktualnie używany przez sesję procesu. /dev/consolereprezentuje 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?

Podstawowymi urządzeniami /dev/tty{1..63}struct con_driver. Aby zobaczyć wszystkie możliwe sterowniki, sprawdź https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console

Nie ma pliku urządzenia dla tych podstawowych urządzeń!


Interfejs przestrzeni użytkownika jest minimalny do zarządzania nimi.

$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device

==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device

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, bindplik w każdym podkatalogu /sys/class/vtconsolewydaje się informować, które urządzenie vtconsole jest aktywne. Jeśli napiszę 0na aktywnym, wydaje się, że przełączy się na atrapę. (VT z GUI wydają się nie ulegać zmianie, ale VT z tekstem przestają działać). Pisanie 1dla manekina nie aktywuje go. Każda z tych metod działa z powrotem na rzeczywistą. Jeśli poprawnie odczytam kod, sztuczka polega na tym, że echo 1 > bindpowinna 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ądra fbcon:map=lub wywołanej komendy con2fbmap.

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 np vgacon.

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ę fbconna nią efifb. Ale jak dotąd nie musiałem przejmować się szczegółami; to po prostu działa.

$ 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. „Do czego /dev/consolesł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 tty0spowoduje dostęp do różnych konsol wirtualnych, w zależności od tego, która jest aktualnie aktywna. Czego ludzie używają tty0i podobnie jak consolew Linuksie?

  1. Technicznie rzecz biorąc, możesz czytać i pisać z console/ tty0, na przykład uruchamiając a, gettyaby umożliwić logowanie tty0. Jest to jednak przydatne tylko jako szybki hack. Ponieważ oznacza to, że nie możesz skorzystać z wielu wirtualnych konsol Linuksa.

  2. systemdszuka sysfsatrybutu powiązanego z urządzeniem / dev / console, aby wykryć bazowe urządzenie TTY. Pozwala to systemdna automatyczne odrodzenie a gettyi pozwala na zalogowanie się np. Na konsoli szeregowej, gdy użytkownik skonfiguruje konsolę jądra poprzez uruchomienie systemu console=ttyS0. Jest to wygodne; pozwala to uniknąć konieczności konfigurowania tej konsoli w dwóch różnych miejscach. Znowu patrz man systemd-getty-generator. Jednak systemdtak naprawdę nie otwiera się /dev/consolena to.

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

  4. W kontenerze systemu Linux plik at /dev/consolemoże zostać utworzony jako coś innego - nie jako numer urządzenia znakowego 5:1. Zamiast tego można go utworzyć jako plik urządzenia PTS. Wtedy sensowne byłoby zalogowanie się przez ten /dev/consoleplik. systemdwewnątrz kontenera umożliwi zalogowanie się na takim urządzeniu; zob man systemd-getty-generator.

    Ten mechanizm jest używany, gdy uruchamiasz kontener za pomocą systemd-nspawnpolecenia. (Myślę, że tylko wtedy, gdy uruchamiasz systemd-nspawnTTY, chociaż nie mogę tego stwierdzić po przeszukaniu strony podręcznika).

    systemd-nspawntworzy kontener /dev/consolejako 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 devptsmontaż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 sposobu devptsmontażu.

  5. 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 (patrz man 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/kmsgzamiast 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.

sourcejedi
źródło
Jako uzupełnienie do punktu 2, często (nie tylko w Linuksie) działało, xconsoleaby śledzić, co się dzieje ;-). (I aby uniknąć wysyłania wiadomości bezpośrednio do bufora ramki, np. Na stacjach SPARC.)
Stephen Kitt
@StephenKitt, kiedy po raz pierwszy użyłem SUSE Linux, myślę, że uruchomiłem xconsole, albo podkręciłem go, żebyś mógł uruchomić go z głównego menu pulpitu, czy coś - nie pamiętam dokładnie, ale widziałem to :-).
sourcejedi
Pozwól, że spróbuję to zrozumieć. /dev/tty{1..63}i /dev/pts/nsą plikami urządzeń reprezentującymi same urządzenia (chociaż są emulacjami), a nie w odniesieniu do procesu lub jądra. /dev/tty0reprezentuje ten, w /dev/tty{1..63}którym jest obecnie używany przez coś (może proces jądra lub powłoki?). /dev/ttyreprezentuje terminal sterujący aktualnie używany przez sesję procesu. /dev/consolereprezentuje 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?
Tim
@Tim "/ dev / tty0 ponownie reprezentuje ten w /dev/tty{1..63}, który jest obecnie używany przez coś (może jądro lub proces powłoki?)" - jądro.
sourcejedi
Co to jest plik urządzenia reprezentujący sam fizyczny terminal, a nie w odniesieniu do jądra lub procesu?
Tim