Linux: ความแตกต่างระหว่าง / dev / console, / dev / tty และ / dev / tty0


133

บนระบบ Linux, สิ่งที่เป็นความแตกต่างระหว่าง/dev/console, /dev/ttyและ/dev/tty0?

การใช้งานของพวกเขาคืออะไรและเปรียบเทียบได้อย่างไร?


3
คุณอาจสนใจในสิ่งนี้
Kevin

คำตอบ:


93

จากเอกสาร :

/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

แบบฝึกหัดเพื่อแสดงความแตกต่างระหว่าง/dev/ttyและ/dev/tty0:

สลับไปยังคอนโซลที่ 2 โดยการกดCtrl+ +Alt เข้าสู่ระบบเป็นF2 rootประเภทsleep 5; echo tty0 > /dev/tty0. กดEnterและสวิทช์ไปที่ 3 คอนโซลโดยการกด+Alt F3ตอนนี้เปลี่ยนกลับไปยังคอนโซลที่ 2 โดยการกด+Alt F2พิมพ์sleep 5; echo tty > /dev/ttyกดEnterและสลับไปที่คอนโซลที่ 3

คุณสามารถเห็นว่าttyเป็นคอนโซลที่กระบวนการเริ่มต้นและtty0เป็นคอนโซลปัจจุบันเสมอ


6
การออกกำลังกายที่ดี! Ubuntu ล็อครูทดังนั้นวิธีหนึ่งในการทำซ้ำบน Ubuntu คือ:$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
SFun28

10
@ SFun28 ฉันมักจะใช้sudo -iและ voila - เปลือกหอย
André Laszlo

4
สำนวนหนึ่งสำหรับการเขียนไปยังไฟล์ที่ต้องใช้การรูทส่วนตัวคือ echo stuff | sudo tee / dev / tty0> / dev / null;
Peter Cordes

บ้า เมื่อĪ̲เขียนunix.stackexchange.com/a/229598/80483 แสดงว่าanswerไม่ทราบคำตอบนี้ !
Incnis Mrsi

@ SFun28: ถ้าsudo anycommandทำงานก็sudo -iไปรูตได้เหมือนกัน ไม่มีสิ่งเช่น Linux / BSD / Unix ที่คุณไม่สามารถรูทได้ (จากนั้นจะไม่เป็น Linux / BSD / Unix อีกต่อไป)
Evi1M4chine

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

  • /dev/tty0 เป็นคอนโซลเสมือนปัจจุบัน

  • /dev/tty[1-x]เป็นหนึ่งในคอนโซลเสมือนที่คุณเปลี่ยนเป็นcontrol- alt- F1และต่อ ๆ ไป

  • /dev/ttyเป็นชนิดของนามแฝงในคอนโซล (อุปกรณ์ฟิสิคัลเสมือนหรืออุปกรณ์หลอกหากมี) ที่เกี่ยวข้องกับกระบวนการที่เปิด ไม่เหมือนกับอุปกรณ์อื่น ๆ คุณไม่จำเป็นต้องใช้สิทธิ์รูทในการเขียน โปรดทราบว่ากระบวนการต่างๆเช่นกระบวนการที่เปิดตัวโดยcronและกระบวนการแบทช์ที่คล้ายกันนั้นไม่สามารถใช้งานได้/dev/ttyเนื่องจากไม่มีการเชื่อมโยงใด ๆ กระบวนการเหล่านี้มี a ?ในTTYคอลัมน์ps -efผลลัพธ์


คุณหมายถึงอะไรโดยการสอบถามจากคำสั่งนี้ "/ dev / tty เป็นคอนโซลที่ใช้โดยกระบวนการสอบถาม"
Ron Vince

1
@ RonVince ฉันหมายถึง/dev/ttyสามารถเป็นอุปกรณ์ที่แตกต่างกันได้ถ้ามีขึ้นอยู่กับกระบวนการที่เปิด อัปเดตคำตอบแล้ว
jlliagre

ขอบคุณ ฉันขอทราบได้ไหมว่ากระบวนการเขียน / อ่านไปยัง / จาก / dev / tty โดยตรงแทนที่จะไปยัง / จากไฟล์อุปกรณ์ที่เชื่อมโยงกับพวกเขาหรือไม่
Ron Vince

@ RonVince ฉันกลัวฉันไม่แน่ใจว่าสิ่งที่คุณถาม คุณสามารถใช้ถ้อยคำใหม่ได้หรือไม่
jlliagre

1
@RonVince การเปิด / dev / tty (ไม่ใช่ /dev/tty421,..,n]) เป็นมาตรฐาน Unix (และ Linux) สำหรับกระบวนการในการเขียนข้อมูลบางอย่างไปยังเทอร์มินัลของผู้ใช้ เขียนโดยตรงไปยังอุปกรณ์อื่น ๆ ที่ไม่ใช่อุปกรณ์พกพาซับซ้อนและเชื่อถือได้น้อยกว่า โปรเซสไม่จำเป็นต้องรู้ว่าอุปกรณ์จริงที่เทอร์มินัลกระบวนการเชื่อมต่ออยู่คืออะไรเคอร์เนลก็รู้แล้ว
jlliagre

20

/ dev / คอนโซล

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/serial-console.rst

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

คุณสามารถผ่านconsole=หลาย ๆ ครั้งเพื่อกำหนดค่าคอนโซลที่หลากหลายและข้อความจะถูกเขียนไปยังพวกเขาทั้งหมด เห็นได้ชัดว่าคุณจะสามารถเลือกหนึ่งคอนโซลของแต่ละ "type": คุณไม่สามารถใช้ทั้งสองและconsole=ttyS0console=ttyS1

เอกสาร kernel ระบุเป็นอุปกรณ์ตัวอักษรหมายเลข/dev/console (5,1)การเปิดอุปกรณ์อักขระนี้จะเปิดคอนโซล "main" ซึ่งเป็น tty สุดท้ายในรายการคอนโซล กระบวนการที่ไม่ใช่เคอร์เนลแรกที่เรียกว่าinitหรือ "PID 1" เริ่มต้นด้วยการ/dev/consoleเชื่อมต่อกับเอาต์พุตมาตรฐานข้อผิดพลาดมาตรฐานและอินพุตมาตรฐาน

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

นอกจากนี้คุณยังสามารถดูรายชื่อ TTY /sys/class/tty/console/activeคอนโซลโดยการอ่าน เอกสาร systemdชี้ให้เห็นว่าอุปกรณ์แรกที่แสดงคือคอนโซลหลัก รายการเป็นจริงในลำดับย้อนกลับของบรรทัดคำสั่งเคอร์เนล เอกสาร kernel ปัจจุบันไม่ถูกต้องระบุว่าอุปกรณ์ที่ผ่านมาแสดงให้เห็นเป็นหลักหรือ "งาน" คอนโซล ด้วยเหตุผลบางอย่างมันเป็นไปได้ที่จะสำรวจความคิดเห็นของไฟล์นี้สำหรับการเปลี่ยนแปลง (ในกรณีที่อุปกรณ์คอนโซลถูกลบ?)

ภายในsystemd-nspawnคอนเทนเนอร์/dev/consoleไฟล์มาตรฐานจะถูกแทนที่ด้วยอุปกรณ์หลอก (PTY) สิ่งเหล่านี้จะอธิบายได้ดีที่สุดในฐานะอุปกรณ์ปลายทางเสมือน พวกเขาจะสร้างแบบไดนามิกและยังใช้ในการดำเนินการเลียนแบบขั้วกราฟิกเช่น GNOME Terminal sshและสำหรับการเข้าถึงระยะไกลเช่น

/ dev / tty0

โหนดอุปกรณ์ Linux TTY tty1ผ่านtty63เป็นเทอร์มินัลเสมือน พวกเขาจะเรียกว่า VTs หรือเสมือนคอนโซล พวกเขาจำลองคอนโซลหลายตัวที่ด้านบนของไดรเวอร์อุปกรณ์คอนโซลทางกายภาพ จะแสดงและควบคุมคอนโซลเสมือนได้ครั้งละหนึ่งคอนโซลเท่านั้น เทอร์มินัลที่ใช้งานอยู่สามารถเปลี่ยนได้เช่นการใช้chvtหรือ Ctrl + Alt + F1 ถึงอย่างไรก็ตามมีปุ่มฟังก์ชั่นมากมายที่คุณมี

นอกจากนี้คุณยังสามารถอ่านและเขียนไปยัง VT /dev/tty0ปัจจุบันใช้ tty0เป็นเคอร์เนลคอนโซลปกติเช่นถ้าคุณไม่ได้เลือกหนึ่งอย่างชัดเจน "ระบบค้นหาการ์ด VGA เป็นลำดับแรก [ซึ่งคือสิ่งที่ VTs ทำงาน") และจากนั้นสำหรับพอร์ตอนุกรม " นอกจากนี้คุณยังสามารถตั้งค่าคอนโซลไปยัง VT console=tty1ที่เฉพาะเจาะจงเช่น

"หากคุณไม่มีการ์ด VGA ในระบบของคุณพอร์ตอนุกรมแรกจะกลายเป็นคอนโซลโดยอัตโนมัติ" A "คอนโซลอนุกรม" ชอบน่าจะเป็นอีกทางเลือกหนึ่งที่พบมากที่สุดttyS0 tty0ไม่สามารถใช้ระบบ VT ที่อยู่ด้านบนของคอนโซลอนุกรมได้

/ dev / TTY

/dev/ttyเป็นหนึ่งในสามไฟล์อุปกรณ์มาตรฐานที่ระบุโดย POSIX ( /dev/เป็นหนึ่งในสามชื่อไดเรกทอรีที่ระบุโดย POSIX) การเปิดมันเทียบเท่ากับการเปิดเทอร์มินัลการควบคุมของกระบวนการปัจจุบัน สถานีควบคุมการตั้งค่าเมื่อกระบวนการเป็นครั้งแรกเปิดขั้ว, อย่างน้อยในลินุกซ์ ยกตัวอย่างเช่นในก็จะหมายถึงinit/dev/console

การพลัดพรากจากสถานีควบคุมเป็นหนึ่งในขั้นตอนที่จำเป็นประเพณีเพื่อเริ่มต้นกระบวนการพื้นหลังเช่นภูตระบบเข้าสู่ระบบ ขั้นตอนในการกลายเป็นกระบวนการพื้นหลังนั้นซับซ้อนอย่างน่ากลัว แต่จะเจาะจงขั้นตอนที่แยกออกจากเทอร์มินัลการควบคุมคือการเรียกระบบsetsid ในระบบที่ทันสมัยกว่านั้นระบบ init เช่น systemd จะเริ่มให้บริการโดยไม่มีสถานีควบคุมใด ๆ ในตอนแรก

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