Linux: Sự khác biệt giữa / dev / console, / dev / tty và / dev / tty0


133

Trên một hệ thống Linux, sự khác biệt giữa là gì /dev/console, /dev/tty/dev/tty0?

Công dụng tương ứng của chúng là gì và chúng so sánh như thế nào?


3
Bạn cũng có thể quan tâm đến điều này
Kevin

Câu trả lời:


93

Từ tài liệu :

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

Ngày xưa /dev/consolelà bảng điều khiển System Administrator. Và TTY là thiết bị nối tiếp của người dùng được gắn vào máy chủ. Bây giờ /dev/console/dev/tty0đại diện cho hiển thị hiện tại và thường là như nhau. Bạn có thể ghi đè nó chẳng hạn bằng cách thêm console=ttyS0vào grub.conf. Sau đó, bạn /dev/tty0là một màn hình và /dev/console/dev/ttyS0.

Một bài tập thể hiện sự khác biệt giữa /dev/tty/dev/tty0:

Chuyển sang bàn điều khiển thứ 2 bằng cách nhấn Ctrl+ Alt+ F2. Đăng nhập như root. Loại sleep 5; echo tty0 > /dev/tty0. Nhấn Entervà chuyển sang bàn điều khiển thứ 3 bằng cách nhấn Alt+ F3. Bây giờ chuyển trở lại bàn điều khiển thứ 2 bằng cách nhấn Alt+ F2. Nhập sleep 5; echo tty > /dev/tty, nhấn Entervà chuyển sang bàn điều khiển thứ 3.

Bạn có thể thấy đó ttylà bàn điều khiển nơi quá trình bắt đầu và tty0luôn là bàn điều khiển hiện tại.


6
tập thể dục tốt Ubuntu khóa root, vì vậy một cách để tái tạo điều này trên Ubuntu là:$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
SFun28

10
@ SFun28, tôi luôn sử dụng sudo -ivà voila - một vỏ gốc.
André Laszlo

4
một thành ngữ để ghi vào các tập tin yêu cầu quyền riêng tư là echo Stuff | sudo tee / dev / tty0> / dev / null;
Peter Cordes

Chết tiệt. Khi viết unix.stackexchange.com/a/229598/80483 , không biết câu trả lời này !
Incni Mrsi 14/9/2015

@ SFun28: nếu sudo anycommandhoạt động, thì sudo -iđể root cũng hoạt động. Không có thứ gọi là Linux / BSD / Unix mà bạn không thể root. (Sau đó, nó sẽ không còn là Linux / BSD / Unix nữa.)
Evi1M4chine

60
  • /dev/consolelà một bộ thiết bị ảo có thể được đặt làm tham số khi khởi động. Nó có thể được chuyển hướng đến một thiết bị nối tiếp hoặc bảng điều khiển ảo và theo các điểm mặc định /dev/tty0. Khi nhiều console=tùy chọn được chuyển đến kernel, đầu ra của giao diện điều khiển sẽ chuyển đến nhiều thiết bị.

  • /dev/tty0 là giao diện điều khiển ảo hiện tại

  • /dev/tty[1-x]là một trong những bảng điều khiển ảo mà bạn chuyển sang control- alt- F1v.v.

  • /dev/ttylà một bí danh cho bàn điều khiển (thiết bị vật lý, ảo hoặc giả, nếu có) liên quan đến quá trình mở nó. Không giống như các thiết bị khác, bạn không cần quyền root để ghi vào nó. Cũng lưu ý rằng các quy trình như các quy trình được khởi chạy bởi cronvà các quy trình hàng loạt tương tự không thể sử dụng được /dev/tty, vì chúng không liên quan đến bất kỳ quy trình nào. Các quá trình này có một ?trong các TTYcột của ps -efđầu ra.


Bạn có ý nghĩa gì khi truy vấn nó từ câu lệnh này "/ dev / tty là bàn điều khiển được sử dụng bởi quá trình truy vấn nó"?
Ron Vince

1
@RonVince Ý tôi là /dev/ttycó thể là một thiết bị khác, nếu có, tùy thuộc vào quá trình mở nó. Trả lời cập nhật.
jlliagre

Cảm ơn. Tôi có thể biết các quy trình thực sự ghi / đọc đến / từ / dev / tty thay vì trực tiếp đến / từ tệp thiết bị được liên kết với chúng không?
Ron Vince

@RonVince Tôi sợ tôi không chắc bạn đang hỏi gì. Bạn có thể viết lại nó?
jlliagre

1
@RonVince Opening / dev / tty (không phải /dev/tty[1,..,n]) là tiêu chuẩn Unix (và Linux) cho một quá trình ghi một cái gì đó vào thiết bị đầu cuối của người dùng. Viết trực tiếp vào bất kỳ thiết bị nào khác là không di động, phức tạp hơn và kém tin cậy hơn. Một tiến trình không cần biết thiết bị thực tế mà thiết bị đầu cuối quá trình được kết nối với là gì, kernel đã biết nó rồi.
jlliagre

20

/ dev / bảng điều khiển

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

Trên Linux, giao diện điều khiển kernel có thể được cấu hình bằng console= tùy chọn khởi động . Mã hạt nhân mà các cuộc gọi printk()có thể ghi tin nhắn đến nó, ví dụ như khi thiết bị được tải hoặc xảy ra lỗi. Những thông điệp này cũng được đệm bởi kernel. (Xem thêm dmesg). Khi một thiết bị console được tìm thấy và khởi động, nó sẽ nhận được tất cả các tin nhắn được đệm trước đó.

Bạn có thể vượt qua console=nhiều lần để định cấu hình nhiều bảng điều khiển và tin nhắn sẽ được viết cho tất cả chúng. Rõ ràng bạn chỉ có thể chọn một bảng điều khiển của mỗi "loại": bạn không thể sử dụng cả hai console=ttyS0console=ttyS1.

Tài liệu kernel chỉ định /dev/consolelà một thiết bị ký tự được đánh số (5,1). Mở thiết bị nhân vật này sẽ mở giao diện điều khiển "chính", đây là tty cuối cùng trong danh sách bảng điều khiển. Quá trình không phải hạt nhân đầu tiên, được gọi là init"PID 1", được bắt đầu bằng /dev/consolekết nối với đầu ra tiêu chuẩn, lỗi tiêu chuẩn và đầu vào tiêu chuẩn.

Nếu không có bảng điều khiển nào là tty, thì việc mở /dev/consolesẽ trả về lỗi ENODEV("Không có thiết bị nào như vậy"). Nhân sẽinđăng nhập một tin nhắn, và bắt đầu initbất kể. Để biết ví dụ về bảng điều khiển hạt nhân không phải là thiết bị tty, hãy xem netconsolehoặc bảng điều khiển yêu thích của tôi , máy in dòng .

Bạn cũng có thể xem danh sách các bảng điều khiển tty bằng cách đọc /sys/class/tty/console/active. tài liệu systemd chỉ ra rằng thiết bị đầu tiên được hiển thị là bàn điều khiển chính. Danh sách này thực sự theo thứ tự ngược lại của dòng lệnh kernel. Các tài liệu hạt nhân hiện không đúng cách khẳng định rằng các thiết bị cuối cùng được thể hiện là chính hoặc "hoạt động" giao diện điều khiển. Vì một số lý do, có thể thăm dò tệp này để thay đổi (trong trường hợp thiết bị bảng điều khiển bị xóa?).

Bên trong một systemd-nspawnthùng chứa, /dev/consoletệp tiêu chuẩn được thay thế bằng thiết bị đầu cuối giả (PTY). Chúng sẽ được mô tả tốt nhất như các thiết bị đầu cuối ảo. Chúng được tạo động và cũng được sử dụng để triển khai các trình giả lập thiết bị đầu cuối đồ họa như Gnome Terminal và để truy cập từ xa như thế nào ssh.

/ dev / tty0

Các nút thiết bị Linux TTY tty1thông qua tty63các thiết bị đầu cuối ảo. Chúng cũng được gọi là VT, hoặc là bảng điều khiển ảo. Chúng mô phỏng nhiều bàn giao tiếp trên trình điều khiển thiết bị bảng điều khiển vật lý. Chỉ có một giao diện điều khiển ảo được hiển thị và kiểm soát tại một thời điểm. Thiết bị đầu cuối hoạt động có thể được chuyển đổi, ví dụ như sử dụng chvthoặc Ctrl + Alt + F1 thông qua nhiều phím chức năng bạn có.

Bạn cũng có thể đọc và ghi vào VT hiện tại bằng cách sử dụng /dev/tty0. tty0là giao diện điều khiển hạt nhân thông thường, ví dụ nếu bạn không chọn một cách rõ ràng. "Trước tiên, hệ thống sẽ tìm thẻ VGA [đó là những gì VT chạy trên] và sau đó là cổng nối tiếp". Bạn cũng có thể đặt bàn điều khiển thành VT cụ thể, vd console=tty1.

"Nếu bạn không có thẻ VGA trong hệ thống của mình, cổng nối tiếp đầu tiên sẽ tự động trở thành bàn điều khiển." Một "bàn điều khiển nối tiếp" như thế ttyS0có lẽ là sự thay thế phổ biến nhất tty0. Không thể sử dụng hệ thống VT trên đầu bảng điều khiển nối tiếp.

/ dev / tty

/dev/ttylà một trong ba tệp thiết bị tiêu chuẩn được chỉ định bởi POSIX ( /dev/là một trong ba tên thư mục được chỉ định bởi POSIX). Mở nó tương đương với việc mở thiết bị đầu cuối kiểm soát của quy trình hiện tại. Thiết bị đầu cuối kiểm soát được đặt khi một quá trình lần đầu tiên mở thiết bị đầu cuối, ít nhất là trên Linux . Ví dụ, trong init, nó sẽ đề cập đến /dev/console.

Tách khỏi thiết bị đầu cuối kiểm soát là một trong những bước truyền thống cần thiết để bắt đầu một quy trình nền, ví dụ như một trình nền ghi nhật ký hệ thống . Các bước để trở thành một quy trình nền rất phức tạp khủng khiếp, nhưng cụ thể, bước tách khỏi thiết bị đầu cuối điều khiển là cuộc gọi hệ thống setid . Trong các hệ thống hiện đại hơn, hệ thống init, ví dụ systemd khởi động dịch vụ mà không cần bất kỳ thiết bị đầu cuối điều khiển nào ở nơi đầu tiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.