`/ dev / console` ใช้ทำอะไร?


13

จากคำตอบนี้ถึงLinux: ความแตกต่างระหว่าง / dev / console, / dev / tty และ / dev / tty0

จาก เอกสารประกอบ :

/dev/tty      Current TTY device
/dev/console  System console
/dev/tty0     Current virtual console

ในสมัยก่อน/dev/consoleเป็นคอนโซลผู้ดูแลระบบ และ TTY เป็นอุปกรณ์อนุกรมของผู้ใช้ที่เชื่อมต่อกับเซิร์ฟเวอร์ ตอนนี้ /dev/consoleและ/dev/tty0แสดงการแสดงผลปัจจุบันและมักจะเหมือนกัน คุณสามารถแทนที่มันตัวอย่างเช่นโดยการเพิ่ม การconsole=ttyS0 grub.confหลังจากนั้นของคุณ/dev/tty0คือการตรวจสอบและเป็น/dev/console/dev/ttyS0

โดย " System console " /dev/consoleดูเหมือนว่าไฟล์อุปกรณ์ของเทอร์มินัลฟิสิคัลข้อความเหมือนกับ/dev/tty{1..63}ไฟล์อุปกรณ์สำหรับคอนโซลเสมือน

โดย " /dev/consoleและ/dev/tty0เป็นตัวแทนของการแสดงผลในปัจจุบันและมักจะเหมือนกัน" /dev/consoleดูเหมือนว่าฉันยังสามารถเป็นไฟล์อุปกรณ์ของคอนโซลเสมือน /dev/consoleดูเหมือนเป็น/dev/tty0มากกว่า/dev/tty{1..63}( เช่น/dev/tty0เป็นคอนโซลเสมือนที่ใช้งานอยู่ในปัจจุบันและสามารถเป็นได้/dev/tty{1..63})

คือ/dev/consoleอะไร ใช้ทำอะไร?

ไม่/dev/consoleเล่นบทบาทเดียวกันสำหรับลินุกซ์เคอร์เนลเป็น/dev/ttyกระบวนการหรือไม่? ( /dev/ttyเป็นสถานีควบคุมของเซสชั่นขั้นตอนของกระบวนการและสามารถเป็นจุด/dev/ttynที่nเป็น 1-63 หรือมากกว่า?)

การตอบกลับอื่น ๆกล่าวถึง:

เอกสารเคอร์เนลระบุ/dev/consoleว่าเป็นอุปกรณ์ตัวอักษรหมายเลข 5: 1 การเปิดอุปกรณ์อักขระนี้จะเปิดคอนโซล "main" ซึ่งเป็น tty สุดท้ายในรายการคอนโซล

ไม่ "รายการของคอนโซล" หมายถึงทั้งหมดconsole=ของในตัวเลือกการบูต ?

โดย " /dev/consoleเป็นอุปกรณ์ตัวอักษรหมายเลข 5: 1" หมายความว่า/dev/consoleเป็นไฟล์อุปกรณ์ของเทอร์มินัลข้อความจริงเช่นคอนโซลระบบหรือไม่? (แต่อีกครั้งคำตอบแรกที่ฉันยกมาข้างต้นบอกว่า/dev/consoleสามารถเหมือนกัน/dev/tty0ซึ่งไม่ใช่เทอร์มินัลข้อความจริง แต่เป็นคอนโซลเสมือน)

ขอบคุณ


ฉันสร้างทดแทนบางอย่างสำหรับหน้าคู่มือที่หายไปปีที่ผ่านมา: jdebp.eu./Proposals/linux-kvt-manual-pages.html
JdeBP

คำตอบ:


18

/dev/consoleมีอยู่เป็นหลักในการเปิดเผยคอนโซลของเคอร์เนลไปยัง userspace ตอนนี้เอกสารของเคอร์เนล Linux บนอุปกรณ์บอกว่า

อุปกรณ์คอนโซล/dev/consoleคืออุปกรณ์ที่ควรส่งข้อความของระบบและอนุญาตให้ลงชื่อเข้าใช้ในโหมดผู้ใช้คนเดียว เริ่มต้นด้วย Linux 2.1.71 /dev/consoleจัดการโดยเคอร์เนล สำหรับเวอร์ชันก่อนหน้านี้ควรเป็นลิงก์สัญลักษณ์ไปยัง/dev/tty0คอนโซลเสมือนเฉพาะเช่น/dev/tty1หรืออุปกรณ์พอร์ตหลัก ( tty*ไม่ใช่cu*) ขึ้นอยู่กับการกำหนดค่าของระบบ

