Что такое суперблок linux

Что такое суперблок linux

Первый элемент этой структуры (суперблок) — одинаков для всех групп, а все остальные — индивидуальны для каждой группы. Суперблок хранится в первом блоке каждой группы блоков (за исключением группы 1, в которой в первом блоке расположена загрузочная запись). Суперблок является начальной точкой файловой системы. Он имеет размер 1024 байта и всегда располагается по смещению 1024 байта от начала файловой системы. Наличие нескольких копий суперблока объясняется чрезвычайной важностью этого элемента файловой системы. Дубликаты суперблока используются при восстановлении файловой системы после сбоев.

Информация, хранимая в суперблоке, используется для организации доступа к остальным данным на диске. В суперблоке определяется размер файловой системы, максимальное число файлов в разделе, объем свободного пространства и содержится информация о том, где искать незанятые участки. При запуске ОС суперблок считывается в память и все изменения файловой системы вначале находят отображение в копии суперблока, находящейся в ОП, и записываются на диск только периодически. Это позволяет повысить производительность системы, так как многие пользователи и процессы постоянно обновляют файлы. С другой стороны, при выключении системы суперблок обязательно должен быть записан на диск, что не позволяет выключать компьютер простым выключением питания. В противном случае, при следующей загрузке информация, записанная в суперблоке, окажется не соответствующей реальному состоянию файловой системы.

Суперблок имеет следующую структуру.

Название поля Тип Комментарий
1.2em s_inodes_count ULONG Число индексных дескрипторов в файловой системе
s_blocks_count ULONG Число блоков в файловой системе
s_r_blocks_count ULONG Число блоков, зарезервированных для суперпользователя
s_free_blocks_count ULONG Счетчик числа свободных блоков
s_free_inodes_count ULONG Счетчик числа свободных индексных дескрипторов
s_first_data_block ULONG Первый блок, который содержит данные. В зависимости от размера блока, это поле может быть равно 0 или 1
s_log_block_size ULONG Индикатор размера логического блока: 0 = 1 Кб; 1 = 2 Кб; 2 = 4 Кб
s_log_frag_size LONG Индикатор размера фрагментов (кажется, понятие фрагмента в настоящее время не используется)
s_blocks_per_group ULONG Число блоков в каждой группе блоков
s_frags_per_group ULONG Число фрагментов в каждой группе блоков
s_inodes_per_group ULONG Число индексных дескрипторов (inodes) в каждой группе блоков
s_mtime ULONG Время, когда в последний раз была смонтирована файловая система
s_wtime ULONG Время, когда в последний раз производилась запись в файловую систему s_mnt_count USHORT Счетчик числа монтирований файловой системы. Если этот счетчик достигает значения, указанного в следующем поле ( s_max_mnt_count ), файловая система должна быть проверена (это делается при перезапуске), а счетчик обнуляется
s_max_mnt_count SHORT Число, определяющее, сколько раз может быть смонтирована файловая система
s_magic USHORT «Магическое число» ( 0xEF53 ), указывающее, что файловая система принадлежит к типу ex2fs
s_state USHORT Флаги, указывающее текущее состояние файловой системы (является ли она чистой ( clean ) и т.п.)
s_errors USHORT Флаги, задающие процедуры обработки сообщений об ошибках (что делать, если найдены ошибки)
s_pad USHORT Заполнение s_lastcheck ULONG Время последней проверки файловой системы
s_checkinterval ULONG Максимальный период времени между проверками файловой системы

s_creator_os ULONG Указание на тип ОС, в которой создана файловая система
s_rev_level ULONG Версия (revision level) файловой системы
s_reserved ULONG[235] Заполнение до 1024 байт

Next: Group Descriptors Up: Структура дискового раздела ext2 Previous: Структура дискового раздела ext2 Contents Index Alex Otwagin 2002-12-16

Источник

Во власти суперблока

Файловая система Linux в подробностях

Денис Колисниченко (dhsilabs@mail.ru, www.dkws.org.ua)

А ты знаешь особенности файловой системы Linux? Linux обаладет очень мощной файловой системы, возможности которой знают далеко не все пользователи. Сегодня ты станешь одним из них, а чтобы статья не была сугубо теоретической и сухой мы рассмотрим ряд практических примеров на каждый день. Один из них — восстановление загрузчика GRUB после очередной переустановки Windows.

Архитектура файловой системы, ее основные структуры

Прежде, чем приступить к рассмотрению архитектуры файловой системы Linux, нужно разобраться, что вообще такое файловая система (ФС). Можно встретить различные определения, например, ФС — это способ представления информации на носителе данных. Или ФС — часть операционной системы, обеспечивающая выполнение операций над файлами. Но более точным будет объединение этих двух определений. Ведь, грубо говоря, любая файловая система состоит как минимум из двух уровней — уровня представления данных и набора системных вызовов для работы с данными. Зачастую операционная система может работать с различными файловыми системами, например, с основной файловой системой (используется на жестком диске) и с файловой системой CD — ISO9660. Поэтому ОС должна обеспечить приложениям стандартный интерфейс, позволяющий обращаться к файлам на разных ФС прозрачно, то есть программист не должен вникать в тонкости каждой файловой системы. Например, в никсах для открытия файла используется системный вызов open(). Программа просто вызывает open(), передав ему имя файла, а на какой ФС расположен этот файл — дело третье. Теперь посмотри на рис. 1, на нем изображено все то, что было сказано выше. Зеленым отмечен пользовательский уровень, а желтым — уровень ядра.

Читайте также:  Этот издатель был заблокирован windows

Рис.1 Архитектура файловой системы

Приложение может использовать функции glibc (библиотека GNU C) или же напрямую использовать системные вызовы ядра — тут уж как будет угодно программисту. Использовать функции glibc удобнее, но, вызывая непосредственно системные вызовы, (например, open(), read(), write(), close()) можно немного повысить производительность приложения — ведь ты минуешь glibc, которая все равно использует те же системные вызовы.

VFS — это виртуальная файловая система. Именно она позволяет добиться существующего сейчас уровня абстракции. Каждая файловая система имеет свои особенности. Если бы не было VFS, то пришлось бы разрабатывать разные версии системных вызовов для каждого типа поддерживаемой файловой системы, например, open_ext3() — для открытия файла, находящегося на файловой системе ext3, или open_vfat() — для ФС VFAT. Другими словами, VFS делает системные вызовы независимыми от типа используемой файловой системы.

Драйверы устройств используются для физического доступа к носителям данных. Ведь эти самые носители тоже различны — у тебя может быть установлено несколько жестких дисков с разными интерфейсами, например, PATA- и SATA-диски.

Рисунок 1 — это общее представление о файловой системе Linux. Настало время копнуть глубже. Рассмотрим логическую структуру файловой системы ext3. Физически жесткий диск разбит на секторы размером 512 байт. Первый сектор дискового раздела в любой файловой системе считается загрузочной областью. В первичном разделе эта область содержит загрузочную запись — фрагмент кода, который инициирует процесс загрузки операционной системы при запуске. На других разделах эта область не используется. Остальные секторы объединены в логические блоки размером 1, 2 или 4 Кб. Логический блок есть наименьшая адресуемая порция данных: данные каждого файла занимают целое число блоков. Блоки, в свою очередь, объединяются в группы блоков. Группы блоков и блоки внутри группы нумеруются последовательно, начиная с 1.

Раздел диска, на котором сформирована файловая система ext3, может быть представлен такой схемой (рис. 2).

Рис.2 Структура файловой системы

Суперблок служит начальной точкой файловой системы и хранит всю информацию о ней. Он имеет размер 1024 байта и располагается по смещению 1024 байта от начала файловой системы. В каждой группе блоков он дублируется, что позволяет быстро восстановить его после сбоев.

В суперблоке определяется размер файловой системы, максимальное число файлов в разделе, объем свободного пространства и содержится информация о том, где искать незанятые участки. При запуске ОС суперблок считывается в память, и все изменения файловой системы вначале находят отображение в копии суперблока и записываются на диск только периодически. Это позволяет повысить производительность системы, так как многие пользователи и процессы постоянно обновляют файлы. С другой стороны, при останове системы суперблок обязательно должен быть записан на диск, что не позволяет выключать компьютер простым выключением питания. В противном случае, при следующей загрузке информация, записанная в суперблоке, окажется не соответствующей реальному состоянию файловой системы.

После суперблока следует описание (дескриптор) группы блоков. Хранящаяся в нем информация позволяет найти битовые карты блоков и индексных дескрипторов, а также таблицу индексных дескрипторов.

Структуру системного блока можно найти в /usr/src/linux/include/linux/fs.h:

Битовой картой блоков (block bitmap) называется структура, каждый бит которой показывает, отведен ли такой же по счету блок какому-либо файлу. Значение 1 показывает, что блок занят. Эта карта служит для поиска свободных блоков в тех случаях, когда надо выделить место под файл. Битовая карта индексных дескрипторов выполняет аналогичную функцию по отношению к таблице индексных дескрипторов: показывает, какие именно дескрипторы заняты. Каждому файлу соответствует один и только один индексный дескриптор (inode), который идентифицируется своим порядковым номером — индексом файла. В индексном дескрипторе хранятся метаданные файла. Среди них — все атрибуты файла, кроме его имени, и указатель на данные файла.

Для обычного файла или каталога этот указатель представляет собой массив из 15 адресов блоков. Первые 12 адресов в этом массиве являются прямыми ссылками на номера блоков, в которых хранятся данные файла. Если данные не помещаются в 12 блоков, то включается механизм косвенной адресации. Следующий адрес в этом массиве является косвенной ссылкой, то есть адресом блока, в котором хранится список адресов следующих блоков с данными из этого файла. Сколько блоков с данными можно так адресовать? Адрес блока занимает 4 байта, блок, как уже сказано, имеет размеры 1, 2 или 4 Кб. Значит, путем косвенной адресации можно разместить 256 — 1024 блока.

Читайте также:  Ubuntu linux что хорошего

А если файл еще длиннее? Следующий адрес в массиве-указателе указывает на блок двойной косвенной адресации (double indirect block). Этот блок содержит список адресов блоков, которые, в свою очередь, содержат списки адресов следующих блоков данных.

И, наконец, последний адрес в массиве-указателе задает адрес блока тройной косвенной адресации, то есть блока со списком адресов блоков, которые являются блоками двойной косвенной адресации.

Пока остается непонятным, где находится имя файла, если его нет ни среди данных файла, ни среди его метаданных. В *nix-подобных системах имя файла есть атрибут не самого файла, а файловой системы, понимаемой как логическая структура каталогов. Имя файла хранится только в каталоге, к которому файл приписан, и больше нигде. Из этого вытекают любопытные следствия.

Во-первых, одному индексному дескриптору может соответствовать любое количество имен, приписанных к разным каталогам, и все они являются настоящими. Количество имен (жестких ссылок) учитывается в индексном дескрипторе. Именно это количество можно увидеть по команде «ls –l». Во-вторых, удаление файла означает просто удаление записи о нем из данных каталога и уменьшение на 1 счетчика ссылок. В-третьих, сопоставить имя можно только номеру индексного дескриптора внутри одной и той же файловой системы, именно поэтому нельзя создать жесткую ссылку в другую файловую систему (символическую — можно, у нее другой механизм хранения).

