บางอย่างเกี่ยวกับไอโหนด

เพื่อที่จะย้ายไปที่ Central Distribution Center ฉันสัมภาษณ์ตำแหน่ง DevOps ที่บริษัทขนาดใหญ่หลายแห่ง ซึ่งส่วนใหญ่อยู่ในเซนต์ปีเตอร์สเบิร์กและมอสโกวเป็นระยะๆ ฉันสังเกตเห็นว่าหลายบริษัท (บริษัทดีๆ หลายแห่ง เช่น Yandex) ถามคำถามที่คล้ายกันสองข้อ:

  • ไอโหนดคืออะไร
  • ด้วยเหตุผลใดที่คุณได้รับข้อผิดพลาดในการเขียนดิสก์ (หรือตัวอย่างเช่น: เหตุใดพื้นที่ดิสก์ของคุณอาจหมด สาระสำคัญก็เหมือนกัน)

บ่อยครั้งที่ฉันแน่ใจว่าฉันรู้หัวข้อนี้ดี แต่ทันทีที่ฉันเริ่มอธิบาย ช่องว่างในความรู้ก็ปรากฏชัดเจน เพื่อจัดระบบความรู้ของฉันเติมช่องว่างและไม่ทำให้ตัวเองอับอายอีกต่อไปฉันกำลังเขียนบทความนี้บางทีมันอาจจะเป็นประโยชน์กับคนอื่น

ฉันจะเริ่มจากด้านล่างนั่นคือ จากฮาร์ดไดรฟ์ (เราจะทิ้งแฟลชไดรฟ์, SSD และสิ่งที่ทันสมัยอื่น ๆ ตัวอย่างเช่นลองพิจารณาไดรฟ์เก่า 20 หรือ 80 กิ๊กเนื่องจากขนาดบล็อกคือ 512 ไบต์)

ฮาร์ดไดรฟ์ไม่ทราบวิธีจัดการพื้นที่ไบต์ทีละไบต์โดยแบ่งออกเป็นบล็อกตามเงื่อนไข การกำหนดหมายเลขบล็อกเริ่มต้นจาก 0 (ซึ่งเรียกว่า LBA มีรายละเอียดที่นี่: ru.wikipedia.org/wiki/LBA)

บางอย่างเกี่ยวกับไอโหนด

ดังที่เห็นได้จากภาพ ฉันกำหนดให้บล็อก LBA เป็นระดับ HDD อย่างไรก็ตาม คุณสามารถดูว่าดิสก์ของคุณมีขนาดบล็อกเท่าใด:

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

ระดับด้านบนคือพาร์ติชั่น หนึ่งพาร์ติชั่นสำหรับทั้งดิสก์ (อีกครั้งเพื่อความเรียบง่าย) ส่วนใหญ่มักใช้มาร์กอัปพาร์ติชันสองประเภท: msdos และ gpt ดังนั้น msdos จึงเป็นรูปแบบเก่าที่รองรับดิสก์สูงสุด 2Tb gpt เป็นรูปแบบใหม่ที่สามารถจัดการบล็อกได้สูงสุด 1 เซตตะไบต์จาก 512 ไบต์ ในกรณีของเรา เรามีพาร์ติชันประเภท msdos ดังที่เห็นได้จากรูปภาพ พาร์ติชันจะขึ้นต้นด้วยบล็อกหมายเลข 1 ในขณะที่ MBR จะใช้ศูนย์

ในพาร์ติชันแรกฉันสร้างระบบไฟล์ ext2 ขนาดบล็อกเริ่มต้นคือ 4096 ไบต์ ซึ่งสะท้อนให้เห็นในรูปด้วย คุณสามารถดูขนาดบล็อกระบบไฟล์ได้ดังนี้:

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

พารามิเตอร์ที่เราต้องการคือ "ขนาดบล็อก"

ตอนนี้ส่วนที่น่าสนใจคือจะอ่านไฟล์ /home/serp/testfile ได้อย่างไร? ไฟล์ประกอบด้วยบล็อกระบบไฟล์ตั้งแต่หนึ่งบล็อกขึ้นไปซึ่งข้อมูลจะถูกเก็บไว้ รู้ชื่อไฟล์แล้วจะค้นหาได้อย่างไร? ฉันควรอ่านบล็อกใด

นี่คือจุดที่ inodes มีประโยชน์ ระบบไฟล์ ext2fs มี "ตาราง" ที่มีข้อมูลสำหรับ inodes ทั้งหมด จำนวน inodes ในกรณีของ ext2fs ถูกตั้งค่าเมื่อสร้างระบบไฟล์ เราดูตัวเลขที่ต้องการในพารามิเตอร์ "จำนวนไอโหนด" ของเอาต์พุต tune2fs เช่น เรามี 65536 ชิ้น. inode มีข้อมูลที่เราต้องการ: รายการบล็อกระบบไฟล์สำหรับไฟล์ที่เราต้องการ จะค้นหาหมายเลขไอโหนดของไฟล์ที่กำหนดได้อย่างไร?

ชื่อและหมายเลขไอโหนดที่เกี่ยวข้องมีอยู่ในไดเร็กทอรี และไดเร็กทอรีใน ext2fs เป็นไฟล์ประเภทพิเศษ เช่น มีหมายเลขไอโหนดของตัวเองด้วย เพื่อทำลายวงจรอุบาทว์นี้ จึงมีการกำหนดหมายเลขไอโหนด "คงที่" "2" ให้กับไดเร็กทอรีราก ลองดูเนื้อหาของ inode หมายเลข 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

อย่างที่คุณเห็น ไดเร็กทอรีที่เราต้องการนั้นอยู่ในบล็อกหมายเลข 579 ในนั้น เราจะค้นหาหมายเลขโหนดสำหรับโฟลเดอร์โฮม และต่อไปเรื่อยๆ จนกระทั่งในไดเร็กทอรี serp เราจะเห็นหมายเลขโหนดสำหรับไฟล์ที่ร้องขอ หากจู่ๆมีคนอยากตรวจสอบว่าตัวเลขถูกต้องและมีข้อมูลที่จำเป็นอยู่หรือไม่ก็ไม่ใช่เรื่องยาก พวกเราทำ:

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

ในเอาต์พุต คุณสามารถอ่านชื่อไฟล์ในไดเร็กทอรีได้

ดังนั้นฉันจึงมาถึงคำถามหลัก: “เหตุใดข้อผิดพลาดในการบันทึกจึงเกิดขึ้นได้”

โดยปกติแล้วสิ่งนี้จะเกิดขึ้นหากไม่มีบล็อกว่างเหลืออยู่ในระบบไฟล์ ในกรณีนี้สามารถทำอะไรได้บ้าง? นอกจาก "ลบสิ่งที่ไม่จำเป็น" อย่างชัดเจนแล้ว คุณควรจำไว้ว่าในระบบไฟล์ ext2,3 และ 4 มีสิ่งที่เรียกว่า "จำนวนบล็อกที่สงวนไว้" หากคุณดูรายการด้านบน เรามีบล็อกดังกล่าว “13094” บล็อกเหล่านี้เป็นบล็อกที่เขียนได้โดยผู้ใช้รูทเท่านั้น แต่ถ้าคุณต้องการแก้ไขปัญหาอย่างรวดเร็ว คุณสามารถทำให้ทุกคนสามารถใช้ได้เป็นวิธีแก้ปัญหาชั่วคราว ซึ่งส่งผลให้มีพื้นที่ว่างบางส่วน:

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

เหล่านั้น. โดยค่าเริ่มต้น คุณมีพื้นที่ว่างในดิสก์ 5% ที่ไม่สามารถเขียนได้ และเมื่อพิจารณาถึงปริมาณของดิสก์สมัยใหม่ อาจมีหลายร้อยกิกะไบต์

มันจะเป็นอะไรอีกล่ะ? อาจเป็นไปได้ว่ามีบล็อกว่าง แต่ไม่มีโหนดอีกต่อไป ซึ่งมักจะเกิดขึ้นหากคุณมีไฟล์จำนวนมากในระบบไฟล์ของคุณที่เล็กกว่าขนาดบล็อกของระบบไฟล์ เมื่อพิจารณาว่า 1 ไอโหนดถูกใช้ไปกับ 1 ไฟล์หรือไดเร็กทอรีและโดยรวมแล้วเรามี (สำหรับระบบไฟล์ที่กำหนด) 65536 - สถานการณ์นั้นสมจริงมากกว่าความเป็นจริง สิ่งนี้สามารถเห็นได้ชัดเจนจากผลลัพธ์ของคำสั่ง 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

ตามที่เห็นได้ชัดเจนบนพาร์ติชัน /var/www จำนวนบล็อกที่ว่างในระบบไฟล์และจำนวนโหนดที่ว่างจะแตกต่างกันอย่างมาก

ในกรณีที่คุณหมด inodes ฉันจะไม่บอกคาถาใด ๆ ให้คุณเพราะ... ไม่มีเลย (ถ้าฉันผิดโปรดบอกฉันด้วย) ดังนั้นสำหรับพาร์ติชั่นที่มีไฟล์ขนาดเล็กทวีคูณ คุณควรเลือกระบบไฟล์อย่างชาญฉลาด ตัวอย่างเช่น btrfs inodes ไม่สามารถสิ้นสุดได้ เนื่องจาก สิ่งใหม่จะถูกสร้างขึ้นแบบไดนามิกหากจำเป็น

ที่มา: will.com

เพิ่มความคิดเห็น