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