/dev/consoleโหนดอุปกรณ์ที่มีเมเจอร์ 5 และรอง 1 ให้การเข้าถึงสิ่งที่เคอร์เนลพิจารณาว่าเป็นวิธีการหลักในการโต้ตอบกับผู้ดูแลระบบ นี่อาจเป็นฟิสิคัลคอนโซลที่เชื่อมต่อกับระบบ (โดยมี virtual console abstraction อยู่ด้านบนดังนั้นจึงสามารถใช้tty0หรือttyNตำแหน่งใด ๆที่Nอยู่ระหว่าง 1 ถึง 63) หรือคอนโซลอนุกรมหรือคอนโซลไฮเปอร์ไวเซอร์หรือแม้แต่อุปกรณ์อักษรเบรลล์ โปรดทราบว่าเคอร์เนลไม่ได้ใช้งาน/dev/console: โหนดอุปกรณ์มีไว้สำหรับ userspace ไม่ใช่สำหรับเคอร์เนล มันไม่ แต่ตรวจสอบว่า/dev/consoleมีอยู่และเป็นที่ใช้งานและชุดขึ้นกับการเข้ามาตรฐานส่งออกและความผิดพลาดของมันชี้ไปที่init/dev/console

ตามที่อธิบายไว้ที่นี่/dev/consoleเป็นอุปกรณ์ตัวละครที่มีอุปกรณ์หลักและรองเนื่องจากเป็นอุปกรณ์แยกต่างหาก (เช่นในวิธีการเข้าถึงเคอร์เนลไม่ใช่อุปกรณ์ทางกายภาพ) ไม่เทียบเท่า/dev/tty0หรืออุปกรณ์อื่น ๆ สิ่งนี้ค่อนข้างคล้ายกับสถานการณ์/dev/ttyที่เป็นอุปกรณ์ของตัวเอง (5: 0) เนื่องจากมีคุณสมบัติที่แตกต่างกันเล็กน้อยกว่าคอนโซลเสมือนหรืออุปกรณ์เทอร์มินัลอื่น ๆ

“ รายการคอนโซล” เป็นรายการคอนโซลที่กำหนดโดยconsole=พารามิเตอร์การบูต (หรือคอนโซลเริ่มต้นหากไม่มี) /proc/consolesท่านสามารถเข้าดูคอนโซลที่กำหนดไว้ในลักษณะนี้โดยดูที่ /dev/consoleไม่ให้การเข้าถึงล่าสุด :

คุณสามารถระบุตัวเลือก console = หลายตัวในบรรทัดคำสั่งเคอร์เนล ผลลัพธ์จะปรากฏในทุกรายการ /dev/consoleอุปกรณ์ที่ผ่านมาจะถูกใช้เมื่อคุณเปิด


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
terdon

6

