Đôi điều về inode

Định kỳ, để chuyển đến Trung tâm phân phối trung tâm, tôi phỏng vấn tại nhiều công ty lớn khác nhau, chủ yếu ở St. Petersburg và Moscow, cho vị trí DevOps. Tôi nhận thấy rằng nhiều công ty (nhiều công ty tốt, ví dụ như Yandex) đặt hai câu hỏi tương tự:

  • inode là gì;
  • vì lý do gì mà bạn có thể gặp lỗi ghi đĩa (hoặc ví dụ: tại sao bạn có thể hết dung lượng ổ đĩa, bản chất là như nhau).

Như thường lệ, tôi chắc chắn rằng mình biết rõ chủ đề này, nhưng ngay khi tôi bắt đầu giải thích, những lỗ hổng kiến ​​​​thức đã trở nên rõ ràng. Để hệ thống hóa kiến ​​thức, lấp đầy những chỗ trống và không còn khiến bản thân phải xấu hổ, tôi viết bài này, biết đâu nó sẽ hữu ích cho người khác.

Tôi sẽ bắt đầu từ phía dưới, tức là từ ổ cứng (chúng tôi sẽ loại bỏ ổ đĩa flash, SSD và những thứ hiện đại khác; ví dụ: hãy xem xét bất kỳ ổ đĩa cũ 20 hoặc 80 gig nào, vì kích thước khối ở đó là 512 byte).

Ổ cứng không biết cách đánh địa chỉ byte không gian của nó theo byte, nó được chia thành các khối một cách có điều kiện. Đánh số khối bắt đầu từ 0. (Đây gọi là LBA, chi tiết tại đây: ru.wikipedia.org/wiki/LBA)

Đôi điều về inode

Như có thể thấy trong hình, tôi đã chỉ định các khối LBA làm cấp độ HDD. Nhân tiện, bạn có thể xem kích thước khối của đĩa của bạn như thế này:

root@ubuntu:/home/serp# blockdev --getpbsz /dev/sdb
512

Cấp độ trên là một phân vùng, một phân vùng cho toàn bộ đĩa (một lần nữa để đơn giản). Thông thường, hai loại đánh dấu phân vùng được sử dụng: msdos và gpt. Theo đó, msdos là định dạng cũ hỗ trợ ổ đĩa lên tới 2Tb, gpt là định dạng mới có khả năng đánh địa chỉ lên tới 1 zettabyte gồm các khối 512 byte. Trong trường hợp của chúng tôi, chúng tôi có một phân vùng loại msdos, như có thể thấy trong hình, phân vùng bắt đầu bằng khối số 1, trong khi số XNUMX được sử dụng cho MBR.

Trong phần đầu tiên, tôi đã tạo một hệ thống tệp ext2, kích thước khối mặc định của nó là 4096 byte, điều này cũng được phản ánh trong hình. Bạn có thể xem kích thước khối hệ thống tệp như thế này:

root@ubuntu:/home/serp# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          a600bf40-f660-41f6-a3e6-96c303995479
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65536
Block count:              261888
Reserved block count:     13094
Free blocks:              257445
Free inodes:              65525
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      63
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Fri Aug  2 15:02:13 2019
Last mount time:          n/a
Last write time:          Fri Aug  2 15:02:14 2019
Mount count:              0
Maximum mount count:      -1
Last checked:             Fri Aug  2 15:02:13 2019
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Default directory hash:   half_md4
Directory Hash Seed:      c0155456-ad7d-421f-afd1-c898746ccd76

Tham số chúng ta cần là “Kích thước khối”.

Bây giờ phần thú vị là làm thế nào để đọc tệp /home/serp/testfile? Một tệp bao gồm một hoặc nhiều khối hệ thống tệp trong đó dữ liệu của nó được lưu trữ. Biết tên tập tin, làm thế nào để tìm thấy nó? Tôi nên đọc khối nào?

Đây là nơi inode có ích. Hệ thống tệp ext2fs có một "bảng" chứa thông tin cho tất cả các nút. Số lượng nút trong trường hợp ext2fs được đặt khi tạo hệ thống tệp. Chúng tôi xem xét các số được yêu cầu trong tham số “Inode count” của đầu ra tune2fs, tức là. chúng tôi có 65536 mảnh. Inode chứa thông tin chúng ta cần: danh sách các khối hệ thống tệp cho tệp chúng ta đang tìm kiếm. Làm cách nào để tìm số inode cho một tệp nhất định?

Tên và số inode tương ứng được chứa trong thư mục và thư mục trong ext2fs là một loại tệp đặc biệt, tức là. cũng có số inode riêng. Để phá vỡ vòng luẩn quẩn này, số inode “cố định” “2” đã được gán cho thư mục gốc. Hãy xem nội dung của inode số 2:

root@ubuntu:/# debugfs /dev/sdb1
debugfs 1.42.9 (4-Feb-2014)
debugfs:  stat <2>

Inode: 2   Type: directory    Mode:  0755   Flags: 0x0
Generation: 0    Version: 0x00000000:00000002
User:     0   Group:     0   Size: 4096
File ACL: 0    Directory ACL: 0
Links: 3   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x5d43cb51:16b61bcc -- Fri Aug  2 16:34:09 2019
 atime: 0x5d43c247:b704301c -- Fri Aug  2 15:55:35 2019
 mtime: 0x5d43cb51:16b61bcc -- Fri Aug  2 16:34:09 2019
crtime: 0x5d43b5c6:00000000 -- Fri Aug  2 15:02:14 2019
Size of extra inode fields: 28
BLOCKS:
(0):579
TOTAL: 1

Như bạn có thể thấy, thư mục chúng ta cần được chứa trong khối số 579. Trong đó, chúng ta sẽ tìm thấy số nút cho thư mục chính, v.v. trong chuỗi cho đến khi trong thư mục serp, chúng ta thấy số nút cho tệp được yêu cầu. Nếu đột nhiên có người muốn kiểm tra xem con số đó có đúng không và có những thông tin cần thiết hay không thì cũng không khó. Chúng tôi làm:

root@ubuntu:/# dd if=/dev/sdb1 of=/home/serp/dd_image bs=4096 count=1 skip=579
1+0 records in
1+0 records out
4096 bytes (4,1 kB) copied, 0,000184088 s, 22,3 MB/s
root@ubuntu:/# hexdump -c /home/serp/dd_image

Ở đầu ra, bạn có thể đọc tên của các tập tin trong thư mục.

Vì vậy, tôi đi đến câu hỏi chính: "vì lý do gì mà lỗi ghi âm có thể xảy ra?"

Đương nhiên, điều này sẽ xảy ra nếu không còn khối trống nào trong hệ thống tệp. Có thể làm gì trong trường hợp này? Bên cạnh điều hiển nhiên là “xóa mọi thứ không cần thiết”, bạn nên nhớ rằng trong hệ thống tệp ext2,3 và 4 còn có một thứ như “Số khối dành riêng”. Nếu bạn nhìn vào danh sách ở trên, chúng tôi có “13094” khối như vậy. Đây là những khối chỉ có thể ghi được bởi người dùng root. nhưng nếu bạn cần nhanh chóng giải quyết vấn đề, thì như một giải pháp tạm thời, bạn có thể cung cấp chúng cho mọi người, dẫn đến một số dung lượng trống:

root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Setting reserved blocks percentage to 0% (0 blocks)

Những thứ kia. theo mặc định, bạn có 5% dung lượng ổ đĩa không có sẵn để ghi và với dung lượng ổ đĩa hiện đại, con số này có thể lên tới hàng trăm gigabyte.

Nó có thể là gì nữa? Cũng có thể có các khối trống nhưng không còn nút nào nữa. Điều này thường xảy ra nếu bạn có một loạt tệp trên hệ thống tệp nhỏ hơn kích thước khối hệ thống tệp. Xem xét rằng 1 inode được sử dụng cho 1 tệp hoặc thư mục và tổng cộng chúng tôi có (đối với một hệ thống tệp nhất định) 65536 - tình hình còn hơn cả thực tế. Điều này có thể thấy rõ từ đầu ra của lệnh df:

serp@ubuntu:~$ df -hi
Filesystem     Inodes IUsed IFree IUse% Mounted on
udev             493K   480  492K    1% /dev
tmpfs            493K   425  493K    1% /run
/dev/xvda1       512K  240K  273K   47% /
none             493K     2  493K    1% /sys/fs/cgroup
none             493K     2  493K    1% /run/lock
none             493K     1  493K    1% /run/shm
none             493K     2  493K    1% /run/user
/dev/xvdc1       320K  4,1K  316K    2% /var
/dev/xvdb1        64K   195   64K    1% /home
/dev/xvdh1       4,0M  3,1M  940K   78% /var/www
serp@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2,0G  4,0K  2,0G   1% /dev
tmpfs           395M  620K  394M   1% /run
/dev/xvda1      7,8G  2,9G  4,6G  39% /
none            4,0K     0  4,0K   0% /sys/fs/cgroup
none            5,0M     0  5,0M   0% /run/lock
none            2,0G     0  2,0G   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/xvdc1      4,8G  2,6G  2,0G  57% /var
/dev/xvdb1      990M  4,0M  919M   1% /home
/dev/xvdh1       63G   35G   25G  59% /var/www

Như được hiển thị rõ ràng trên phân vùng /var/www, số lượng khối trống trong hệ thống tệp và số lượng nút trống rất khác nhau.

Trong trường hợp bạn hết inode, tôi sẽ không cho bạn biết bất kỳ phép thuật nào, bởi vì... không có (nếu tôi sai, hãy cho tôi biết). Vì vậy, đối với các phân vùng chứa nhiều tệp nhỏ, bạn nên chọn hệ thống tệp một cách khôn ngoan. Ví dụ: inode btrfs không thể kết thúc, bởi vì Những cái mới được tạo động nếu cần thiết.

Nguồn: www.habr.com

Thêm một lời nhận xét