Fd linux что это

Обновлено: 04.07.2024

Однажды, на одном интервью меня спросили, что ты будешь делать, если обнаружишь неработающий сервис из-за того, что на диске закончилось место?

Конечно же я ответил, что посмотрю, чем занято это место и если возможно, то почищу место.
Тогда интервьюер спросил, а что если на разделе нет свободного места, но и файлов, которые бы занимали все место, ты тоже не видишь?

На это я сказал, что всегда можно посмотреть открытые файл дескрипторы, например командой lsof и понять какое приложение заняло все доступное место, а дальше можно действовать по обстоятельствам, в зависимости от того, нужны ли данные.

Интервьюер прервал меня на последнем слове, дополнив свой вопрос: «Предположим, что данные нам не нужны, это просто дебаг лог, но приложение не работает из-за того, что не может записать дебаг»?

«окей», — ответил я, «мы можем выключить дебаг в конфиге приложения и перезапустить его».
Интервьюер возразил: «Нет, приложение мы перезапустить не можем, у нас в памяти все еще хранятся важные данные, а к самому сервису подключены важные клиенты, которых мы не можем заставлять переподключаться заново».

«ну хорошо», сказал я, «если мы не можем перезапускать приложение и данные нам не важны, то мы можем просто очистить этот открытый файл через файл дескриптор, даже если мы его не видим в команде ls на файловой системе».

Интервьюер остался доволен, а я нет.

Тогда я подумал, почему человек, проверяющий мои знания, не копает глубже? А что, если данные все-таки важны? Что если мы не можем перезапускать процесс, и при этом этот процесс пишет на файловую систему в раздел, на котором нет свободного места? Что если мы не можем потерять не только уже записанные данные, но и те данные, что этот процесс пишет или пытается записать?

Тузик

В начале моей карьеры я пытался создать небольшое приложение, в котором нужно было хранить информацию о пользователях. И тогда я думал, а как мне сопоставить пользователя к его данным. Есть, например, у меня Иванов Иван Иваныч, и есть у него какие-то данные, но как их подружить? Я могу указать напрямую, что собака по имени «Тузик» принадлежит этому самому Ивану. Но что, если он сменит имя и вместо Ивана станет, например, Олей? Тогда получится, что наша Оля Ивановна Иванова больше не будет иметь собаки, а наш Тузик все еще будет принадлежать несуществующему Ивану. Решить эту проблему помогла база данных, которая каждому пользователю давала уникальный идентификатор (ID), и мой Тузик привязывался к этому ID, который, по сути, был просто порядковым номером. Таким образом хозяин у тузика был с ID под номером 2, и на какой-то момент времени под этим ID был Иван, а потом под этим же ID стала Оля. Проблема человечества и животноводства была практически решена.

Файл дескриптор

Проблема файла и программы, работающей с этим файлом, примерно такая же как нашей собаки и человека. Предположим я открыл файл под именем ivan.txt и начал в него записывать слово tuzik, но успел записать только первую букву «t» в файл, и этот файл был кем-то переименован, например в olya.txt. Но файл остался тем же самым, и я все еще хочу записать в него своего тузика. Каждый раз при открытии файла системным вызовом open в любом языке программирования я получаю уникальный ID, который указывает мне на файл, этот ID и есть файл дескриптор. И совершенно не важно, что и кто делает с этим файлом дальше, его могут удалить, его могут переименовать, ему могут поменять владельца или забрать права на чтение и запись, я все равно буду иметь к нему доступ, потому что на момент открытия файла у меня были права для его чтения и/или записи и я успел начать с ним работать, а значит должен продолжать это делать.

В Linux библиотека libc открывает для каждого запущенного приложения(процесса) 3 файл дескриптора, с номерами 0,1,2. Больше информации вы можете найти по ссылкам man stdio и man stdout

  • Файл дескриптор 0 называется STDIN и ассоциируется с вводом данных у приложения
  • Файл дескриптор 1 называется STDOUT и используется приложениями для вывода данных, например командами print
  • Файл дескриптор 2 называется STDERR и используется приложениями для вывода данных, сообщающих об ошибке

Список файл дескрипторов можно посмотреть у любого процесса, если вы знаете его PID.

