Untuk apa `/ dev / console`?

13

Dari jawaban ini untuk Linux: Perbedaan antara / dev / console, / dev / tty dan / dev / tty0

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.

Dengan " System console ", /dev/consolesepertinya seperti file perangkat terminal fisik teks, sama seperti /dev/tty{1..63}file perangkat untuk konsol virtual.

Dengan " /dev/consoledan /dev/tty0mewakili tampilan saat ini dan biasanya sama", /dev/consolemenurut saya itu juga bisa menjadi file perangkat konsol virtual. /dev/consolesepertinya lebih /dev/tty0dari suka /dev/tty{1..63}( /dev/tty0adalah konsol virtual yang aktif saat ini, dan bisa berupa apa saja /dev/tty{1..63}).

Apa /dev/console? Untuk apa ini digunakan?

Apakah /dev/consolememainkan peran yang sama untuk kernel Linux seperti /dev/ttyproses? (Apakah /dev/ttyterminal pengendali dari sesi proses dari proses, dan dapat berupa poin, di /dev/ttynmana ndari 1 hingga 63, atau lebih?)

Jawaban lain menyebutkan:

Dokumentasi kernel menetapkan /dev/consolesebagai perangkat karakter bernomor 5: 1. Membuka perangkat karakter ini membuka konsol "utama", yang merupakan tty terakhir dalam daftar konsol.

Apakah "daftar konsol" berarti semua console='s di opsi boot ?

Dengan " /dev/consolesebagai perangkat karakter bernomor 5: 1", apakah itu berarti /dev/consolefile perangkat terminal teks fisik yaitu konsol sistem? (Tetapi sekali lagi, balasan pertama yang saya kutip di atas mengatakan /dev/consolebisa sama dengan /dev/tty0yang bukan terminal teks fisik, tetapi konsol virtual)

Terima kasih.

Tim
sumber
Saya membuat beberapa penggantian untuk halaman buku panduan yang hilang beberapa tahun yang lalu: jdebp.eu./Proposals/linux-kvt-manual-pages.html
JdeBP

Jawaban:

18

/dev/consoleada terutama untuk mengekspos konsol kernel ke userspace. Dokumentasi kernel Linux pada perangkat sekarang mengatakan

Perangkat konsol /dev/console,, adalah perangkat yang pesan sistemnya harus dikirim, dan di mana info masuk harus diizinkan dalam mode pengguna tunggal. Dimulai dengan Linux 2.1.71, /dev/consoledikelola oleh kernel; untuk versi sebelumnya itu harus berupa tautan simbolis ke salah satu /dev/tty0, konsol virtual tertentu seperti /dev/tty1, atau ke perangkat utama port serial ( tty*, bukan cu*), tergantung pada konfigurasi sistem.

/dev/console, simpul perangkat dengan mayor 5 dan minor 1, menyediakan akses ke apa pun yang dianggap kernel sebagai sarana utamanya untuk berinteraksi dengan administrator sistem; ini dapat berupa konsol fisik yang terhubung ke sistem (dengan abstraksi konsol virtual di atasnya, sehingga dapat digunakan tty0atau di ttyNmana N berada di antara 1 dan 63), atau konsol serial, atau konsol hypervisor, atau bahkan perangkat Braille. Perhatikan bahwa kernel itu sendiri tidak menggunakan /dev/console: node perangkat adalah untuk userspace, bukan untuk kernel; itu, bagaimanapun, memeriksa yang /dev/consoleada dan dapat digunakan, dan mengatur initdengan input standar, output dan kesalahan menunjuk ke /dev/console.

Seperti dijelaskan di sini, /dev/consoleadalah perangkat karakter dengan mayor tetap dan minor karena merupakan perangkat terpisah (seperti, cara mengakses kernel; bukan perangkat fisik), tidak setara dengan /dev/tty0atau perangkat lain. Ini agak mirip dengan situasi/dev/tty yang merupakan perangkatnya sendiri (5: 0) karena ia menyediakan fitur yang sedikit berbeda dari konsol virtual atau perangkat terminal lainnya.

"Daftar konsol" memang daftar konsol yang ditentukan oleh console=parameter boot (atau konsol default, jika tidak ada). Anda dapat melihat konsol yang ditentukan dengan cara ini dengan melihat /proc/consoles. /dev/consolememang memberikan akses ke yang terakhir ini :

Anda dapat menentukan beberapa opsi konsol = pada baris perintah kernel. Output akan muncul pada mereka semua. Perangkat terakhir akan digunakan saat Anda membuka /dev/console.

Stephen Kitt
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
terdon
6

"Apa itu /dev/console?" dijawab dalam jawaban sebelumnya . Mungkin jawaban itu lebih jelas ketika Anda tahu jawaban untuk dua pertanyaan lainnya.

Q1. "Apa file perangkat yang mewakili terminal fisik itu sendiri?"

Tidak ada file perangkat seperti itu.

Q2. "Untuk apa /dev/console?"

