"Nedir /dev/console
?" cevaplanır önceki cevabı . Diğer iki sorunun cevabını bildiğinizde belki de bu cevap daha açıktır.
S1. "Fiziksel terminalin kendisini temsil eden aygıt dosyası nedir?"
Böyle bir cihaz dosyası yok.
S2. "Ne için /dev/console
kullanılır?"
Linux'ta, /dev/console
başlatma (ve kapatma) sırasında mesajları göstermek için kullanılır. Stephen Kitt'in cevabında belirtildiği gibi "tek kullanıcı modu" için de kullanılır. Kullanmak için mantıklı olan başka bir şey yok.
Unix'in "eski güzel günlerinde" /dev/console
özel bir fiziksel cihazdı. Ama Linux'ta durum böyle değil.
İlgili kanıtlar
1. "Fiziksel terminalin kendisini temsil eden aygıt dosyası nedir?"
Bu yolu anlamaya çalışayım. /dev/tty{1..63}
ve /dev/pts/n
işlem veya çekirdek ile ilgili değil, aygıtların kendisini (öykünme olmasına rağmen) temsil eden aygıt dosyalarıdır. /dev/tty0
bir tane reprsents /dev/tty{1..63}
anda bir şey tarafından kullanılan (belki çekirdeğiveya kabuk işlemi?). /dev/tty
şu anda bir işlem oturumu tarafından kullanılan kontrol terminalini temsil eder. /dev/console
şu anda çekirdek tarafından kullanılan terminali temsil ediyor mu?
Çekirdek veya işlemle ilgili olarak değil, fiziksel terminalin kendisini temsil eden aygıt dosyası nedir?
İçin temel aygıt (lar) /dev/tty{1..63}
dır struct con_driver
. Tüm olası sürücüleri görmek için kontrol https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console
Bu temel aygıt (lar) için aygıt dosyası yok!
Bunları yönetmek için yalnızca minimal bir kullanıcı arayüzü arayüzü vardır.
$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device
==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device
Gerçekten daha fazla bilgi edinmek istiyorsanız, modülün açılımı . Yani kukla konsol cihazı yüklenebilir bir çekirdek modülü tarafından sağlanmaz; ilk çekirdek görüntüsünün bir parçasıdır ("yerleşik" olarak da bilinir).(M)
İkinci olarak, hangi bind
alt dizindeki dosya, /sys/class/vtconsole
hangi vtconsole aygıtının etkin olduğunu bildirir. Ben yazarsam 0
aktif birine, kukla birine geçiş görünmektedir. (GUI VT'leri etkilenmemiş gibi görünür, ancak metin VT'leri çalışmayı durdurur). 1
Kukla için yazmak onu etkinleştirmez. Her iki yöntem de gerçek olana geri dönmek için çalışır. Kodu doğru okursam, hile echo 1 > bind
sadece bir modül (?!) Olarak inşa edilmiş konsol sürücüleri için çalışması gerekiyordu.
İçin karetamponu özellikle konsolları, farklı karetamponu aygıtlarını (bağlama hakkında birtakım bilgiler var /dev/fb0
spesifik sanal konsolları için ...) https://kernel.org/doc/Documentation/fb/fbcon.txt . Buna bir çekirdek seçeneği fbcon:map=
veya denilen bir komut dahildir con2fbmap
.
Tabii ki ayrıntılar farklı çekirdek sürümleri, mimariler, yazılımlar, aygıtlar, sürücüler vb. İle değişebilir. Çekirdek sadece i915
/ inteldrmfb
/ istediğiniz her şeyi yüklerken devralmaya izin verir, örneğin vgacon
.
EFI makinemin hiç olmadığı gibi görünüyor vgacon
. Bu yüzden önce kukla bir konsol kullanır ve ikincisi 1.2 saniye sonra fbcon
üstüne geçer efifb
. Ama şimdiye kadar detayların ne olduğu umurumda değildi; sadece işe yarıyor.
$ 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. "Ne için /dev/console
kullanılır?"
/ Dev / console komutunu TTY cihazı olarak kullanabilirsiniz. Örneğin, üzerine yazmak, kendine ait bir karakter cihazı numarasına sahip olacak belirli bir temel cihaza yazacaktır.
Genellikle / dev / console / dev / tty0'a bağlıdır, ancak bazen farklı bir cihaza bağlanabilir.
Yani bu durumda / dev / console'a yazmak / dev / tty0'a yazacaktır. Ve / dev / tty0'a yazmak, / dev / ttyN cihazının şu anda etkin olanlara yazmakla eşdeğerdir.
Ancak bu ilginç bir soruyu gündeme getiriyor. Erişim tty0
, o anda etkin olana bağlı olarak farklı sanal konsollara erişir. İnsanlar aslında tty0
ne için kullanıyorlar ve benzer şekilde console
Linux'ta ne için kullanılıyorlar?
Teknik olarak, oturum açmaya izin vermek için console
/ öğelerini okuyabilir ve yazabilirsiniz . Ancak bu sadece hızlı bir saldırı olarak kullanışlıdır. Çünkü bu Linux'un çoklu sanal konsollarından yararlanamayacağınız anlamına geliyor.tty0
getty
tty0
systemd
sysfs
temel TTY cihazını algılamak için / dev / console cihazıyla ilişkilendirilmiş bir özellik arar . Bu , kullanıcı önyükleme yaparak bir çekirdek konsolu ayarladığında, systemd
otomatik olarak getty
bir seri oluşturmaya ve örneğin bir seri konsolda oturum açmaya izin verir console=ttyS0
. Bu uygundur; bu konsolu iki farklı yerde yapılandırma gereğini ortadan kaldırır. Tekrar bakın man systemd-getty-generator
. Ancak, systemd
aslında bunun için açılmaz /dev/console
.
Sistem önyüklemesi sırasında, henüz sysfs yüklememiş olabilirsiniz. Ancak en kısa sürede hata ve ilerleme mesajları gösterebilmek istiyorsunuz! Bu yüzden 1). Çekirdek, stdin / stdout / stderr bağlıyken PID 1'i başlatır /dev/console
. Bu basit mekanizmanın en baştan kurulmasını sağlamak çok güzel.
Linux kapsayıcısının içinde, adresindeki dosya /dev/console
karakter aygıtı numarası değil, farklı bir şey olarak oluşturulabilir 5:1
. Bunun yerine, bir PTS cihaz dosyası olarak oluşturulabilir. Sonra bu sayede giriş yapmak mantıklı olur /dev/console
dosyası. systemd
bir kabın içinde böyle bir cihazda oturum açmaya izin verir; bakın man systemd-getty-generator
.
Bu mekanizma, systemd-nspawn
komutla bir kap çalıştırdığınızda kullanılır . (Ben sadece systemd-nspawn
bir TTY üzerinde çalıştırmak , ancak adam sayfasında arama söyleyemiyorum düşünüyorum).
systemd-nspawn
kabın /dev/console
, ana bilgisayardan bir PTS cihazının bir bağlama aparatı olarak oluşturulmasını sağlar . Bu, bu PTS cihazının /dev/pts/
kabın içinde görünmediği anlamına gelir .
PTS cihazları belirli bir devpts
yuva için yereldir . PTS cihazları normal kuralın bir istisnasıdır, cihazlar cihaz numaralarına göre tanımlanır. PTS cihazları, cihaz numaralarının ve devpts
bağlantılarının birleşimi ile tanımlanır .
Kullanıcının geçerli sanal konsoluna yazmak için console
/ öğesine acil mesajlar tty0
yazabilirsiniz. Bu, konsola yazdırılan acil çekirdek mesajlarına benzer acil kullanıcı alanı hata mesajları için yararlı olabilir (bkz. man dmesg
). Bununla birlikte, en azından sistem önyüklemeyi bitirdiğinde bunu yapmak yaygın değildir.
rsyslog'un bu sayfada çekirdek mesajlarını yazdırdığı bir örneği vardır /dev/console
; Linux'ta anlamsızdır, çünkü çekirdek zaten bunu varsayılan olarak yapar. Tekrar bulamadığım bir örnek, çekirdek olmayan mesajlar için bunu kullanmanın iyi bir fikir olmadığını söylüyor çünkü çok fazla syslog mesajı var, konsolunuzu dolduruyorsunuz ve çok fazla yol alıyor.
systemd-journalald benzer şekilde tüm günlükleri konsola iletme seçeneklerine sahiptir. Prensipte bu, sanal bir ortamda hata ayıklama için yararlı olabilir. Bununla birlikte, hata ayıklama için genellikle /dev/kmsg
bunun yerine ileri gideriz . Bu onları okuyabilmeniz için çekirdek günlük arabelleğine kaydeder dmesg
. Çekirdek tarafından oluşturulan iletiler gibi, bu iletiler de geçerli çekirdek yapılandırmasına bağlı olarak konsola yansıtılabilir.