"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/console
digunakan 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/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 cara ini. /dev/tty{1..63}
dan /dev/pts/n
merupakan file perangkat yang mewakili perangkat itu sendiri (walaupun emulasi), tidak terkait dengan proses atau kernel. /dev/tty0
mewakili /dev/tty{1..63}
yang saat ini digunakan oleh sesuatu (mungkin kernelatau proses shell?). /dev/tty
mewakili terminal pengendali 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 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, bind
file di setiap subdirektori dari /sys/class/vtconsole
muncul untuk memberi tahu Anda perangkat vtconsole mana yang aktif. Jika saya menulis 0
ke yang aktif, tampaknya beralih ke yang dummy. (GUI VTs tampaknya tidak terpengaruh, tetapi teks VTs berhenti bekerja). Menulis 1
untuk boneka tidak mengaktifkannya. Metode mana pun berfungsi untuk beralih kembali ke yang asli. Jika saya membaca kode dengan benar, triknya adalah yang echo 1 > bind
seharusnya 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/console
digunakan?"
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 tty0
akan mengakses berbagai konsol virtual, tergantung yang sedang aktif. Apa yang sebenarnya digunakan orang tty0
, dan apa pula yang console
digunakan untuk Linux?
Secara teknis, Anda dapat membaca dan menulis dari console
/ tty0
, misalnya menjalankan a getty
untuk mengizinkan masuk tty0
. Tapi ini hanya berguna sebagai peretasan cepat. Karena itu berarti Anda tidak dapat memanfaatkan beberapa konsol virtual Linux.
systemd
mencari sysfs
atribut yang terkait dengan perangkat / dev / console, untuk mendeteksi perangkat TTY yang mendasarinya. Hal ini memungkinkan systemd
untuk secara otomatis menelurkan a getty
dan 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, systemd
sebenarnya tidak terbuka /dev/console
untuk ini.
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.
Di dalam wadah Linux, file di /dev/console
dapat 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/console
file ini . systemd
di dalam sebuah wadah akan memungkinkan masuk pada perangkat seperti itu; lihat man systemd-getty-generator
.
Mekanisme ini digunakan ketika Anda menjalankan wadah dengan systemd-nspawn
perintah. (Saya pikir hanya ketika Anda menjalankan systemd-nspawn
pada TTY, meskipun saya tidak tahu dari mencari halaman manual).
systemd-nspawn
membuat wadah /dev/console
sebagai bind mount perangkat PTS dari host. Ini berarti bahwa perangkat PTS ini tidak terlihat di /dev/pts/
dalam wadah.
Perangkat PTS bersifat lokal untuk devpts
pemasangan tertentu . Perangkat PTS merupakan pengecualian terhadap aturan normal, bahwa perangkat diidentifikasi berdasarkan nomor perangkatnya. Perangkat PTS diidentifikasi oleh kombinasi nomor perangkat mereka, dan devpts
dudukannya.
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.