"Cái gì /dev/console
?" được trả lời trong câu trả lời trước . Có lẽ câu trả lời đó rõ ràng hơn khi bạn biết câu trả lời cho hai câu hỏi còn lại.
Q1. "Tập tin thiết bị đại diện cho thiết bị đầu cuối vật lý là gì?"
Không có tập tin thiết bị như vậy.
Quý 2 " /dev/console
Dùng để làm gì?"
Trên Linux, /dev/console
được sử dụng để hiển thị các thông báo trong khi khởi động (và tắt máy). Nó cũng được sử dụng cho "chế độ người dùng đơn", như được chỉ ra trong câu trả lời của Stephen Kitt. Không có nhiều ý nghĩa khác để sử dụng nó cho.
"Ngày xưa" của Unix, /dev/console
là một thiết bị vật lý chuyên dụng. Nhưng đây không phải là trường hợp trong Linux.
Bằng chứng liên quan
1. "Tệp thiết bị đại diện cho thiết bị đầu cuối vật lý là gì?"
Hãy để tôi cố gắng hiểu theo cách này. /dev/tty{1..63}
và /dev/pts/n
là các tệp thiết bị đại diện cho chính các thiết bị (mặc dù chúng là mô phỏng), không liên quan đến quá trình hoặc kernel. /dev/tty0
nhắc lại cái /dev/tty{1..63}
mà hiện đang được sử dụng bởi một cái gì đó (có thể là kernelhoặc quá trình vỏ?). /dev/tty
đại diện cho thiết bị đầu cuối kiểm soát hiện đang được sử dụng bởi một phiên quy trình. /dev/console
đại diện cho thiết bị đầu cuối hiện đang được sử dụng bởi kernel?
Tệp thiết bị đại diện cho thiết bị đầu cuối vật lý, không liên quan đến kernel hoặc quá trình là gì?
Các thiết bị cơ bản (s) cho /dev/tty{1..63}
là struct con_driver
. Để xem tất cả các trình điều khiển có thể, hãy xem https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console
Không có tệp thiết bị cho (các) thiết bị cơ bản này!
Chỉ có một giao diện không gian người dùng tối thiểu để quản lý chúng.
$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device
==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device
Nếu bạn thực sự muốn biết thêm, các (M)
đại diện cho mô-đun . Tức là thiết bị bảng điều khiển giả không được cung cấp bởi mô-đun hạt nhân có thể tải; nó là một phần của hình ảnh hạt nhân ban đầu (còn gọi là "dựng sẵn").
Thứ hai, bind
tệp trong mỗi thư mục con /sys/class/vtconsole
xuất hiện để cho bạn biết thiết bị vtconsole nào đang hoạt động. Nếu tôi viết 0
cho một hoạt động, nó xuất hiện để chuyển sang một hình nộm. (GUI VT có vẻ không bị ảnh hưởng, nhưng VT văn bản ngừng hoạt động). Viết 1
cho người giả không kích hoạt nó. Hoặc là phương pháp hoạt động để chuyển trở lại thực tế. Nếu tôi đọc mã chính xác, mẹo là echo 1 > bind
chỉ được cho là hoạt động đối với trình điều khiển bàn điều khiển được xây dựng dưới dạng mô-đun (?!).
Đối với các bảng điều khiển bộ đệm khung cụ thể, có một số thông tin khác về việc liên kết các thiết bị bộ đệm khung khác nhau ( /dev/fb0
...) với các bảng điều khiển ảo cụ thể trong https://kernel.org/doc/Documentation/fb/fbcon.txt . Điều này liên quan đến một tùy chọn kernel fbcon:map=
hoặc một lệnh được gọi con2fbmap
.
Tất nhiên các chi tiết có thể thay đổi với các phiên bản kernel, kiến trúc, phần cứng, thiết bị, trình điều khiển khác nhau, v.v. Tôi chưa bao giờ thực sự phải sử dụng bất kỳ giao diện nào ở trên. Hạt nhân chỉ cho phép i915
/ inteldrmfb
/ bất cứ điều gì bạn muốn gọi nó khi nó tải, thay vào đó, ví dụ vgacon
.
Có vẻ như máy EFI của tôi không bao giờ có vgacon
. Vì vậy, trước tiên, nó sử dụng một giao diện điều khiển giả, và thứ hai sau 1,2 giây nó chuyển sang fbcon
, chạy trên đầu trang efifb
. Nhưng cho đến nay tôi vẫn chưa quan tâm chi tiết là gì; nó chỉ hoạt động.
$ 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
Dùng để làm gì?"
Bạn có thể sử dụng / dev / console làm thiết bị TTY. Viết cho nó, ví dụ, sẽ viết cho một thiết bị cơ bản cụ thể, cũng sẽ có một số thiết bị ký tự của riêng nó.
Thường thì / dev / console được gắn với / dev / tty0, nhưng đôi khi nó có thể được gắn với một thiết bị khác.
Vì vậy, trong trường hợp này, ghi vào / dev / console sẽ ghi vào / dev / tty0. Và lần lượt, ghi vào / dev / tty0 tương đương với việc ghi vào thiết bị nào / dev / ttyN hiện đang hoạt động.
Nhưng điều này đặt ra một câu hỏi thú vị. Truy cập tty0
sẽ truy cập các bảng điều khiển ảo khác nhau, tùy thuộc vào hiện đang hoạt động. Mọi người thực sự sử dụng tty0
để làm gì, và tương tự như những gì được console
sử dụng cho Linux?
Về mặt kỹ thuật, bạn có thể đọc và viết từ console
/ tty0
, ví dụ như chạy một getty
để cho phép đăng nhập tty0
. Nhưng điều này chỉ hữu ích như một hack nhanh chóng. Bởi vì điều đó có nghĩa là bạn không thể tận dụng nhiều bảng điều khiển ảo của Linux.
systemd
tìm sysfs
kiếm một thuộc tính được liên kết với thiết bị / dev / console để phát hiện thiết bị TTY nằm bên dưới. Điều này cho phép systemd
tự động sinh ra a getty
và cho phép đăng nhập, ví dụ như bảng điều khiển nối tiếp, khi người dùng thiết lập bảng điều khiển hạt nhân bằng cách khởi động cùng console=ttyS0
. Điều này là thuận tiện; nó tránh sự cần thiết phải cấu hình giao diện điều khiển này ở hai nơi khác nhau. Một lần nữa, xem man systemd-getty-generator
. Tuy nhiên, systemd
không thực sự mở /dev/console
cho điều này.
Trong quá trình bootstrap hệ thống, bạn thậm chí có thể chưa cài đặt sysfs. Nhưng bạn muốn có thể hiển thị thông báo lỗi và tiến trình càng sớm càng tốt! Vì vậy, chúng tôi vòng quanh điểm 1). Nhân khởi động PID 1 với stdin / stdout / stderr được kết nối với /dev/console
. Thật tuyệt khi có cơ chế đơn giản này được thiết lập ngay từ đầu.
Bên trong một thùng chứa Linux, tệp tại /dev/console
có thể được tạo như một thứ gì đó khác - không phải số thiết bị ký tự 5:1
. Thay vào đó, nó có thể được tạo như một tệp thiết bị PTS. Sau đó, nó sẽ có ý nghĩa để đăng nhập thông qua /dev/console
tập tin này . systemd
bên trong một container sẽ cho phép đăng nhập vào một thiết bị như vậy; thấy man systemd-getty-generator
.
Cơ chế này được sử dụng khi bạn chạy một container với systemd-nspawn
lệnh. (Tôi chỉ nghĩ rằng khi bạn chạy systemd-nspawn
trên TTY, mặc dù tôi không thể biết được việc tìm kiếm trang nam).
systemd-nspawn
tạo bộ chứa /dev/console
dưới dạng gắn kết của thiết bị PTS từ máy chủ. Điều này có nghĩa là thiết bị PTS này không thể nhìn thấy bên /dev/pts/
trong container.
Các thiết bị PTS là cục bộ cho một devpts
gắn kết cụ thể . Các thiết bị PTS là một ngoại lệ đối với quy tắc thông thường, rằng các thiết bị được xác định bằng số thiết bị của chúng. Các thiết bị PTS được xác định bằng cách kết hợp số thiết bị và giá devpts
đỡ của chúng .
Bạn có thể viết tin nhắn khẩn cấp tới console
/ tty0
, để viết lên bảng điều khiển ảo hiện tại của người dùng. Điều này có thể hữu ích cho các thông báo lỗi không gian người dùng khẩn cấp, tương tự như các thông báo kernel khẩn cấp được in ra bàn điều khiển (xem man dmesg
). Tuy nhiên, điều này không phổ biến để làm điều này, ít nhất một khi hệ thống đã khởi động xong.
rsyslog có một ví dụ trên trang này , nó in các thông điệp kernel đến /dev/console
; Điều này là vô nghĩa trên Linux vì kernel sẽ làm như vậy theo mặc định. Một ví dụ mà tôi không thể tìm thấy một lần nữa nói rằng không nên sử dụng nó cho các tin nhắn không phải kernel vì có quá nhiều tin nhắn nhật ký hệ thống, bạn làm ngập bảng điều khiển của bạn và nó gây cản trở quá nhiều.
systemd-journald tương tự có các tùy chọn để chuyển tiếp tất cả các bản ghi đến bàn điều khiển. Về nguyên tắc, điều này có thể hữu ích để gỡ lỗi trong môi trường ảo. Mặc dù, để gỡ lỗi, chúng tôi thường chuyển tiếp để /dev/kmsg
thay thế. Điều này lưu chúng trong bộ đệm nhật ký kernel để bạn có thể đọc chúng với dmesg
. Giống như các tin nhắn được tạo bởi chính kernel, các tin nhắn này có thể được lặp lại tới bàn điều khiển tùy thuộc vào cấu hình kernel hiện tại.