Всем привет! Мы продолжаем запуски новых потоков по уже полюбившимся вам курсам и сейчас спешим сообщить о том, что у нас стартует новый набор по курсу
Виртуальные файловые системы выполняют роль некой волшебной абстракции, которая позволяет философии Linux говорить, что «всё является файлом».
Что такое файловая система? Опираясь на слова одного из первых контрибьюторов и авторов Linux
Основы файловой системы
Ядро Linux имеет определенные требования к сущности, которая может считаться файловой системой. Она должна реализовывать методы open()
, read()
и write()
для постоянных объектов, которые имеют имена. С точки зрения объектно-ориентированного
Если мы можем открывать, читать и записывать в сущность, то эта сущность считается файлом, как мы видим из примера в консоли сверху.
Феномен VFS лишь подчеркивает наблюдение, характерное для Unix-подобных систем, которое гласит, что «всё является файлом». Подумайте, насколько странно, что тот маленький пример сверху с /dev/console показывает, как на самом деле работает консоль. На картинке изображена интерактивная Bash сессия. Отправка строки в консоль (virtual console device) отображает ее на виртуальном экране. VFS имеет другие, еще более странные свойства. Например, она дает возможность осуществлять поиск по
Знакомые нам системы, такие как ext4, NFS и /proc имеют три важные функции в структуре данных С, которая называется read()
одной файловой системы, а затем использовать метод write ()
другой файловой системы для вывода данных.
Определения функций, которые принадлежат к базовым типам VFS, находятся в файлах fs/
содержат определенные файловые системы. В ядре также содержатся сущности, такие как cgroups
, /dev
и tmpfs
, которые требуются в процессе загрузки и поэтому определяются в подкаталоге ядра init/
. Заметьте, что cgroups
, /dev
и tmpfs
не вызывают «большую тройку» функций file_operations
, а напрямую читают и пишут в память.
На приведенной ниже диаграмме показано, как userspace обращается к различным типам файловых систем, обычно монтируемых в системах Linux. Не показаны такие конструкции как pipes
, dmesg
и POSIX clocks
, которые также реализуют структуру file_operations
, доступ к которым проходит через слой VFS.
VFS — это «слой оболочки» между системными вызовами и реализациями определенных file_operations
, таких как ext4
и procfs
. Функции file_operations
могут взаимодействовать либо с драйверами устройств, либо с устройствами доступа к памяти. tmpfs
, devtmpfs
и cgroups
не используют file_operations
, а напрямую обращаются к памяти.
Существование VFS обеспечивает возможность переиспользовать код, так как основные методы, связанные с файловыми системами, не должны быть повторно реализованы каждым типом файловой системы. Переиспользование кода – широкоприменяемая практика программных инженеров! Однако, если повторно используемый код содержит
/tmp: Простая подсказка
Простой способ обнаружить, что VFS присутствуют в системе – это ввести mount | grep -v sd | grep -v :/
, что покажет все смонтированные (mounted
) файловые системы, которые не являются резидентами на диске и не NFS, что справедливо на большинстве компьютеров. Одним из перечисленных маунтов(mounts
) VFS, несомненно, будет /tmp
, верно?
Все знают, что хранение / tmp
на физическом носителе – безумие!
Почему нежелательно хранить /tmp
на физическом носителе? Потому что файлы в /tmp
являются временными, а устройства хранения медленнее, чем память, где создается tmpfs. Более того, физические носители более подвержены износу при перезаписи, чем память. Наконец, файлы в /tmp могут содержать конфиденциальную информацию, поэтому их исчезновение при каждой перезагрузке является неотъемлемой функцией.
К сожалению, некоторые скрипты инсталляции Linux дистрибутивов создают /tmp на устройстве хранения по умолчанию. Не отчаивайтесь, если это произошло и с вашей системой. Выполните несколько простых инструкций с tmpfs
становится недоступной для других целей. Другими словами, система с гигантской tmpfs и большими файлами в ней может израсходовать всю память и упасть. Другая подсказка: во время редактирования файла /etc/fstab
, помните о том, что он должен заканчиваться новой строкой, иначе ваша система не загрузится.
/proc и /sys
Помимо /tmp
, VFS (виртуальные файловые системы), которые наиболее знакомы пользователям Linux – это /proc
и /sys
. (/dev
располагается в общей памяти и не имеет file_operations
). Почему именно эти два компонента? Давайте разберемся в этом вопросе.
procfs
создает снимок мгновенного состояния ядра и процессов, которые он контролирует для userspace
. В /proc
ядро выводит информацию о том, какими средствами оно располагает, например, прерывания, виртуальная память и планировщик. Кроме того, /proc/sys
– это место, где параметры, настраиваемые с помощью команды sysctl
, доступны для userspace
. Статус и статистика отдельных процессов выводится в каталогах /proc/
.
Здесь /proc/meminfo
— это пустой файл, который тем не менее содержит ценную информацию.
Поведение /proc
файлов показывает, какими непохожими могут быть дисковые файловые системы VFS. С одной стороны, /proc/meminfo
содержат информацию, которую можно посмотреть командой free
. С другой же, там пусто! Как так получается? Ситуация напоминает знаменитую статью под названием /proc
, и на самом деле в файлах /proc
ничего нет, когда никто туда не смотрит. Как сказал
Кажущаяся пустота procfs
имеет смысл, поскольку располагающаяся там информация динамична. Немного другая ситуация с sysfs
. Давайте сравним, сколько файлов размером не менее одного байта есть в /proc
и в /sys
.
Procfs
имеет один файл, а именно экспортированную конфигурацию ядра, которая является исключением, поскольку ее нужно генерировать только один раз за загрузку. С другой стороны, в /sys
лежит множество более объемных файлов, многие из которых занимают целую страницу памяти. Обычно файлы sysfs
содержат ровно одно число или строку, в отличие от таблиц информации, получаемой при чтении таких файлов, как /proc/meminfo
.
Цель sysfs
– предоставить свойства доступные для чтения и записи того, что ядро называет «kobjects»
в userspace. Единственная цель kobjects
– это подсчет ссылок: когда удаляется последняя ссылка на kobject, система восстановит ресурсы, связанные с ним. Тем не менее, /sys
составляет большую часть знаменитого
Стабильный двоичный интерфейс приложений ядра (kernel’s stable ABI) ограничивает то, что может появиться в /sys
, а не то, что на самом деле присутствует в данный конкретный момент. Листинг разрешений на файлы в sysfs обеспечивает понимание того, как конфигурируемые параметры устройств, модулей, файловых систем и т.д. могут быть настроены или прочитаны. Делаем логический вывод, что procfs также является частью stable ABI ядра, хотя это не указано явно в
Файлы в sysfs
описывают одно конкретное свойство для каждой сущности и могут быть читаемыми, перезаписываемыми или и то и другое сразу. «0» в файле говорит о том, что SSD не может быть удален.
Вторую часть перевода начнем с того, как наблюдать за VFS с помощью инструментов eBPF и bcc, а сейчас ждем ваши комментарии и традиционно приглашаем на
Источник: habr.com