"क्या है /dev/console
?" इसका उत्तर पिछले उत्तर में दिया गया है । जब आप अन्य दो प्रश्नों के उत्तर जानते हैं तो शायद यह उत्तर अधिक स्पष्ट है।
Q1। "भौतिक टर्मिनल का प्रतिनिधित्व करने वाली डिवाइस फ़ाइल क्या है?"
ऐसी कोई डिवाइस फ़ाइल नहीं है।
Q2। "किस चीज के लिए /dev/console
उपयोग किया जाता है?"
लिनक्स पर, /dev/console
स्टार्टअप (और शटडाउन) के दौरान संदेश दिखाने के लिए उपयोग किया जाता है। इसका उपयोग "एकल उपयोगकर्ता मोड" के लिए भी किया जाता है, जैसा कि स्टीफन किट के उत्तर में बताया गया है। इसके लिए इसका उपयोग करने के लिए बहुत कुछ नहीं है।
यूनिक्स के "अच्छे पुराने दिनों में" /dev/console
एक समर्पित शारीरिक उपकरण था। लेकिन लिनक्स में ऐसा नहीं है।
संबंधित साक्ष्य
1. "भौतिक टर्मिनल का प्रतिनिधित्व करने वाली डिवाइस फ़ाइल क्या है?"
मुझे इस तरह समझने की कोशिश करते हैं। /dev/tty{1..63}
और /dev/pts/n
डिवाइस फ़ाइलें हैं जो स्वयं उपकरणों का प्रतिनिधित्व करती हैं (हालांकि वे उत्सर्जन हैं), प्रक्रिया या कर्नेल के संबंध में नहीं। /dev/tty0
एक में reprsents /dev/tty{1..63}
(शायद गिरी जो वर्तमान में कुछ द्वारा किया जाता हैया शेल प्रक्रिया?)। /dev/tty
वर्तमान में प्रक्रिया सत्र द्वारा उपयोग किए जाने वाले नियंत्रण टर्मिनल का प्रतिनिधित्व करता है। /dev/console
वर्तमान में कर्नेल द्वारा उपयोग किए जाने वाले टर्मिनल का प्रतिनिधित्व करता है?
भौतिक टर्मिनल का प्रतिनिधित्व करने वाली डिवाइस फ़ाइल क्या है, कर्नेल या प्रक्रिया के संबंध में नहीं?
के लिए अंतर्निहित डिवाइस /dev/tty{1..63}
हैं struct con_driver
। सभी संभावित ड्राइवरों को देखने के लिए, https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console देखें।
इन अंतर्निहित डिवाइस के लिए कोई डिवाइस फ़ाइल नहीं है!
उन्हें प्रबंधित करने के लिए केवल एक न्यूनतम उपयोगकर्ता इंटरफ़ेस है।
$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device
==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device
यदि आप वास्तव में अधिक जानना चाहते हैं, तो (M)
मॉड्यूल के लिए खड़ा है । यानी डमी कंसोल डिवाइस एक लोडेबल कर्नेल मॉड्यूल द्वारा प्रदान नहीं किया जाता है; यह प्रारंभिक कर्नेल छवि (उर्फ "बिलिन") का हिस्सा है।
दूसरे, bind
प्रत्येक उपनिर्देशिका में फ़ाइल /sys/class/vtconsole
आपको बताती है कि कौन सा vtconsole डिवाइस सक्रिय है। अगर मैं 0
सक्रिय एक को लिखता हूं , तो यह डमी पर स्विच करने के लिए प्रकट होता है। (GUI VTs अप्रभावित लगते हैं, लेकिन पाठ VTs काम करना बंद कर देते हैं)। 1
डमी के लिए लेखन इसे सक्रिय नहीं करता है। या तो विधि वास्तविक एक पर वापस जाने के लिए काम करती है। यदि मैं कोड को सही ढंग से पढ़ता हूं, तो चाल echo 1 > bind
केवल कंसोल ड्राइवरों के लिए काम करने वाली है जो एक मॉड्यूल (!) के रूप में निर्मित होती है।
विशेष रूप से फ़्रेमबफ़र कंसोल के लिए , विभिन्न फ़्रेमबफ़र डिवाइस ( /dev/fb0
...) को विशिष्ट वर्चुअल कंसोल को https://kernel.org/doc/Documentation/fb/fbcon.txt में बाँधने के बारे में कुछ और जानकारी है । इसमें एक कर्नेल विकल्प fbcon:map=
या एक कमांड शामिल है जिसे कहा जाता है con2fbmap
।
बेशक विवरण अलग-अलग कर्नेल संस्करण, आर्किटेक्चर, फ़र्मवेयर, डिवाइस, ड्राइवर, आदि के साथ भिन्न हो सकते हैं। मुझे वास्तव में ऊपर दिए गए किसी भी इंटरफेस का उपयोग नहीं करना है। कर्नेल बस देता है i915
/ inteldrmfb
/ जो भी आप इसे कॉल करना चाहते हैं जब यह लोड होता है, उदाहरण के लिए vgacon
।
ऐसा लगता है कि मेरी EFI मशीन कभी नहीं है vgacon
। तो सबसे पहले यह एक डमी कंसोल का उपयोग करता है, और दूसरी बार 1.2 सेकंड के बाद यह स्विच करता है fbcon
, शीर्ष पर चल रहा है efifb
। लेकिन अभी तक मुझे इस बात की परवाह नहीं थी कि विवरण क्या हैं; यह सिर्फ काम करता है।
$ 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. "किसके लिए /dev/console
उपयोग किया जाता है?"
आप TTY डिवाइस के रूप में / dev / कंसोल का उपयोग कर सकते हैं। इसके लिए लिखना, उदाहरण के लिए, एक विशिष्ट अंतर्निहित डिवाइस पर लिखेंगे, जिसमें स्वयं का एक वर्ण डिवाइस नंबर भी होगा।
अक्सर / देव / कंसोल / देव / tty0 से बंधा होता है, लेकिन कभी-कभी यह एक अलग डिवाइस से बंधा हो सकता है।
तो इस मामले में / dev / कंसोल पर लिखना / dev / tty0 को लिखना होगा। और बदले में, लिखने के लिए / dev / tty0 जो भी / dev / ttyN डिवाइस वर्तमान में सक्रिय है लिखने के बराबर है।
लेकिन इससे एक दिलचस्प सवाल उठता है। tty0
पहुँच विभिन्न वर्चुअल कंसोल तक पहुँच जाएगी, जिसके आधार पर वर्तमान में सक्रिय है। लोग वास्तव में क्या उपयोग tty0
करते हैं, और इसी तरह console
लिनक्स पर किसके लिए उपयोग किया जाता है?
तकनीकी रूप से, आप पढ़ सकते हैं और console
/ से लिख सकते हैं tty0
, उदाहरण के लिए, getty
लॉग ऑन करने की अनुमति देने के लिए tty0
। लेकिन यह केवल एक त्वरित हैक के रूप में उपयोगी है। क्योंकि इसका मतलब है कि आप लिनक्स के कई वर्चुअल कंसोल का लाभ नहीं उठा सकते हैं।
systemd
sysfs
अंतर्निहित TTY डिवाइस का पता लगाने के लिए / dev / कंसोल डिवाइस से संबद्ध विशेषता के लिए दिखता है। यह systemd
स्वचालित रूप से स्पॉन करने की अनुमति देता है getty
और उदाहरण के लिए एक सीरियल कंसोल पर लॉगिंग की अनुमति देता है, जब उपयोगकर्ता बूट करके कर्नेल कंसोल सेट करता है console=ttyS0
। यह सुविधाजनक है; यह दो अलग-अलग स्थानों में इस कंसोल को कॉन्फ़िगर करने की आवश्यकता से बचा जाता है। फिर से, देखें man systemd-getty-generator
। हालाँकि, systemd
वास्तव में इसके लिए खुला नहीं है /dev/console
।
सिस्टम बूटस्ट्रैप के दौरान, आपके पास अभी तक sysfs माउंट नहीं हो सकते हैं। लेकिन आप जल्द से जल्द त्रुटि और प्रगति संदेश दिखाना चाहते हैं! इसलिए हम बिंदु 1 पर चक्कर लगाते हैं)। कर्नेल पीआईडी 1 को स्टडिन / स्टडआउट / स्टडर से जुड़ा हुआ है /dev/console
। यह बहुत आसान है कि यह सरल तंत्र शुरू से ही सही हो।
एक लिनक्स कंटेनर के अंदर, फ़ाइल /dev/console
को कुछ अलग बनाया जा सकता है - चरित्र डिवाइस नंबर नहीं 5:1
। इसके बजाय, इसे PTS डिवाइस फ़ाइल के रूप में बनाया जा सकता है। तब यह इस /dev/console
फ़ाइल के माध्यम से लॉग इन करने के लिए समझ में आता है । systemd
एक कंटेनर के अंदर ऐसे उपकरण पर लॉगिंग की अनुमति देगा; देखते हैं man systemd-getty-generator
।
जब आप systemd-nspawn
कमांड के साथ कंटेनर चलाते हैं तो इस तंत्र का उपयोग किया जाता है । (मुझे लगता है कि केवल जब आप systemd-nspawn
एक TTY पर चलते हैं , हालांकि मैं मैन पेज को खोजने से नहीं बता सकता)।
systemd-nspawn
कंटेनर /dev/console
को होस्ट से PTS डिवाइस के बाइंड माउंट के रूप में बनाता है । इसका मतलब है कि यह PTS डिवाइस /dev/pts/
कंटेनर के अंदर दिखाई नहीं दे रहा है ।
पीटीएस डिवाइस एक विशिष्ट devpts
माउंट के लिए स्थानीय हैं । पीटीएस डिवाइस सामान्य नियम का एक अपवाद हैं, कि उपकरणों को उनके डिवाइस नंबर से पहचाना जाता है। पीटीएस उपकरणों की पहचान उनके डिवाइस नंबर और उनके devpts
माउंट के संयोजन से की जाती है ।
आप उपयोगकर्ता के वर्तमान वर्चुअल कंसोल पर लिखने के लिए console
/ को तत्काल संदेश लिख सकते हैं tty0
। यह तत्काल कर्नेल संदेशों के लिए उपयोगी हो सकता है, जो तत्काल कर्नेल संदेशों के समान हैं जो कंसोल (देखें man dmesg
) पर मुद्रित होते हैं । हालाँकि, ऐसा करना सामान्य नहीं है, कम से कम एक बार सिस्टम बूटिंग समाप्त कर लेता है।
rsyslog का इस पृष्ठ पर एक उदाहरण है , जो कर्नेल संदेशों को प्रिंट करता है /dev/console
; यह लिनक्स पर व्यर्थ है क्योंकि कर्नेल डिफ़ॉल्ट रूप से पहले से ही ऐसा करेगा। एक उदाहरण जो मुझे फिर से नहीं मिल रहा है कि यह गैर-कर्नेल संदेशों के लिए उपयोग करने के लिए एक अच्छा विचार नहीं है क्योंकि बहुत सारे syslog संदेश हैं, आप अपने कंसोल को बाढ़ देते हैं और यह बहुत अधिक तरीके से हो जाता है।
systemd-journald में कंसोल के सभी लॉग्स को अग्रेषित करने के विकल्प हैं। सिद्धांत रूप में यह वर्चुअल वातावरण में डीबगिंग के लिए उपयोगी हो सकता है। हालांकि, डिबगिंग के लिए हम आम तौर पर /dev/kmsg
इसके बजाय आगे बढ़ते हैं । यह उन्हें कर्नेल लॉग बफर में बचाता है ताकि आप उन्हें पढ़ सकें dmesg
। कर्नेल द्वारा उत्पन्न संदेशों की तरह, ये संदेश वर्तमान कर्नेल कॉन्फ़िगरेशन के आधार पर कंसोल पर प्रतिध्वनित हो सकते हैं।