Hệ thống tệp (file system) Linux dựa trên inodes. Những thành phần quan trọng của hệ thống tệp thường bị hiểu nhầm. Vậy nên trong bài viết này, chúng ta sẽ tìm hiểu về inodes và hệ thống tệp của Linux.
Các yếu tố trong File System
Theo định nghĩa, một File System cần phải lưu trữ các tệp và chúng cũng chứa các thư mục. Các tệp được lưu trữ trong các thư mục và các thư mục này có thể có các thư mục con. Vậy nên phải có một thứ gì đó ghi lại vị trí của tất cả các tệp trong hệ thống tệp, chúng được gọi là gì, chúng thuộc về tài khoản nào, có quyền nào và cnhiều thứ khác nữa. Thông tin này được gọi là siêu dữ liệu vì đây là loại dữ liệu mô tả các dữ liệu khác.
Trong hệ thống tệp ext4 của Linux, cấu trúc inode và thư mục làm việc cùng nhau để cung cấp một khung cơ sở lưu trữ tất cả siêu dữ liệu cho mọi tệp và thư mục. Chúng cung cấp siêu dữ liệu cho bất kỳ phần mềm yêu cầu, cho dù đó là kernel, ứng dụng người dùng hay tiện ích của Linux, chẳng hạn như ls, stat và df.
Inodes và kích thước hệ thống tệp
Mặc dù đúng là có một cặp cấu trúc, nhưng hệ thống tệp yêu cầu nhiều thứ hơn thế. Có hàng ngàn và hàng vạn cấu trúc. Mọi tệp và thư mục đều yêu cầu inode và vì mọi tệp đều nằm trong một thư mục nên mọi tệp cũng yêu cầu cấu trúc thư mục. Cấu trúc thư mục còn được gọi là các mục nhập thư mục (directory entries), hoặc “dentries”.
Mỗi inode có một số inode, là số duy nhất trong một hệ thống tệp. Cùng một số inode có thể xuất hiện trong nhiều hệ thống tệp. Tuy nhiên, ID hệ thống tệp và số inode kết hợp để tạo thành một mã định danh duy nhất, bất kể có bao nhiêu hệ thống tệp có trên hệ thống Linux của bạn.
Hãy nhớ rằng, trong Linux, bạn không chia ổ cứng hoặc phân vùng. Mà là chia hệ thống tệp trên phân vùng, do đó, bạn có thể có nhiều hệ thống tệp mà bản thân lại không biết đó. Nếu bạn có nhiều ổ cứng hoặc phân vùng trên một ổ đĩa, thì bạn sẽ có nhiều hệ thống tệp. Chúng có thể là cùng một loại, chẳng hạn như tất cả là ext4, nhưng chúng vẫn sẽ là các hệ thống tệp riêng biệt.
Tất cả các inodes được tổ chức trong một bảng. Sử dụng số inode, hệ thống tệp dễ dàng tính toán nơi inode được đặt. Đó là lý do tại sao chữ “i” trong inode là viết tắt của index.
Biến chứa số inode được khai báo trong mã nguồn dưới dạng số nguyên 32 bit, không dấu. Điều này có nghĩa, số inode là một giá trị nguyên với kích thước tối đa là 2 ^ 32, bằng 4,294,967,295, hơn 4 tỷ inode.
Đó là con số tối đa về mặt lý thuyết. Trên thực tế, số lượng inode trong hệ thống tệp ext4 được xác định khi hệ thống tệp được tạo ở tỷ lệ mặc định là một inode trên 16 KB dung lượng hệ thống tệp. Cấu trúc thư mục được tạo ngay lập tức khi hệ thống tệp đang được sử dụng, vì tệp và thư mục được tạo trong hệ thống tệp.
Bạn có thể sử dụng lệnh dưới để xem có bao nhiêu inodes trong hệ thống tệp trên máy tính của mình. Tùy chọn -i (inodes) của lệnh df hiển thị số lượng inodes.
Mình sẽ xem số lượng indos trên phân vùng đầu tiên của ổ cứng đầu tiên:
df -i /dev/sda1
Đầu ra:
- File system: Hệ thống tệp đang được kiểm tra.
- Inodes: Tổng số inodes trong hệ thống tệp này.
- IUsed: Số lượng inodes đang được sử dụng.
- IFree: Số inode còn lại có sẵn để sử dụng.
- IUse%: Phần trăm inodes đã sử dụng.
- Mounted on: đường dẫn cho phân vùng này.
Mình đã sử dụng 10% inodes trong hệ thống tệp này. Các tệp được lưu trữ trên ổ cứng trong các khối đĩa. Mỗi inode trỏ đến các khối đĩa lưu trữ nội dung của tệp. Nếu bạn có hàng triệu tệp nhỏ, bạn có thể sử dụng hết inodes trước khi hết dung lượng ổ cứng. Tuy nhiên, đó là một vấn đề rất khó gặp phải.
Trước đây, một số máy chủ lưu trữ thư email dưới dạng tệp rời rạc đã gặp sự cố này. Tuy nhiên, khi các ứng dụng đó thay đổi thành cơ sở dữ liệu, thì vấn đề đã được giải quyết.Hệ thống tệp gia đình trung bình sẽ không hết inodes, với hệ thống tệp ext4, bạn không thể thêm nhiều inodes hơn mà không cần cài đặt lại hệ thống tệp.
Để xem kích thước của khối đĩa trên hệ thống tệp của bạn, bạn có thể sử dụng lệnh blockdev với tùy chọn –getbsz (lấy kích thước khối):
sudo blockdev --getbsz /dev/sda
Kích thước khối là 4096 byte.
Hãy sử dụng tùy chọn -B (kích thước khối) để chỉ định kích thước khối là 4096 byte và kiểm tra mức sử dụng ổ cứng:
df -B 4096 /dev/sda1
Kết quả:
- File system: Hệ thống tệp mà chúng ta đang kiểm tra.
- 4K-blocks: Tổng số khối 4 KB trong hệ thống tệp này.
- Used: Có bao nhiêu khối 4K đang được sử dụng.
- Available: Số khối 4 KB còn lại có sẵn để sử dụng.
- Use%: Phần trăm khối 4 KB đã được sử dụng.
- Mounted on: đường dẫn cho phân vùng.
Trong ví dụ này, chúng ta đã sử dụng 28% dung lượng trên hệ thống tệp này, với 10% inodes, vẫn còn rất ổn đó chứ.
Siêu dữ liệu Inode
Để xem số inode của một tệp, chúng ta có thể sử dụng lệnh ls với tùy chọn -i (inode):
ls -i geek.txt
Số inode của tệp này là 1441801, vì vậy inode này giữ siêu dữ liệu cho tệp geek.txt và theo truyền thống, các con trỏ sẽ truy cập đến khối đĩa (disk blocks) chứa tệp trên ổ cứng. Nếu tệp bị phân mảnh, hoặc hoặc quá lớn, một số khối mà inode trỏ đến có thể chứa thêm các con trỏ khác truy cập đến các khối đĩa khác. Và một số khối đĩa khác cũng có thể chứa các con trỏ đến một tập hợp khối đĩa khác. Điều này khắc phục được vấn đề của inode có kích thước cố định và có thể chứa một số lượng con trỏ hữu hạn đến các khối đĩa.
Phương pháp đó đã được thay thế bằng một lược đồ mới sử dụng các “extents” (phạm vi – vùng mở rộng). Chúng ghi lại khối bắt đầu và khối kết thúc của mỗi tập hợp các khối được sử dụng để lưu trữ tệp. Nếu tệp không bị phân mảnh, bạn chỉ phải lưu trữ khối đầu tiên và độ dài tệp. Nếu tệp bị phân mảnh, bạn phải lưu trữ khối đầu tiên và khối cuối cùng của mỗi phần phân mảnh của tệp. Phương pháp này rõ ràng là hiệu quả hơn.
Nếu bạn muốn xem liệu hệ thống tệp của mình có sử dụng con trỏ hoặc vùng mở rộng của khối đĩa hay không, bạn có thể xem dữ liệt bên trong một inode. Để làm như vậy, chúng ta sẽ sử dụng lệnh debugfs với tùy chọn -R (request) và chọn inode của tệp bạn muốn. Điều này yêu cầu debugfs sử dụng lệnh “stat” để hiển thị nội dung của inode. Bởi vì số inode chỉ là duy nhất trong một hệ thống tệp, nên chúng ta cũng phải cho debugfs biết inode nằm trong hệ thống tệp nào.
Ví dụ:
sudo debugfs -R "stat <1441801>" /dev/sda1
Như được hiển thị bên dưới, lệnh debugfs trích xuất thông tin từ inode và hiển thị dữ liệu cho chúng ta thấy:
Chúng tôi được hiển thị thông tin sau:
- Inode: Số inode mà chúng ta đang chọn.
- Type: Đây là một tệp thông thường (regular), không phải là một thư mục hoặc liên kết tượng trưng.
- Mode: Các quyền của tệp trong hệ bát phân.
- Flags: Các chỉ số đại diện cho các tính năng hoặc chức năng khác nhau. 0x80000 là flag “extents” (giải thích thêm ở phía dưới).
- Generation: Network File System (NFS) sử dụng tính năng này khi ai đó truy cập hệ thống tệp từ xa qua kết nối mạng.
- Version: Phiên bản inode.
- User: Chủ sở hữu của tệp.
- Group: Nhóm chủ sở hữu của tệp.
- Project: Nên luôn luôn là số không.
- Size: Kích thước của file
- File ACL: Danh sách kiểm soát quyền truy cập tệp. Chúng được thiết kế để cho phép bạn cấp quyền truy cập có kiểm soát cho những người không thuộc nhóm chủ sở hữu.
- Links: Số lượng liên kết cứng đến tệp.
- Blockcount: Dung lượng ổ cứng được phân bổ cho tệp này, được tính theo khối 512 byte.
- Fragment: Tệp này không bị phân mảnh. (Đây là một flag lỗi thời)
- Ctime: Thời gian tệp được tạo.
- Atime: Thời gian mà tệp này được truy cập lần cuối.
- Mtime: Thời gian mà tệp này được sửa đổi lần cuối.
- Crtime: Thời gian tệp được tạo.
- Size of extra inode fields: Hệ thống tệp ext4 đã giới thiệu khả năng phân bổ inode lớn hơn trên đĩa tại thời điểm định dạng. Giá trị này là số byte phụ mà inode đang sử dụng. Không gian bổ sung này cũng có thể được sử dụng để đáp ứng các yêu cầu trong tương lai đối với kernel mới hoặc để lưu trữ các thuộc tính mở rộng.
- Inode checksum: Kiểm tra cho inode này, giúp bạn có thể phát hiện ra inode có bị hỏng hay không.
- Extents: Nếu các phạm vi đang được sử dụng (trên ext4, theo mặc định), siêu dữ liệu liên quan đến việc sử dụng khối đĩa của tệp sẽ có hai số cho biết khối bắt đầu và khối kết thúc của mỗi phần trong tệp bị phân mảnh.
Tên tệp ở đâu?
Hiện chúng ta có rất nhiều thông tin về tệp, nhưng như bạn có thể nhận thấy, chúng không có tên tệp. Đây là lúc cấu trúc thư mục phát huy tác dụng. Trong Linux, giống như một tệp, một thư mục có một inode. Tuy nhiên, thay vì trỏ tới khối đĩa chứa dữ liệu tệp, inode thư mục trỏ đến khối đĩa chứa cấu trúc thư mục.
So với inode, cấu trúc thư mục chứa một lượng thông tin hạn chế về tệp. Nó chỉ chứa số inode, tên và độ dài của tên.
Inode và cấu trúc thư mục chứa mọi thứ bạn (hoặc một ứng dụng) cần biết về một tệp hoặc thư mục. Cấu trúc thư mục nằm trong một khối đĩa thư mục, vì vậy chúng ta biết thư mục có chứa tệp. Cấu trúc thư mục cho chúng ta tên tệp và số inode. Inode cho chúng ta biết mọi thứ khác về tệp, bao gồm mốc thời gian, quyền và nơi tìm dữ liệu tệp trong hệ thống tệp.
Đường dẫn Inodes
Bạn có thể xem số inode của một thư mục dễ dàng như cách bạn xem số inodes tệp.
Trong ví dụ sau, chúng ta sẽ sử dụng lệnh ls với các tùy chọn -l (định dạng dài), -i (inode) và -d (thư mục) và xem thư mục work
:
ls -lid work/
Bởi vì chúng ta đã sử dụng tùy chọn -d (thư mục), ls báo cáo về chính thư mục, không phải nội dung của nó. Inode cho thư mục này là 1443016.
Ví dụ về thư mục chính:
ls -lid ~
Inode cho thư mục chính là 1447510 và thư mục công việc nằm trong thư mục chính. Bây giờ, hãy xem nội dung của thư mục công việc. Thay vì tùy chọn -d (thư mục), chúng ta sẽ sử dụng tùy chọn -a (tất cả). Điều này sẽ cho chúng ta thấy các thư mục thường bị ẩn.
ls -lia work/
Nếu bạn nhìn vào số inode của mục 1 dấu chấm, bạn sẽ thấy đó là 1443016, chính là số inode mà chúng ta nhận được ở trên. Ngoài ra, số inode của mục 2 dấu chấm giống với số inode cho thư mục chính.
Đó là lý do tại sao bạn có thể sử dụng lệnh cd .. để truy cập thư mục khác. Tương tự như vậy, khi bạn đặt trước tên ứng dụng hoặc tập lệnh bằng ./, bạn sẽ cho shell biết nơi khởi chạy ứng dụng hoặc tập lệnh.
Inodes và liên kết
Như mình đã trình bày, ba thành phần bắt buộc phải có để có một tệp được định dạng tốt và có thể truy cập được trong hệ thống tệp là tệp, cấu trúc thư mục và inode. Tệp là dữ liệu được lưu trữ trên ổ cứng, cấu trúc thư mục chứa tên của tệp và số inode của nó, inode chứa tất cả siêu dữ liệu cho tệp.
Liên kết tượng trưng là các mục nhập hệ thống tệp trông giống như tệp, nhưng chúng thực sự là các phím tắt trỏ đến tệp hoặc thư mục hiện có.
Giả sử chúng ta có một thư mục chứa hai tệp trong đó: một tệp là tập lệnh và tệp kia là ứng dụng, như được hiển thị bên dưới.
Chúng ta có thể sử dụng lệnh ln và tùy chọn -s (Symbol) để tạo một liên kết mềm đến tệp script, như sau:
ls -s my_script geek.sh
Chúng ta đã tạo một liên kết đến my_script.sh có tên là geek.sh. Chúng ta có thể gõ như sau và sử dụng lệnh ls để xem hai tệp script:
ls -li *.sh
Mục geek.sh có màu xanh lam. Ký tự đầu tiên của quyền là “l” cho liên kết và -> trỏ đến my_script.sh. Tất cả điều này chỉ ra rằng geek.sh là một liên kết.
Hai tệp script có số inode khác nhau. Tuy nhiên, điều ngạc nhiên hơn là liên kết mềm, geek.sh, không có quyền người dùng giống như tệp gốc. Trên thực tế, các quyền cho geek.sh tự do hơn nhiều, tất cả người dùng đều có đầy đủ quyền.
Cấu trúc thư mục cho geek.sh chứa tên của liên kết và inode của nó. Khi bạn cố gắng sử dụng liên kết, inode của nó được tham chiếu, giống như một tệp thông thường. Inode liên kết sẽ trỏ đến một khối đĩa, nhưng thay vì chứa dữ liệu nội dung tệp, khối đĩa chứa tên của tệp gốc. Hệ thống tệp chuyển hướng đến tệp gốc.
Chúng ta sẽ xóa tệp gốc và xem điều gì sẽ xảy ra khi nhập lệnh sau để xem nội dung của geek.sh:
rm my_script.sh
cat geek.sh
Liên kết bị hỏng và chuyển hướng truy cập không thành công.
Bây giờ chúng ta gõ như sau để tạo một liên kết cứng đến tệp ứng dụng:
ln special-app geek-app
Để xem các inodes cho hai tệp này, chúng ta nhập lệnh sau:
ls -li
Cả hai đều trông giống như các tệp thông thường. Không có gì về ứng dụng geek chỉ ra rằng đó là một liên kết theo cách mà ls đã làm với geek.sh. Ngoài ra, ứng dụng geek có quyền người dùng giống như tệp gốc. Tuy nhiên, điều gây ngạc nhiên là cả hai ứng dụng đều có cùng số inode: 1441797.
Mục nhập thư mục cho geek-app chứa tên “geek-app” và số inode, nhưng nó giống với số inode của tệp gốc. Vì vậy, chúng ta có hai mục nhập hệ thống tệp với các tên khác nhau, nhưng cả hai đều trỏ đến cùng một inode. Trên thực tế, bất kỳ số lượng mục nào cũng có thể trỏ đến cùng một inode.
Chúng ta sẽ nhập lệnh sau để xem tệp đích:
stat special-app
Chúng ta thấy rằng hai liên kết cứng trỏ đến tệp này. Điều này được lưu trữ trong inode.
Trong ví dụ sau, chúng ta sẽ xóa tệp gốc và cố gắng sử dụng liên kết có mật khẩu:
rm special-app
./geek-app correcthorsebatterystaple
Đáng ngạc nhiên là ứng dụng chạy như mong đợi, nhưng làm thế nào? Nó hoạt động vì khi bạn xóa một tệp, inode sẽ được sử dụng lại. Cấu trúc thư mục được đánh dấu là có số inode bằng 0 và các khối đĩa sau đó sẵn sàng cho một tệp khác được lưu trữ trong không gian đó.
Tuy nhiên, nếu số liên kết cứng đến inode lớn hơn một, thì số liên kết cứng sẽ giảm đi một và số inode của cấu trúc thư mục của tệp đã xóa được đặt thành 0. Nội dung tệp trên ổ cứng và inode vẫn có sẵn cho các liên kết cứng khác.
Chúng ta sẽ nhập lệnh sau nhưng lần này là trên ứng dụng geek:
stat geek-app
Các chi tiết này được lấy từ cùng một inode (1441797) như lệnh stat trước đó. Số lượng liên kết đã giảm đi một.
Hệ thống tệp sẽ giải phóng inode và đánh dấu cấu trúc thư mục inode bằng không. Sau đó, một tệp mới có thể ghi đè lên phần lưu trữ dữ liệu trên ổ cứng.
Yêu cầu chung của Inode
Để đọc một tệp, hệ thống tệp phải thực hiện tất cả những việc sau:
- Tìm cấu trúc thư mục phù hợp
- Đọc số inode
- Tìm inode phù hợp
- Đọc thông tin inode
- Thực hiện theo các liên kết inode hoặc các phạm vi mở rộng đến các khối đĩa có liên quan
- Đọc dữ liệu tệp
Có rất nhiều việc phải làm chỉ để ls có được thông tin cần thiết để tạo kết quả đầu ra.
Ngoài ra, bạn cũng có thể xem qua 8 hệ điều hành Linux tốt nhất tại đây.
Xem Them Chi Tiet
Nhung Mon Do Cong Nghe Duoc Yeu Thich
Do Cong Nghe Phu Kien
Xem Them Chi Tiet
Phu nu phai dep dan ong moi yeu! Sam ngay bo vay dam sieu dep
Thanh xuan nhu mot tach trá Khong mua do hot phi hoai thanh xuan
Tidak ada komentar:
Posting Komentar