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:
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