GNU/Linux >> Belajar Linux >  >> Linux

Untuk apa `/dev/console` digunakan?

/dev/console ada terutama untuk mengekspos konsol kernel ke ruang pengguna. Dokumentasi kernel Linux pada perangkat sekarang menyatakan

Perangkat konsol, /dev/console , adalah perangkat tujuan pengiriman pesan sistem, dan login yang harus diizinkan dalam mode pengguna tunggal. Dimulai dengan Linux 2.1.71, /dev/console dikelola oleh kernel; untuk versi sebelumnya itu harus berupa tautan simbolis ke /dev/tty0 , konsol virtual tertentu seperti /dev/tty1 , atau ke port serial utama (tty* , bukan cu* ) perangkat, bergantung pada konfigurasi sistem.

/dev/console , node perangkat dengan mayor 5 dan minor 1, menyediakan akses ke apa pun yang dianggap kernel sebagai sarana utama untuk berinteraksi dengan administrator sistem; ini bisa berupa konsol fisik yang terhubung ke sistem (dengan abstraksi konsol virtual di atas, sehingga dapat menggunakan tty0 atau ttyN apa pun di mana N antara 1 dan 63), atau konsol serial, atau konsol hypervisor, atau bahkan perangkat Braille. Perhatikan bahwa kernel itu sendiri tidak menggunakan /dev/console :simpul perangkat adalah untuk ruang pengguna, bukan untuk kernel; namun, periksa /dev/console itu ada dan dapat digunakan, dan menyetel init dengan input, output, dan error standarnya yang mengarah ke /dev/console .

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

“Daftar konsol” sebenarnya adalah daftar konsol yang ditentukan oleh console= parameter boot (atau konsol default, jika tidak ada). Anda dapat melihat konsol yang didefinisikan dengan cara ini dengan melihat /proc/consoles . /dev/console memang menyediakan akses ke yang terakhir ini:

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


"Apa itu /dev/console ?" dijawab di jawaban sebelumnya. Mungkin jawaban itu lebih jelas ketika Anda mengetahui jawaban dari dua pertanyaan lainnya.

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

Tidak ada file perangkat tersebut.

Q2. "Apa itu /dev/console digunakan untuk?"

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

"Di masa lalu yang indah" dari Unix, /dev/console adalah 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 dengan cara ini. /dev/tty{1..63} dan /dev/pts/n adalah file perangkat yang mewakili perangkat itu sendiri (meskipun merupakan emulasi), bukan terkait dengan proses atau kernel. /dev/tty0 mewakili yang ada di /dev/tty{1..63} yang saat ini digunakan oleh sesuatu (mungkin kernel atau proses shell ?). /dev/tty mewakili terminal pengontrol yang saat ini digunakan oleh sesi proses. /dev/console mewakili terminal yang saat ini digunakan oleh kernel?

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

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

Tidak ada file perangkat untuk perangkat dasar ini!

Hanya ada antarmuka ruang 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, (M) singkatan dari modul. Yaitu. perangkat konsol dummy tidak disediakan oleh modul kernel yang dapat dimuat; itu adalah bagian dari gambar kernel awal (alias "bawaan").

Kedua, bind file di setiap subdirektori /sys/class/vtconsole tampaknya memberi tahu Anda perangkat vtconsole mana yang aktif. Jika saya menulis 0 ke yang aktif, tampaknya beralih ke yang tiruan. (GUI VT tampaknya tidak terpengaruh, tetapi VT teks berhenti bekerja). Menulis 1 untuk boneka tidak mengaktifkannya. Metode mana pun berfungsi untuk beralih kembali ke yang asli. Jika saya membaca kodenya dengan benar, triknya adalah echo 1 > bind seharusnya hanya berfungsi untuk driver konsol yang dibuat sebagai modul (?!).

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

Tentu saja detailnya dapat bervariasi dengan versi kernel yang berbeda, arsitektur, firmware, perangkat, driver, dll. Saya tidak pernah benar-benar harus menggunakan salah satu antarmuka di atas. Kernel membiarkan i915 / inteldrmfb / apa pun yang Anda ingin menyebutnya, ambil alih saat dimuat, ganti mis. vgacon .

