- PVSM.RU - https://www.pvsm.ru -
Всем привет! Мы продолжаем запуски новых потоков по уже полюбившимся вам курсам и сейчас спешим сообщить о том, что у нас стартует новый набор по курсу «Администратор Linux» [1], который запустится в конце апреля. К этому событию и будет приурочена новая публикация. С оригиналом материала можно ознакомиться тут [2].
Виртуальные файловые системы выполняют роль некой волшебной абстракции, которая позволяет философии Linux говорить, что «всё является файлом».
Что такое файловая система? Опираясь на слова одного из первых контрибьюторов и авторов Linux Робера Лава [3], «Файловая система – это иерархическое хранилище данных, собранное в соответствии с определенной структурой». Как бы то ни было, это определение в равной мере хорошо подходит для VFAT (Virtual File Allocation Table), Git и Cassandra [4] (база данных NoSQL [5]). Так что именно определяет такое понятие, как «файловая система»?
Основы файловой системы
Ядро Linux имеет определенные требования к сущности, которая может считаться файловой системой. Она должна реализовывать методы open()
, read()
и write()
для постоянных объектов, которые имеют имена. С точки зрения объектно-ориентированного программирования [6], ядро определяет обобщенную файловую систему (generic filesystem) в качестве абстрактного интерфейса, а эти три большие функции считаются «виртуальными» и не имеют конкретного определения. Соответственно, реализация файловой системы по умолчанию называется виртуальной файловой системой (VFS).
Если мы можем открывать, читать и записывать в сущность, то эта сущность считается файлом, как мы видим из примера в консоли сверху.
Феномен VFS лишь подчеркивает наблюдение, характерное для Unix-подобных систем, которое гласит, что «всё является файлом». Подумайте, насколько странно, что тот маленький пример сверху с /dev/console показывает, как на самом деле работает консоль. На картинке изображена интерактивная Bash сессия. Отправка строки в консоль (virtual console device) отображает ее на виртуальном экране. VFS имеет другие, еще более странные свойства. Например, она дает возможность осуществлять поиск по ним [7].
Знакомые нам системы, такие как ext4, NFS и /proc имеют три важные функции в структуре данных С, которая называется file_operations [8]. Кроме того, определенные файловые системы расширяют и переопределяют функции VFS привычным объектно-ориентированным способом. Как отмечает Роберт Лав, абстракция VFS позволяет пользователям Linux беспечно копировать файлы в или из сторонних операционных систем или абстрактных сущностей, таких как pipes, не беспокоясь об их внутреннем формате данных. Со стороны пользователя (userspace) с помощью системного вызова процесс может копировать из файла в структуры данных ядра с помощью метода read()
одной файловой системы, а затем использовать метод write()
другой файловой системы для вывода данных.
Определения функций, которые принадлежат к базовым типам VFS, находятся в файлах fs/*.c [9] исходного кода ядра, в то время как подкаталоги 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 обеспечивает возможность переиспользовать код, так как основные методы, связанные с файловыми системами, не должны быть повторно реализованы каждым типом файловой системы. Переиспользование кода – широкоприменяемая практика программных инженеров! Однако, если повторно используемый код содержит серьезные ошибки [10], от них страдают все реализации, которые наследуют общие методы.
/tmp: Простая подсказка
Простой способ обнаружить, что VFS присутствуют в системе – это ввести mount | grep -v sd | grep -v :/
, что покажет все смонтированные (mounted
) файловые системы, которые не являются резидентами на диске и не NFS, что справедливо на большинстве компьютеров. Одним из перечисленных маунтов (mounts
) VFS, несомненно, будет /tmp
, верно?
Все знают, что хранение /tmp
на физическом носителе – безумие! Источник [11].
Почему нежелательно хранить /tmp
на физическом носителе? Потому что файлы в /tmp
являются временными, а устройства хранения медленнее, чем память, где создается tmpfs. Более того, физические носители более подвержены износу при перезаписи, чем память. Наконец, файлы в /tmp могут содержать конфиденциальную информацию, поэтому их исчезновение при каждой перезагрузке является неотъемлемой функцией.
К сожалению, некоторые скрипты инсталляции Linux дистрибутивов создают /tmp на устройстве хранения по умолчанию. Не отчаивайтесь, если это произошло и с вашей системой. Выполните несколько простых инструкций с Arch Wiki [12], чтобы это исправить, и помните о том, что память выделенная для 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
. С другой же, там пусто! Как так получается? Ситуация напоминает знаменитую статью под названием «Существует ли луна, когда на нее никто не смотрит? Реальность и квантовая теория» [13], написанную профессором физики Корнельского университета Дэвидом Мермином в 1985 году. Дело в том, что ядро собирает статистику памяти, когда происходит запрос к /proc
, и на самом деле в файлах /proc
ничего нет, когда никто туда не смотрит. Как сказал Мермин [14], «Фундаментальная квантовая доктрина гласит, что измерение, как правило, не выявляет ранее существовавшего значения измеряемого свойства.» (А над вопросом про луну подумайте в качестве домашнего задания!)
Кажущаяся пустота procfs
имеет смысл, поскольку располагающаяся там информация динамична. Немного другая ситуация с sysfs
. Давайте сравним, сколько файлов размером не менее одного байта есть в /proc
и в /sys
.
Procfs
имеет один файл, а именно экспортированную конфигурацию ядра, которая является исключением, поскольку ее нужно генерировать только один раз за загрузку. С другой стороны, в /sys
лежит множество более объемных файлов, многие из которых занимают целую страницу памяти. Обычно файлы sysfs
содержат ровно одно число или строку, в отличие от таблиц информации, получаемой при чтении таких файлов, как /proc/meminfo
.
Цель sysfs
– предоставить свойства доступные для чтения и записи того, что ядро называет «kobjects»
в userspace. Единственная цель kobjects
– это подсчет ссылок: когда удаляется последняя ссылка на kobject, система восстановит ресурсы, связанные с ним. Тем не менее, /sys
составляет большую часть знаменитого «stable ABI для userspace» [15] ядра, которое никто никогда, ни при каких обстоятельствах не может «сломать» [16]. Это не означает, что файлы в sysfs статичны, что противоречило бы подсчету ссылок на нестабильные объекты.
Стабильный двоичный интерфейс приложений ядра (kernel's stable ABI) ограничивает то, что может появиться в /sys
, а не то, что на самом деле присутствует в данный конкретный момент. Листинг разрешений на файлы в sysfs обеспечивает понимание того, как конфигурируемые параметры устройств, модулей, файловых систем и т.д. могут быть настроены или прочитаны. Делаем логический вывод, что procfs также является частью stable ABI ядра, хотя это не указано явно в документации [15].
Файлы в sysfs
описывают одно конкретное свойство для каждой сущности и могут быть читаемыми, перезаписываемыми или и то и другое сразу. «0» в файле говорит о том, что SSD не может быть удален.
Вторую часть перевода начнем с того, как наблюдать за VFS с помощью инструментов eBPF и bcc, а сейчас ждем ваши комментарии и традиционно приглашаем на открытый вебинар [17], который уже 9 апреля проведет наш преподаватель — Владимир Дроздецкий [18].
Автор: Дмитрий
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/313610
Ссылки в тексте:
[1] «Администратор Linux»: https://otus.pw/gbcl/
[2] ознакомиться тут: https://opensource.com/article/19/3/virtual-filesystems-linux
[3] Робера Лава: https://www.pearson.com/us/higher-education/program/Love-Linux-Kernel-Development-3rd-Edition/PGM202532.html
[4] Cassandra: http://cassandra.apache.org/
[5] база данных NoSQL: https://en.wikipedia.org/wiki/NoSQL
[6] программирования: http://lwn.net/Articles/444910/
[7] ним: https://lwn.net/Articles/22355/
[8] file_operations: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/fs.h
[9] fs/*.c: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs
[10] серьезные ошибки: https://lwn.net/Articles/774114/
[11] Источник: https://tinyurl.com/ybomxyfo
[12] Arch Wiki: https://wiki.archlinux.org/index.php/Tmpfs
[13] «Существует ли луна, когда на нее никто не смотрит? Реальность и квантовая теория»: http://www-f1.ijs.si/~ramsak/km1/mermin.moon.pdf
[14] Мермин: https://en.wikiquote.org/wiki/David_Mermin
[15] «stable ABI для userspace»: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/stable
[16] «сломать»: https://lkml.org/lkml/2012/12/23/75
[17] открытый вебинар: https://otus.pw/5LoU/
[18] Владимир Дроздецкий: https://otus.pw/mlMR/
[19] Источник: https://habr.com/ru/post/446614/?utm_source=habrahabr&utm_medium=rss&utm_campaign=446614
Нажмите здесь для печати.