W systemie Linux, jaka jest różnica między /dev/console
, /dev/tty
a /dev/tty0
?
Jakie jest ich zastosowanie i jak się porównują?
W systemie Linux, jaka jest różnica między /dev/console
, /dev/tty
a /dev/tty0
?
Jakie jest ich zastosowanie i jak się porównują?
Odpowiedzi:
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ąc console=ttyS0
do grub.conf
. Potem twój /dev/tty0
jest monitorem i /dev/console
jest /dev/ttyS0
.
Ćwiczenie, aby pokazać różnicę między /dev/tty
i /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 tty
jest to konsola, od której rozpoczyna się proces, i tty0
jest to zawsze bieżąca konsola.
$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
sudo -i
, a voila - powłoka root.
sudo anycommand
działa, to również sudo -i
do 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.)
/dev/console
to 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/tty
jest 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 cron
i podobne procesy wsadowe nie mają zastosowania /dev/tty
, ponieważ nie są z nimi powiązane. Te procesy mają ?
w TTY
kolumnie ps -ef
wyników.
/dev/tty
może to być inne urządzenie, jeśli takie istnieje, w zależności od procesu, który je otwiera. Odpowiedź zaktualizowana.
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=ttyS0
i console=ttyS1
.
Dokumentacja jądra określa /dev/console
urzą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 init
lub „PID 1”, rozpoczyna się od /dev/console
podłączenia do standardowego wyjścia, standardowego błędu i standardowego wejścia.
Jeśli żadna konsola nie jest tty, otwarcie /dev/console
zwraca błąd ENODEV
(„Brak takiego urządzenia”). Jądro to zrobiwydrukowaćzaloguj wiadomość i rozpocznij init
niezależ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-nspawn
kontenera standardowy /dev/console
plik 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
.
Węzły urządzeń Linux TTY tty1
przez tty63
to 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ą chvt
lub Ctrl + Alt + F1 za pomocą dowolnej liczby klawiszy funkcyjnych.
Możesz także czytać i zapisywać na bieżącym VT za pomocą /dev/tty0
. tty0
jest 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” ttyS0
jest prawdopodobnie najczęstszą alternatywą dla tty0
. Nie można użyć systemu VT na konsoli szeregowej.
/dev/tty
jest 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 init
odwoł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.