Віртуальні файлові системи в Linux: навіщо вони потрібні та як вони працюють? Частина 1

Всім привіт! Ми продовжуємо запуски нових потоків за курсами, що вже полюбилися вам, і зараз поспішаємо повідомити про те, що у нас стартує новий набір по курсу «Адміністратор Linux», який запуститься наприкінці квітня До цієї події і буде присвячено нову публікацію. З оригіналом матеріалу можна ознайомитися тут.

Віртуальні файлові системи виконують роль чарівної абстракції, яка дозволяє філософії Linux говорити, що «все є файлом».

Віртуальні файлові системи в Linux: навіщо вони потрібні та як вони працюють? Частина 1

Що таке файлова система? Спираючись на слова одного з перших контриб'юторів та авторів Linux Робера Лава, «Файлова система – це ієрархічне сховище даних, зібране відповідно до певної структури». Як би там не було, це визначення однаково добре підходить для VFAT (Virtual File Allocation Table), Git та Кассандра (база даних NoSQL). То що саме визначає таке поняття як «файлова система»?

Основи файлової системи

Ядро Linux має певні вимоги до сутності, які можуть вважатися файлової системою. Вона має реалізовувати методи open(), read() и write() для постійних об'єктів, які мають імена. З погляду об'єктно-орієнтованого програмуванняядро визначає узагальнену файлову систему (generic filesystem) як абстрактний інтерфейс, а ці три великі функції вважаються «віртуальними» і не мають конкретного визначення. Відповідно, реалізація файлової системи за умовчанням називається віртуальною файловою системою (VFS).

Віртуальні файлові системи в Linux: навіщо вони потрібні та як вони працюють? Частина 1

Якщо ми можемо відкривати, читати та записувати в сутність, то ця сутність вважається файлом, як бачимо з прикладу в консолі зверху.
Феномен VFS лише підкреслює спостереження, характерне Unix-подібних систем, яке свідчить, що «все є файлом». Подумайте, наскільки дивно, що маленький приклад зверху з /dev/console показує, як насправді працює консоль. На зображенні зображена інтерактивна Bash сесія. Надсилання рядка в консоль (virtual console device) відображає її на віртуальному екрані. VFS має інші, ще дивніші властивості. Наприклад, вона дає можливість здійснювати пошук по ним.

Знайомі нам системи, такі як ext4, NFS та /proc мають три важливі функції у структурі даних С, яка називається файлові_операції. Крім того, певні файлові системи розширюють та перевизначають функції VFS звичним об'єктно-орієнтованим способом. Як зазначає Роберт Лав, абстракція VFS дозволяє користувачам Linux безтурботно копіювати файли в або зі сторонніх операційних систем або абстрактних сутностей, таких як pipes, не турбуючись про їхній внутрішній формат даних. З боку користувача (userspace) за допомогою системного виклику процес може копіювати з файлу структури даних ядра за допомогою методу read() однієї файлової системи, а потім використовувати метод write () інший файлової системи виведення даних.

Визначення функцій, що належать до базових типів VFS, знаходяться у файлах fs/*.c вихідного коду ядра, тоді як підкаталоги fs/ містять певні файлові системи. У ядрі також містяться сутності, такі як cgroups, /dev и tmpfs, які потрібні в процесі завантаження і тому визначаються в підкаталозі ядра init/. Зауважте, що cgroups, /dev и tmpfs не викликають «велику трійку» функцій file_operations, а безпосередньо читають та пишуть на згадку.
На наведеній нижче діаграмі показано, як userspace звертається до різних типів файлових систем, які зазвичай монтуються в системах Linux. Не показані такі конструкції як pipes, dmesg и POSIX clocks, які також реалізують структуру file_operations, доступ до яких відбувається через шар VFS.

Віртуальні файлові системи в Linux: навіщо вони потрібні та як вони працюють? Частина 1

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, вірно?

Віртуальні файлові системи в Linux: навіщо вони потрібні та як вони працюють? Частина 1

Усі знають, що зберігання / tmp на фізичному носії - безумство! Джерело.

Чому небажано зберігати /tmp на фізичному носії? Тому що файли в /tmp є тимчасовими, а пристрої зберігання повільніше ніж пам'ять, де створюється tmpfs. Більше того, фізичні носії більш схильні до зносу при перезаписі, ніж пам'ять. Нарешті, файли /tmp можуть містити конфіденційну інформацію, тому їх зникнення при кожному перезавантаженні є невід'ємною функцією.

На жаль, деякі скрипти інсталяції дистрибутивів Linux створюють /tmp на пристрої зберігання за замовчуванням. Не впадайте у відчай, якщо це сталося і з вашою системою. Виконайте кілька простих інструкцій з Arch Wiki, щоб це виправити, і пам'ятайте, що пам'ять виділена для tmpfs стає недоступною для інших цілей. Іншими словами, система з гігантською tmpfs і великими файлами в ній може витратити всю пам'ять та впасти. Інша підказка: під час редагування файлу /etc/fstab, пам'ятайте, що він повинен закінчуватися новим рядком, інакше ваша система не завантажиться.

/proc та /sys

Крім /tmp, VFS (віртуальні файлові системи), які найбільш знайомі користувачам Linux – це /proc и /sys. (/dev розташовується у спільній пам'яті і не має file_operations). Чому саме ці два компоненти? Давайте розберемося у цьому питанні.

procfs створює знімок миттєвого стану ядра та процесів, які він контролює для userspace. У /proc ядро виводить інформацію про те, які засоби воно має, наприклад, переривання, віртуальна пам'ять і планувальник. Крім того, /proc/sys – це місце, де параметри, що налаштовуються за допомогою команди sysctl, доступні для userspace. Статус та статистика окремих процесів виводиться у каталогах /proc/.

Віртуальні файлові системи в Linux: навіщо вони потрібні та як вони працюють? Частина 1

Тут /proc/meminfo — це порожній файл, який містить цінну інформацію.

Поведінка /proc файлів показує, якими несхожими можуть бути дискові файлові системи VFS. З одного боку, /proc/meminfo містять інформацію, яку можна переглянути командою free. З іншого ж там порожньо! Як так виходить? Ситуація нагадує знамениту статтю під назвою «Чи існує місяць, коли на нього ніхто не дивиться? Реальність та квантова теорія», написану професором фізики Корнельського університету Девідом Мерміном у 1985 році. Справа в тому, що ядро ​​збирає статистику пам'яті, коли відбувається запит до /proc, і насправді у файлах /proc нічого нема, коли ніхто туди не дивиться. Як сказав Мермін, «Фундаментальна квантова доктрина свідчить, що вимір, як правило, не виявляє раніше існуючого значення вимірюваної властивості.» (А над питанням про місяць подумайте як домашнє завдання!)
Порожнеча, що здається procfs має сенс, оскільки наявна там інформація динамічна. Трохи інша ситуація з sysfs. Давайте порівняємо, скільки файлів розміром не менше одного байта є в /proc і в /sys.

Віртуальні файлові системи в Linux: навіщо вони потрібні та як вони працюють? Частина 1

Procfs має один файл, а саме експортовану конфігурацію ядра, яка є винятком, оскільки її потрібно генерувати лише один раз за завантаження. З іншого боку, в /sys лежить безліч об'ємніших файлів, багато з яких займають цілу сторінку пам'яті. Зазвичай файли sysfs містять одно число або рядок, на відміну від таблиць інформації, одержуваної при читанні таких файлів, як /proc/meminfo.

Мета sysfs – надати властивості доступні для читання та запису того, що ядро ​​називає «kobjects» в userspace. Єдина мета kobjects – це підрахунок посилань: коли видаляється останнє посилання kobject, система відновить ресурси, пов'язані з ним. Проте, /sys становить більшу частину знаменитого "stable ABI для userspace" ядра, яке ніхто ніколи, ні за яких обставин не може «зламати». Не означає, що файли в sysfs статичні, що суперечило б підрахунку посилань на нестабільні об'єкти.
Стабільний двійковий інтерфейс додатків ядра (kernel's stable ABI) обмежує те, що може з'явитися в /sys, а не те, що насправді є в даний момент. Лістинг дозволів на файли в sysfs забезпечує розуміння того, як параметри пристроїв, модулів, файлових систем і т.д. можуть бути налаштовані чи прочитані. Робимо логічний висновок, що procfs також є частиною stable ABI ядра, хоча це не вказано явно у документації.

Віртуальні файлові системи в Linux: навіщо вони потрібні та як вони працюють? Частина 1

Файли в sysfs описують одну конкретну властивість для кожної сутності і можуть бути читаними, перезаписувати або те й інше відразу. "0" у файлі говорить про те, що SSD не може бути видалено.

Другу частину перекладу почнемо з того, як спостерігати за VFS за допомогою інструментів eBPF та bcc, а зараз чекаємо на ваші коментарі та традиційно запрошуємо на відкритий вебінар, який вже 9 квітня проведе наш викладач Володимир Дроздецький.

Джерело: habr.com

Додати коментар або відгук