Виртуалните файлови системи в Linux: защо са необходими и как работят? Част 1

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

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

Виртуалните файлови системи в Linux: защо са необходими и как работят? Част 1

Какво представлява файловата система? Опирането на думите на един от първите contributors и автори на Linux Робер Лав, "Файловата система е йерархично хранилище на данни, организирано в съответствие с определена структура." Независимо от това, това определение важи и за VFAT (Virtual File Allocation Table), Git и Cassandra (база данни NoSQL). Какво точно определя понятието "файлова система"?

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

Ядро на Linux има определени изисквания към съществото, което може да бъде считано за файловата система. То трябва да реализира методи open(), read() и write() за постоянни обекти, които имат имена. От гледна точка на обектно-ориентираното програмиране, ядрото определя обобщената файловата система (generic filesystem) като абстрактен интерфейс, а тези три основни функции се считат за "виртуални" и нямат конкретно определение. Съответно, реализацията на файловата система по подразбиране се нарича виртуална файловата система (VFS).

Виртуалните файлови системи в Linux: защо са необходими и как работят? Част 1

Ако можем да отваряме, четем и записваме в същността, то тя се счита за файл, както виждаме от примера в консолата отгоре.
Феноменът VFS само подчертава наблюдението, характерно за Unix-подобни системи, което гласи, че "всичко е файл". Помислете колко странно е, че този малък пример отгоре с /dev/console показва как всъщност работи консолата. На картинката е показана интерактивна Bash сесия. Изпращането на ред в консолата (virtual console device) го показва на виртуалния екран. VFS има и други, още по-странни свойства. Например, тя дава възможност да се търси по тях.

Известни ни системи като ext4, NFS и /proc имат три важни функции в структурата на данни C, наречена file_operations. Освен това, определени файлови системи разширяват и пренаписват функциите на 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 часовници, които също реализират структура 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“ в потребителското пространство. Единствената цел на kobjects е броя на препратките: когато последната препратка към kobject бъде премахната, системата ще освободи свързаните с него ресурси. Въпреки това, /sys съставлява голяма част от известния „стабилен ABI за потребителското пространство“ на ядрото, което никога не може да бъде „разбито“. Това не означава, че файловете в sysfs са статични, което би противоречало на броенето на препратки към нестабилни обекти.
Стабилният двоичен интерфейс на приложенията на ядрото (kernel’s stable ABI) ограничава това, което може да се появи в /sys, а не това, което всъщност присъства в конкретния момент. Листингът на разрешенията за файлове в sysfs осигурява разбиране за това как конфигурируемите параметри на устройства, модули, файлови системи и т.н. могат да бъдат настройвани или четени. С правим логичен извод, че procfs също е част от стабилния ABI на ядрото, въпреки че това не е изрично посочено в документацията.

Виртуалните файлови системи в Linux: защо са необходими и как работят? Част 1

Файловете в sysfs описват едно конкретно свойство за всяка единица и могат да бъдат четими, презаписваеми или и двете едновременно. „0“ в файла показва, че SSD не може да бъде премахнат.

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

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster