Суперблок в линуксе

Thank you for reading this post, don't forget to subscribe!

Блок файловой системы

После фор­ма­ти­ро­ва­ния дис­ка или раз­де­ла сек­то­ра на дис­ке раз­де­ле­ны на неболь­шие груп­пы. Такая груп­па сек­то­ров назы­ва­ет­ся бло­ком. Раз­мер бло­ка может быть раз­ным и зада­ет­ся как пара­метр клю­ча коман­ды фор­ма­ти­ро­ва­ния. Например

ключ -b зада­ет раз­мер бло­ка в бай­тах, в дан­ном слу­чае раз­мер бло­ка будет 4096 байт

Раз­мер бло­ка может быть раз­ным. Это зави­сит от типа фай­ло­вой системы

  • Ext2 — 1Кб, 2Кб, 4Кб, 8Кб
  • Ext3 — 1Кб, 2Кб, 4Кб, 8Кб
  • Ext4 — от 1Кб до 64Кб

При выбо­ре раз­ме­ра бло­ка нуж­но учесть ряд моментов

  • Мак­си­маль­ный раз­мер файла
  • Мак­си­маль­ный раз­мер фай­ло­вой системы
  • Про­из­во­ди­тель­ность

Раз­мер бло­ка вли­я­ет на ско­рость чтения/записи с дис­ка. Пред­ста­вим себе файл раз­ме­ров в несколь­ко сот мега­байт, кото­рый счи­ты­ва­ет­ся с дис­ка бло­ка­ми по 1Кб. Тот же файл будет счи­ты­вать­ся быст­рее если раз­мер бло­ка фай­ло­вой систе­мы будет 4Кб или 8Кб. Это ясно. Поэто­му при фор­ма­ти­ро­ва­нии име­ет смысл задать блок боль­ше­го раз­ме­ра, если пла­ни­ру­ет­ся исполь­зо­вать фай­лы боль­шо­го размера

Так­же вер­но и обрат­ное утвер­жде­ние. В слу­чае хра­не­ния неболь­ших фай­лов луч­ше исполь­зо­вать бло­ки мини­маль­но­го размера

Ядро Linux рабо­та­ет с раз­ме­ром бло­ка фай­ло­вой систе­мы, а не с раз­ме­ром сек­то­ра дис­ка (обыч­но 512 байт). Важ­но пони­мать, что раз­мер бло­ка фай­ло­вой систе­мы не может быть мень­ше раз­ме­ра сек­то­ра дис­ка и все­гда будет крат­ным ему. Так­же ядро ожи­да­ет, что раз­мер бло­ка фай­ло­вой систе­мы будет мень­ше или рав­но раз­ме­ру систем­ной страницы

Раз­мер систем­ной стра­ни­цы мож­но уви­деть выпол­нив команду

Группы блоков файловой системы

Бло­ки, о кото­рых мы гово­ри­ли ранее обье­де­ня­ют­ся в груп­пы бло­ков, что пози­тив­но отра­жа­ет­ся на опе­ра­ци­ях чтения/записи так как умень­ша­ет­ся вре­мя чтения/записи боль­ших обье­мов данных

Фай­ло­вая систе­ма EXT раз­би­ва­ет все доспуп­ное про­стран­ство на груп­пы бло­ков рав­но­го раз­ме­ра. Эти груп­пы рас­по­ла­га­ют­ся после­до­ва­тель­но, одна за другой

Загру­зоч­ный блок Груп­па бло­ков 1 Груп­па бло­ков 2 Груп­па бло­ков 2 Груп­па бло­ков 3

Коли­че­ство бло­ков в груп­пе неиз­мен­но и может быть расчи­та­но по формуле

Взгля­нем на вывод коман­ды mke2fs

Отме­тим то, о чем гово­ри­ли выше

  • Раз­мер бло­ка 4096 байт
  • 800 бло­ко­вых групп
  • 32768 бло­ков в груп­пе (8*4096)

Так­же вид­ны бло­ки в кото­рых хра­нят­ся резерв­ные копии суперблока

Так что же такое суперблок?

Самым про­стым опре­де­ле­ни­ем супер­бло­ка мог­ло бы быть сле­ду­ю­щее утверждение

Супер­блок — это блок в кото­ром хра­нят­ся мета­дан­ные фай­ло­вой системы

