Linux: Różnica między / dev / console, / dev / tty i / dev / tty0

133

W systemie Linux, jaka jest różnica między /dev/console, /dev/ttya /dev/tty0?

Jakie jest ich zastosowanie i jak się porównują?

Axel Fontaine
źródło
3
Możesz być także zainteresowany tym
Kevin

Odpowiedzi:

93

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.

Ćwiczenie, aby pokazać różnicę między /dev/ttyi /dev/tty0:

Przejdź do drugiej konsoli, naciskając Ctrl+ Alt+ F2. Zaloguj się jako root. Typ sleep 5; echo tty0 > /dev/tty0. Naciśnij Enteri przejdź do 3. konsoli, naciskając Alt+ F3. Teraz wróć do drugiej konsoli, naciskając Alt+ F2. Wpisz sleep 5; echo tty > /dev/tty, naciśnij Enteri przełącz na 3. konsolę.

Widać, że ttyjest to konsola, od której rozpoczyna się proces, i tty0jest to zawsze bieżąca konsola.

dchirikov
źródło
6
niezłe ćwiczenie! Ubuntu blokuje $ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
rootowanie
10
@ SFun28, zawsze używałem sudo -i, a voila - powłoka root.
André Laszlo
4
jednym z idiomów zapisywania w plikach wymagających uprawnień roota jest echo | sudo tee / dev / tty0> / dev / null;
Peter Cordes,
Cholera. Kiedy Ī̲ napisał unix.stackexchange.com/a/229598/80483 , Ī̲ nie był świadomy tej odpowiedzi!
Incnis Mrsi,
@ SFun28: jeśli sudo anycommanddziała, to również sudo -ido rootowania działa. Nie ma czegoś takiego jak Linux / BSD / Unix, w którym nie można rootować. (Wtedy nie byłby to już Linux / BSD / Unix.)
Evi1M4chine
60
  • /dev/consoleto wirtualny zestaw urządzeń, które można ustawić jako parametr podczas uruchamiania. Może zostać przekierowany na urządzenie szeregowe lub wirtualną konsolę i domyślnie wskazuje na /dev/tty0. Gdy console=do jądra zostanie przekazanych wiele opcji, dane wyjściowe konsoli trafią do więcej niż jednego urządzenia.

  • /dev/tty0 jest bieżącą konsolą wirtualną

  • /dev/tty[1-x]jest jedną z wirtualnych konsol, na które przełączasz się za pomocą control- alt- F1i tak dalej.

  • /dev/ttyjest rodzajem aliasu do konsoli (fizycznej, wirtualnej lub pseudo urządzenia, jeśli istnieje) powiązanej z procesem, który ją otwiera. W przeciwieństwie do innych urządzeń, nie potrzebujesz uprawnień roota, aby do niego pisać. Zauważ również, że procesy takie jak te uruchomione przez croni podobne procesy wsadowe nie mają zastosowania /dev/tty, ponieważ nie są z nimi powiązane. Te procesy mają ?w TTYkolumnie ps -efwyników.

jlliagre
źródło
Co masz na myśli, pytając go z tej instrukcji „/ dev / tty jest konsolą używaną przez proces, który go odpytuje”?
Ron Vince
1
@RonVince Mam na myśli, że /dev/ttymoże to być inne urządzenie, jeśli takie istnieje, w zależności od procesu, który je otwiera. Odpowiedź zaktualizowana.
jlliagre,
Dzięki. Czy mogę wiedzieć, czy procesy faktycznie zapisują / odczytują do / z / dev / tty zamiast bezpośrednio do / z powiązanego z nimi pliku urządzenia?
Ron Vince
@ RonVince Obawiam się, że nie jestem pewien, o co pytasz. Czy mógłbyś to zmienić?
jlliagre,
1
@RonVince Otwarcie / dev / tty (nie /dev/tty[1,..,n]) jest standardem Uniksa (i Linuksa) dla procesu zapisu czegoś do terminala użytkownika. Bezpośrednie pisanie na dowolne inne urządzenie nie jest przenośne, bardziej złożone i mniej niezawodne. Proces nie musi wiedzieć, z jakim faktycznym urządzeniem jest połączony terminal procesowy, jądro już to wie.
jlliagre
20

/ dev / console

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

W systemie Linux konsolę jądra można skonfigurować za pomocą console= opcji rozruchu . Kod jądra, który wywołuje, printk()może zapisywać do niego komunikaty, np. Gdy urządzenie jest załadowane lub wystąpi błąd. Te komunikaty są również buforowane przez jądro. (Zobacz także dmesg). Gdy urządzenie konsoli zostanie znalezione i uruchomione, odbiera wszystkie uprzednio buforowane wiadomości.

Możesz przejść console=wiele razy, aby skonfigurować wiele konsol, a wiadomości zostaną zapisane na wszystkich z nich. Najwyraźniej możesz wybrać tylko jedną konsolę każdego „typu”: nie możesz używać obu console=ttyS0i console=ttyS1.

Dokumentacja jądra określa /dev/consoleurządzenie znakowe ponumerowane (5,1). Otwarcie tego znaku powoduje otwarcie „głównej” konsoli, która jest ostatnim tty na liście konsol. Pierwszy proces inny niż jądro, zwany initlub „PID 1”, rozpoczyna się od /dev/consolepodłączenia do standardowego wyjścia, standardowego błędu i standardowego wejścia.

Jeśli żadna konsola nie jest tty, otwarcie /dev/consolezwraca błąd ENODEV(„Brak takiego urządzenia”). Jądro to zrobiwydrukowaćzaloguj wiadomość i rozpocznij initniezależnie. Aby zobaczyć przykład konsoli jądra, która nie jest urządzeniem tty, zobacz netconsole, lub moja ulubiona konsola, drukarkę liniową .

Możesz także zobaczyć listę konsoli tty, czytając /sys/class/tty/console/active. Dokumentacja systemd wskazuje, że pierwszym pokazanym urządzeniem jest konsola główna. Lista jest w rzeczywistości w odwrotnej kolejności od wiersza poleceń jądra. Aktualną dokumentację jądro niepoprawnie stwierdza, że ostatnie urządzenie pokazane jest głównym lub „aktywne” konsoli. Z jakiegoś powodu można sondować ten plik pod kątem zmian (w przypadku usunięcia urządzeń konsoli?).

Wewnątrz systemd-nspawnkontenera standardowy /dev/consoleplik jest zastępowany urządzeniem pseudoterminalowym (PTY). Można je najlepiej opisać jako wirtualne urządzenia końcowe. Są tworzone dynamicznie i służą również do implementacji emulatorów terminali graficznych, takich jak GNOME Terminal, i do zdalnego dostępu, takich jak ssh.

/ dev / tty0

Węzły urządzeń Linux TTY tty1przez tty63to wirtualne terminale. Są również nazywane VT lub konsolami wirtualnymi. Symulują wiele konsol na fizycznym sterowniku konsoli. Jednocześnie wyświetlana i kontrolowana jest tylko jedna konsola wirtualna. Aktywny terminal można przełączać, np. Za pomocą chvtlub Ctrl + Alt + F1 za pomocą dowolnej liczby klawiszy funkcyjnych.

Możesz także czytać i zapisywać na bieżącym VT za pomocą /dev/tty0. tty0jest zwykłą konsolą jądra, np. jeśli nie wybrałeś jej jednoznacznie. „System najpierw szuka karty VGA [na której działają VT], a następnie portu szeregowego”. Możesz także ustawić konsolę na określony VT, np console=tty1.

„Jeśli nie masz karty VGA w systemie, pierwszy port szeregowy automatycznie stanie się konsolą”. Taka „konsola szeregowa” ttyS0jest prawdopodobnie najczęstszą alternatywą dla tty0. Nie można użyć systemu VT na konsoli szeregowej.

/ dev / tty

/dev/ttyjest jednym z trzech standardowych plików urządzeń określonych przez POSIX ( /dev/jest jedną z trzech nazw katalogów określonych przez POSIX). Otwarcie jest równoznaczne z otwarciem terminala sterującego bieżącego procesu. Terminal sterujący jest ustawiany, gdy proces po raz pierwszy otwiera terminal, przynajmniej w systemie Linux . Na przykład w initodwołaniu byłoby to /dev/console.

Odłączanie od terminala sterującego jest jednym z kroków tradycyjnie wymaganych do uruchomienia procesu w tle, na przykład demona rejestrującego system . Kroki, aby stać się procesem w tle, są strasznie skomplikowane, ale mówiąc konkretnie, krokiem, który odłącza się od terminala sterującego, jest wywołanie systemowe setid . W bardziej nowoczesnych systemach system inicjujący, np. Systemd, w pierwszej kolejności uruchamia usługę bez terminala sterującego.

sourcejedi
źródło