Tại sao các tập tin thiết bị đặc biệt có inodes?


11

Tập tin thiết bị không phải là tập tin mỗi se. Chúng là giao diện I / O để sử dụng các thiết bị trong các hệ điều hành giống Unix. Họ không sử dụng không gian trên đĩa, tuy nhiên, họ vẫn sử dụng một nút như được báo cáo bởi statlệnh:

$ stat /dev/sda
      File: /dev/sda
      Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 6h/6d   Inode: 14628       Links: 1     Device type: 8,0

Các tệp thiết bị có sử dụng các nút vật lý trong hệ thống tệp không và tại sao chúng cần chúng?


2
Inode và dữ liệu tập tin. Không có inode, bạn không có tập tin. (Các tệp thiết bị không có bất kỳ dữ liệu nào)
user253751

Câu trả lời:


16

Câu trả lời ngắn gọn là nó chỉ thực hiện nếu bạn có bản sao lưu hệ thống tệp vật lý /dev(và nếu bạn đang sử dụng bản phân phối Linux hiện đại, có lẽ bạn không nên).

Câu trả lời dài sau:

Tất cả điều này quay trở lại triết lý UNIX ban đầu rằng mọi thứ đều là một tệp. Triết lý này là một phần của những gì làm cho UNIX trở nên linh hoạt, bởi vì bạn có thể tương tác trực tiếp với các thiết bị từ không gian người dùng mà không cần phải có mã đặc biệt trong ứng dụng của mình để nói chuyện trực tiếp với phần cứng vật lý.

Ban đầu, /devchỉ là một thư mục khác với một cái tên nổi tiếng nơi bạn đặt các tập tin thiết bị của bạn. Một số hệ thống UNIX vẫn áp dụng cách tiếp cận này (tôi tin rằng OpenBSD vẫn còn) và bạn thường có thể biết liệu một hệ thống có như thế này không vì nó sẽ có rất nhiều tệp thiết bị cho các thiết bị mà hệ thống không thực sự có (ví dụ: tệp cho mọi phân vùng có thể trên mọi đĩa có thể). Điều này giúp tiết kiệm không gian trong bộ nhớ và thời gian khởi động với chi phí sử dụng thêm một chút dung lượng đĩa, đây là một sự đánh đổi tốt cho các hệ thống ban đầu vì chúng thường bị hạn chế bộ nhớ và không nhanh lắm. Điều này thường được gọi là có một tĩnh /dev.

Trên các hệ thống Linux hiện đại (và tôi cũng tin FreeBSD và có thể là các phiên bản gần đây của Solaris), /devlà một hệ thống tệp trong bộ nhớ tạm thời được nhân bởi (hoặc udev nếu bạn sử dụng Systemd, vì họ không tin hạt nhân làm hầu hết mọi thứ) . Điều này giúp tiết kiệm một số dung lượng đĩa ở mức giá của một số bộ nhớ (thường là ít hơn vài MB) và chi phí xử lý rất nhỏ. Nó cũng có một số ưu điểm khác, với một trong những ưu điểm lớn nhất là dễ dàng phát hiện phần cứng cắm nóng hơn. Điều này thường được gọi là có một năng động /dev.

Trong cả hai trường hợp, các nút thiết bị được truy cập thông qua lớp VFS thông thường, theo định nghĩa có nghĩa là chúng phải có một nút (ngay cả khi đó là một nút ảo chỉ tồn tại để những thứ giống như stat()hoạt động của nó. điều này không ảnh hưởng đến các hệ thống sử dụng động /devvì chúng chỉ lưu trữ các nút trong bộ nhớ hoặc tạo chúng khi cần thiết và gần như không ảnh hưởng đến /devtĩnh vì các nút chiếm không gian gần bằng 0 trên đĩa và hầu hết các hệ thống tệp đều không có giới hạn trên chúng hoặc cách cung cấp nhiều hơn bất cứ ai có thể sẽ cần.


3
Thận trọng giơ tay. Tôi đã từng tham gia một dự án có một máy chủ hết hạn. Cuối cùng, đó là cuộc khủng hoảng mà nhóm chúng tôi cần thuyết phục ban lãnh đạo đầu tư thay thế hệ thống back-end đó, được thiết kế (kém, như bạn có thể tưởng tượng!) Trước khi bất kỳ ai trong chúng ta đến đó.
KRyan

@KRyan Điều đó có thể xảy ra, nhưng ngày nay thật hiếm khi trừ khi quản trị viên giảm số lượng rõ ràng khi tạo hệ thống tập tin. Nhiều hệ thống tập tin hiện đại (ít nhất là NTFS, BTRFS và ZFS, tôi nghĩ rằng XFS cũng có thể) thực sự phân bổ các nút một cách linh hoạt, vì vậy trên rất nhiều hệ thống mới hơn, thực sự không thể hết.
Austin Hemmelgarn

@KRyan Tôi cũng đã có vấn đề đó. Và nó thực sự là một hệ thống được thiết kế tốt, nếu một ngày được đưa ra và đưa ra (mỗi giao dịch yêu cầu một bản ghi độc lập, được lưu trên đĩa, cuối cùng nó chỉ chứa đầy các nút nhỏ xíu)
coteyr

1
Od và docker là loại nổi tiếng vì gây ra chính xác vấn đề inode này.
coteyr

@AustinHemmelgarn Gia đình ext khá khét tiếng vì có số lượng nút tĩnh (và sau đó hết). Đây cũng là hệ thống tập tin Linux được sử dụng nhiều nhất bởi một tỷ lệ rất lớn (các kịch bản lưu trữ lượng dữ liệu khổng lồ trên XFS sang một bên, với ZFS và BTRFS là tương đối mới) và mặc định cho hầu hết các bản phát hành. Tất nhiên, trong một hệ thống hiện đại, các nút tối đa mặc định có nhiều đơn đặt hàng lớn hơn số lượng tệp thiết bị bạn từng có.
Bob

15

Các tệp thiết bị cũng có quyền và những tệp này được lưu trữ trong một nút.


Điểm tuyệt vời mà tôi quên đề cập.
Austin Hemmelgarn

5
Không chỉ là quyền, mà còn là loại tệp và siêu dữ liệu khác. Về mặt kinh điển, bản thân thư mục chỉ chứa tên và số inode - không có gì chỉ ra rằng tệp là một thiết bị cho đến khi bạn đọc được inode.
Gilles 'SO- ngừng trở nên xấu xa'

12

Các thư mục chỉ đơn giản là ánh xạ từ tên tệp đến inodes, vì vậy mọi thứ về cái tên mà nó đề cập đến (một tệp, một liên kết tượng trưng, ​​một thiết bị, một FIFO, một ổ cắm) phải nằm trong nút, không có nơi nào khác để đặt nó.

Thông tin về thiết bị được lưu trữ trong inode. Số thiết bị chính và phụ có ở đó, cũng như các quyền, dấu thời gian, v.v. Trường loại nói rằng đó là một khối hoặc thiết bị ký tự chứ không phải là một tệp thông thường được lưu trữ ở đó.

Inode cho các thiết bị đơn giản là không sử dụng các trường có chứa sơ đồ khối của tệp.


0

Nếu không có inode, bạn chỉ có tên tệp để chứa tất cả thông tin về thiết bị được đề cập. Điều này có nghĩa là những tên thiết bị "đẹp" /dev/sdasẽ không còn tồn tại: bạn cần một cái tên có thể gắn với một trình điều khiển cụ thể, như thế nào /dev/ohci/sda.

Thậm chí quan trọng hơn, tất cả các công cụ dựa vào inodes (như stat, lsv.v.) sẽ phải được sửa đổi để xử lý các đường dẫn theo /devmột cách đặc biệt. Đó sẽ là một khối lượng công việc quá lớn không có lợi ích rõ ràng so với tình trạng hiện tại.

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.