شيء عن inode

بشكل دوري، من أجل الانتقال إلى مركز التوزيع المركزي، أقوم بإجراء مقابلات مع العديد من الشركات الكبرى، خاصة في سانت بطرسبرغ وموسكو، للحصول على منصب DevOps. لقد لاحظت أن العديد من الشركات (العديد من الشركات الجيدة، على سبيل المثال ياندكس) تطرح سؤالين مماثلين:

  • ما هو inode؛
  • لأي أسباب قد تحصل على خطأ في الكتابة على القرص (أو على سبيل المثال: لماذا قد تنفد مساحة القرص، الجوهر هو نفسه).

وكما يحدث في كثير من الأحيان، كنت على يقين من أنني أعرف هذا الموضوع جيدًا، ولكن بمجرد أن بدأت في الشرح، أصبحت الفجوات في المعرفة واضحة. لتنظيم معرفتي، وملء الفجوات وعدم إحراج نفسي بعد الآن، أكتب هذا المقال، ربما يكون مفيدًا لشخص آخر.

سأبدأ من الأسفل، أي. من محرك الأقراص الثابتة (سنتخلص من محركات الأقراص المحمولة ومحركات أقراص SSD وغيرها من الأشياء الحديثة؛ على سبيل المثال، لنفكر في أي محرك أقراص قديم بسعة 20 أو 80 جيجا، نظرًا لأن حجم الكتلة هناك هو 512 بايت).

القرص الصلب لا يعرف كيفية التعامل مع مساحته بايت بايت، فهو مقسم بشكل مشروط إلى كتل. يبدأ ترقيم الكتل من 0. (وهذا ما يسمى LBA، التفاصيل هنا: ru.wikipedia.org/wiki/LBA)

شيء عن inode

كما يتبين من الشكل، قمت بتعيين كتل LBA كمستوى HDD. بالمناسبة، يمكنك معرفة حجم الكتلة الموجودة على القرص الخاص بك على النحو التالي:

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

المستوى أعلاه عبارة عن قسم، قسم للقرص بأكمله (مرة أخرى للتبسيط). في أغلب الأحيان، يتم استخدام نوعين من علامات القسم: msdos وgpt. وفقًا لذلك، يعد msdos تنسيقًا قديمًا يدعم الأقراص التي تصل سعتها إلى 2 تيرابايت، أما 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 عند إنشاء نظام الملفات. نحن ننظر إلى الأرقام المطلوبة في معلمة "Inode count" لمخرج Tune2fs، أي. لدينا 65536 قطعة. يحتوي inode على المعلومات التي نحتاجها: قائمة كتل نظام الملفات للملف الذي نبحث عنه. كيفية العثور على رقم inode لملف معين؟

يتم تضمين الاسم ورقم inode المقابلين في الدليل، والدليل في ext2fs هو نوع خاص من الملفات، أي. لديه أيضًا رقم inode خاص به. لكسر هذه الحلقة المفرغة، تم تعيين رقم inode "ثابت" "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 يوجد شيء مثل "عدد الكتل المحجوزة". إذا نظرت إلى القائمة أعلاه، فلدينا "XNUMX" من هذه الكتل. هذه كتل قابلة للكتابة فقط بواسطة المستخدم الجذر. ولكن إذا كنت بحاجة إلى حل المشكلة بسرعة، كحل مؤقت، يمكنك إتاحتها للجميع، مما يؤدي إلى توفير بعض المساحة الحرة:

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 - الوضع أكثر من واقعي. يمكن رؤية ذلك بوضوح من خلال إخراج الأمر 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، يختلف عدد الكتل المجانية في نظام الملفات وعدد العقد الحرة بشكل كبير.

في حالة نفاد الرموز، لن أخبرك بأي تعويذة، لأن... لا يوجد شيء (إذا كنت مخطئا، اسمحوا لي أن أعرف). لذلك بالنسبة للأقسام التي تتكاثر فيها الملفات الصغيرة، يجب عليك اختيار نظام الملفات بحكمة. على سبيل المثال، لا يمكن أن تنتهي btrfs inodes، لأن يتم إنشاء أخرى جديدة ديناميكيًا إذا لزم الأمر.

المصدر: www.habr.com

إضافة تعليق