Alguna cosa sobre l'inode

Periòdicament, per traslladar-me al Centre de Distribució Central, faig entrevistes a diverses grans empreses, principalment a Sant Petersburg i Moscou, per a un lloc de DevOps. Em vaig adonar que moltes empreses (moltes bones empreses, per exemple Yandex) fan dues preguntes semblants:

  • què és l'inode;
  • per quins motius podeu obtenir un error d'escriptura del disc (o per exemple: per què us podeu quedar sense espai al disc, l'essència és la mateixa).

Com passa sovint, estava segur que coneixia bé aquest tema, però tan bon punt vaig començar a explicar, es van fer evidents mancances de coneixement. Per sistematitzar els meus coneixements, omplir els buits i deixar de fer-me vergonya, escric aquest article, potser serà útil a algú més.

Començaré des de baix, és a dir. des d'un disc dur (descartarem unitats flaix, SSD i altres coses modernes; per exemple, considerem qualsevol unitat antiga de 20 o 80 giga, ja que la mida del bloc és de 512 bytes).

El disc dur no sap com adreçar el seu espai byte a byte; està dividit condicionalment en blocs. La numeració de blocs comença a partir de 0. (Això s'anomena LBA, detalls aquí: ru.wikipedia.org/wiki/LBA)

Alguna cosa sobre l'inode

Com es pot veure a la figura, vaig designar blocs LBA com a nivell de disc dur. Per cert, podeu veure quina mida de bloc té el vostre disc així:

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

El nivell superior és una partició, una per a tot el disc (de nou per simplicitat). Molt sovint, s'utilitzen dos tipus de marcatge de partició: msdos i gpt. En conseqüència, msdos és un format antic que admet discs de fins a 2 Tb, gpt és un nou format capaç d'adreçar fins a 1 zettabyte de blocs de 512 bytes. En el nostre cas, tenim una partició de tipus msdos, com es pot veure a la figura, la partició comença amb el bloc núm. 1, mentre que s'utilitza zero per a l'MBR.

A la primera partició vaig crear un sistema de fitxers ext2, la seva mida de bloc per defecte és de 4096 bytes, que també es reflecteix a la figura. Podeu veure la mida del bloc del sistema de fitxers així:

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

El paràmetre que necessitem és "Mida del bloc".

Ara la part interessant és com llegir el fitxer /home/serp/testfile? Un fitxer consta d'un o més blocs del sistema de fitxers en els quals s'emmagatzemen les seves dades. Sabent el nom del fitxer, com trobar-lo? Quins blocs he de llegir?

Aquí és on els inodes són útils. El sistema de fitxers ext2fs té una "taula" que conté informació per a tots els inodes. El nombre d'inodes en el cas d'ext2fs s'estableix en crear el sistema de fitxers. Mirem els números requerits al paràmetre "Recompte d'inodes" de la sortida de tune2fs, és a dir. tenim 65536 peces. L'inode conté la informació que necessitem: una llista de blocs del sistema de fitxers per al fitxer que busquem. Com trobar el número d'inode per a un fitxer determinat?

El nom i el número d'inode corresponents es troben al directori, i un directori a ext2fs és un tipus especial de fitxer, és a dir. també té el seu propi número d'inode. Per trencar aquest cercle viciós, es va assignar un número d'inode "fix" "2" al directori arrel. Vegem el contingut de l'inode número 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

Com podeu veure, el directori que necessitem està contingut al bloc número 579. En ell hi trobarem el número de node de la carpeta d'inici, i així successivament en cadena fins que al directori serp veiem el número de node per al fitxer sol·licitat. Si de sobte algú vol comprovar si el número és correcte i si hi ha la informació necessària, no és difícil. Nosaltres fem:

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

A la sortida podeu llegir els noms dels fitxers del directori.

Així que arribo a la pregunta principal: "per quins motius es pot produir un error de gravació?"

Naturalment, això passarà si no queden blocs lliures al sistema de fitxers. Què es pot fer en aquest cas? A més de l'obvi "suprimir qualsevol cosa innecessària", haureu de recordar que als sistemes de fitxers ext2,3 i 4 hi ha una cosa com "Recompte de blocs reservats". Si mireu la llista anterior, tenim "13094" aquests blocs. Aquests són blocs que només poden escriure l'usuari root. però si necessiteu resoldre el problema ràpidament, com a solució temporal podeu posar-los a l'abast de tothom, donant lloc a un espai lliure:

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

Aquells. de manera predeterminada, teniu un 5% de l'espai en disc no disponible per escriure, i tenint en compte el volum dels discs moderns, aquest pot ser de centenars de gigabytes.

Què més podria ser? També és possible que hi hagi blocs lliures, però no hi hagi més nodes. Això sol passar si teniu un munt de fitxers al vostre sistema de fitxers que són més petits que la mida del bloc del sistema de fitxers. Tenint en compte que 1 inode es gasta en 1 fitxer o directori, i en total tenim (per a un sistema de fitxers determinat) 65536, la situació és més que realista. Això es pot veure clarament des de la sortida de l'ordre 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

Com és clarament visible a la partició /var/www, el nombre de blocs lliures al sistema de fitxers i el nombre de nodes lliures varien molt.

En cas que us quedeu sense inodes, no us diré cap encanteri, perquè... no n'hi ha cap (si m'equivoco, avisa'm). Per tant, per a les particions en què es multipliquen fitxers petits, hauríeu de triar el sistema de fitxers amb prudència. Per exemple, els inodes btrfs no poden acabar, perquè Si cal, se'n creen de nous de manera dinàmica.

Font: www.habr.com

Afegeix comentari