Linux: Perbedaan antara / dev / console, / dev / tty dan / dev / tty0

133

Pada sistem Linux, apa perbedaan antara /dev/console, /dev/ttydan /dev/tty0?

Apa yang digunakan masing-masing dan bagaimana mereka membandingkan?

Axel Fontaine
sumber
3
Anda mungkin juga tertarik dengan ini
Kevin

Jawaban:

93

Dari dokumentasi :

/dev/tty        Current TTY device
/dev/console    System console
/dev/tty0       Current virtual console

Di masa lalu yang baik /dev/consoleadalah konsol Sistem Administrator. Dan TTY adalah perangkat serial pengguna yang dilampirkan ke server. Sekarang /dev/consoledan /dev/tty0tampilkan tampilan saat ini dan biasanya sama. Anda dapat menimpa itu misalnya dengan menambahkan console=ttyS0ke grub.conf. Setelah itu Anda /dev/tty0adalah monitor dan /dev/consoleadalah /dev/ttyS0.

Latihan untuk menunjukkan perbedaan antara /dev/ttydan /dev/tty0:

Beralih ke konsol ke-2 dengan menekan Ctrl+ Alt+ F2. Masuk sebagai root. Jenis sleep 5; echo tty0 > /dev/tty0. Tekan Enterdan alihkan ke konsol ke-3 dengan menekan Alt+ F3. Sekarang kembali ke konsol ke-2 dengan menekan Alt+ F2. Ketik sleep 5; echo tty > /dev/tty, tekan Enterdan alihkan ke konsol ke-3.

Anda dapat melihat bahwa itu ttyadalah konsol tempat proses dimulai, dan tty0merupakan konsol yang selalu terkini.

dchirikov
sumber
6
latihan yang bagus! Ubuntu mengunci root, jadi salah satu cara untuk mereproduksi ini di Ubuntu adalah:$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
SFun28
10
@ SFun28, saya selalu menggunakan sudo -i, dan voila - shell root.
André Laszlo
4
satu idiom untuk menulis ke file yang membutuhkan root privs adalah echo stuff | sudo tee / dev / tty0> / dev / null;
Peter Cordes
Sialan. Ketika Ī̲ menulis unix.stackexchange.com/a/229598/80483 , Ī̲ tidak mengetahui jawaban ini !
Incnis Mrsi
@ SFun28: jika sudo anycommandberhasil, maka sudo -iuntuk melanjutkan pekerjaan root juga. Tidak ada yang namanya Linux / BSD / Unix di mana Anda tidak dapat melakukan root. (Maka itu bukan Linux / BSD / Unix lagi.)
Evi1M4chine
60
  • /dev/consoleadalah seperangkat perangkat virtual yang dapat ditetapkan sebagai parameter pada saat boot. Mungkin diarahkan ke perangkat serial atau konsol virtual dan secara default menunjuk ke /dev/tty0. Ketika beberapa console=opsi dilewatkan ke kernel, output konsol akan menuju lebih dari satu perangkat.

  • /dev/tty0 adalah konsol virtual saat ini

  • /dev/tty[1-x]adalah salah satu konsol virtual yang Anda gunakan untuk control- alt- F1dan seterusnya.

  • /dev/ttyadalah jenis alias untuk konsol (perangkat fisik, virtual, atau pseudo, jika ada) yang terkait dengan proses yang membukanya. Berbeda dengan perangkat lain, Anda tidak perlu hak root untuk menulisnya. Perhatikan juga bahwa proses seperti yang diluncurkan oleh crondan proses batch serupa tidak dapat digunakan /dev/tty, karena tidak terkait dengan apa pun. Proses-proses ini ada ?di TTYkolom ps -efoutput.

Jlliagre
sumber
Apa yang Anda maksud dengan menanyakannya dari pernyataan ini "/ dev / tty adalah konsol yang digunakan oleh proses menanyakannya"?
Ron Vince
1
@RonVince saya maksud /dev/ttybisa perangkat yang berbeda, jika ada, tergantung pada proses yang membukanya. Jawaban diperbarui.
jlliagre
Terima kasih. Bolehkah saya tahu apakah proses sebenarnya menulis / membaca ke / dari / dev / tty daripada langsung ke / dari file perangkat yang terkait dengannya?
Ron Vince
@RonVince aku takut aku tidak yakin apa yang kamu minta. Bisakah Anda ulangi lagi?
jlliagre
1
@RonVince Pembukaan / dev / tty (bukan /dev/tty[1,..,n]) adalah standar Unix (dan Linux) untuk proses menulis sesuatu ke terminal pengguna. Langsung menulis ke perangkat lain apa pun yang tidak portabel, lebih kompleks dan kurang dapat diandalkan. Suatu proses tidak perlu tahu apa perangkat sebenarnya dari terminal proses terhubung, kernel sudah tahu itu.
jlliagre
20