Например, откроем консоль с bash и посмотрим PID нашего процесса


Во второй консоли запустим


Файл дескриптор с номером 255 можете смело игнорировать в рамках данной статьи, он был открыт для своих нужд уже самим bash, а не прилинкованной библиотекой.

Сейчас все 3 файл дескриптора связаны с устройством псевдотерминала /dev/pts, но мы все равно можем ими манипулировать, например запустим во второй консоли


И в первой консоли мы увидим

Redirect и Pipe

Вы можете легко переопределить эти 3 файл дескриптора в любом процессе, в том числе и в bash, например через трубу(pipe), соединяющую два процесса, смотрим


Вы можете сами запустить эту команду с strace -f и увидеть, что происходит внутри, но я вкратце расскажу.

Наш родительский процесс bash с PID 15771 парсит нашу команду и понимает сколько именно команд мы хотим запустить, в нашем случае их две: cat и sleep. Bash знает что ему нужно создать два дочерних процесса, и объединить их одной трубой. Итого bash потребуется 2 дочерних процесса и один pipe.

Перед созданием дочерних процессов bash запускает системный вызов pipe и получает новые файл дескрипторы на временный буфер pipe, но этот буфер никак пока не связывает наши два дочерних процесса.

Для родительского процесса это выглядит так будто pipe уже есть, а дочерних процессов еще нет:


Затем с помощью системного вызова clone bash создает два дочерних процесса, и наши три процесса будут выглядеть так:


Не забываем, что clone клонирует процесс вместе со всеми файл дескрипторами, поэтому в родительском процессе и в дочерних они будут одинаковые. Задача родительского процесса с PID 15771 следить за дочерними процессами, поэтому он просто ждет ответ от дочерних.

Следовательно pipe ему не нужен, и он закрывает файл дескрипторы с номерами 3 и 4.

В первом дочернем процессе bash с PID 9004, системным вызовом dup2, меняет наш STDOUT файл дескриптор с номером 1 на файл дескриптор указывающий на pipe, в нашем случае это номер 3. Таким образом все, что первый дочерний процесс с PID 9004 будет писать в STDOUT, будет автоматически попадать в буфер pipe.

Во втором дочернем процессе с PID 9005 bash меняет с помощью dup2 файл дескриптор STDIN с номером 0. Теперь все, что будет читать наш второй bash с PID 9005, будет читать из pipe.

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

Файл дескриптор 255 я намеренно игнорирую, он использует для внутренних нужд самого bash и в дочерних процессах будет также закрыт.

Далее в первом дочернем процессе с PID 9004 bash запускает с помощью системного вызова exec исполняемый файл, который мы указали в командной строке, в нашем случае это /usr/bin/cat.

Во втором дочернем процессе с PID 9005 bash запускает второй исполняемый файл, который мы указали, в нашем случае это /usr/bin/sleep.

Системный вызов exec не закрывает файл дескрипторы, если они не были открыты с флагом O_CLOEXEC во время выполнения вызова open. В нашем случае после запуска исполняемых файлов все текущие файл дескрипторы сохранятся.

Проверяем в консоли:


Как видите уникальный номер нашего pipe у нас в обоих процессах совпадает. Таким образом у нас есть связь между двумя разными процессами с одним родителем.

Для тех, кто не знаком с системными вызовами, которые использует bash, крайне рекомендую запустить команды через strace и посмотреть, что происходит внутри, например, так:


Вернемся к нашей проблеме с нехваткой места на диске и попыткой сохранить данные без перезапуска процесса. Напишем небольшую программу, которая будет записывать на диск примерно 1 мегабайт в секунду. При этом если по какой-либо причине мы не смогли записать данные на диск, мы будем просто игнорировать это и пытаться записать данные вновь через секунду. В примере я использую Python, вы можете использовать любой другой язык программирования.


Запустим программу и посмотрим на файл дескрипторы


Как видим у нас есть наши 3 стандартные файл дескрипторы и еще один, который мы открыли. Проверим размер файла:


данные пишутся, пробуем поменять права на файл:


Видим, что данные все еще пишутся, хотя наш пользователь не имеет права писать в файл. Попробуем его удалить:


Куда пишутся данные? И пишутся ли вообще? Проверяем:


Да, наш файл дескриптор все еще существует, и мы можем работать с этим файл дескриптором как с нашим старым файлом, мы можем его читать, очищать и копировать.

Смотрим на размер файла:


Размер файла 19923457. Пробуем очистить файл:


Как видим размер файла только увеличивается и наш транкейт не сработал. Обратимся к документации по системному вызову open. Если при открытии файла мы используем флаг O_APPEND, то при каждой записи операционная система проверяет размер файла и пишет данные в самый конец файла, причем делает это атомарно. Это позволяет нескольким тредам или процессам писать в один и тот же файл. Но в нашем коде мы не используем этот флаг. Мы можем увидеть другой размер файла в lsof после транкейт только если откроем файл для дозаписи, а значит в нашем коде вместо


мы должны поставить


Проверяем с «w» флагом

Программируем уже запущенный процесс

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

Возвращаясь к оригинальному вопросу с нехваткой места на диске для записи файла, попробуем сэмулировать проблему.

Создадим файл для нашего раздела, который мы подмонтируем как отдельный диск:


Создадим файловую систему:


Подмонтируем файловую систему:


Создаем директорию с нашим владельцем:


Откроем файл только на запись в нашей программе:


Ждем несколько секунд


Итак, мы получили проблему, описанную в начале этой статьи. Свободного места 0, занятого 100%.

Мы помним, что по условиям задачи мы пытаемся записать очень важные данные, которые нельзя потерять. И при этом нам нужно починить сервис без перезапуска процесса.

Допустим, у нас все же есть место на диске, но в другом разделе, например в /home.

Попробуем «перепрограммировать на лету» наш код.

Смотрим PID нашего процесса, который съел все место на диске:


Подключаемся к процессу через gdb


Смотрим открытые файл дескрипторы:


Смотрим информацию о файл дескрипторе с номером 3, который нас интересует


Помня о том, какой системный вызов делает Python (смотрите выше, где мы запускали strace и находили вызов open), обрабатывая наш код для открытия файла, мы делаем то же самое самостоятельно от имени нашего процесса, но биты O_WRONLY|O_CREAT|O_TRUNC нам нужно заменить на числовое значение. Для этого открываем исходники ядра, например тут и смотрим какие флаги за что отвечают

Объединяем все значения в одно, получаем 00001101

Запускаем наш вызов из gdb


Итак мы получили новый файл дескриптор с номером 4 и новый открытый файл на другом разделе, проверяем:


Мы помним пример с pipe — как bash меняет файл дескрипторы, и уже выучили системный вызов dup2.

Пробуем подменить один файл дескриптор другим


Закрываем файл дескриптор 4, так как нам он не нужен:


И выходим из gdb


Проверяем новый файл:


Как видим, данные пишутся в новый файл, проверяем старый:


Данные не потеряны, приложение работает, логи пишутся в новое место.

Немного усложним задачу

Представим, что данные нам важны, но места на диске у нас нет ни в одном из разделов и подключить диск мы не можем.

Перезапускаем приложение, и проверяем:


Места на диске нет, но мы успешно создаем там именованный pipe:


Теперь нам надо как-то завернуть все данные, что попадают в этот pipe на другой сервер через сеть, для этого подойдет все тот же netcat.


На нашем проблемном сервере запускаем в отдельном терминале


Теперь все данные, которые попадут в pipe автоматически попадут на stdin в netcat, который их отправит в сеть на порт 7777.

Все что нам осталось сделать это начать писать наши данные в этот именованный pipe.

У нас уже есть запущенное приложение:


Из всех флагов нам нужен только O_WRONLY так как файл уже существует и очищать нам его не нужно


Данные идут, проверяем проблемный сервер


Данные сохранились, проблема решена.

Пользуясь случаем, передаю привет коллегам из компании Degiro.
Слушайте подкасты Радио-Т.

В качестве домашнего задания предлагаю подумать, что будет в файл дескрипторах процесса cat и sleep если запустить такую команду:


Она использует усеченный синтаксис и сокращенную структуру команд, чтобы ваши набранные команды были короткими и точными.

Однако это отсутствие многословия, которое упрощает ввод fd, усложняет понимание.

fd также выполняет сопоставление с шаблоном быстрее, чем команды поиска по умолчанию.

