Всім привіт! Ми продовжуємо запуски нових потоків за курсами, що вже полюбилися вам, і зараз поспішаємо повідомити про те, що у нас стартує новий набір по курсу
Віртуальні файлові системи виконують роль чарівної абстракції, яка дозволяє філософії 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