Здравейте на всички! Продължаваме с пускането на нови потоци по вече известните ви курсове и сега бързаме да съобщим, че стартираме нов набор по курса , който ще стартира в края на април. Тази публикация ще бъде посветена на събитието. С оригинала на материала можете .
Виртуалните файлови системи изпълняват ролята на магическа абстракция, която позволява философията на Linux да казва, че "всичко е файл".

Какво представлява файловата система? Опирането на думите на един от първите contributors и автори на Linux , "Файловата система е йерархично хранилище на данни, организирано в съответствие с определена структура." Независимо от това, това определение важи и за VFAT (Virtual File Allocation Table), Git и (). Какво точно определя понятието "файлова система"?
Основи на файловата система
Ядро на Linux има определени изисквания към съществото, което може да бъде считано за файловата система. То трябва да реализира методи open(), read() и write() за постоянни обекти, които имат имена. От гледна точка на обектно-ориентираното , ядрото определя обобщената файловата система (generic filesystem) като абстрактен интерфейс, а тези три основни функции се считат за "виртуални" и нямат конкретно определение. Съответно, реализацията на файловата система по подразбиране се нарича виртуална файловата система (VFS).

Ако можем да отваряме, четем и записваме в същността, то тя се счита за файл, както виждаме от примера в консолата отгоре.
Феноменът VFS само подчертава наблюдението, характерно за Unix-подобни системи, което гласи, че "всичко е файл". Помислете колко странно е, че този малък пример отгоре с /dev/console показва как всъщност работи консолата. На картинката е показана интерактивна Bash сесия. Изпращането на ред в консолата (virtual console device) го показва на виртуалния екран. VFS има и други, още по-странни свойства. Например, тя дава възможност да се търси по .
Известни ни системи като ext4, NFS и /proc имат три важни функции в структурата на данни C, наречена . Освен това, определени файлови системи разширяват и пренаписват функциите на VFS по традиционен обектно-ориентиран начин. Както отбелязва Робърт Лав, абстракцията на VFS позволява на потребителите на Linux безпроблемно да копират файлове в или от други операционни системи или абстрактни единици, като pipes, без да се тревожат за вътрешния им формат на данни. От страна на потребителя (userspace) с помощта на системен повик процесът може да копира от файл в структурите данни на ядрото чрез метода read() на една файловата система, а след това да използва метода write () на друга файловата система за извеждане на данните.
Дефиниции на функции, принадлежащи на основните типове VFS, се намират във файловете изходния код на ядрото, докато подкаталогите fs/ съдържат определени файлови системи. В ядрото също така са включени единици, като cgroups, /dev и tmpfs, които са необходими по време на зареждането и следователно се дефинират в подкаталога на ядрото init/. Обърнете внимание, че cgroups, /dev и tmpfs не извикват „голямата тройка“ функции file_operations, а директно четат и пишат в паметта.
На по-долната диаграма е показано как userspace взаимодейства с различни типове файлови системи, обикновено монтирани в системи Linux. Не са показани такива конструкции като pipes, dmesg и POSIX часовници, които също реализират структура 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. От друга страна, там е празно! Как така се получава? Ситуацията напомня на известната статия, озаглавена , написана от професора по физика в Корнелския университет Дейвид Мермин през 1985 година. Работата е там, че ядрото събира статистика за паметта, когато се прави запитване към /proc, и всъщност в файловете /proc няма нищо, когато никой не гледа там. Както каза , „Фундаменталната квантова доктрина гласи, че измерването, като правило, не разкрива преди съществуваща стойност на измерваното свойство.“ (А помислете за въпроса за луната в качеството на домашно задание!)
Предполагаемата празнота procfs има смисъл, тъй като информацията, която се намира там, е динамична. Ситуацията с sysfsе малко по-различна. Нека сравним колко файла с размер не по-малък от един байт има в /proc и в /sys.

Procfs има един файл, а именно експортираната конфигурация на ядрото, която е изключение, тъй като трябва да бъде генерирана само веднъж при зареждане. От друга страна, в /sys има множество по-обемни файлове, много от които заемат цяла страница памет. Обикновено файловете sysfs съдържат точно едно число или низ, в контекста на информацията, получаваща се при четене на такива файлове, като /proc/meminfo.
Цел sysfs – предоставя свойствата, достъпни за четене и запис на това, което ядрото нарича „kobjects“ в потребителското пространство. Единствената цел на kobjects е броя на препратките: когато последната препратка към kobject бъде премахната, системата ще освободи свързаните с него ресурси. Въпреки това, /sys съставлява голяма част от известния на ядрото, което никога не може да бъде . Това не означава, че файловете в sysfs са статични, което би противоречало на броенето на препратки към нестабилни обекти.
Стабилният двоичен интерфейс на приложенията на ядрото (kernel’s stable ABI) ограничава това, което може да се появи в /sys, а не това, което всъщност присъства в конкретния момент. Листингът на разрешенията за файлове в sysfs осигурява разбиране за това как конфигурируемите параметри на устройства, модули, файлови системи и т.н. могат да бъдат настройвани или четени. С правим логичен извод, че procfs също е част от стабилния ABI на ядрото, въпреки че това не е изрично посочено в .

Файловете в sysfs описват едно конкретно свойство за всяка единица и могат да бъдат четими, презаписваеми или и двете едновременно. „0“ в файла показва, че SSD не може да бъде премахнат.
Втората част от превода ще започнем с наблюдение на VFS чрез инструменти eBPF и bcc, а сега очакваме вашите коментари и традиционно каним на , който ще се проведе на 9 април от нашия преподавател — .
Източник: habr.com