Узнайте, как использовать fd в Linux и macOS.

Установка fd на Linux

fd не поставляется во многих системах по умолчанию.

Вам нужно будет использовать предпочитаемый менеджер пакетов для загрузки и установки приложения, а затем вы сможете запустить его из терминала.

Ubuntu

Он будет поставляться на Ubuntu Disco Dingo 19.04, но в противном случае вам придется скачать и установить его.

Для Ubuntu и других дистрибутивов Linux на основе Debian вы должны выполнить следующие команды для загрузки и установки программы.

Если вам нужна 32-битная версия или другая сборка, загрузите ее со страницы релизов GitHub для fd.

Debian

На Debian Buster или новее вы можете установить fd из официального репозитория, поддерживаемого Debian.

Fedora

На Fedora 28, fd может быть установлен из официальных версий пакета.

Arch Linux

Аналогично, пользователи Arch могут получить fd из официальных репозиториев:

Gentoo Linux

Пользователи Gentoo могут использовать следующую команду для загрузки fd ebuild:

macOS

Если вы используете macOS, установите Homebrew, затем используйте команду ниже для установки fd:

Использование fd в Linux


Команды fd имеют базовую структуру шаблона fd по сравнению с find. -наименование «шаблон».

Чтобы найти файл по его имени, используйте следующую команду:

Этот поиск выполняется в предустановленном рабочем каталоге, включая подкаталоги.

Для поиска в определенном каталоге, укажите его после поискового запроса:

Выполнение команды по результатам

Как и find, fd имеет функциональность, которая передает найденные файлы другой команде для выполнения.

Где используется find . -iname pattern -exec command ,команда, fd использует флаг -x:

Эта команда отправит все zip-файлы в каталоге команде unzip.

Вы можете использовать следующие символы в «фразе» команды execute для передачи информации определенным образом.

Окно терминала на ПК с Linux с рабочим столом в стиле Ubuntu.

Фатмавати Ахмад Заенури / Shutterstock

В Linux fd это более простая альтернатива find команда. Он имеет упрощенный синтаксис, использует разумные значения по умолчанию и обладает встроенным поведением здравого смысла. Давайте пройдем его темпами.

fd против находки: в чем разница?

fd имеет цветной вывод, аналогичный тому, что у некоторых ls режимы. Он рекурсивный, но по умолчанию не ищет скрытые каталоги. Это знает о Git и также автоматически игнорирует любые шаблоны в вашем файле .gitignore.

fd нечувствителен к регистру по умолчанию. Однако, если ваш шаблон поиска содержит заглавную букву, fd работает в чувствительном к регистру режиме. Конечно, вы можете изменить настройки по умолчанию, но во многих случаях они работают в вашу пользу.

СВЯЗАННЫЙ: Как использовать все поисковые команды Linux

Установка ФД

Начиная с Ubuntu 19.04 (Disco Dingo,) вы можете установить fd непосредственно позвонив в официально поддерживаемый пакет с apt-get , Если вы используете более старую версию Ubuntu, проверьте инструкции по установке на странице Git Hub,

sudo apt-get установить fd-find в окне терминала.

В Ubuntu команда fdfind чтобы избежать конфликта имен с другой существующей утилитой. Если вы хотите, чтобы это было fd Вы можете настроить псевдоним:

псевдоним fd = fdfind в окне терминала.

Чтобы сделать псевдоним постоянным, чтобы он оставался доступным после перезагрузки, поместите его в файл «.bashrc» или «.bash_aliases».

СВЯЗАННЫЙ: Как создать псевдонимы и функции оболочки в Linux

Установить fd в Fedora введите эту команду:

sudo dnf установите fd-find в окне терминала.

На Манджаро введите следующее:

sudo pacman -Сю фд в окне терминала.

FD против Fdfind

Чтобы избежать путаницы, мы оставили команду с именем по умолчанию, fdfind , на нашем тестовом ПК Ubuntu. fd и fdfind точно такая же команда, как вы увидите в следующем примере (если вы спросите fdfind чтобы показать свою версию, он называет себя «fd»):

fdfind - версия в окне терминала.

Мы будем называть команду «накормленной», но в примерах мы будем использовать Ubuntu «fdfind». В других дистрибутивах Linux вы можете ввести «fd» вместо «fdfind», чтобы сохранить несколько нажатий клавиш.

Простой поиск с помощью fd

Если вы используете fd без параметров командной строки, он ведет себя немного как ls , за исключением того, что он перечисляет файлы в подкаталогах по умолчанию.

fdfind в окне терминала.

Вывод отображается в разных цветах для разных типов файлов и каталогов.

Вывод из fdfind в окне терминала.

Чтобы увидеть файлы определенного типа, используйте -e (расширение) вариант. Обратите внимание, что вам не нужно ставить перед расширением точку (.), И при этом она не учитывает регистр.

Например, вы можете ввести следующее:

fdfind -e png в окне терминала.

Теперь единственными файлами в списке являются файлы изображений PNG.

вывод fdfind -e png в окне терминала.

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

Файл найден и находится в подкаталоге. Нам не нужно было говорить fd искать рекурсивно.

Чтобы начать поиск в определенном каталоге, укажите путь к файлу в командной строке. Следующая команда запустит поиск в каталоге «/ etc» и найдет файлы, содержащие «passwd» в имени файла:

fdfind passwd / etc в окне терминала.

Здесь мы ищем все файлы с исходным кодом на языке C, которые содержат в имени файла «координаты»:

fdfind -e c координат в окне терминала.

Два подходящих файла были найдены.

FD и Git

Git чрезвычайно популярен система контроля версий исходного кода, Если вы используете Git на своем компьютере, вы, вероятно, используете файлы «.gitignore», чтобы сообщить Git, к каким файлам он должен относиться и что он может игнорировать. По умолчанию, fd уважает настройки в ваших файлах «.gitignore».

В этом каталоге у нас есть Git-репозиторий и файл «.gitignore». Мы вводим следующее:

ls -adl .git * в окне терминала.

Давай спросим fd перечислить любые файлы, которые содержат «координаты» в имени файла. Затем мы повторим поиск и используем -I (не игнорировать) вариант. Это говорит fd игнорировать настройки в файле «.gitignore» и сообщать о каждом соответствующем файле.

Чтобы сделать все это, мы набираем следующее:

fdfind координат в терминальном окне.

Два дополнительных файла во втором наборе результатов являются объектными файлами. Они создаются при компиляции файловой программы. Затем они используются компоновщиком для создания окончательной исполняемой версии программы.

Объектные файлы обычно игнорируются программами контроля версий исходного кода. Они восстанавливаются каждый раз, когда вы компилируете свою программу, поэтому вам не нужно хранить их копии. В файле «.gitignore» есть запись, которая указывает Git игнорировать объектные файлы и, по умолчанию, fd их тоже игнорирует.

-I (не игнорировать) опция силы fd возвращать все, что находит, а не руководствоваться файлом «.gitginore».

Типы файлов и чувствительность к регистру

Вы можете спросить fd искать каталоги, файлы (включая исполняемые и пустые) и символические ссылки. Вы можете сделать это с помощью -t (тип), сопровождаемый одной из букв ниже:

Следующее ищет каталог с именем images:

fdfind -td изображения в окне терминала.

Найдено совпадение, один подкаталог ниже текущего.

Давайте посмотрим, как чувствительность к регистру работает с шаблонами поиска. Мы вводим следующее, чтобы сначала выполнить поиск файлов, которые содержат «geo» в именах файлов, а затем те, которые содержат «Geo» в именах файлов:

fdfind -tf geo в окне терминала.

В первой команде мы использовали шаблон поиска в нижнем регистре, который вызывал fd работать без учета регистра. Это означает, что и «Geo», и «geo» являются действительными совпадениями.

Наша вторая команда содержала символ в верхнем регистре, который вызывал fd работать с учетом регистра. Это означает, что только «Geo» является действительным совпадением.

Выполнение команды

fd Команда позволяет запустить другую команду и выполнить ее для каждого из найденных файлов.

Допустим, мы знаем, что есть Почтовый файл где-то в нашем дереве каталогов исходного кода. Мы можем найти его с помощью следующей команды, которая ищет файлы с расширением ZIP:

fdfinf -e zip в окне терминала.

