Wirtualne systemy plików w Linuxie: po co są potrzebne i jak działają? Część 1

Cześć wszystkim! Kontynuujemy uruchamianie nowych kursów, które już zdążyły się wam spodobać, i teraz z radością informujemy, że rozpoczynamy nową edycję kursu Administrator Linux, który ruszy pod koniec kwietnia. Z tej okazji opublikujemy nowy materiał. Oryginał można znaleźć tutaj.

Wirtualne systemy plików pełnią rolę pewnej magicznej abstrakcji, która pozwala filozofii Linuxa mówić, że "wszystko jest plikiem".

Wirtualne systemy plików w Linuxie: po co są potrzebne i jak działają? Część 1

Czym jest system plików? Opierając się na słowach jednego z pierwszych wkładów i autorów Linuxa Roberta Lawa, „System plików to hierarchiczne przechowalnia danych, zorganizowane zgodnie z określoną strukturą”. Niezależnie od tego, ta definicja równie dobrze pasuje do VFAT (Virtual File Allocation Table), Git oraz Cassandra (bazy danych NoSQL). Co więc dokładnie definiuje takie pojęcie, jak „system plików”?

Podstawy systemu plików

Jądro Linuxa ma konkretne wymagania wobec podmiotu, który może być uznany za system plików. Musi on implementować metody open(), read() i write() dla obiektów trwałych, które mają nazwy. Z perspektywy programowania obiektowego , jądro definiuje uogólniony system plików (generic filesystem) jako abstrakcyjny interfejs, a te trzy główne funkcje są uważane za „wirtualne” i nie mają konkretnej definicji. W związku z tym, implementacja systemu plików domyślnie nazywana jest wirtualnym systemem plików (VFS).Jeśli możemy otwierać, czytać i zapisywać w danym podmiocie, to podmiot ten uznawany jest za plik, tak jak widzimy w przykładzie powyżej.

Wirtualne systemy plików w Linuxie: po co są potrzebne i jak działają? Część 1

Fenomen VFS jedynie podkreśla obserwację charakterystyczną dla systemów podobnych do Unix, która głosi, że "wszystko jest plikiem". Pomyślcie, jak dziwne jest, że ten mały przykład powyżej z /dev/console pokazuje, jak właściwie działa konsola. Na obrazku przedstawiona jest interaktywna sesja Bash. Wysłanie wiersza do konsoli (virtual console device) wyświetla go na wirtualnym ekranie. VFS ma inne, jeszcze dziwniejsze właściwości. Na przykład, umożliwia przeprowadzanie wyszukiwania przez
nie Znane nam systemy, takie jak ext4, NFS i /proc mają trzy ważne funkcje w strukturze danych C, która nazywa się.

Znane nam systemy, takie jak ext4, NFS i /proc, mają trzy ważne funkcje w strukturze danych C, która nazywa się file_operations. Ponadto, niektóre systemy plików rozszerzają i redefiniują funkcje VFS w typowy sposób obiektowo-zorientowany. Jak zauważa Robert Love, abstrakcja VFS pozwala użytkownikom Linuksa nie martwić się o wewnętrzny format danych podczas kopiowania plików do lub z obcych systemów operacyjnych lub abstrakcyjnych bytów, takich jak pipes. read() Z poziomu użytkownika za pomocą wywołania systemowego proces może kopiować z pliku do struktur danych jądra przy użyciu metody write () innego systemu plików do wyjścia danych.

Definicje funkcji, które należą do podstawowych typów VFS, znajdują się w plikach fs/*.c źródłowego kodu jądra, podczas gdy podkatalogi fs/ zawierają konkretne systemy plików. W jądrze znajdują się również byty, takie jak cgroups, /dev i tmpfs, które są potrzebne w procesie rozruchu i dlatego są definiowane w podkatalogu jądra init/. Zauważ, że cgroups, /dev i tmpfs nie wywołują «wielkiej trójki» funkcji file_operations, a bezpośrednio odczytują i zapisują do pamięci.
Na poniższym diagramie pokazano, jak userspace uzyskuje dostęp do różnych typów systemów plików, zwykle montowanych w systemach Linux. Nie pokazano takich konstrukcji jak pipes, dmesg i POSIX clocks, które również implementują strukturę file_operations, do której dostęp odbywa się przez warstwę VFS.

Wirtualne systemy plików w Linuxie: po co są potrzebne i jak działają? Część 1

VFS jest «warstwą powłokową» między wywołaniami systemowymi a realizacjami określonych file_operations, takich jak ext4 i procfs. Funkcje file_operations mogą współdziałać zarówno z sterownikami urządzeń, jak i z urządzeniami dostępu do pamięci. tmpfs, devtmpfs i cgroups nie używają file_operations, a bezpośrednio odnoszą się do pamięci.
Istnienie VFS umożliwia ponowne wykorzystanie kodu, ponieważ podstawowe metody związane z systemami plików nie muszą być ponownie implementowane przez każdy typ systemu plików. Ponowne wykorzystanie kodu to powszechnie stosowana praktyka inżynierów oprogramowania! Jednak jeśli ponownie używany kod zawiera poważne błędy, wszystkie implementacje, które dziedziczą wspólne metody, się na tym cierpią.

/tmp: Простая подсказка

Prosty sposób na sprawdzenie, czy VFS obecne są w systemie, to wprowadzenie mount | grep -v sd | grep -v :/, co pokaże wszystkie zamontowane (mounted) systemy plików, które nie są rezydentami na dysku i nie są NFS, co jest prawdą w większości komputerów. Jednym z wymienionych mauntów (mounts) VFS na pewno będzie /tmp, prawda?

Wirtualne systemy plików w Linuxie: po co są potrzebne i jak działają? Część 1

Wszyscy wiedzą, że przechowywanie / tmp na nośniku fizycznym to szaleństwo! Źródło.

Dlaczego nie jest wskazane przechowywanie /tmp na nośniku fizycznym? Ponieważ pliki w /tmp są tymczasowe, a urządzenia pamięci są wolniejsze niż pamięć, gdzie tworzony jest tmpfs. Co więcej, nośniki fizyczne są bardziej narażone na zużycie przy zapisie niż pamięć. Wreszcie, pliki w /tmp mogą zawierać poufne informacje, dlatego ich zniknięcie przy każdym ponownym uruchomieniu jest funkcją nieodłączną.

Niestety, niektóre skrypty instalacyjne dystrybucji Linuksa domyślnie tworzą /tmp na nośniku pamięci. Nie martw się, jeśli to się zdarzyło i w Twoim systemie. Wykonaj kilka prostych instrukcji z Arch Wiki, aby to naprawić, i pamiętaj, że pamięć przydzielona dla tmpfs staje się niedostępna do innych celów. Innymi słowy, system z ogromnym tmpfs i dużymi plikami w nim może wyczerpać całą pamięć i się zawiesić. Inna wskazówka: podczas edycji pliku /etc/fstab, pamiętaj, aby kończył się nową linią, w przeciwnym razie Twój system się nie uruchomi.

/proc и /sys

Oprócz /tmp, VFS (wirtualne systemy plików), które są najbardziej znane użytkownikom Linuksa to /proc i /sys. (/dev znajduje się w pamięci współdzielonej i nie ma file_operations). Dlaczego te dwa komponenty? Przeanalizujmy tę kwestię.

procfs tworzy migawkę natychmiastowego stanu jądra i procesów, którymi zarządza dla userspace. W /proc jądro wyprowadza informacje o tym, jakimi zasobami dysponuje, takimi jak przerwania, pamięć wirtualna i planista. Co więcej, /proc/sys to miejsce, w którym parametry konfigurowane za pomocą komendy sysctl, są dostępne dla userspace. Status i statystyki poszczególnych procesów są wyświetlane w katalogach /proc/.

Wirtualne systemy plików w Linuxie: po co są potrzebne i jak działają? Część 1

Tutaj /proc/meminfo — to pusty plik, który jednak zawiera cenne informacje.

Zachowanie /proc plików pokazuje, jak różne mogą być systemy plików VFS. Z jednej strony, /proc/meminfo zawierają informacje, które można sprawdzić za pomocą komendy free. Z drugiej strony, jest tam pusto! Jak to się dzieje? Sytuacja przypomina słynny artykuł zatytułowany "Czy istnieje księżyc, kiedy nikt na niego nie patrzy? Rzeczywistość a teoria kwantowa", napisany przez profesora fizyki z Uniwersytetu w Cornellu, Davida Mermina w 1985 roku. Fakt jest taki, że jądro zbiera statystyki pamięci, gdy dochodzi do zapytania do /proc, i tak naprawdę w plikach. /proc nic nie ma, gdy nikt nie patrzy. Jak powiedział Mermin, „Fundamentalna doktryna kwantowa stwierdza, że pomiar zasadniczo nie ujawnia wcześniej istniejącej wartości mierzonej cechy.” (Pomyślcie o pytaniu na temat księżyca jako o pracy domowej!)
Pozorna pustka procfs ma sens, ponieważ znajdujące się tam informacje są dynamiczne. Sytuacja jest nieco inna z sysfs. Porównajmy, ile plików o rozmiarze co najmniej jednego bajta znajduje się w /proc i w /sys.

Wirtualne systemy plików w Linuxie: po co są potrzebne i jak działają? Część 1

Procfs ma jeden plik, a mianowicie wyeksportowaną konfigurację jądra, która jest wyjątkiem, ponieważ należy ją generować tylko raz przy każdorazowym uruchomieniu. Z drugiej strony w /sys leży wiele bardziej obszerne pliki, z których wiele zajmuje całą stronę pamięci. Zwykle pliki sysfs zawierają dokładnie jedną liczbę lub ciąg, w przeciwieństwie do tabel informacji uzyskiwanych z takich plików jak /proc/meminfo.

Cel sysfs – dostarczyć właściwości dostępne do odczytu i zapisu tego, co jądro nazywa „kobjects” w przestrzeni użytkownika. Jedynym celem kobjects jest zliczanie referencji: gdy ostatnie odniesienie do kobject zostaje usunięte, system odzyskuje zasoby związane z nim. Niemniej jednak /sys stanowi dużą część słynnego „stabilnego ABI dla przestrzeni użytkownika” jądra, którego nikt nigdy, w żadnych okolicznościach, nie może „zepsuć”. To nie oznacza, że pliki w sysfs są statyczne, co byłoby sprzeczne z liczeniem referencji na niestabilnych obiektach.
Stabilny interfejs binarny aplikacji jądra (stabilne ABI jądra) ogranicza to, co może się pojawić w /sys, a nie to, co faktycznie jest obecne w danym konkretnym momencie. Wykaz uprawnień do plików w sysfs zapewnia zrozumienie, w jaki sposób konfigurowane parametry urządzeń, modułów, systemów plików itp. mogą być ustawiane lub odczytywane. Wnioskujemy logicznie, że procfs jest również częścią stabilnego ABI jądra, chociaż nie jest to jasno określone w dokumentacji.

Wirtualne systemy plików w Linuxie: po co są potrzebne i jak działają? Część 1

Pliki w sysfs opisują jedną konkretną cechę dla każdej jednostki i mogą być czytelne, nadpisywalne lub zarówno jedno, jak i drugie jednocześnie. „0” w pliku oznacza, że SSD nie może być usunięty.

Drugą część tłumaczenia rozpoczniemy od tego, jak obserwować VFS za pomocą narzędzi eBPF i bcc, a tymczasem czekamy na wasze komentarze i tradycyjnie zapraszamy na otwarty webinar, który już 9 kwietnia poprowadzi nasz nauczyciel — Włodzimierz Drozdziecki.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster