Κάτι για το inode

Περιοδικά, για να μετακομίσω στο Κεντρικό Κέντρο Διανομής, παίρνω συνεντεύξεις από διάφορες μεγάλες εταιρείες, κυρίως στην Αγία Πετρούπολη και τη Μόσχα, για μια θέση DevOps. Παρατήρησα ότι πολλές εταιρείες (πολλές καλές εταιρείες, για παράδειγμα η Yandex) κάνουν δύο παρόμοιες ερωτήσεις:

  • τι είναι το inode?
  • για ποιους λόγους μπορεί να εμφανιστεί ένα σφάλμα εγγραφής στο δίσκο (ή για παράδειγμα: γιατί μπορεί να εξαντληθεί ο χώρος στο δίσκο, η ουσία είναι η ίδια).

Όπως συμβαίνει συχνά, ήμουν σίγουρος ότι ήξερα καλά αυτό το θέμα, αλλά μόλις άρχισα να εξηγώ, έγιναν εμφανή κενά στη γνώση. Για να συστηματοποιήσω τις γνώσεις μου, να καλύψω τα κενά και να μην ντρέπομαι πια, γράφω αυτό το άρθρο, ίσως είναι χρήσιμο σε κάποιον άλλον.

Θα ξεκινήσω από κάτω, δηλ. από έναν σκληρό δίσκο (θα απορρίψουμε μονάδες flash, SSD και άλλα σύγχρονα πράγματα· για παράδειγμα, ας εξετάσουμε οποιαδήποτε μονάδα δίσκου 20 ή 80 gig, καθώς το μέγεθος του μπλοκ είναι 512 byte).

Ο σκληρός δίσκος δεν γνωρίζει πώς να διευθύνει τον χώρο του byte byte, χωρίζεται υπό όρους σε μπλοκ. Η αρίθμηση μπλοκ ξεκινά από το 0. (Αυτό ονομάζεται LBA, λεπτομέρειες εδώ: ru.wikipedia.org/wiki/LBA)

Κάτι για το inode

Όπως φαίνεται από το σχήμα, όρισα μπλοκ LBA ως επίπεδο σκληρού δίσκου. Παρεμπιπτόντως, μπορείτε να δείτε τι μέγεθος μπλοκ έχει ο δίσκος σας ως εξής:

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

Το παραπάνω επίπεδο είναι ένα διαμέρισμα, ένα για ολόκληρο το δίσκο (και πάλι για απλότητα). Τις περισσότερες φορές, χρησιμοποιούνται δύο τύποι σήμανσης διαμερισμάτων: msdos και gpt. Αντίστοιχα, το msdos είναι μια παλιά μορφή που υποστηρίζει δίσκους έως 2 Tb, το gpt είναι μια νέα μορφή ικανή να διευθύνει έως και 1 zettabyte μπλοκ 512 byte. Στην περίπτωσή μας, έχουμε ένα διαμέρισμα τύπου msdos, όπως φαίνεται από το σχήμα, το διαμέρισμα ξεκινά με το μπλοκ Νο. 1, ενώ το μηδέν χρησιμοποιείται για το MBR.

Στο πρώτο διαμέρισμα που δημιούργησα ένα σύστημα αρχείων ext2, το προεπιλεγμένο μέγεθος του μπλοκ είναι 4096 byte, το οποίο αντικατοπτρίζεται επίσης στο σχήμα. Μπορείτε να δείτε το μέγεθος του μπλοκ συστήματος αρχείων ως εξής:

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 έχει έναν "πίνακα" που περιέχει πληροφορίες για όλα τα inode. Ο αριθμός των inodes στην περίπτωση του ext2fs ορίζεται κατά τη δημιουργία του συστήματος αρχείων. Εξετάζουμε τους απαιτούμενους αριθμούς στην παράμετρο "Inode count" της εξόδου tune2fs, δηλ. έχουμε 65536 κομμάτια. Το inode περιέχει τις πληροφορίες που χρειαζόμαστε: μια λίστα μπλοκ συστήματος αρχείων για το αρχείο που αναζητούμε. Πώς να βρείτε τον αριθμό inode για ένα δεδομένο αρχείο;

Το αντίστοιχο όνομα και ο αριθμός inode περιέχονται στον κατάλογο και ένας κατάλογος στο ext2fs είναι ένας ειδικός τύπος αρχείου, π.χ. έχει επίσης τον δικό του αριθμό κωδικού. Για να σπάσει αυτός ο φαύλος κύκλος, ένας "σταθερός" αριθμός inode "2" εκχωρήθηκε στον ριζικό κατάλογο. Ας δούμε τα περιεχόμενα του inode number 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. αλλά αν χρειάζεται να επιλύσετε γρήγορα το πρόβλημα, ως προσωρινή λύση μπορείτε να τα καταστήσετε διαθέσιμα σε όλους, με αποτέλεσμα λίγο ελεύθερο χώρο:

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

Εκείνοι. Από προεπιλογή, έχετε το 5% του χώρου στο δίσκο που δεν είναι διαθέσιμο για εγγραφή και, δεδομένου του όγκου των σύγχρονων δίσκων, μπορεί να είναι εκατοντάδες gigabyte.

Τι άλλο θα μπορούσε να είναι; Είναι επίσης πιθανό να υπάρχουν ελεύθερα μπλοκ, αλλά να μην υπάρχουν άλλοι κόμβοι. Αυτό συμβαίνει συνήθως εάν έχετε ένα σωρό αρχεία στο σύστημα αρχείων σας που είναι μικρότερα από το μέγεθος του μπλοκ συστήματος αρχείων. Λαμβάνοντας υπόψη ότι 1 inode ξοδεύεται σε 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, ο αριθμός των ελεύθερων μπλοκ στο σύστημα αρχείων και ο αριθμός των ελεύθερων κόμβων ποικίλλουν πολύ.

Σε περίπτωση που ξεμείνετε από inode, δεν θα σας πω ξόρκια, γιατί... δεν υπάρχουν (αν κάνω λάθος, ενημερώστε με). Επομένως, για διαμερίσματα στα οποία πολλαπλασιάζονται μικρά αρχεία, θα πρέπει να επιλέξετε το σύστημα αρχείων με σύνεση. Για παράδειγμα, το btrfs inodes δεν μπορεί να τελειώσει, γιατί Νέα δημιουργούνται δυναμικά εάν είναι απαραίτητο.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο