W systemie Linux, jaka jest różnica między /dev/console, /dev/ttya /dev/tty0?
Jakie jest ich zastosowanie i jak się porównują?
W systemie Linux, jaka jest różnica między /dev/console, /dev/ttya /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/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.
$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
sudo -i, a voila - powłoka root.
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.)
/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.
/dev/ttymoż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=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.
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/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.