Обнаружение файловой системы Linux

Я пытаюсь следовать этой книге, чтобы немного понять, как работает ядро ​​linux.

То, что я не могу на самом деле обернуть, - это то, что я не понимаю, как Linux обнаруживает тип файловой системы, в Linux есть файловая система gazillion, каждая из которых имеет свои особенности.

Может ли кто-нибудь указать мне фрагмент кода в ядре, который должен различать let say fat и ext4?

MBR не содержит такую ​​информацию, а суперблок каждого типа отличается.

При выпуске mount /dev/whatever /media нет необходимости добавлять тип файловой системы.

Ответ 1

Причина, по которой вы не можете найти ее, заключается в том, что она по большей части не находится в ядре - это в утилите userpace mount, которая находится в пакете util-linux. Если вы не даете ему тип файловой системы или если вы даете ему тип "any", mount просто просматривает список всех файловых систем, о которых знает ядро, и пытается каждый из них в порядке, пока один из они успешно монтируются (или возвращают ошибку, если ни одна из них не делает).

Как узнать, какие типы файловых систем знают ядро? Он читает файл /proc/filesystems, который просматривает связанный список file_systems в fs/filesystems.c. Когда загружается драйвер файловой системы, он вызывает register_filesystem в том же файле, чтобы добавить себя в этот список. Например, вызов register_filesystem в init_ext2_fs в fs/ext2/super.c - init_ext2_fs является функцией модуля-init для модуля ext2.

Некоторые файловые системы являются шумными и печатают ошибки в журнале отладки ядра, когда кто-то пытается подключить устройство к неправильной файловой системе, поэтому, например, вы можете увидеть ошибки в "недопустимой файловой системе XFS" при успешной установке файловой системы ext4, если mount случилось сначала попробовать xfs.

Ответ 2

blkid -o value -s TYPE /dev/path/to/device

Ответ 3

Из mount man-страница:

Если опция -t не указана, или если указан тип auto, mount попытается угадать желаемый тип. Если mount был скомпилирован с помощью библиотеки blkid, угадывание выполняется этой библиотекой. В противном случае монтируйте догадки, исследуя суперблок; если это не отображает ничего знакомого, mount попытается прочитать файл /etc/filesystems или, если этого не существует, /proc/filesystems. Все перечисленные там типы файловой системы будут проверены, за исключением тех, которые помечены как "nodev" (например, devpts, proc, nfs и nfs4). Если /etc/filesystems заканчивается в строке только одним *, mount будет читать /proc/filesystems впоследствии.

Кроме того, в моем блоке ubuntu есть страница монтирования (упоминается библиотека volume_id)

Если опция -t не указана, или если указан тип auto, mount попытается угадать желаемый тип. Использование горы               библиотека blkid или volume_id для угадывания типа файловой системы; если это не отразится на том, что выглядит               знакомый, mount попытается прочитать файл /etc/filesystems, или, если этого не существует, /proc/filesystems. Все               из перечисленных типов файловой системы будут проверяться, за исключением тех, которые помечены как "nodev" (например, devpts, proc               и nfs). Если /etc/filesystems заканчивается в строке только одним *, mount будет читать /proc/filesystems впоследствии.