/ dev / console

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

Di Linux, konsol kernel dapat dikonfigurasi menggunakan console= opsi boot . Kode kernel yang membuat panggilan printk()dapat menulis pesan, misalnya ketika perangkat dimuat atau terjadi kesalahan. Pesan-pesan ini juga disangga oleh kernel. (Lihat juga dmesg). Ketika perangkat konsol ditemukan dan dimulai, ia menerima semua pesan yang sebelumnya disangga.

Anda dapat melewati console=beberapa kali untuk mengonfigurasi beberapa konsol, dan pesan akan ditulis ke semuanya. Tampaknya Anda hanya dapat memilih satu konsol dari setiap "tipe": Anda tidak dapat menggunakan keduanya console=ttyS0dan console=ttyS1.

Dokumentasi kernel menentukan /dev/consolesebagai perangkat karakter bernomor (5,1). Membuka perangkat karakter ini membuka konsol "utama", yang merupakan tty terakhir dalam daftar konsol. Proses non-kernel pertama, disebut initatau "PID 1", dimulai dengan /dev/consoleterhubung ke output standar, kesalahan standar, dan input standar.

Jika tidak ada konsol yang tty, maka membuka /dev/consolemengembalikan kesalahan ENODEV("Tidak ada perangkat seperti itu"). Kernel akanmencetakcatat pesan, dan mulai initterlepas. Untuk contoh konsol kernel yang bukan perangkat tty, lihat netconsole, atau konsol printer baris favorit saya .

Anda juga dapat melihat daftar konsol tty dengan membaca /sys/class/tty/console/active. dokumentasi systemd menunjukkan bahwa perangkat pertama yang ditampilkan adalah konsol utama. Daftar ini sebenarnya dalam urutan terbalik dari baris perintah kernel. The dokumentasi kernel saat ini tidak benar menyatakan bahwa perangkat terakhir yang ditampilkan adalah utama atau "aktif" konsol. Untuk beberapa alasan dimungkinkan untuk polling file ini untuk perubahan (jika perangkat konsol dihapus?).

Di dalam systemd-nspawnwadah, /dev/consolefile standar diganti dengan perangkat pseudo-terminal (PTY). Ini akan digambarkan sebagai perangkat terminal virtual. Mereka dibuat secara dinamis dan juga digunakan untuk mengimplementasikan emulator terminal grafis seperti Terminal GNOME, dan untuk akses jarak jauh seperti ssh.

/ dev / tty0

Linux TTY perangkat node tty1 melalui tty63adalah terminal virtual. Mereka juga disebut sebagai VT, atau sebagai konsol virtual. Mereka mensimulasikan banyak konsol di atas driver perangkat konsol fisik. Hanya satu konsol virtual yang ditampilkan dan dikendalikan pada satu waktu. Terminal yang aktif dapat diaktifkan, misalnya menggunakan chvt, atau Ctrl + Alt + F1 melalui banyak tombol fungsi yang Anda miliki.

Anda juga dapat membaca dan menulis ke VT saat ini menggunakan /dev/tty0. tty0adalah konsol kernel yang biasa, misalnya jika Anda tidak memilih satu secara eksplisit. "Sistem pertama-tama mencari kartu VGA [yang menjalankan VT] dan kemudian untuk port serial". Anda juga dapat mengatur konsol ke VT tertentu, misalnya console=tty1.

"Jika Anda tidak memiliki kartu VGA di sistem Anda, port serial pertama akan secara otomatis menjadi konsol." Seperti "konsol serial" ttyS0mungkin merupakan alternatif yang paling umum tty0. Tidak mungkin untuk menggunakan sistem VT di atas konsol serial.

/ dev / tty

/dev/ttyadalah salah satu dari tiga file perangkat standar yang ditentukan oleh POSIX ( /dev/adalah salah satu dari tiga nama direktori yang ditentukan oleh POSIX). Membuka itu sama dengan membuka terminal pengendali dari proses saat ini. Terminal pengendali diatur ketika sebuah proses pertama kali membuka terminal, setidaknya di Linux . Misalnya, dalam init, itu akan merujuk /dev/console.

Melepaskan dari terminal pengendali adalah salah satu langkah yang secara tradisional diperlukan untuk memulai proses latar belakang, misalnya daemon logging sistem . Langkah-langkah untuk menjadi proses latar belakang sangat rumit, tetapi untuk lebih spesifik, langkah yang terlepas dari terminal pengendali adalah panggilan sistem setsid . Dalam sistem yang lebih modern, sistem init misalnya systemd memulai layanan tanpa terminal pengendali.

sourcejedi
sumber