Aldian behin, Banaketa Zentro Zentrora joateko, hainbat enpresa handitan elkarrizketatzen dut, batez ere San Petersburgo eta Moskun, DevOps postu baterako. Konturatu nintzen enpresa askok (enpresa on askok, Yandex adibidez) antzeko bi galdera egiten dituztela:
- zer da inodoa;
- zer arrazoirengatik lor dezakezu diskoaren idazketa-errore bat (edo adibidez: zergatik agortu zaitezke diskoko lekurik, funtsa berdina da).
Askotan gertatzen den bezala, ziur nengoen gai hau ondo ezagutzen nuela, baina azaltzen hasi bezain pronto, ezagutzan hutsuneak nabaritu ziren. Nire ezagutza sistematizatu, hutsuneak bete eta gehiago lotsatzeko, artikulu hau idazten ari naiz, agian beste norbaitentzat baliagarria izango da.
Behetik hasiko naiz, hau da. disko gogor batetik (flash driveak, SSDak eta beste gauza moderno batzuk baztertuko ditugu; adibidez, kontuan har dezagun 20 edo 80 gigako edozein disko zahar, han blokearen tamaina 512 byte baita).
Disko gogorrak ez daki bere espazioa bytez byte nola zuzendu; baldintzapean blokeetan banatuta dago. Blokeen zenbaketa 0tik hasten da. (LBA deitzen da, xehetasunak hemen:
Irudian ikus daitekeenez, LBA blokeak HDD maila gisa izendatu nituen. Bide batez, zure diskoak zer bloke-tamaina duen ikus dezakezu honela:
root@ubuntu:/home/serp# blockdev --getpbsz /dev/sdb
512
Goiko maila partizio bat da, disko osorako (berriz ere sinpletasunagatik). Gehienetan, bi partizio-marka mota erabiltzen dira: msdos eta gpt. Horren arabera, msdos 2Tb arteko diskoak onartzen dituen formatu zaharra da, gpt 1 byte-blokeetako zettabyte 512 arte heltzeko gai den formatu berria da. Gure kasuan, msdos motako partizioa dugu, irudian ikus daitekeenez, partizioa 1. zenbakiarekin hasten da, MBRrako zero erabiltzen den bitartean.
Lehenengo partizioan ext2 fitxategi-sistema bat sortu nuen, bere bloke-tamaina lehenetsia 4096 byte da, eta hori ere irudian islatzen da. Fitxategi-sistemaren blokearen tamaina honela ikus dezakezu:
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
Behar dugun parametroa "Blokearen tamaina" da.
Orain parte interesgarria da nola irakurri /home/serp/testfile fitxategia? Fitxategi bat fitxategi-sistemako bloke batek edo gehiagok osatzen dute eta bertan bere datuak gordetzen dira. Fitxategiaren izena ezagututa, nola aurkitu? Zein bloke irakurri behar ditut?
Hemen inodoak erabilgarriak dira. Ext2fs fitxategi-sistemak inodo guztien informazioa daukan "taula" du. Ext2fs kasuan inodo kopurua fitxategi-sistema sortzean ezartzen da. Tune2fs irteerako "Inode count" parametroan eskatzen diren zenbakiak ikusten ditugu, hau da. 65536 pieza ditugu. Inodoak behar dugun informazioa dauka: bilatzen ari garen fitxategirako fitxategi-sistema blokeen zerrenda. Nola aurkitu fitxategi jakin baterako inodo zenbakia?
Dagokion izena eta inodo zenbakia direktorioan daude, eta ext2fs-ko direktorio bat fitxategi mota berezi bat da, hau da. bere inodo zenbakia ere badu. Zirkulu zoro hau apurtzeko, "2" inodo zenbaki "finko" bat esleitu zitzaion erroko direktorioari. Ikus ditzagun 2. zenbakiaren inodoaren edukia:
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
Ikusten duzunez, behar dugun direktorioa 579. zenbakian dago jasota. Bertan hasierako karpetaren nodo-zenbakia aurkituko dugu, eta horrela katean behera serp direktorioan eskatutako fitxategiaren nodo-zenbakia ikusiko dugun arte. Bat-batean norbaitek zenbakia zuzena den eta beharrezko informazioa dagoen egiaztatu nahi badu, ez da zaila. Egiten dugu:
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
Irteeran direktorioko fitxategien izenak irakur ditzakezu.
Beraz, galdera nagusira nator: "zer arrazoirengatik gerta daiteke grabazio-errore bat?"
Jakina, hori gertatuko da fitxategi-sisteman bloke librerik geratzen ez bada. Zer egin daiteke kasu honetan? "Ezabatu behar ez den ezer" bistakoaz gain, gogoratu behar duzu ext2,3 eta 4 fitxategi-sistemetan "Erreserbatutako blokeen kopurua" bezalako gauza bat dagoela. Goiko zerrendari begiratuz gero, "13094" bloke hauek ditugu. Erro erabiltzaileak soilik idazteko moduko blokeak dira. baina arazoa azkar konpondu behar baduzu, behin-behineko irtenbide gisa guztion eskura jar ditzakezu, eta, ondorioz, leku librea izango da:
root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Setting reserved blocks percentage to 0% (0 blocks)
Horiek. lehenespenez, diskoko espazioaren % 5 ez duzu idazteko erabilgarri, eta disko modernoen bolumena kontuan hartuta, ehunka gigabyte izan daiteke.
Zer gehiago izan liteke? Baliteke bloke libreak egotea ere, baina ez dago nodo gehiago. Hau normalean gertatzen da zure fitxategi-sisteman fitxategi-sistemaren blokearen tamaina baino txikiagoa den fitxategi mordoa baduzu. Inodo 1 fitxategi edo direktorio batean gastatzen dela kontuan hartuta, eta guztira (fitxategi-sistema jakin baterako) 1 ditugu - egoera errealista baino gehiago da. Hau argi ikus daiteke df komandoaren irteeratik:
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
/var/www partizioan argi ikusten denez, fitxategi-sistemako bloke libreen kopurua eta nodo libreen kopurua asko aldatzen dira.
Inodorik gabe geratzen bazara, ez dizut sorginkeriarik esango, zeren... ez dago (oker banago, jakinarazi iezadazu). Beraz, fitxategi txikiak biderkatzen diren partizioetarako, fitxategi-sistema zentzuz aukeratu behar duzu. Adibidez, btrfs inodoak ezin dira amaitu, zeren Beharrezkoa izanez gero, berriak dinamikoki sortzen dira.
Iturria: www.habr.com