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-c898746ccd76Parameeter, 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: 1Nagu 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_imageVĂ€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/wwwNagu 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