Di Linux, /dev/consoledigunakan untuk menampilkan pesan saat startup (dan shutdown). Ini juga digunakan untuk "mode pengguna tunggal", seperti yang ditunjukkan dalam jawaban Stephen Kitt. Tidak banyak lagi yang masuk akal untuk menggunakannya.

"Di masa lalu yang indah" Unix, /dev/consoleadalah perangkat fisik khusus. Tapi ini tidak terjadi di Linux.

Bukti terkait

1. "Apa file perangkat yang mewakili terminal fisik itu sendiri?"

Biarkan saya mencoba memahami cara ini. /dev/tty{1..63}dan /dev/pts/nmerupakan file perangkat yang mewakili perangkat itu sendiri (walaupun emulasi), tidak terkait dengan proses atau kernel. /dev/tty0mewakili /dev/tty{1..63}yang saat ini digunakan oleh sesuatu (mungkin kernelatau proses shell?). /dev/ttymewakili terminal pengendali yang saat ini digunakan oleh sesi proses. /dev/consolemewakili terminal yang saat ini digunakan oleh kernel?

Apa file perangkat yang mewakili terminal fisik itu sendiri, bukan dalam kaitannya dengan kernel atau proses?

Perangkat yang mendasarinya /dev/tty{1..63}adalah struct con_driver. Untuk melihat semua kemungkinan driver, periksa https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console

Tidak ada file perangkat untuk perangkat yang mendasarinya!


Hanya ada antarmuka pengguna minimal untuk mengelolanya.

$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device

==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device

Jika Anda benar-benar ingin tahu lebih banyak, yang (M)berdiri untuk modul . Yaitu perangkat konsol dummy tidak disediakan oleh modul kernel yang dapat dimuat; ini adalah bagian dari imej kernel awal (alias "builtin").

Kedua, bindfile di setiap subdirektori dari /sys/class/vtconsolemuncul untuk memberi tahu Anda perangkat vtconsole mana yang aktif. Jika saya menulis 0ke yang aktif, tampaknya beralih ke yang dummy. (GUI VTs tampaknya tidak terpengaruh, tetapi teks VTs berhenti bekerja). Menulis 1untuk boneka tidak mengaktifkannya. Metode mana pun berfungsi untuk beralih kembali ke yang asli. Jika saya membaca kode dengan benar, triknya adalah yang echo 1 > bindseharusnya hanya berfungsi untuk driver konsol yang dibangun sebagai modul (?!).

Untuk konsol framebuffer secara khusus, ada beberapa informasi lebih lanjut tentang mengikat berbagai perangkat framebuffer ( /dev/fb0...) ke konsol virtual tertentu di https://kernel.org/doc/Documentation/fb/fbcon.txt . Ini melibatkan opsi kernel fbcon:map=atau perintah yang disebut con2fbmap.

Tentu saja detailnya dapat bervariasi dengan versi kernel, arsitektur, firmware, perangkat, driver, dll. Saya tidak pernah benar-benar harus menggunakan antarmuka apa pun di atas. Kernel hanya membiarkan i915/ inteldrmfb/ apa pun yang Anda ingin menyebutnya mengambil alih ketika ia memuat, menggantikan mis vgacon.

Sepertinya mesin EFI saya tidak pernah memilikinya vgacon. Jadi pertama menggunakan konsol boneka, dan kedua setelah 1,2 detik beralih ke fbcon, berjalan di atas efifb. Tapi sejauh ini saya tidak perlu peduli dengan detailnya; itu hanya berfungsi.

$ 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. "Untuk apa /dev/consoledigunakan?"

Anda dapat menggunakan / dev / console sebagai perangkat TTY. Menulis ke sana, misalnya, akan menulis ke perangkat tertentu yang mendasarinya, yang juga akan memiliki nomor perangkat karakter sendiri.

Seringkali / dev / console diikat ke / dev / tty0, tetapi kadang-kadang itu dapat diikat ke perangkat lain.

Jadi dalam hal ini menulis ke / dev / console akan menulis ke / dev / tty0. Dan pada gilirannya, menulis ke / dev / tty0 sama dengan menulis ke perangkat / dev / ttyN mana saja yang sedang aktif.

Tapi ini menimbulkan pertanyaan menarik. Mengakses tty0akan mengakses berbagai konsol virtual, tergantung yang sedang aktif. Apa yang sebenarnya digunakan orang tty0, dan apa pula yang consoledigunakan untuk Linux?

  1. Secara teknis, Anda dapat membaca dan menulis dari console/ tty0, misalnya menjalankan a gettyuntuk mengizinkan masuk tty0. Tapi ini hanya berguna sebagai peretasan cepat. Karena itu berarti Anda tidak dapat memanfaatkan beberapa konsol virtual Linux.

  2. systemdmencari sysfsatribut yang terkait dengan perangkat / dev / console, untuk mendeteksi perangkat TTY yang mendasarinya. Hal ini memungkinkan systemduntuk secara otomatis menelurkan a gettydan memungkinkan masuk pada misalnya konsol serial, ketika pengguna mengatur konsol kernel dengan boot dengan console=ttyS0. Ini nyaman; itu menghindari perlunya mengkonfigurasi konsol ini di dua tempat yang berbeda. Sekali lagi, lihat man systemd-getty-generator. Namun, systemdsebenarnya tidak terbuka /dev/consoleuntuk ini.

  3. Selama bootstrap sistem, Anda mungkin belum menginstal sysfs. Tetapi Anda ingin dapat menampilkan pesan kesalahan dan progres sesegera mungkin! Jadi kita berputar ke titik 1). Kernel memulai PID 1 dengan stdin / stdout / stderr terhubung /dev/console. Sangat menyenangkan memiliki mekanisme sederhana ini diatur sejak awal.

  4. Di dalam wadah Linux, file di /dev/consoledapat dibuat sebagai sesuatu yang berbeda - bukan nomor perangkat karakter 5:1. Sebagai gantinya, ini dapat dibuat sebagai file perangkat PTS. Maka masuk akal untuk masuk melalui /dev/consolefile ini . systemddi dalam sebuah wadah akan memungkinkan masuk pada perangkat seperti itu; lihat man systemd-getty-generator.

    Mekanisme ini digunakan ketika Anda menjalankan wadah dengan systemd-nspawnperintah. (Saya pikir hanya ketika Anda menjalankan systemd-nspawnpada TTY, meskipun saya tidak tahu dari mencari halaman manual).

    systemd-nspawnmembuat wadah /dev/consolesebagai bind mount perangkat PTS dari host. Ini berarti bahwa perangkat PTS ini tidak terlihat di /dev/pts/dalam wadah.

    Perangkat PTS bersifat lokal untuk devptspemasangan tertentu . Perangkat PTS merupakan pengecualian terhadap aturan normal, bahwa perangkat diidentifikasi berdasarkan nomor perangkatnya. Perangkat PTS diidentifikasi oleh kombinasi nomor perangkat mereka, dan devptsdudukannya.

  5. Anda dapat menulis pesan mendesak ke console/ tty0, untuk menulis ke konsol virtual pengguna saat ini. Ini bisa berguna untuk pesan kesalahan pengguna yang mendesak, mirip dengan pesan kernel yang mendesak yang dicetak ke konsol (lihat man dmesg). Namun tidak umum untuk melakukan ini, setidaknya setelah sistem selesai booting.

    rsyslog memiliki satu contoh di halaman ini , yang mencetak pesan kernel ke /dev/console; ini tidak ada gunanya di Linux karena kernel sudah melakukannya secara default. Satu contoh yang saya tidak dapat temukan lagi mengatakan bahwa ini bukan ide yang baik untuk menggunakan ini untuk pesan non-kernel karena ada terlalu banyak pesan syslog, Anda membanjiri konsol Anda dan terlalu banyak menghalangi.

    systemd-journald juga memiliki opsi untuk meneruskan semua log ke konsol. Pada prinsipnya ini mungkin berguna untuk debugging di lingkungan virtual. Meskipun, untuk debugging, kami biasanya meneruskan /dev/kmsg. Ini menyimpannya dalam buffer log kernel sehingga Anda dapat membacanya dmesg. Seperti pesan yang dihasilkan oleh kernel itu sendiri, pesan-pesan ini dapat digaungkan ke konsol tergantung pada konfigurasi kernel saat ini.

sourcejedi
sumber
Sebagai pelengkap untuk poin 2, dulu biasa (tidak hanya di Linux) untuk menjalankan xconsoleuntuk melacak apa yang sedang terjadi ;-). (Dan untuk menghindari agar pesan tidak ditulis langsung ke framebuffer, misalnya di SPARCstations.)
Stephen Kitt
@StephenKitt ketika saya pertama kali menggunakan SUSE Linux, saya pikir itu mulai xconsole, atau ste up sehingga Anda bisa memulainya dari menu utama desktop, atau sesuatu - Saya tidak ingat persis tetapi saya telah melihatnya :-).
sourcejedi
Biarkan saya mencoba memahami cara ini. /dev/tty{1..63}dan /dev/pts/nmerupakan file perangkat yang mewakili perangkat itu sendiri (walaupun emulasi), tidak terkait dengan proses atau kernel. /dev/tty0reprsents /dev/tty{1..63}yang saat ini digunakan oleh sesuatu (mungkin kernel atau proses shell?). /dev/ttymewakili terminal pengendali yang saat ini digunakan oleh sesi proses. /dev/consolemewakili terminal yang saat ini digunakan oleh kernel? Apa file perangkat yang mewakili terminal fisik itu sendiri, bukan dalam kaitannya dengan kernel atau proses?
Tim
@Tim "/ dev / tty0 merepresentasikan yang ada di /dev/tty{1..63} yang saat ini digunakan oleh sesuatu (mungkin proses kernel atau shell?)" - kernel.
sourcejedi
Apa file perangkat yang mewakili terminal fisik itu sendiri, bukan dalam kaitannya dengan kernel atau proses?
Tim