"คือ/dev/console
อะไร" เป็นคำตอบในคำตอบก่อนหน้า บางทีคำตอบนั้นอาจชัดเจนกว่าเมื่อคุณรู้คำตอบของอีกสองคำถาม
ไตรมาสที่ 1 "ไฟล์อุปกรณ์ใดแสดงถึงฟิสิคัลเทอร์มินัลเอง"
ไม่มีไฟล์อุปกรณ์ดังกล่าว
ไตรมาสที่ 2 " /dev/console
ใช้ทำอะไร?"
บน Linux /dev/console
ใช้เพื่อแสดงข้อความระหว่างการเริ่มต้น (และปิด) มันยังใช้สำหรับ "โหมดผู้ใช้คนเดียว" ตามที่ระบุไว้ในคำตอบของ Stephen Kitt มีไม่มากมันสมเหตุสมผลที่จะใช้สำหรับ
"ในวันเก่า ๆ ที่ดี" ของ Unix /dev/console
เป็นอุปกรณ์ทางกายภาพโดยเฉพาะ แต่นี่ไม่ใช่กรณีใน Linux
หลักฐานที่เกี่ยวข้อง
1. "ไฟล์อุปกรณ์ที่แสดงถึงฟิสิคัลเทอร์มินัลคืออะไร"
ให้ฉันพยายามทำความเข้าใจวิธีนี้ /dev/tty{1..63}
และ/dev/pts/n
เป็นไฟล์อุปกรณ์ที่แสดงถึงอุปกรณ์ของตัวเอง (แม้ว่าจะเป็นอีมูเลชั่น) ไม่เกี่ยวข้องกับกระบวนการหรือเคอร์เนล /dev/tty0
ตอบกลับสิ่ง/dev/tty{1..63}
ที่ปัจจุบันใช้โดยบางสิ่ง (อาจเป็นเคอร์เนลหรือกระบวนการเชลล์?) /dev/tty
แสดงถึงเทอร์มินัลการควบคุมที่ใช้ในปัจจุบันโดยเซสชันกระบวนการ /dev/console
แทนเทอร์มินัลที่เคอร์เนลใช้อยู่ในปัจจุบัน?
ไฟล์อุปกรณ์ใดที่แสดงถึงฟิสิคัลเทอร์มินัลเองไม่เกี่ยวข้องกับเคอร์เนลหรือกระบวนการ
อุปกรณ์พื้นฐาน (s) สำหรับเป็น/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
หากคุณต้องการทราบข้อมูลเพิ่มเติมจริงๆยืนสำหรับโมดูล นั่นคือไม่ได้ให้อุปกรณ์คอนโซลจำลองโดยโมดูลเคอร์เนลที่โหลดได้ มันเป็นส่วนหนึ่งของภาพเคอร์เนลเริ่มต้น (aka "builtin")(M)
ประการที่สองbind
ไฟล์ในแต่ละไดเรกทอรีย่อย/sys/class/vtconsole
จะปรากฏขึ้นเพื่อบอกให้คุณทราบว่าอุปกรณ์ vtconsole ใดที่ทำงานอยู่ หากฉันเขียน0
ไปยังรายการที่ใช้งานอยู่ดูเหมือนว่าจะเปลี่ยนไปใช้รูปแบบจำลอง (GUI VTs ดูเหมือนจะไม่ได้รับผลกระทบ แต่ข้อความ VT หยุดทำงาน) การเขียน1
เพื่อหุ่นจำลองจะไม่เปิดใช้งาน วิธีใดวิธีหนึ่งจะเปลี่ยนกลับไปเป็นของจริง หากฉันอ่านรหัสอย่างถูกต้องเคล็ดลับคือecho 1 > bind
ควรทำงานกับไดรเวอร์คอนโซลที่สร้างขึ้นเป็นโมดูล (?!) เท่านั้น
สำหรับframebufferคอนโซลเฉพาะมีบางข้อมูลเพิ่มเติมเกี่ยวกับผลผูกพันอุปกรณ์ framebuffer แตกต่างกัน ( /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
ใช้ทำอะไร"
คุณสามารถใช้ / dev / console เป็นอุปกรณ์ TTY ตัวอย่างเช่นการเขียนลงไปจะเขียนไปยังอุปกรณ์ที่สำคัญซึ่งจะมีหมายเลขอุปกรณ์ของตัวเอง
บ่อยครั้งที่ / dev / console เชื่อมโยงกับ / dev / tty0 แต่บางครั้งอาจเชื่อมโยงกับอุปกรณ์อื่น
ดังนั้นในกรณีนี้การเขียนไปยัง / dev / console จะเขียนถึง / dev / tty0 และในทางกลับกันการเขียนไปยัง / dev / tty0 เทียบเท่ากับการเขียนอุปกรณ์ใดก็ตามที่ / dev / ttyN ใช้งานอยู่ในปัจจุบัน
แต่นี่ทำให้เกิดคำถามที่น่าสนใจ การเข้าถึงtty0
จะเข้าถึงคอนโซลเสมือนที่แตกต่างกันขึ้นอยู่กับว่ากำลังใช้งานอยู่ในปัจจุบัน สิ่งที่ผู้คนใช้จริงtty0
และในทำนองเดียวกันสิ่งที่console
ใช้สำหรับบน Linux?
เทคนิคคุณสามารถอ่านและเขียนจากconsole
/ tty0
ยกตัวอย่างการทำงานที่จะช่วยให้การเข้าสู่ระบบในgetty
tty0
แต่นี่เป็นเพียงการแฮ็คด่วนเท่านั้น เพราะมันหมายความว่าคุณไม่สามารถใช้ประโยชน์จากคอนโซลเสมือนหลาย ๆ ตัวของ Linux ได้
systemd
ค้นหาsysfs
แอตทริบิวต์ที่เกี่ยวข้องกับอุปกรณ์ / dev / console เพื่อตรวจสอบอุปกรณ์ TTY ที่เกี่ยวข้อง นี้จะช่วยให้systemd
การวางไข่โดยอัตโนมัติและช่วยให้การเข้าสู่ระบบในเช่นคอนโซลอนุกรมเมื่อชุดที่ใช้ขึ้นคอนโซลเคอร์เนลโดยบูตด้วยgetty
console=ttyS0
สะดวกสบาย มันหลีกเลี่ยงความจำเป็นในการกำหนดค่าคอนโซลนี้ในสองที่แตกต่างกัน man systemd-getty-generator
อีกครั้งดู อย่างไรก็ตามsystemd
ไม่ได้เปิดให้บริการ/dev/console
สำหรับสิ่งนี้
ระหว่างบูตระบบคุณอาจยังไม่ได้ติดตั้ง sysfs แต่คุณต้องการที่จะแสดงข้อความข้อผิดพลาดและความคืบหน้าโดยเร็วที่สุด! ดังนั้นเราจึงวนรอบจุด 1) เคอร์เนลเริ่ม PID 1 stdin / stdout / stderr /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/
ภาชนะ
อุปกรณ์ PTS เป็นโลคัลสำหรับการdevpts
เมานต์เฉพาะ อุปกรณ์ PTS เป็นข้อยกเว้นของกฎปกติอุปกรณ์นั้นจะถูกระบุด้วยหมายเลขอุปกรณ์ของพวกเขา อุปกรณ์ PTS ถูกระบุโดยการรวมกันของหมายเลขอุปกรณ์และdevpts
เมานต์
คุณสามารถเขียนข้อความด่วนถึงconsole
/ tty0
เพื่อเขียนไปยังคอนโซลเสมือนปัจจุบันของผู้ใช้ สิ่งนี้อาจมีประโยชน์สำหรับข้อความแสดงข้อผิดพลาดของผู้ใช้เร่งด่วนคล้ายกับข้อความเคอร์เนลเร่งด่วนซึ่งพิมพ์ไปยังคอนโซล (ดูman dmesg
) อย่างไรก็ตามการทำเช่นนี้ไม่ใช่เรื่องปกติอย่างน้อยหนึ่งครั้งระบบจะบูตเสร็จสิ้น
rsyslog มีตัวอย่างหนึ่งในหน้านี้ซึ่งพิมพ์ข้อความเคอร์เนลไปที่/dev/console
; สิ่งนี้ไม่มีประโยชน์บน Linux เนื่องจากเคอร์เนลจะดำเนินการตามค่าเริ่มต้นแล้ว ตัวอย่างหนึ่งที่ฉันไม่สามารถหาได้อีกบอกว่ามันไม่ใช่ความคิดที่ดีที่จะใช้มันสำหรับข้อความที่ไม่ใช่เคอร์เนลเพราะมันมีข้อความ syslog มากเกินไปคุณทำให้คอนโซลของคุณเต็มไปด้วยความผิด
systemd-journald ในทำนองเดียวกันมีตัวเลือกในการส่งต่อบันทึกทั้งหมดไปยังคอนโซล ในหลักการสิ่งนี้อาจมีประโยชน์สำหรับการดีบักในสภาพแวดล้อมเสมือน ถึงแม้ว่าสำหรับการแก้ไขข้อบกพร่องเรามักจะส่งต่อไป/dev/kmsg
แทน นี้ช่วยให้พวกเขาในบัฟเฟอร์บันทึก kernel dmesg
เพื่อให้คุณสามารถอ่านได้ด้วย เช่นเดียวกับข้อความที่สร้างโดยเคอร์เนลเองข้อความเหล่านี้อาจสะท้อนไปยังคอนโซลโดยขึ้นอยู่กับการกำหนดค่าเคอร์เนลปัจจุบัน