Inodoari buruzko zerbait

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: ru.wikipedia.org/wiki/LBA)

Inodoari buruzko zerbait

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

Gehitu iruzkin berria