Các thư mục được triển khai trong các hệ thống tập tin Unix như thế nào?


19

Câu hỏi của tôi là làm thế nào các thư mục được thực hiện? Tôi có thể tin rằng một cấu trúc dữ liệu như một biến, ví dụ như bảng, mảng hoặc tương tự. Vì UNIX là mã nguồn mở nên tôi có thể tìm trong nguồn những gì chương trình làm khi nó tạo một thư mục mới. Bạn có thể cho tôi biết nơi để tìm hoặc giải thích về chủ đề này? Đó là một thư mục "là" một tập tin tôi có thể hiểu và một thư mục thực sự là một tập tin? Tôi không chắc chắn rằng sự thật là các tệp được lưu trữ các tệp "trong" trong khi vẫn theo cách bạn có thể nói tệp từ gần như mọi thứ và tôi không chắc chắn đó hoàn toàn không phải là một tệp vì bạn có thể gọi ngay cả một biến a tập tin. Ví dụ, một liên kết chắc chắn không phải là một tệp và một liên kết giống như một thư mục nhưng sau đó điều này có vi phạm rằng một thư mục là một tệp không?


1
Bạn có quan tâm đến bất kỳ hệ thống tập tin cụ thể nào không?
Ignacio Vazquez-Abrams

3
Trong UNIX, mọi thứ đều là một tập tin (trí tuệ lịch sử). Nhưng không phải mọi UNIX đều là Nguồn mở. Bạn không biết Unix, bạn biết không? Open Solaris là một Unix mã nguồn mở, trong khi Linux chỉ là một hệ điều hành unixoid. :) Và có - hệ thống tập tin - Reiserfs? Ext2-3-4? XFS? NFS?
người dùng không xác định

2
Một liên kết thực sự là một tập tin, quá.
mattdm

5
Một liên kết tượng trưng là một tập tin. Một liên kết cứng là một cạnh trong biểu đồ hệ thống tập tin.
dmckee

3
Quảng cáo: bạn có thể quan tâm đến đề xuất trang web Phát triển hệ điều hành .
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


22

Cấu trúc bên trong của các thư mục phụ thuộc vào hệ thống tập tin đang sử dụng. Nếu bạn muốn biết chính xác những gì xảy ra, hãy xem triển khai hệ thống tập tin.

Về cơ bản, trong hầu hết các hệ thống tập tin, một thư mục là một mảng kết hợp giữa tên tệp (khóa) và số inodes (giá trị). Một cái gì đó như thế này¹:

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

Danh sách này được mã hóa theo một số cách - ít nhiều - hiệu quả bên trong một chuỗi (thường) các khối 4KB. Lưu ý rằng nội dung của các tệp thông thường được lưu trữ tương tự. Trong trường hợp các thư mục, không có điểm nào để biết kích thước nào thực sự được sử dụng bên trong các khối này. Đó là lý do tại sao kích thước của các thư mục được báo cáo dulà bội số của 4KB.

Các nút ở đó để liên kết các khối lại với nhau, tạo thành một thực thể duy nhất, cụ thể là một "tệp" theo nghĩa chung. Chúng được xác định bởi một số là một loại địa chỉ và mỗi địa chỉ thường được lưu trữ dưới dạng một khối đặc biệt.

Quản lý tất cả điều này xảy ra trong chế độ kernel. Phần mềm chỉ yêu cầu tạo một thư mục có chức năng có tên int mkdir(const char *pathname, mode_t mode);dẫn đến một cuộc gọi hệ thống và tất cả phần còn lại được thực hiện phía sau hậu trường.

Về cấu trúc liên kết:

Một liên kết cứng không phải là một tập tin, nó chỉ là một mục nhập thư mục mới (tức là một tên - liên kết số inode ) đề cập đến một thực thể inode có sẵn từ trước. Điều này có nghĩa là cùng một nút có thể được truy cập từ các tên đường dẫn khác nhau. Đặc biệt, vì metadatas (quyền, quyền sở hữu, dấu thời gian,) được lưu trữ trong inode, chúng là duy nhất và độc lập với tên đường dẫn được chọn để truy cập tệp.

Một liên kết tượng trưng một tập tin và nó khác với mục tiêu của nó. Điều này có nghĩa là nó có inode riêng. Nó từng được xử lý giống như một tệp thông thường: đường dẫn đích được lưu trữ trong một khối dữ liệu. Nhưng bây giờ, vì lý do hiệu quả trong gần đây ext hệ thống tập tin, đường dẫn ngắn hơn 60 byte dài được lưu trữ trong các inode tự (sử dụng các lĩnh vực mà thông thường sẽ được sử dụng để lưu trữ các con trỏ đến khối dữ liệu).

-
1. điều này đã thu được bằng cách sử dụng ls -ai1 testdir.
2. có loại phải khác với 'thư mục' ngày nay.


Cảm ơn bạn đã xây dựng để tôi có thể hiểu sự khác biệt giữa các thư mục và tệp ở cấp độ lập trình.
Niklas

12

Để mở rộng bài đăng từ Stéphane Gimenez, tạo thư mục mới là quá trình tạo một nút mới với giá trị st_mode của S_IFDIR (với chế độ cấp phép), tạo hai mục nhập trong khối dữ liệu đầu tiên của nút inode mới bằng liên kết ( 2) gọi hệ thống: '.' trỏ đến inode mới này và '..' trỏ đến thư mục cha, sau đó tạo một mục trong thư mục cha với inode và tên của thư mục mới - phần đầu tiên và cuối cùng được thực hiện bởi hệ thống gọi mknod ( 2). Ngoài ra, chỉ root mới có thể sử dụng mknod (2) những ngày này cho các tác vụ như chúng ta đang nói đến.

Ví dụ, mkdir("/home/larry.user/xyzzy", 0666)về cơ bản là như sau (đây là mã C từ SysV ngày [1]):

int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, ".");  /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
    link(".", path1);
else {
    *p = '\0';
    link(path2, path1);
}
  1. Haviland & Salama, "Lập trình hệ thống UNIX", 1987, tr69-71.

Điều này quá dễ xảy ra lỗi (và một trong những lý do chính cho fsck) vì vậy một cuộc gọi hệ thống mkdir (2) đã được tạo để có thể thực hiện điều này cho bạn.

Lưu ý rằng đối tượng hệ thống tập tin amy có thể được tạo bằng mknod (2): tệp thông thường, thư mục, tệp thiết bị, symlink, v.v. Vì vậy, để trả lời một trong những câu hỏi của OP, vâng, một thư mục là một tệp, có nghĩa là "nó là một đối tượng, được biểu thị bằng một nút, nằm trong một hệ thống tệp hoạt động với giao diện i / o ".


Cảm ơn bạn đã trả lời rất thú vị. Tôi hiểu và nghĩ rằng tôi cũng có thể tìm trong nguồn cho chương trình touchtạo ra một tệp trống và xem nó làm gì.
Niklas

2

nếu bạn muốn có thêm thông tin về các hệ thống tập tin Unix / Linux, tôi khuyên bạn nên đọc 2 cuốn sách Tìm hiểu về nhân LinuxPhát triển nhân Linux . Đó là những cuốn sách tốt nhất để hiểu nhân Linux.

Trong các hệ thống Unix "Mô hình tệp chung", mỗi thư mục được coi là một tệp chứa danh sách các tệp và thư mục.

Trong VFS (Hệ thống tệp ảo), các thư mục được biểu diễn trong một cấu trúc được gọi dentry. Các dentry là một cấu trúc C với một tên chuỗi ( d_name ), một con trỏ đến một inode ( d_inode ) và một con trỏ đến dentry mẹ ( d_parent ). Một nút là một cấu trúc để xử lý thông tin về một tệp trong hệ thống tệp. Chẳng hạn, nếu bạn có thư mục /tmp/test/foo, VFS sẽ tạo một đối tượng răng cho mọi thành phần trong tên đường dẫn. Vì vậy, nó sẽ tạo ra một đối tượng răng cho /, một đối tượng nha khoa thứ hai cho testmục nhập của thư mục gốc và một đối tượng nha khoa thứ ba cho foomục nhập của thư mục thử nghiệm.


Cảm ơn Dimitri. Tôi muốn hiểu lý do tại sao một số dự án chọn một cấu trúc dữ liệu cụ thể như B-Tree, cây nhị phân, trie hoặc mảng kết hợp. Tôi nghĩ điều quan trọng là chọn mô hình dữ liệu / mô hình dữ liệu phù hợp. Tìm hiểu về các triển khai khác nhau cung cấp các chi tiết tôi đang tìm kiếm.
Niklas

1

Bạn có thể bắt đầu bằng cách đọc http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM . Để biết thêm chi tiết, hãy lấy cuốn sách kinh điển xuất sắc "Thiết kế và triển khai hệ điều hành 4.4 BSD".


Cảm ơn các liên kết. Tôi hiểu cả hai tệp là các thư mục về cơ bản là các mảng được hiểu là tệp hoặc thư mục. Xin hãy sửa tôi nếu tôi sai ..
Niklas

1
Các thư mục theo truyền thống chỉ là các tệp được định dạng đặc biệt, nhưng điều đó không còn đúng nữa: en.wikipedia.org/wiki/ReiserFS#Design Trong ReiserFS và một số thư mục khác là các mục trong cơ sở dữ liệu. Các thư mục có thể hoạt động như một mảng, nhưng đó chỉ là sự trừu tượng hóa lập trình.
Bruce Ediger

Cảm ơn bạn rất nhiều vì đã chỉ ra các chi tiết. Bây giờ tôi nghĩ rằng tôi đã hiểu thêm về cách các hệ thống tập tin hoạt động vẫn tự hỏi làm thế nào và tại sao chương trình locatehoạt động và làm thế nào điều này liên quan đến việc cập nhật chương trình định vị bằng cách chạy updatedb(thông số tôi sử dụng PC-BSD, DragonflyBSD và Ubuntu Natty khởi động từ Live CD và điểm chuẩn các cài đặt khác nhau và giao diện)
Niklas
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.