С -x (exec), вы можете передать каждый найденный файл другой команде, которая будет обработана им. Например, мы можем набрать следующее, чтобы вызвать распаковать утилиту чтобы распаковать наш ZIP-файл («<>» является заполнителем, представляющим найденный файл):

Это распакует файл в текущем рабочем каталоге. Если мы хотим распаковать его в каталог, содержащий ZIP-файл, мы можем использовать один из следующих заполнителей:

  • <>: Полный путь к файлу и имя найденного файла.
  • : Имя найденного файла.
  • : Каталог, содержащий найденный файл. : Имя найденного файла без расширения.

Чтобы наш ZIP-файл был найден и распакован в каталоге, в котором он находится, мы можем использовать распаковку -d (каталог), и передать в родительский каталог заполнителя ( ):

fdfind-e zip -x unzip <></p>
<p> -d<//> в окне терминала.

ZIP-файл затем находится и распаковывается в родительском каталоге.

Вывод из fdfind-e zip -x unzip <></p>
<p> -d<//> в окне терминала.

Ваш Go-to Find?

Поскольку он охватывает наиболее распространенные виды использования с такой простотой, fd может легко стать вашей командой «найти». Всякий раз, когда вам нужны более продвинутые функции, вы всегда можете вернуться к этому опытному ветерану, find ,


Как администратор Linux, вы должны знать, как проверить UUID раздела или UUID файловой системы.

Потому что большинство систем Linux монтируют разделы с UUID.

То же самое было может проверено в файле /etc/fstab.

Есть много утилит для проверки UUID.

В этой статье мы покажем вам, как проверить UUID разными способами, и вы сможете выбрать тот, который подходит именно вам.

Что такое UUID?

UUID расшифровывается как Universally Unique Identifier, который помогает системе Linux идентифицировать раздел жесткого диска вместо файла блочного устройства.

libuuid является частью пакета util-linux-ng начиная с версии ядра 2.15.1 и по умолчанию устанавливается в системе Linux.

Можно предположить, что идентификаторы UUID, сгенерированные этой библиотекой, будут уникальными в системе и уникальными во всех системах.

UUID первоначально использовались в сетевой вычислительной системе Apollo (NCS), а более поздние UUID стандартизируются Open Software Foundation (OSF) как часть распределенной вычислительной среды (DCE).

Пример моего файла /etc/fstab.

Мы можем проверить тоже самое, используя следующие семь команд.

Как проверить UUID раздела диска / файловой системы в Linux с помощью команды blkid?

Он использует библиотеку libblkid для получения UUID раздела диска в системе Linux.

Как проверить UUID раздела диска / файловой системы в Linux с помощью команды lsblk?

lsblk выводит информацию обо всех доступных или указанных блочных устройствах.

Команда lsblk читает файловую систему sysfs и базу данных udev для сбора информации.

Если база данных udev недоступна или lsblk скомпилирован без поддержки udev, он пытается прочитать метки LABEL, UUID и типы файловых систем с блочного устройства.

В этом случае необходимы права суперпользователя.

По умолчанию команда выводит все блочные устройства (кроме дисков RAM) в древовидном формате.

Как проверить UUID раздела диска / файловой системы в Linux, используя путь byUUID?

Каталог содержит UUID и файлы реальных блочных устройств, UUID были символическими ссылками с файлами реальных блочных устройств.

Как проверить UUID раздела диска / файловой системы в Linux с помощью команды hwinfo?

hwinfo расшифровывается как инструмент информации об оборудовании.

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

Как проверить UUID раздела диска / файловой системы в Linux с помощью команды udevadm?

udevadm содержит команду и специфичные для команды опции.

Он управляет поведением systemd-udevd во время выполнения, запрашивает события ядра, управляет очередью событий и предоставляет простые механизмы отладки.

Как проверить UUID раздела диска / файловой системы в Linux с помощью команды tune2fs?

tune2fs позволяет системному администратору настраивать различные настраиваемые параметры файловой системы в файловых системах Linux ext2, ext3 или ext4.

Текущие значения этих параметров можно отобразить с помощью параметра -l.

Как проверить UUID раздела диска / файловой системы в Linux с помощью команды dumpe2fs?

dumpe2fs печатает суперблок и блокирует информацию о группе для файловой системы, представленной на устройстве.

Читайте также: