Trên một hệ thống Linux, sự khác biệt giữa là gì /dev/console
, /dev/tty
và /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?
Trên một hệ thống Linux, sự khác biệt giữa là gì /dev/console
, /dev/tty
và /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?
Câu trả lời:
Từ tài liệu :
/dev/tty Current TTY device
/dev/console System console
/dev/tty0 Current virtual console
Ngày xưa /dev/console
là 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
và /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=ttyS0
vào grub.conf
. Sau đó, bạn /dev/tty0
là một màn hình và /dev/console
là /dev/ttyS0
.
Một bài tập thể hiện sự khác biệt giữa /dev/tty
và /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 đó tty
là bàn điều khiển nơi quá trình bắt đầu và tty0
luôn là bàn điều khiển hiện tại.
$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
sudo -i
và voila - một vỏ gốc.
sudo anycommand
hoạ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.)
/dev/console
là 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/tty
là 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 cron
và 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 TTY
cột của ps -ef
đầu ra.
/dev/tty
có 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.
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=ttyS0
và console=ttyS1
.
Tài liệu kernel chỉ định /dev/console
là 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/console
kế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/console
sẽ 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 init
bấ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 netconsole
hoặ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-nspawn
thùng chứa, /dev/console
tệ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
.
Các nút thiết bị Linux TTY tty1
thông qua tty63
cá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 chvt
hoặ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
. tty0
là 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ế ttyS0
có 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
là 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.