„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?”
Pozwól, że spróbuję to zrozumieć. /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 jądrolub proces 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?
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_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, 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ć). Pisanie 1
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, że echo 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ą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ę fbcon
na 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/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 jak console
w Linuksie?
Technicznie rzecz biorąc, możesz czytać i pisać z console
/ tty0
, na przykład uruchamiając a, getty
aby 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.
systemd
szuka sysfs
atrybutu powiązanego z urządzeniem / dev / console, aby wykryć bazowe urządzenie TTY. Pozwala to systemd
na automatyczne odrodzenie a getty
i 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 systemd
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 znakowego 5: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; zob man systemd-getty-generator
.
Ten mechanizm jest używany, gdy uruchamiasz kontener za pomocą systemd-nspawn
polecenia. (Myślę, że tylko wtedy, gdy uruchamiasz systemd-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 sposobu devpts
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 (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/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.