it-swarm-vi.com

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

$ 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 /dev và các thư mục con của nó đều là mô tả tệp của 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/0 là tất cả các liên kết đến /dev/pts/2.
  3. Nếu l in lrwx------ có nghĩa là liên kết, c in crw--w---- nghĩa là?
55
Tim

Hầu như tất cả các tệp trong /devtệp 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, 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ị: khối thiết bị (được biểu thị bằng b là ký tự đầu tiên trong đầu ra của ls -l) và các thiết bị ký tự (được biểu thị bằng 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 giống như các tệp có kích thước cố định lớn: 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 dòng nối tiếp) và đọc một byte cũng có tác dụng ngay lập tức (ví dụ: nó được đọ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ố 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 sự 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 -l list, 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 /dev khô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 tập lệnh Shell, khi bạn muốn bỏ qua đầu ra từ một lệnh (>/dev/null) hoặc chạy lệnh không có đầu vào (</dev/null). Các ví dụ phổ biến khác là /dev/zero (trả về byte rỗng ad infinitum ) /dev/urandom (trả về byte ngẫu nhiên ad infinitum ).

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/stdin chỉ đị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/tty chỉ định thiết bị đầu cuối mà quá trình được kết nối. Trong Linux, ngày nay, /dev/stdin và bạn bè không được triển khai dưới dạng 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ế tổng quát 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/stdin là 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 trong /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/scd0 là một liên kết tượng trưng đến /dev/sr0 trong Linux; cả hai chỉ định thiết bị CD đầu tiên. Một lý do khác cho các liên kết tượng trưng là tổ chức: trong Linux, bạn sẽ tìm thấy các đĩa cứng và phân vùng của mình ở một số nơi: /dev/sda/dev/sda1 và bạn bè (mỗi đĩa được chỉ định bởi một chữ cái tùy ý và các phân vùng theo bố cục 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/* (phân vùng có hệ thống tệp, được chỉ định bởi nhãn do con người chọn); và hơn thế 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/dvd có thể là một liên kết tượng trưng đến /dev/sr0 hoặc nó có thể là một liên kết đến /dev/sr1 nế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 trong /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 đơn vị, /dev/log là một socket mà các chương trình sử dụng để phát ra thông điệp tường trình. /dev/MAKEDEV là tập lệnh tạo 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 dev , 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ị.

  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/ là 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 không điểm tĩnh thành /dev/pts/2 hoặc bất kỳ thứ gì khác - chỉ cần chuyển sang thiết bị đầu cuối khác và bạn sẽ thấy. /dev/stdin là đầu vào tiêu chuẩn của hiện tại phiên cuối. Đó 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, c là viết tắt của loại thiết bị chararacter.
14
rozcietrzewiacz

Đố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ị. (a.k.a. "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 đầu ra ls 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 ra của ls -l là loại 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.

11
rulingminds