Сам каталог таким же образом приписан к своему родительскому каталогу. Корневой каталог всегда записан в индексный дескриптор с номером 2 (номер 1 отведен для списка адресов дефектных блоков). В каждом каталоге хранится ссылка на него самого и на его родительский каталог — это и есть псевдоподкаталоги «.» и «..».

Таким образом, количество ссылок на каталог равно количеству его подкаталогов плюс два. Данные каталога представляют собой связный список с записями переменной длины и выглядят примерно так, как показано на рис 3.

Рис.3 Структура каталога в ext3

А как же файлы физических устройств? Они могут находиться в тех же каталогах, что и обычные файлы: в каталоге нет никаких данных, говорящих о принадлежности имени файлу на диске или устройству. Разница находится на уровне индексного дескриптора. Если иноде обычного файла указывает на дисковые блоки, где хранятся его данные, то в иноде файла устройства содержится указатель на список драйверов устройств в ядре — тот элемент списка, который соответствует старшему номеру устройства (рис. 4).

Рис.4 Разница между обычным файлом и файлом устройства

Чтобы получить доступ к файлам и каталогам, находящимся за пределами корневой ФС (на других разделах жесткого диска или на других носителях), нужно примонтировать их к корневой файловой системе.

Для монтирования файловой системы предназначена программа mount, для размонтирования — umount. Общий формат вызова (наиболее часто используемый) следующий:

# mount –t тип_ФС устройство точка_монтирования

После монтирования файловая система добавляется в список смонтированных файловых систем в ядре:

Последняя структура mnt_list — это и есть список смонтированных файловых систем. Пользователь может просмотреть этот список в файле /etc/mtab.

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

Создать файловую систему Linux можно не только на физическом носителе данных, но и в обычном файле. Для начала нужно создать пустой файл:

# dd if=/dev/zero of=fs.img bs=1k count=30000

Команда dd читает данные с устройства /dev/zero и записывает их в файл fs.img. В качестве данных будет просто поток нулей, причем не чисел ноль (ANSI-код 48), а неотображаемых символов NULL (ANSI-код 0). Данные читаются и записываются блоками по 1 Кб (bs=1k), и общее количество блоков равно 30000. Таким образом, на выходе получаем файл размером почти 30 Мб, заполненный символами NULL. После этого командой losetup мы превратим наш файл в блочное устройство:

# losetup /dev/loop0 fs.img

Теперь мы можем обращаться к устройству /dev/loop0, как к обычному блочному устройству (блочным называется устройство, обмен данными с которым производится блоками, например, секторами диска). Создадим файловую систему на устройстве /dev/loop0 с помощью команды mke2fs:

# mke2fs -c /dev/loop0 30000

Все готово для монтирования созданной файловой системы. Мы подмонтируем ее к каталогу /mnt/fs, который нужно создать заранее:

После этого мы можем работать с каталогом /mnt/fs, как с обычным каталогом файловой системы. Никаких ограничений нет. Внутри этого каталога мы можем создать еще один пустой файл и тоже превратить его в файловую систему, а затем подмонтировать. Для упрощения процесса вместо команды losetup можно указать параметр ‘-o loop’ команды mount, например:

Читайте также:  Растровые графические редакторы linux

# mount -o loop -t ext2 fs.img /mnt/fs

Для размонтирования файла с файловой системой, как обычно, используем umount:

Далее следует удалить устройство /dev/loop0 (если ты его создавал):

# losetup -d /dev/loop0

Немного практики. Alcohol и UltraISO средствами Linux!

Все это хорошо и очень занимательно, но разберемся, как можно применить полученные знания на практике. Пустой файл, созданный с помощью dd, нам не нужен. Что мы будем в нем хранить? Записывать файлы? А не проще ли записать их в обычные каталоги и не морочить себе голову? Но dd можно использовать не только для создания пустых файлов, но и для создания образов CD/DVD:

# dd if=/dev/cdrom of=

Данная команда создаст образ CD-диска и запишет его в домашний каталог пользователя под именем image.iso. Затем можно обратиться к файлам созданного образа без его записи на болванку. Для этого нужно подмонтировать его к корневой файловой системе (каталог /mnt/fs должен существовать):

# mount -o loop -t iso9660

После этого ты можешь работать с /mnt/fs, как с обычным каталогом. Но работа с ISO-образами — это не единственное применение loop-устройств. Может так получиться, что после установки системы окажется, что оперативной памяти не хватает. Покупать дополнительный модуль памяти не хочется, а переразбивать жесткий диск с целью увеличения размера раздела подкачки — тем более. Тогда можно создать пустой файл, отформатировать его как файл подкачки и подключить к системе:

Первая команда создает пустой файл размером 256 Мб. Вторая — форматирует его как своп. Как видишь, для Linux нет особой разницы, с чем работать — с файлом или с блочным устройством. Ты запросто можешь отформатировать обычный файл в любую файловую систему. Третья команда подключает созданный своп-файл к системе. Можешь ввести команду free, чтобы убедиться, что файл подкачки подключен. Только не забудь добавить последнюю команду в сценарии запуска системы, чтобы не вводить ее после каждой перезагрузки.

Изменение корневой файловой системы

Linux позволяет изменять корневую файловую систему. Предположим, требуется восстановить загрузчик Linux. Ты загрузился с LiveCD, но тебе нужно подключить корневую файловую систему так, чтобы все изменения, производимые вводимыми командами, относились именно к корневой файловой системе на жестком диске, а не к корневой файловой системе LiveCD. Другими словами нам нужно изменить корневую файловую систему. Делается это просто — с помощью команды chroot:

Монтирование каталога к каталогу

В Linux можно подмонтировать каталог к каталогу, а не только каталог к устройству. Делается это с помощью все той же команды mount, но запущенной с параметром ‘—bind’:

# mount —bind исходный_каталог каталог_назначения

Восстановление загрузчика GRUB: пошаговое руководство

Ты переустановил Windows, а она установила в MBR свой загрузчик и теперь нельзя загрузить Linux? Не переустанавливать же еще и Linux из-за такой мелочи! Для восстановления загрузчика GRUB нужно загрузиться с LiveCD (подойдет любой LiveCD с любым дистрибутивом Linux) и ввести следующие команды:

Все данные команды нужно вводить от имени root. Чтобы получить полномочия root, нужно использовать команды su или sudo. Например, в Ubuntu LiveCD нужно вводить все команды с использованием команды sudo, например,

Разберемся, что означают данные команды. Первая команда создает каталог /old, который будет использоваться в качестве точки монтирования. Вторая команда создает в этом каталоге подкаталог dev, который пригодится для монтирования devfs – псевдофайловой системы. Третья команда используется для монтирования корневой файловой системы дистрибутива Linux, установленного на жестком диске к каталогу /old. Предположим, что твой дистрибутив Linux был установлен в раздел /dev/sda5. Поэтому нужно ввести команду:

mount /dev/sda5 /old

После этого нужно подмонтировать каталог /dev к каталогу /old/dev. Это делается с помощью все той же команды mount, но с параметром —bind. Команда chroot заменяет корневую систему нашего LiveCD на корневую систему дистрибутива, установленного на винчестере. Тебе остается лишь ввести команду:

Данная команда установит загрузчик GRUB так, как он был установлен до этого. После установки GRUB нужно перезагрузить компьютер (команда reboot).

К сожалению, мы рассмотрели далеко не все возможности файловой системы Linux. В частности не были рассмотрены права доступа, квотирование, практически ничего не сказано о создании ссылок. Все это темы для отдельного разговора, а пока если у тебя есть вопросы/комментарии/пожелания, можешь обращаться по адресу dhsilabs@mail.ru.

Рис.5 Создание и монтирование файла с файловой системой

Источник

Оцените статью