"คือ/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?

  1. เทคนิคคุณสามารถอ่านและเขียนจากconsole/ tty0ยกตัวอย่างการทำงานที่จะช่วยให้การเข้าสู่ระบบในgetty tty0แต่นี่เป็นเพียงการแฮ็คด่วนเท่านั้น เพราะมันหมายความว่าคุณไม่สามารถใช้ประโยชน์จากคอนโซลเสมือนหลาย ๆ ตัวของ Linux ได้

  2. systemdค้นหาsysfsแอตทริบิวต์ที่เกี่ยวข้องกับอุปกรณ์ / dev / console เพื่อตรวจสอบอุปกรณ์ TTY ที่เกี่ยวข้อง นี้จะช่วยให้systemdการวางไข่โดยอัตโนมัติและช่วยให้การเข้าสู่ระบบในเช่นคอนโซลอนุกรมเมื่อชุดที่ใช้ขึ้นคอนโซลเคอร์เนลโดยบูตด้วยgetty console=ttyS0สะดวกสบาย มันหลีกเลี่ยงความจำเป็นในการกำหนดค่าคอนโซลนี้ในสองที่แตกต่างกัน man systemd-getty-generatorอีกครั้งดู อย่างไรก็ตามsystemdไม่ได้เปิดให้บริการ/dev/consoleสำหรับสิ่งนี้

  3. ระหว่างบูตระบบคุณอาจยังไม่ได้ติดตั้ง sysfs แต่คุณต้องการที่จะแสดงข้อความข้อผิดพลาดและความคืบหน้าโดยเร็วที่สุด! ดังนั้นเราจึงวนรอบจุด 1) เคอร์เนลเริ่ม PID 1 stdin / stdout / stderr /dev/consoleเชื่อมต่อกับ เป็นเรื่องดีมากที่มีการตั้งค่ากลไกอย่างง่ายตั้งแต่เริ่มต้น

  4. ภายในภาชนะลินุกซ์ไฟล์ที่/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เมานต์

  5. คุณสามารถเขียนข้อความด่วนถึงconsole/ tty0เพื่อเขียนไปยังคอนโซลเสมือนปัจจุบันของผู้ใช้ สิ่งนี้อาจมีประโยชน์สำหรับข้อความแสดงข้อผิดพลาดของผู้ใช้เร่งด่วนคล้ายกับข้อความเคอร์เนลเร่งด่วนซึ่งพิมพ์ไปยังคอนโซล (ดูman dmesg) อย่างไรก็ตามการทำเช่นนี้ไม่ใช่เรื่องปกติอย่างน้อยหนึ่งครั้งระบบจะบูตเสร็จสิ้น

    rsyslog มีตัวอย่างหนึ่งในหน้านี้ซึ่งพิมพ์ข้อความเคอร์เนลไปที่/dev/console; สิ่งนี้ไม่มีประโยชน์บน Linux เนื่องจากเคอร์เนลจะดำเนินการตามค่าเริ่มต้นแล้ว ตัวอย่างหนึ่งที่ฉันไม่สามารถหาได้อีกบอกว่ามันไม่ใช่ความคิดที่ดีที่จะใช้มันสำหรับข้อความที่ไม่ใช่เคอร์เนลเพราะมันมีข้อความ syslog มากเกินไปคุณทำให้คอนโซลของคุณเต็มไปด้วยความผิด

    systemd-journald ในทำนองเดียวกันมีตัวเลือกในการส่งต่อบันทึกทั้งหมดไปยังคอนโซล ในหลักการสิ่งนี้อาจมีประโยชน์สำหรับการดีบักในสภาพแวดล้อมเสมือน ถึงแม้ว่าสำหรับการแก้ไขข้อบกพร่องเรามักจะส่งต่อไป/dev/kmsgแทน นี้ช่วยให้พวกเขาในบัฟเฟอร์บันทึก kernel dmesgเพื่อให้คุณสามารถอ่านได้ด้วย เช่นเดียวกับข้อความที่สร้างโดยเคอร์เนลเองข้อความเหล่านี้อาจสะท้อนไปยังคอนโซลโดยขึ้นอยู่กับการกำหนดค่าเคอร์เนลปัจจุบัน


ในฐานะที่เป็นส่วนเสริมของข้อ 2 มันเคยเป็นเรื่องธรรมดา (ไม่ใช่แค่บน Linux) เพื่อเรียกใช้xconsoleเพื่อติดตามสิ่งที่เกิดขึ้น ;-) (และเพื่อหลีกเลี่ยงการมีข้อความที่เขียนโดยตรงไปยัง framebuffer เช่นใน SPARCstations)
Stephen Kitt

@StephenKitt เมื่อฉันใช้ SUSE Linux เป็นครั้งแรกฉันคิดว่ามันเริ่ม xconsole หรือเพิ่มมันขึ้นมาเพื่อให้คุณสามารถเริ่มต้นได้จากเมนูหลักบนเดสก์ท็อปหรือบางสิ่งบางอย่าง - ฉันจำไม่ได้แน่นอน
sourcejedi

ให้ฉันพยายามทำความเข้าใจวิธีนี้ /dev/tty{1..63}และ/dev/pts/nเป็นไฟล์อุปกรณ์ที่แสดงถึงอุปกรณ์ของตัวเอง (แม้ว่าจะเป็นอีมูเลชั่น) ไม่เกี่ยวข้องกับกระบวนการหรือเคอร์เนล /dev/tty0ตอบกลับสิ่ง/dev/tty{1..63}ที่ปัจจุบันใช้โดยบางสิ่ง (อาจเป็นเคอร์เนลหรือกระบวนการเชลล์) /dev/ttyแสดงถึงเทอร์มินัลการควบคุมที่ใช้ในปัจจุบันโดยเซสชันกระบวนการ /dev/consoleแทนเทอร์มินัลที่เคอร์เนลใช้อยู่ในปัจจุบัน? ไฟล์อุปกรณ์ใดที่แสดงถึงฟิสิคัลเทอร์มินัลเองไม่เกี่ยวข้องกับเคอร์เนลหรือกระบวนการ
ทิม

@Tim "/ dev / tty0 ตอบกลับหนึ่งใน /dev/tty{1..63} ซึ่งปัจจุบันใช้โดยบางสิ่ง (บางทีเคอร์เนลหรือกระบวนการเชลล์?)" - เคอร์เนล
sourcejedi

ไฟล์อุปกรณ์ใดที่แสดงถึงฟิสิคัลเทอร์มินัลเองไม่เกี่ยวข้องกับเคอร์เนลหรือกระบวนการ
ทิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.