Sepertinya mesin EFI saya tidak pernah memiliki vgacon . Jadi pertama menggunakan konsol boneka, dan kedua setelah 1,2 detik beralih ke fbcon , berjalan di atas efifb . Tapi sejauh ini saya tidak terlalu 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. "Apa itu /dev/console digunakan untuk?"

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

Sering kali /dev/console diikat ke /dev/tty0, tetapi terkadang terikat 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 pun yang sedang aktif.

Tapi ini menimbulkan pertanyaan yang menarik. Mengakses tty0 akan mengakses konsol virtual yang berbeda, tergantung mana yang sedang aktif. Apa yang sebenarnya digunakan orang tty0 untuk, dan juga apa itu console digunakan untuk di Linux?

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

  2. systemd lihat di sysfs untuk atribut yang terkait dengan perangkat /dev/console, untuk mendeteksi perangkat TTY yang mendasarinya. Ini memungkinkan systemd untuk menelurkan getty secara otomatis dan izinkan masuk pada mis. konsol serial, saat pengguna menyiapkan konsol kernel dengan mem-boot dengan console=ttyS0 . Ini nyaman; itu menghindari kebutuhan untuk mengonfigurasi konsol ini di dua tempat berbeda. Sekali lagi, lihat man systemd-getty-generator . Namun, systemd sebenarnya tidak membuka /dev/console untuk ini.

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

  4. Di dalam wadah Linux, file di /dev/console dapat dibuat sebagai sesuatu yang berbeda - bukan nomor perangkat karakter 5:1 . Sebaliknya, itu dapat dibuat sebagai file perangkat PTS. Maka masuk akal untuk masuk melalui /dev/console ini mengajukan. systemd di dalam wadah akan memungkinkan masuk ke perangkat semacam itu; lihat man systemd-getty-generator .

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

    systemd-nspawn membuat /dev/console penampung sebagai pengikat perangkat PTS dari host. Artinya, perangkat PTS ini tidak terlihat di dalam /dev/pts/ di dalam wadah.

    Perangkat PTS bersifat lokal untuk devpts tertentu gunung. Perangkat PTS merupakan pengecualian dari aturan normal, bahwa perangkat diidentifikasi berdasarkan nomor perangkatnya. Perangkat PTS diidentifikasi dengan kombinasi nomor perangkat mereka, dan devpts mereka pasang.

  5. Anda dapat menulis pesan penting ke console / tty0 , untuk menulis ke konsol virtual pengguna saat ini. Ini dapat berguna untuk pesan kesalahan ruang pengguna yang mendesak, mirip dengan pesan kernel mendesak yang dicetak ke konsol (lihat man dmesg ). Namun hal ini tidak umum dilakukan, paling tidak setelah sistem selesai melakukan 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. Salah satu contoh yang tidak dapat saya temukan lagi mengatakan bahwa bukan ide yang baik untuk menggunakan ini untuk pesan non-kernel karena ada terlalu banyak pesan syslog, Anda membanjiri konsol Anda dan terlalu banyak mengganggu.

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


Linux
  1. Cara membuat kata sandi acak di linux menggunakan /dev/random

  2. Linux:Perbedaan Antara /dev/console , /dev/tty Dan /dev/tty0?

  3. Seberapa Portabel /dev/stdin, /dev/stdout Dan /dev/stderr?

  1. Linux – Mengapa `/dev/ptmx` Dan `/dev/pts/ptmx` Bukan File Perangkat?

  2. Kapan Menggunakan /dev/random Vs /dev/urandom?

  3. Linux – Apa Arti Huruf 'u' Di /dev/urandom?

  1. Cara memetakan perangkat /dev/sdX dan /dev/mapper/mpathY dari perangkat /dev/dm-Z

  2. Apa itu file /dev/zero dan /dev/null di Linux?

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