Diçka për inode

Periodikisht, për të kaluar në Qendrën Qendrore të Shpërndarjes, intervistoj në kompani të ndryshme të mëdha, kryesisht në Shën Petersburg dhe Moskë, për një pozicion DevOps. Vura re se shumë kompani (shumë kompani të mira, për shembull Yandex) bëjnë dy pyetje të ngjashme:

  • çfarë është inode;
  • për cilat arsye mund të merrni një gabim në shkrimin e diskut (ose për shembull: pse mund t'ju mbarojë hapësira në disk, thelbi është i njëjtë).

Siç ndodh shpesh, isha i sigurt se e njihja mirë këtë temë, por sapo fillova të shpjegoj, boshllëqet në njohuri u bënë të dukshme. Për të sistemuar njohuritë e mia, për të mbushur boshllëqet dhe për të mos vënë më në siklet veten time, po shkruaj këtë artikull, ndoshta do t'i jetë i dobishëm dikujt tjetër.

Do të filloj nga fundi, d.m.th. nga një hard disk (do të heqim disqet flash, SSD dhe gjëra të tjera moderne; për shembull, le të marrim parasysh çdo disk të vjetër 20 ose 80 giga, pasi madhësia e bllokut atje është 512 bajt).

Hard disku nuk di se si të adresojë hapësirën e tij bajt pas bajt; ai ndahet me kusht në blloqe. Numërimi i bllokut fillon nga 0. (Kjo quhet LBA, detajet këtu: ru.wikipedia.org/wiki/LBA)

Diçka për inode

Siç mund të shihet nga figura, unë caktova blloqet LBA si nivel HDD. Nga rruga, ju mund të shihni se çfarë madhësie blloku ka disku juaj si kjo:

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

Niveli i mësipërm është një ndarje, një për të gjithë diskun (përsëri për thjeshtësi). Më shpesh, përdoren dy lloje të shënjimit të ndarjeve: msdos dhe gpt. Prandaj, msdos është një format i vjetër që mbështet disqe deri në 2 Tb, gpt është një format i ri i aftë për të adresuar deri në 1 zetabyte blloqe 512 bajt. Në rastin tonë kemi një ndarje të tipit msdos, siç shihet nga figura, ndarja fillon me bllokun nr.1, ndërsa zero përdoret për MBR.

Në ndarjen e parë kam krijuar një sistem skedar ext2, madhësia e bllokut të tij të paracaktuar është 4096 bajt, gjë që pasqyrohet edhe në figurë. Ju mund të shikoni madhësinë e bllokut të sistemit të skedarëve si kjo:

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

Parametri që na nevojitet është "Madhësia e bllokut".

Tani pjesa interesante është se si të lexoni skedarin /home/serp/testfile? Një skedar përbëhet nga një ose më shumë blloqe të sistemit të skedarëve në të cilat ruhen të dhënat e tij. Duke ditur emrin e skedarit, si ta gjeni atë? Cilat blloqe duhet të lexoj?

Kjo është ajo ku inodes vijnë në ndihmë. Sistemi i skedarëve ext2fs ka një "tabela" që përmban informacione për të gjitha inodet. Numri i inodes në rastin e ext2fs vendoset kur krijohet sistemi i skedarëve. Ne shikojmë numrat e kërkuar në parametrin "Inode count" të daljes tune2fs, d.m.th. kemi 65536 copë. Inode përmban informacionin që na nevojitet: një listë e blloqeve të sistemit të skedarëve për skedarin që kërkojmë. Si të gjeni numrin inode për një skedar të caktuar?

Emri përkatës dhe numri inode përmbahen në drejtori, dhe një direktori në ext2fs është një lloj skedari i veçantë, d.m.th. gjithashtu ka numrin e vet inode. Për të thyer këtë rreth vicioz, një numër inode "fiks" "2" u caktua në direktorinë rrënjë. Le të shohim përmbajtjen e inodit numër 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

Siç mund ta shihni, direktoria që na nevojitet gjendet në bllokun numër 579. Në të do të gjejmë numrin e nyjës për dosjen kryesore, dhe kështu me radhë poshtë zinxhirit derisa në direktorinë serp të shohim numrin e nyjës për skedarin e kërkuar. Nëse papritmas dikush dëshiron të kontrollojë nëse numri është i saktë dhe nëse informacioni i nevojshëm është aty, nuk është e vështirë. Ne bejme:

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

Në dalje mund të lexoni emrat e skedarëve në drejtori.

Kështu që unë vij në pyetjen kryesore: "për cilat arsye mund të ndodhë një gabim regjistrimi?"

Natyrisht, kjo do të ndodhë nëse nuk ka blloqe të lira të mbetura në sistemin e skedarëve. Çfarë mund të bëhet në këtë rast? Përveç "fshirjes së çdo gjëje të panevojshme" të dukshme, duhet të mbani mend se në sistemet e skedarëve ext2,3 dhe 4 ekziston një gjë e tillë si "Numri i bllokut të rezervuar". Nëse shikoni listën e mësipërme, ne kemi "13094" blloqe të tilla. Këto janë blloqe që mund të shkruhen vetëm nga përdoruesi rrënjë. por nëse keni nevojë ta zgjidhni shpejt problemin, si një zgjidhje e përkohshme mund t'i bëni ato të disponueshme për të gjithë, duke rezultuar në një hapësirë ​​të lirë:

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

Ato. si parazgjedhje, ju keni 5% të hapësirës së diskut të padisponueshme për shkrim, dhe duke pasur parasysh vëllimin e disqeve moderne, kjo mund të jetë qindra gigabajt.

Çfarë tjetër mund të jetë? Është gjithashtu e mundur që të ketë blloqe të lira, por nuk ka më nyje. Kjo zakonisht ndodh nëse keni një grup skedarësh në sistemin tuaj të skedarëve që janë më të vegjël se madhësia e bllokut të sistemit të skedarëve. Duke marrë parasysh që 1 inode shpenzohet për 1 skedar ose drejtori, dhe në total kemi (për një sistem skedar të caktuar) 65536 - situata është më se realiste. Kjo mund të shihet qartë nga dalja e komandës 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

Siç shihet qartë në ndarjen /var/www, numri i blloqeve të lira në sistemin e skedarëve dhe numri i nyjeve të lira ndryshojnë shumë.

Në rast se ju mbarojnë inode, nuk do t'ju tregoj asnjë magji, sepse ... nuk ka asnjë (nëse e kam gabim, më njoftoni). Pra, për ndarjet në të cilat skedarët e vegjël shumëzohen, duhet të zgjidhni sistemin e skedarëve me mençuri. Për shembull, btrfs inodes nuk mund të përfundojë, sepse Të reja krijohen në mënyrë dinamike nëse është e nevojshme.

Burimi: www.habr.com

Shto një koment