Віртуальныя файлавыя сістэмы ў 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

Дадаць каментар