Midagi inode kohta

Keskjaotuskeskusesse kolimiseks teen perioodiliselt intervjuusid erinevates suurettevõtetes, peamiselt Peterburis ja Moskvas, DevOpsi ametikoha saamiseks. Märkasin, et paljud ettevõtted (paljud head ettevõtted, näiteks Yandex) küsivad kahte sarnast küsimust:

  • mis on inode;
  • mis põhjustel võib tekkida ketta kirjutamisviga (või näiteks: miks kettaruum võib otsa saada, olemus on sama).

Nagu sageli juhtub, olin kindel, et tunnen seda teemat hästi, kuid niipea, kui hakkasin seletama, ilmnesid lüngad teadmistes. Oma teadmiste süstematiseerimiseks, lünkade täitmiseks ja enda enam mitte häbistamiseks kirjutan seda artiklit, võib-olla on see kellelegi teisele kasulik.

Alustan põhjast, st. kõvakettalt (viskame ära mälupulgad, SSD-d ja muud moodsad asjad; võtame näiteks mistahes 20 või 80 giga vana draivi, kuna seal on ploki suurus 512 baiti).

Kõvaketas ei tea, kuidas oma ruumi bait-bait haaval adresseerida, see on tinglikult jagatud plokkideks. Plokkide nummerdamine algab 0-st. (Seda nimetatakse LBA-ks, üksikasjad siin: ru.wikipedia.org/wiki/LBA)

Midagi inode kohta

Nagu jooniselt näha, määrasin HDD tasemeks LBA plokid. Muide, teie ketta ploki suurust näete järgmiselt:

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

Ülaltoodud tase on partitsioon, üks kogu ketta jaoks (lihtsuse huvides). Kõige sagedamini kasutatakse kahte tüüpi partitsiooni märgistust: msdos ja gpt. Sellest tulenevalt on msdos vana vorming, mis toetab kuni 2Tb kettaid, gpt on uus vorming, mis suudab adresseerida kuni 1 zetabaiti 512-baidistest plokkidest. Meie puhul on meil msdos tüüpi partitsioon, nagu jooniselt näha, algab partitsioon plokist nr 1, samas kui MBR jaoks kasutatakse nulli.

Esimeses partitsioonis lõin ext2 failisüsteemi, selle vaikimisi ploki suurus on 4096 baiti, mis kajastub ka joonisel. Saate vaadata failisüsteemi ploki suurust järgmiselt:

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

Parameeter, mida vajame, on "Block size".

Nüüd on huvitav osa, kuidas lugeda faili /home/serp/testfile? Fail koosneb ühest või mitmest failisüsteemi plokist, milles selle andmed on salvestatud. Kui teate failinime, kuidas seda leida? Milliseid plokke peaksin lugema?

Siin tulevad appi inoodid. Failisüsteemis ext2fs on "tabel", mis sisaldab teavet kõigi inoodide kohta. Inoodide arv ext2fs puhul määratakse failisüsteemi loomisel. Vaatame tune2fs väljundi parameetris “Inode count” vajalikke numbreid, st. meil on 65536 tükki. Inode sisaldab vajalikku teavet: otsitava faili failisüsteemi plokkide loend. Kuidas leida antud faili inoodi number?

Vastav nimi ja inode number sisalduvad kataloogis ning ext2fs-is olev kataloog on faili eritüüp, st. on ka oma inoodi number. Selle nõiaringi katkestamiseks määrati juurkataloogile "fikseeritud" inoodi number "2". Vaatame inoodi number 2 sisu:

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

Nagu näete, asub meile vajalik kataloog plokis 579. Sealt leiame kodukausta sõlme numbri ja nii edasi, kuni serp-kataloogis näeme soovitud faili sõlme numbrit. Kui äkki keegi tahab kontrollida, kas number on õige ja kas vajalik info on olemas, pole see keeruline. Me teeme:

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

Väljundis saab lugeda kataloogis olevate failide nimesid.

Niisiis jõuan põhiküsimuseni: "mis põhjustel võib salvestusviga tekkida?"

Loomulikult juhtub see siis, kui failisüsteemis pole vabu plokke. Mida saab sel juhul teha? Lisaks ilmselgele "kustuta kõik mittevajalik" peaksite meeles pidama, et ext2,3, 4 ja 13094 failisüsteemides on olemas selline asi nagu "Reserveeritud plokkide arv". Kui vaatate ülaltoodud loendit, on meil sellised plokid "XNUMX". Need on plokid, mida saab kirjutada ainult juurkasutaja. aga kui teil on vaja probleem kiiresti lahendada, saate need ajutise lahendusena kõigile kättesaadavaks teha, mille tulemuseks on vaba ruumi:

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

Need. vaikimisi pole teil kirjutamiseks saadaval 5% kettaruumist ja tänapäevaste ketaste mahtu arvestades võib see olla sadu gigabaite.

Mis see veel olla võiks? Samuti on võimalik, et vabu plokke on, kuid sõlme pole enam. Tavaliselt juhtub see siis, kui teie failisüsteemis on hunnik faile, mis on failisüsteemi ploki suurusest väiksemad. Arvestades, et 1 inode kulub 1 failile või kataloogile ja kokku on meil (antud failisüsteemi jaoks) 65536 - olukord on enam kui realistlik. Seda on selgelt näha käsu df väljundist:

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

Nagu on selgelt näha partitsioonil /var/www, on vabade plokkide arv failisüsteemis ja vabade sõlmede arv väga erinev.

Juhuks, kui sul inoodid otsa saavad, ei räägi ma sulle loitse, sest... neid pole (kui ma eksin, andke teada). Nii et partitsioonide jaoks, milles väikesed failid paljunevad, peaksite failisüsteemi valima targalt. Näiteks btrfs inodes ei saa lõppeda, sest Vajadusel luuakse dünaamiliselt uusi.

Allikas: www.habr.com

Lisa kommentaar