Midagi inode'ist

Aeg-ajalt, et üleviimine CRSi, olen intervjueerinud erinevates suurtes ettevõtetes, peamiselt Peterburis ja Moskvas, DevOps ametikoha peale. Olen tähele pannud, et paljudes ettevõtetes (paljudes heades ettevõtetes, näiteks Yandexis) esitatakse kaks sarnast küsimust:

  • mis on inode;
  • millistel põhjustel võib tekkida viga ketta kirjutamisel (või näiteks: miks võib ketas täis saada, sisu on sama).

Nagu sageli juhtub, olin kindel, et teema on mul hästi selge, kuid kui hakkasin selgitama, siis ilmnesid teadmisteaugud. Et oma teadmisi süsteemsemalt korraldada, lünkasid täita ja enam mitte piinlikkust tunda, kirjutan selle artikli, ehk on see kellelegi veel kasulik.

Alustan „alt“, st kõvakettast (väikesed mälupulgad, SSD ja muud kaasaegsed vidinad jäetakse kõrvale, vaatleme igasugust 20 või 80 gigabaidist vana ketast, kuna seal on ploki suurus 512 baiti).

Kõvaketas ei oska adresseerida oma ruumi baitide kaupa, see on tinglikult jagatud plokkideks. Plokkide nummerdamine algab 0-st. (seda nimetatakse LBA-ks, detailid siin: ru.wikipedia.org/wiki/LBA)

Midagi inode'ist

Nagu jooniselt näha, olen LBA plokid tähistanud kui HDD taset. Muide, vaadata, milline on teie ketta ploki suurus, saab niimoodi:

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

Ühe taseme võrra kõrgem on osakond, üks tervele kettale (taas lihtsuse huvides). Kõige sagedamini kasutatakse kaht tüüpi partitsioonihaldust: msdos ja gpt. Seega msdos on vana formaat, mis toetab kettasid kuni 2Tb, gpt on uus formaat, mis suudab adresseerida kuni 1 zettabaidi 512 baitiste plokkide. Meie juhul on osakonna tüüp msdos, nagu jooniselt näha, osakond algab ploki nr 1-st, nullkasutatakse aga MBR jaoks.

Esimeses osas lõin failisüsteemi ext2, mille ploki suurus on vaikimisi 4096 baiti, nagu jooniselt näha. Failisüsteemi ploki suurust saab vaadata niimoodi:

root@ubuntu:/home/serp# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Filesystem volume name:   
Last mounted on:          
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 ()
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

Meile vajalik parameeter on "Block size."

Nüüd on kõige huvitavam, kuidas lugeda faili /home/serp/testfile? Fail koosneb ühe või mitme failisüsteemi blokist, kus on talletatud selle andmed. Teades faili nime, kuidas seda leida? Milliseid blokke lugeda?

Siin tulevadki abiks inode'id. Failisüsteemil ext2fs on "tabel", kus on teave kõigi inode'ide kohta. Inode'ide arvu määrab ext2fs-i loomisel failisüsteem. Vajalikke arve vaatame parametrist "Inode count" tune2fs väljundis, st meil on 65536 tükki. Inode'ides on vajalik teave: failisüsteemi blokkide loetelu otsitava faili jaoks. Kuidas leida antud faili inode'i number?

Nime ja inode'i numberi vastavust hoitakse kataloogis ning kataloog ext2fs-is on erilise tüübi fail, st tal on samuti oma inode'i number. Selle nõiaringi katkestamiseks määrati juurkataloogile „fikseeritud“ inode'i number „2“. Vaatame inode'i sisu numbriga 2:

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

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äha, sisaldub vajalik kaust plokis number 579. Sealt leiame kausta home nodenumbri ja jätkame järjestust, kuni kataloogis serp näeme nõutud faili nodenumbrit. Kui keegi soovib kontrollida, kas number on õige ja kas seal on vajalik teave, pole see keeruline. 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äljundist võib lugeda kaustade nimesid.

Nüüd olen lähenenud peamisele küsimusele: „Millistel põhjustel võib tekkida kirjutamisviga“?

Loomulikult juhtub see siis, kui failisüsteemis ei jää vabu blokke. Mida saab sel juhul teha? Peale kõige ilmsema „kustuta midagi mittevajalikku“, tasub meeles pidada, et failisüsteemides ext2, 3 ja 4 on selline asi nagu „Reserved block count“. Kui vaadata eelnevat nimekirja, siis on meil neid blokee „13094“. Need blokid on kirjutamiseks saadaval ainult kasutajale root. Kuid kui on vaja küsimus kiiresti lahendada, siis saab ajutiselt teha need kõikidele kättesaadavaks, mille tulemusena ilmub veidi vaba ruumi:

root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Seades reserveeritud blokki protsendi 0% (0 blokki)

See tähendab, et vaikimisi on teil kirjutamiseks kättesaadavad 5% ketasruumist, ja arvestades kaasaegsete ketaste mahtu, võivad need olla sada gigabaytti.

Mis veel võib juhtuda? Veel on võimalik olukord, kus vabad blokid on olemas, kuid nodid on otsas. See juhtub tavaliselt siis, kui teie failisüsteemis on palju faile, mis on väiksemad kui failisüsteemi bloki suurus. Arvestades, et iga faili või kausta puhul kulub 1 inode ja kokku on need (antud failisüsteemi jaoks) 65536 — olukord on enam kui reaalne. Selgelt on seda näha käsku df käitades:

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 hästi on märgata jaotises /var/www, on failisüsteemi vabad blokeerimise numbrid ja vabad noodid tugevalt erinevad.

Kui inode'id peaksid otsa lõppema, ei oska ma juhendada, kuna neid pole (kui ma eksin, andke teada). Seega, jaotistes, kus luuakse väikeseid faile, tuleb failisüsteemi valimisel olla hoolikas. Näiteks btrfs puhul ei saa inode'id otsa lõppeda, kuna neid luuakse vajadusel dünaamiliselt.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster