Рубрика:
Карьера/Образование /
Лабораторная работа
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
ПАВЕЛ ЗАКЛЯКОВ, ИТ-специалист
Лабораторная работа: исследуем inode Часть 1. Взаимодействие с inode через стандартные программы на пользовательском уровне
Можно ли «увидеть» inode? Да, в работе рассказывается, «как» и на что он «влияет»
Цель публикаций в данной рубрике – в ненавязчивой форме освежить в памяти читателей отдельные теоретические моменты, после чего позволить им плавно перейти к самостоятельной работе и исследованию теоретических вопросов напрактике. Симбиоз теории, практики, различных интересных вопросов, заданий и решений (howto), фактически это некий «квест» (quest) или вызов (challenge) читателям, потратить своё время на некоторое приключение, где наградой запрохождение (выполнение заданий) будут новые знания и навыки.
Из-за большого объёма данная работа разделена на отдельные публикации: «теория», «подготовка и проведение (части 1 и 2)», «завершение (часть 3)». Наименование частей следующее: 1. Взаимодействие с inode через стандартные программы на пользовательском уровне. 2. Взаимодействие через утилиты ФС. 3. «Сырое» чтение данных из ФС.
Введение
Предложенная в январе 1993 года Реми Кардом (Remy Card) «вторая расширенная файловая система (ФС)» (Second Extended File System, сокращённо – ext2 или ext2fs) взамен существовавшей тогда ext совсем скоро отметит четвертьвековой юбилей своего использования и сегодня фактически является не уступающим по производительности эталоном, с которым в «мире UNIX и Linux» часто сравнивают все другие файловые системы.
Новички в ОС Linux обычно исключают первую версию из рассмотрения, как de facto ушедшую в историю, а вторую вместе с третьей и четвёртой версиями рассматривают как нечто очень схожее. Общие подходы к построению и некоторая совместимость действительно существуют.
В рамках работы предлагается на примере ФС ext2 и ext4 самостоятельно более глубоко изучить, какими свойствами обладает inode (он же индексный дескриптор) и какую роль он играет в целом. Аналогичные индексные дескрипторы можно встретить и в других ФС, например UFS (Unix file system, она же Berkeley Fast File System) и др. Чтобы не вдаваться в сравнение различий, в данной работе они не рассматриваются.
Подготовка к работе
Перед началом исследования элементов ФС на практике читателям, не имеющим минимальных теоретических знаний, рекомендуется самостоятельно изучить примерное устройство ФС ext2, например из [1-6] (см. рис. 1).
Рисунок 1. Структура файловой системы ext2
Также во избежание разночтений определимся с используемыми понятиями и терминологией, рассмотрим некоторые нетипичные вопросы относительно ФС семейства ext2-ext4 и освежим важные теоретические моменты в памяти.
Краткие теоретические сведения
Как и в любой файловой системе UNIX, в составе файловой системы ext2 можно выделить следующие составляющие [1, 2, 6, 7]:
- блок и группа блоков;
- информационный узел (information node, inode);
- суперблок (superblock) и его резервные копии;
- директория.
Для эффективного доступа к ним в ФС ext2-4 дополнительно создаются и используются:
- таблица дескрипторов групп (и её копии);
- битовая карта занятости inode в каждой группе блоков;
- битовая карта занятости блоков в каждой группе блоков;
- зарезервированные блоки (в группах, где имеются копии суперблока).
Блоки и группы блоков
Всё пространство раздела диска разбивается на блоки фиксированного размера: 1024, 2048 или 4096 байт (предполагается, что в ext4 не включена поддержка 64-битных значений для ряда параметров ФС). По задумке все три числа были взяты кратными размеру сектора – 512 байт. В начале 1990-х такой размер сектора использовался как на дискетах, так и на жёстких дисках. Сектора по 4096 байт (используемые абсолютно всеми жёсткими дисками большого объёма начиная примерно с 2009 года) не только не существовали, но и не предвиделись. В наши дни такие большие сектора нисколько не усложняют жизнь, при создании ФС размер одного блока выбирается равным размеру одного сектора. Также среднестатистический размер мелких файлов типичной системы обычно оказывается близок к 4 КБ, что позволяет более оптимально использовать дисковое пространство за счёт минимизации неиспользуемого пространства в конце завершающих блоков с данными.
Размер логического блока указывается при создании файловой системы (с помощью ключа -b) либо определяется эвристически от размера файловой системы и ожидаемого предназначения ФС (типа использования).
Все блоки имеют порядковые номера. Поскольку ФС разрабатывалась предпочтительно для использования на традиционных жёстких дисках, то в целях уменьшения фрагментации и количества перемещений считывающих головок причтении больших массивов данных блоки объединяются в группы, нумерация блоков слева направо (см. рис. 1).
Начиная с ФС ext4 появилась новая возможность группировки нескольких соседних групп блоков в укрупнённые виртуальные группы блоков (flexible block groups), данная возможность включается опцией flex_bg при создании ФС, а число группирующихся блоков задаётся опцией -G и должно равняться 2n.
Практически все группы блоков имеют одинаковый формат. В каждой группе, помимо информационных блоков, хранится информация о занятости блоков и inode группы в виде битовой карты (Block Bitmap и Inode Bitmap). В состав 0-йгруппы блоков и некоторых других входят также суперблок, таблица дескрипторов групп и резервные блоки.
Суперблок
Суперблок – это основной элемент файловой системы ext2-4, представляющий собой некоторую таблицу различных значений, определяющих параметры ФС и местоположение её составных частей. Если не считать смещение в 1024 байта от начала файловой системы, то он идёт самым первым по порядку (см. рис. 1). Смещение необходимо для возможности размещения в самом начале кода загрузчика ОС. Если размер логического блока ФС равен 1024, то суперблок фактически начинается и оказывается во втором блоке (с порядковым номером 1, так как блоки нумеруются начиная с нуля).
В зависимости от версии ФС суперблоки несколько различаются. Первые поля структуры суперблока (назовём их базовыми) одинаковы для разных версий ФС, их общий суммарный размер меньше 1024 байт, поэтому блок с суперблоком вконце заполняется нулями. Если же используется дополнение-модификация суперблока EXT4_DYNAMIC_REV, то тогда после базовой вместо нулей располагается таблица расширенных параметров, но в любом случае весь суперблок непревышает по размеру 1024 байта.
Если размер логического блока ФС оказывается таковым, что после размещения в нём суперблока остаётся свободное место, то оно заполняется символами с кодом 0.
В базовой части суперблока содержится следующая информацию о файловой системе (список не полный):
- общее число блоков и inode в файловой системе;
- число свободных блоков и inode в файловой системе;
- размер логического блока файловой системы;
- количество блоков и inode в группе;
- размер inode;
- идентификатор файловой системы;
- номер первого блока данных;
- как часто (при каких условиях) необходимо делать проверку ФС;
- время создания ФС и т.д.
На практике вывести всю информацию, содержащуюся в суперблоке (например, для раздела /dev/sda1), можно с помощью команды:
# dumpe2fs /dev/sda1 -h
В суперблоке содержится довольно важная информация по файловой системе. От его целостности напрямую зависит работоспособность файловой системы. Чтобы эта информация не потерялась и не произошла ситуация, когда из-за сбоя одного блока стал недоступен весь диск, её дублируют на диске в нескольких местах. Поскольку информация, содержащаяся в дескрипторе группы блоков, следующем за суперблоком, также важна, то она тоже дублируется, следуя закопиями суперблока.
Копии суперблока
В ранних подверcиях ФС ext2 копия суперблока (и дескриптор группы блоков) содержалась в каждой группе блоков, но после выяснилось, что указанная избыточность дорого обходится, поэтому от столь большого числа копий отказались впользу хранения копий лишь в некоторых группах блоков. Для этого была введена функция (флаг) sparce_super (для ФС ext2 – EXT2_FEATURE_RO_COMPAT_SPARCE_SUPER, для ФС ext3/4 – EXT3_FEATURE_RO_COMPAT_SPARCE_SUPER), включённая по умолчанию при создании ФС. Алгоритм расчёта, в каких именно группах размещать копию (при наличии флага), а в каких нет, довольно прост. Суперблок (и дескриптор группы блоков) находится в 0-й группе блоков, а его копии в группах блоков, чьи номера равны степеням чисел 1, 3, 5 и 7, то есть 11, 31, 51 ,71, 32 = 9, 52 = 25, 33 = 27 и 72 = 49, 53 = 125 и т.д. Если флаг не установлен (функция невключена), то копии делаются во всех группах [4].
Для того чтобы в дальнейшем использовать копии, например при восстановлении ФС в случае потери данных из нулевой группы блоков, важный подготовительный шаг – понять, как пересчитать номера групп блоков, содержащих копии суперблока, в номера блоков (чья нумерация сквозная по всему диску), поскольку различные программы требуют указания именно блока, где находится копия суперблока. Не имея в своём распоряжении суперблока или его копии, сделать это непросто, так как в суперблоке (и его копиях) содержится необходимая для расчёта информация – размер блока и число блоков в группе. Чем-то похоже на ситуацию «ключ от сейфа в сейфе». От полного перебора всех возможных вариантов обычно спасает то, что многие администраторы при создании ФС пользуются параметрами, предлагаемыми по умолчанию, что значительно уменьшает число возможных мест для поиска копий суперблока на диске. Если предположить, что блоков в группе n = 8192, то копии суперблока будут в блоках с номерами, рассчитываемыми по формуле m*n + 1, где m – номер группы блоков с копией (см. алгоритм получения m выше), т.е.: 1*8192 + 1 = 8193, 3*8192 +1 = 24577, 5*8192 + 1 = 40961, 7*8192 + 1 = 57345, 32*8192 + 1 = 73729, 52*8192 + 1 = 204801 и т.д.
На практике вычисленных значений номеров блоков недостаточно, поскольку для чтения копий суперблока с диска дополнительно потребуется знать размер блока, для того чтобы правильно вычислить смещение в байтах от начала диска. Вреальности количество различных вариантов для размера блока конечно, что делает оправданным их перебор при поиске копий.
Совет. После создания ФС лучше всего выполнить команду:
# dumpe2fs /dev/sdaX
...
Group 9: (Blocks 73729-81920)
Backup superblock at 73729, Group descriptors at 73730-73730
Reserved GDT blocks at 73731-73986
Block bitmap at 74279 (+550), Inode bitmap at 74280 (+551)
Inode table at 73987-74242 (+258)
0 free blocks, 2048 free inodes, 0 directories
Free blocks:
Free inodes: 18433-20480
...
а результат её вывода сохранить на другом компьютере или распечатать на бумаге и хранить в отдельной папке на случай последующего ручного восстановления данных.
Таблица дескрипторов групп (и её копии), резервные блоки, битовые карты
Каждая группа блоков описывается в таблице дескрипторов групп (дескрипторе группы блоков) – структуре, которая содержит информацию по каждой группе блоков: адреса битовых карт занятости блоков и inode, таблицы inode. Дляхранения структуры (вместе с её копиями), а также следующими за ней резервными блоками используются те же группы блоков, что и для хранения суперблока или его копий.
Поскольку эти все элементы ФС не будут использоваться в данной работе, то подробно они не рассматриваются. Для простоты изображения на рис. 1 резервные блоки даже не отмечены.
В каждой группе блоков имеются свои битовая карта занятости inode и битовая карта занятости блоков. При использовании опций flex_bg и meta_bg расположение битовых карт внутри укрупнённых групп однозначно не фиксировано.
По умолчанию размер битовой карты – один блок. Каждый бит карты обозначает состояние блока (или inode). Если бит установлен (1), то блок (inode) занят, если сброшен (0) – блок (inode) свободен. Первому блоку группы (inode) соответствует нулевой бит карты, второму – первый бит и т.д. Отличие inode от блоков заключается в том, что они меньшего размера, поэтому inode, находящиеся в пределах одной группы, собраны в таблицу. В битовой карте занятости inode группы каждый бит аналогично характеризует состояние элемента в таблице inode группы.
Так, если размер блока выбран 1024, то в группе блоков будет содержаться 1024*8 = 8192 блоков. Поскольку inode чаще требуется меньше числа блоков, их битовая карта оказывается меньше, а блок, содержащий карту до конца, заполняется нулями (побитно).
Информационный узел (inode)
Базовым понятием файловой системы является информационный узел, information node, inode, i-узел или i-node. Каждый inode, как и блок, имеет порядковый номер, уникальный в пределах файловой системы, и включает информацию только об одном файле. Следует отметить, что термин «файл» в контексте ФС может пониматься многозначно:
- на физическом уровне как описание расположения данных внутри ФС (номера занимаемых блоков, смещения отдельных частей и пр.);
- на логическом уровне организации ФС как его полное имя, состоящее из иерархии вложенных директорий и имени файла;
- с точки зрения ОС как псевдофайл (сокет, канал, ссылка, блочное устройство, символьное устройств, директория);
- на пользовательском уровне как содержимое файла.
inode содержит информацию о «физическом» расположении данных. Связь логического имени файла с inode производится с помощью жёстких ссылок. Жёстких ссылок (как и логических имён) у одного файла в ФС ext2-4 может быть несколько. Типичный пример этому – особый тип файла – директория, в которую можно попасть как сверху, например по имени dir1 (cd dir1), так и снизу, например из низлежащих поддиректорий, переходом в директорию с именем «..» (cd ..).
Посмотреть номера inode у логических имён файлов (и директорий) можно с помощью команды ls -i либо с помощью утилиты stat.
Внутреннее устройство inode следующее: это специальная структура (таблица), которая содержит информацию об атрибутах и физическом расположении файла или, одним словом, метаданные (см. рис. 2). Её размер для ext2 – 128 байт, дляext4 – 256 байт. Причём увеличение размера происходит за счёт использования тех же структур, что и для inode ФС ext2, в первых 128 байтах, а всё дополнительное добавляется в конец. Фактически используется 156 байт, а оставшиеся 100байт пустые и могут использоваться для хранения расширенных атрибутов, также во время создания ФС размер inode может быть задан и больше – по размеру блока ФС, хотя это не очень эффективно.
Рисунок 2. Приблизительная структура индексного дескриптора (первые 128 байт, общие для ФС ext2-4)
Атрибутами файла являются его тип (обычный файл, каталог и т.д.), права доступа к нему (меняемые командой chmod), идентификаторы владельца и группы, размер, время создания.
Информация о физическом расположении зависит от размеров файла и представляет собой последовательность абсолютных номеров блоков, содержащих данные файла. Эта информация представляет собой последовательность 32-битных номеров блоков, содержащих данные файла.
Первые 12 номеров – это прямые ссылки на информационные блоки (direct blocks number). 13-й номер является косвенной ссылкой (indirect blocks number). В нём находится адрес блока, в котором хранятся адреса информационных блоков.14-й номер – двойная косвенная ссылка (double indirect blocks number), 15-й номер – тройная косвенная ссылка (triple indirect blocks number) (см. рис. 3).
Рисунок 3. Структура ссылок на номера блоков в inode
Замечание. Поскольку адресация блоков 32-битная, на хранение адреса отводится 4 байта. В приведённом выше примере используются блоки размером 1024 байта, в которые помещается 1024/4 = 256 адресов. При использовании блоков большего размера нумерация на рис. 4 изменится, поскольку при косвенной адресации один блок будет содержать больше 256 адресов. Соответственно, изменится и максимально адресуемое по такой схеме пространство внутри файла, тоесть максимальный теоретический размер файла.
Следует отметить, что «имя файла» в состав данных, хранимых в inode, не входит, установление соответствия между именами файлов и порядковыми номерами inode выполняется с помощью жёстких ссылок, которые хранятся вдиректориях (каталогах).
Подробнее о структуре inode см. [4].
Директория (каталог)
Директория, так же как и файл, описывается при помощи inode. Наглядности ради её можно считать особым псевдофайлом, у которого в ФС установлен тип d, а его содержимое представляет собой массив записей, содержащих информацию о файлах, псевдофайлах или поддиректориях, которые находятся «внутри» неё. Используется два не сильно отличающихся формата этих записей (ext4_dir_entry и ext4_dir_entry_2). Поскольку исследование директорий не входит в цели данной работы, коротко скажем, что первая из вышеупомянутых структур имеет следующий вид:
- порядковый номер inode файла;
- длина записи в байтах;
- длина имени файла;
- имя файла.
Вопросы общего плана на понимание темы
Для того чтобы подумать на досуге или для проверки готовности к выполнению работы.
- Зачем нужны ФС, какие они бывают и почему их много?
- Какие задачи решают ФС?
- Какие существуют проблемы (ограничения) при использовании ФС?
- Какие вы знаете способы классификации ФС?
- Какие проблемы решает inode или на что он влияет?
- Можно ли увидеть inode?
- Существует один тип inode или их несколько?
- Какой размер у inode?
- Как inode связан с жёсткими ссылками и именами файлов?
- Что такое файл, сколько определений файла вы можете дать?
- Если содержимое файла 4 байта, то сколько места в ФС потребуется (будет задействовано байт) для его хранения?
- Назовите такие размеры (n и n+1, в байтах) содержимого двух файлов, при которых между ними существует «качественный скачок» с точки зрения ФС?
- Как узнать общее число inode в файловой системе и сколько из них заняты?
Замечание (или ещё один вопрос). В детстве я любил задавать взрослым разные (как многие из них говорили, «глупые») вопросы, возможно, это было одним из моих любимых занятий. Одни, не находя, что ответить, меня сразу «посылали», другие, попав в неловкое положение, всё же находили во мне достойного собеседника и пытались что-то ответить.
Слова «троллить» в современном его понимании тогда не существовало, а многие вопросы не были глупыми – это был способ познания мира. Помню, что как-то в очередной раз, не зная, что ответить по сути, моя бабушка выдала народную мудрость: «Один дурак может задать столько вопросов, что сто умных не ответят». Ответ был дан, и я понял, да и сейчас верю, что «глупых вопросов не бывает». Поскольку я нередко «сдруживался» с теми, кто пытался давать ответы, попытаюсь сдружиться с читателями СА, добавив к списку выше ещё один интересный вопрос по теме, и дам на него ответ, поскольку зачастую из ответов можно узнать больше, чем прочитать в ста книжках.
- Можно ли создать файл (или иной объект ФС) с конкретным номером inode? Например, 1 или 112233?
Попробуем ответить на вопрос формально, рассмотрев всевозможные варианты: из пользовательского пространства создать нельзя, поскольку не существует команды, в которой был бы предусмотрен выбор номера. Но косвенно можно попытаться. Поскольку в вопросе не оговорено, как будет получен результат и какие права у пользователя (обычные или административные), то рассмотрим оба варианта.
Естественно, от администратора ситуация выглядит легче, поскольку последний может получить прямой доступ к файловой системе, через доступ к разделу (носителю), на котором она расположена. С другой стороны, существенен момент, в какой ФС будет создаваться файл и какой именно номер из двух выше указанных затребован задающим вопрос? Это важно, поскольку в разных ФС номера inode могут повторяться, и одно дело – оперировать с ФС на отчуждаемом носителе, а другое дело – с корневой ФС.
Номер inode также имеет значение, поскольку номера с 0 по 11 зарезервированы системой для разных целей [4], конкретно номер 1 используется (зарезервирован) для хранения списка дефектных (сбойных) блоков. Именно из-за этого корневая директория ФС (/) имеет номер 2. Без вмешательства в ФС через debugfs [8, 9] или напрямую в «сыром» режиме не обойтись.
Что касаемо номера 112233, то ситуации возможны следующие:
- такого номера нет в принципе, поскольку ФС мала;
- такой номер есть и занят файлом «X»/директорией «Y»;
- такой номер есть, но пока не занят.
Второй случай, как найти объекты ФС по номеру inode, в работе рассмотрен, однако многое ещё зависит от того, кто владелец файла/директории и какие есть права у пользователя. Если это файл и прав у пользователя достаточно, то можно создать жёсткую ссылку на него. А чтобы полноценно и единолично пользоваться содержимым, то ещё потребуется скопировать содержимое в новый файл, удалить другие ссылки на требуемый inode и создать их заново, но уже на inode нового файла-копии. С директорией сложнее, поскольку на неё создавать ссылки нельзя, поэтому придётся её удалить (предварительно переписав содержимое в созданную для этого новую). После этого будет третья ситуация, когда требуемый inode не занят.
Несмотря на то что система многопользовательская, предположим, что мы единственные пользователи ФС и конкуренции по «захвату» нужного номера у нас не будет.
Единственный вариант решения от уровня пользователя – это создавать файлы, пока не будет занят нужный номер, например банально циклом:
for i in $(seq 1 xxx); do touch $i; done
указав вместо xxx число, сравнимое с искомым, 112233. Поскольку часть номеров в ФС уже занята, то необходимое количество создаваемых файлов будет меньше на число уже занятых и зарезервированных inode. Создавать же файлов больше, чем требуется, нет смысла. Ненужные файлы впоследствии можно стереть, а как найти среди них файл с нужным номером, будет показано в работе.
Если требуемую ФС можно отмонтировать, то «захватить» требуемый inode намного проще с использованием утилиты debugfs. С помощью неё можно попытаться использовать и некоторые зарезервированные номера из первого десятка, новыйдет ли это «боком», предугадать сложно.
Краткая последовательность действий для номера x следующая:
0) отмонтировать раздел;
1) открыть его в debugfs, указав опцию -w, чтобы можно было вносить изменения;
2) clri <x>;
3) seti <x>;
4) sif <x> mode 0x81FF;
5) ln <x> NewFileName;
6) sif <x> links_count 1 (команда ln внутри debugfs не меняет это значение);
7) quit.
После монтирования ФС файл NewFileName будет иметь номер inode, равный x, и его можно использовать как обычный файл. Номер x в командах выше (для debugfs) вводится в угловых скобках (знаках меньше и больше).
Вместо заключения
Теперь, когда вы освежили в памяти отдельные вопросы строения ФС, можно переходить к подготовке лабораторного стенда и самой работе. Продолжение следует...
- Мешков В. Архитектура файловой системы ext2. // «Системный администратор», № 11, 2003 г. – С. 26-32. URL: http://www.samag.ru/archive/article/203.
- Design and Implementation of the Second Extended Filesystem – http://e2fsprogs.sourceforge.net/ext2intro.html.
- Analyzing a filesystem – http://homepage.smc.edu/morgan_david/cs40/analyze-ext2.htm.
- Ext4 Disk Layout – https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout.
- Документация по ФС ext2-4 из исходников ядра (v.3.16.44 на kernel.org) файлы Documentation/filesystems/ext2.txt (ext3.txt, ext4.txt) либо из пакета kernel-doc-2.6.32-642.15.1.el6.noarch файл /usr/share/doc/kernel-doc-2.6.32/Documentation/filesystems/ext2.txt, ext3.txt, ext4.txt.
- A Non-Technical Look Inside the EXT2 File System (архивная версия страницы http://web.archive.org/web/20040301054851/http://linuxgazette.net/issue21/ext2.html).
- The Second Extended File System – http://www.nongnu.org/ext2-doc/ext2.html.
- debugfs Command Examples – https://www.cs.montana.edu/courses/309/topics/4-disks/debugfs_example.html.
- Linux Ext2fs Undeletion mini-HOWTO – http://www.faqs.org/docs/Linux-mini/Ext2fs-Undeletion.html.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|