Ана­ло­гич­но тому, как i-ноды хра­нят мета­дан­ные о фай­лах, супер­блок хра­нит мета­дан­ные о фай­ло­вой сите­ме. Если вдруг супер­блок повре­жден, то не воз­мож­но будет при­мон­ти­ро­вать фай­ло­вую систе­му. Обыч­но при загруз­ке систе­ма про­ве­ря­ет супер­блок и при необ­хо­ди­мо­сти исправ­ля­ет его, что в резуль­та­те при­во­дит к кор­рект­но­му мон­ти­ро­ва­нию фай­ло­вых систем

Неко­то­рые дан­ные, кото­рые хра­нят­ся в супер­бло­ке. Например

  • Коли­че­ство бло­ков в фай­ло­вой системе
  • Коли­че­ство сво­бод­ных бло­ков в фай­ло­вой системе
  • Коли­че­ство i-нод в бло­ко­вой группе
  • Бло­ки в бло­ко­вой группе
  • Коли­че­ство запус­ков фай­ло­вой систе­мы со вре­ме­ни послед­ней про­вер­ки fsck
  • UUID фай­ло­вой системы
  • Состо­я­ние фай­ло­вой систе­мы (была ли кор­рект­но раз­мон­ти­ро­ва­на, обна­ру­же­ные ошиб­ки и т.д.)
  • Тип фай­ло­вой системы
  • Опе­ра­ци­он­ная систе­ма в кото­рой была отфор­ма­ти­ро­ва­на дан­ная фай­ло­вая система
  • Вре­мя послед­не­го монтирования
  • Вре­мя послед­ней записи

Основ­ная копия супер­бло­ка хра­нит­ся в самой пер­вой груп­пе бло­ков. Она назва­на основ­ной, пото­му что счи­ты­ва­ет­ся систе­мой в про­цес­се мон­ти­ро­ва­ния фай­ло­вой систе­мы. Так как отсчет бло­ко­вых групп начи­на­ет­ся с 0 то мож­но гово­рить о том, что супер­блок хра­нит­ся в нача­ле бло­ко­вой груп­пы 0

Супер­блок весь­ма кри­ти­чен для фай­ло­вой систе­мы. Поэто­му в каж­дой бло­ко­вой груп­пе есть копии супер­бло­ка. Это дает нам пра­во думать, что повре­жден­ный супер­блок будет вос­ста­нов­лен вся­кий раз, когда это будет необходимо

Может пока­зать­ся, что нали­чие в каж­дой бло­ко­вой груп­пе резерв­ных копий супер­бло­ка при­во­дит к потреб­ле­нию боль­шо­го дис­ко­во­го про­стран­ства. Для это­го в послед­них вер­си­ях систем была реа­ли­зо­ва­на функ­ция «sparse_super» целью кото­рой было созда­ние резерв­ных копий в груп­пе бло­ков 0, 1, 3, 5, 7

Как увидеть, что хранится в суперблоке?

Для это­го вос­поль­зу­ем­ся коман­дой dumpe2fs

Еще один вывод коман­ды пока­зы­ва­ет инфор­ма­цию о суперблоке

Как восстановить поврежденный суперблок?

Для нача­ла нуж­но про­ве­рить фай­ло­вую систе­му ути­ли­той fsck

В слу­чае если fsck  обна­ру­жи­ла ошиб­ку чте­ния супер­бло­ка мож­но попро­бо­вать сде­лать следующее:

Для нача­ла опре­де­лим где рас­по­ло­же­ны резерв­ные копии супер­бло­ка. Для это­го выполняем

или

ключ -n гово­рит коман­де не созда­вать фай­ло­вую систе­му, но пока­зать вывод какой мог бы быть при реаль­ном созда­нии фай­ло­вой системы

Далее вос­ста­нов­ли­ва­ем супер­блок из бека­па при помо­щи e2fsck

В дан­ном слу­чае в бло­ке 819200 хра­нит­ся резерв­ная копия супер­бло­ка. После при­ме­не­ния коман­ды про­бу­ем сно­ва мон­ти­ро­вать фай­ло­вую систе­му. Либо как вари­ант исполь­зо­вать ключ sb коман­ды mount, кото­рый ука­зы­ва­ет на рас­по­ло­же­ние копии суперблока

В дан­ном слу­чае счи­ты­ва­ем копию супер­бло­ка из бло­ка 819200