Hiểu / dev và các thư mục con và tệp của nó


52
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Tôi đã tự hỏi nếu tất cả các tập tin dưới /devvà thư mục con của nó là tất cả các mô tả tập tin của các thiết bị?
  2. Tại sao có nhiều liên kết với nhau? Ví dụ, /dev/fd/0, /dev/stdin, /proc/self/fd/0là tất cả các liên kết đến /dev/pts/2.
  3. Nếu ltrong lrwx------liên kết có nghĩa là, những gì hiện ctại crw--w---- trung bình?

3
Và để trả lời # 3, chữ c là viết tắt của thiết bị ký tự hoặc ký tự đặc biệt . b là viết tắt của khối đặc biệt .
felixphew

Câu trả lời:


78

Hầu như tất cả các tập tin dưới /devđây là tập tin thiết bị . Trong khi đọc và ghi vào một tệp thông thường lưu trữ dữ liệu trên đĩa hoặc hệ thống tệp khác, việc truy cập tệp thiết bị sẽ giao tiếp với trình điều khiển trong kernel, thường lần lượt giao tiếp với một phần cứng (thiết bị phần cứng, do đó là tên).

Có hai loại tệp thiết bị: thiết bị khối (được biểu thị bằng bký tự đầu tiên trong đầu ra của ls -l) và thiết bị ký tự (được chỉ định bởi c). Sự khác biệt giữa các thiết bị khối và nhân vật không hoàn toàn phổ biến. Thiết bị chặn là những thứ giống như đĩa, hoạt động như các tệp lớn, kích thước cố định: nếu bạn viết một byte ở một độ lệch nhất định và sau đó đọc từ thiết bị ở độ lệch đó, bạn sẽ lấy lại byte đó. Các thiết bị ký tự gần như là bất cứ thứ gì khác, trong đó việc viết một byte có tác dụng ngay lập tức (ví dụ: nó được phát ra trên một chuỗi nối tiếp) và đọc một byte cũng có một số hiệu ứng ngay lập tức (ví dụ: đọc từ cổng nối tiếp).

Ý nghĩa của một tập tin thiết bị được xác định bởi số lượng của nó, không phải bởi tên của nó (tên quan trọng đối với các ứng dụng, nhưng không phải với kernel). Số thực tế là hai số: số chính cho biết trình điều khiển nào chịu trách nhiệm cho thiết bị này và số phụ cho phép người lái lái một số thiết bị¹. Những con số này xuất hiện trong ls -ldanh sách, nơi bạn thường tìm thấy kích thước tệp. Ví dụ brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ thiết bị này là chính 8, nhỏ 0.

Một số tệp thiết bị dưới /devkhông tương ứng với các thiết bị phần cứng. Một cái tồn tại trên mọi hệ thống unix là /dev/null; viết cho nó không có tác dụng, và đọc từ nó không bao giờ trả lại bất kỳ dữ liệu nào. Nó thường thuận tiện trong các kịch bản shell, khi bạn muốn bỏ qua đầu ra từ một lệnh ( >/dev/null) hoặc chạy một lệnh không có đầu vào ( </dev/null). Các ví dụ phổ biến khác là /dev/zero(trả về null byte ad infinitum ) /dev/urandom(trả về byte infinitum ngẫu nhiên ).

Một vài tệp thiết bị có ý nghĩa phụ thuộc vào quá trình truy cập nó. Ví dụ, /dev/stdinchỉ định đầu vào tiêu chuẩn của quy trình hiện tại; mở từ có hiệu quả gần giống như mở tệp gốc được mở dưới dạng đầu vào tiêu chuẩn của quy trình. Tương tự như vậy, /dev/ttychỉ định thiết bị đầu cuối mà quá trình được kết nối. Ngày nay, trong Linux, /dev/stdinvà bạn bè không được triển khai như các thiết bị ký tự, mà thay vào đó là các liên kết tượng trưng đến một cơ chế chung hơn cho phép mọi mô tả tệp được tham chiếu (trái ngược với chỉ 0, 1 và 2 theo phương pháp truyền thống); ví dụ /dev/stdinlà một liên kết tượng trưng đến /proc/self/fd/0. Xem Làm thế nào / dev / fd liên quan đến / Proc / self / fd /? .

Bạn sẽ tìm thấy một số liên kết tượng trưng dưới /dev. Điều này có thể xảy ra vì lý do lịch sử: một tệp thiết bị đã được chuyển từ tên này sang tên khác, nhưng một số ứng dụng vẫn sử dụng tên cũ. Ví dụ, /dev/scd0là một liên kết tượng trưng đến /dev/sr0trong Linux; cả hai chỉ định thiết bị CD đầu tiên. Một lý do khác cho liên kết tượng trưng là tổ chức: trong Linux, bạn sẽ tìm thấy đĩa cứng của bạn và phân vùng trong một số nơi: /dev/sda/dev/sda1và bạn bè (mỗi đĩa được chỉ định bởi một chữ tùy ý, và phân vùng theo cách bố trí phân vùng), /dev/disk/by-id/*(đĩa được chỉ định bởi một số sê-ri duy nhất), /dev/disk/by-label/*(các phân vùng có hệ thống tệp, được chỉ định bởi nhãn do con người chọn); và nhiều hơn nữa. Liên kết tượng trưng cũng được sử dụng khi một tên thiết bị chung có thể là một trong nhiều tên; ví dụ/dev/dvdcó thể là một liên kết tượng trưng đến /dev/sr0hoặc nó có thể là một liên kết đến /dev/sr1nếu bạn có hai đầu đọc CD và cái thứ hai là đầu đọc DVD mặc định.

Cuối cùng, có một vài tệp khác mà bạn có thể tìm thấy bên dưới /dev, vì lý do truyền thống. Bạn sẽ không tìm thấy điều tương tự trên mọi hệ thống. Trên hầu hết các thông báo, /dev/loglà một ổ cắm mà các chương trình sử dụng để phát ra thông điệp tường trình. /dev/MAKEDEVlà một kịch bản tạo ra các mục trong /dev. Trên các hệ thống Linux hiện đại, các mục trong /dev/được tạo tự động bởi udev , lỗi thời MAKEDEV.

Điều này thực sự không còn đúng với Linux, nhưng chi tiết này chỉ quan trọng đối với người viết trình điều khiển thiết bị.


Cảm ơn! Bởi "Ý nghĩa của một tập tin thiết bị được xác định bởi số của nó", bạn có nghĩa là mô tả tập tin của nó?
Tim

@Tim: Không, các số xuất hiện trong ls -ldanh sách mà bạn thường tìm thấy kích thước tệp, trước ngày, ví dụ brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ thiết bị này là chính 8, nhỏ 0. Số thiết bị không xuất hiện thường xuyên trong thực tế, tôi chỉ đề cập đến chúng để nói điều gì làm cho một thiết bị trở thành một thiết bị (quan trọng nhất, đó không phải là tên tệp). Một số mô tả tập tin chỉ có một ý nghĩa trong một quy trình cụ thể.
Gilles 'SO- ngừng trở nên xấu xa'

Không, mở /dev/stdin(=> /proc/self/fd/0) trên Linux không có tác dụng tương tự như sao chép đầu vào tiêu chuẩn. Để thấy sự khác biệt, su - non_root_usersau đó exec 5</dev/stdinsẽ thất bại với "Quyền bị từ chối", nhưng exec 5<&0sẽ thành công. Và nó không phải là duy nhất mà các fd mới sẽ được mở ra với lá cờ khác nhau, tất cả mọi thứ về đối tượng tập tin ( "tập tin mở descrip tion " trong POSIX biệt ngữ) sẽ khác nhau (con trỏ file offset, phi / chặn chế độ, vv).
mosvy

14
  1. Có - trực tiếp hoặc dưới dạng liên kết tượng trưng - đó là những gì /dev/dành cho.
  2. Đối với các mục đích khác nhau: đôi khi để tương thích giữa các sơ đồ đặt tên, đôi khi cần thiết cho môi trường làm việc - như trong ví dụ về /dev/stdin. Điều này không chỉ tĩnh để /dev/pts/2hoặc bất kỳ khác - chỉ cần chuyển sang terminal khác và bạn sẽ thấy. /dev/stdinlà đầu vào tiêu chuẩn của phiên thiết bị đầu cuối hiện tại của bạn . Đó cũng là một ví dụ tại sao nó cần phải là một liên kết tượng trưng.
  3. Xem man mknodinfo coreutils 'mknod invocation'. Nói chung, clà viết tắt của một loại thiết bị chararacter.

3
"đầu vào tiêu chuẩn của phiên thiết bị đầu cuối hiện tại của bạn" hơi mơ hồ. /dev/stdinđề cập đến đầu vào tiêu chuẩn của quá trình sẽ mở nó. Mọi thứ trong đó /proc/$pidlà dữ liệu phụ thuộc vào quy trình và /proc/selflà một loại liên kết ma thuật chỉ vào dữ liệu của chính quy trình.
Stéphane Gimenez

11

Đối với câu hỏi đầu tiên của bạn, chúng không phải là mô tả tệp, chúng là tệp thiết bị. (còn gọi là "nút dev")

Các tệp đó được liên kết với trình điều khiển đang xử lý thiết bị bằng các số chính và phụ. (Ví dụ: "136, 2" trong lsđầu ra của bạn đề cập đến trình điều khiển thiết bị bị ràng buộc với số chính 136 và chỉ định thiết bị # 2 được xử lý bởi trình điều khiển đó.)

Chữ cái đầu tiên của ls -lloại là thiết bị trong trường hợp tệp thiết bị. Nếu đó là 'c' thì đó là một thiết bị ký tự hoặc nếu là 'b', thì đó là một thiết bị khối.

Đối với câu hỏi thứ hai của bạn, hãy tham khảo câu trả lời trên của rozcietrzewiacz.


1
Liên kết "Giới thiệu về Trình điều khiển thiết bị" dường như bị hỏng.
Slothworks
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.