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

Cześć wszystkim! Nadal uruchamiamy nowe transmisje kursów, w których już się zakochałeś, a teraz spieszymy z ogłoszeniem, że uruchamiamy nowy zestaw kursów „Administrator Linuksa”który ruszy pod koniec kwietnia. Z okazji tego wydarzenia zostanie wydana nowa publikacja. Z oryginalnym materiałem możesz przeczytaj tutaj.

Wirtualne systemy plików służą jako rodzaj magicznej abstrakcji, która pozwala filozofii Linuksa powiedzieć, że „wszystko jest plikiem”.

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

Co to jest system plików? Na podstawie słów jednego z pierwszych współpracowników i autorów Linuksa Roberta Lawa, „System plików to hierarchiczne przechowywanie danych zebranych zgodnie z określoną strukturą”. Tak czy inaczej, ta definicja równie dobrze pasuje do VFAT (Virtual File Allocation Table), Git i Cassandra (Baza danych NoSQL). Więc co dokładnie definiuje coś takiego jak „system plików”?

Podstawy systemu plików

Jądro Linuksa ma pewne wymagania dotyczące jednostki, którą można uznać za system plików. Musi wdrożyć metody open(), read() и write() dla trwałych obiektów, które mają nazwy. Z obiektowego punktu widzenia programowanie, jądro definiuje ogólny system plików jako abstrakcyjny interfejs, a te trzy duże funkcje są uważane za „wirtualne” i nie mają konkretnej definicji. W związku z tym domyślna implementacja systemu plików nosi nazwę wirtualnego systemu plików (VFS).

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

Jeśli możemy otwierać, odczytywać i zapisywać w jednostce, to ta jednostka jest uważana za plik, jak widać na przykładzie w konsoli powyżej.
Zjawisko VFS tylko podkreśla uniksową obserwację, że „wszystko jest plikiem”. Pomyśl, jakie to dziwne, że ten mały przykład /dev/console powyżej pokazuje, jak faktycznie działa konsola. Rysunek przedstawia interaktywną sesję Bash. Wysłanie ciągu do konsoli (wirtualnego urządzenia konsoli) wyświetla go na wirtualnym ekranie. VFS ma inne, jeszcze dziwniejsze właściwości. Na przykład umożliwia wyszukiwanie według on.

Znane systemy, takie jak ext4, NFS i /proc, pełnią trzy ważne funkcje w strukturze danych C zwanej operacje na plikach. Ponadto niektóre systemy plików rozszerzają i redefiniują funkcjonalność VFS w znany obiektowy sposób. Jak podkreśla Robert Love, abstrakcja VFS umożliwia użytkownikom Linuksa nonszalanckie kopiowanie plików do lub z systemów operacyjnych innych firm lub abstrakcyjnych jednostek, takich jak potoki, bez martwienia się o ich wewnętrzny format danych. Po stronie użytkownika (przestrzeń użytkownika), za pomocą wywołania systemowego, proces może kopiować z pliku do struktur danych jądra za pomocą metody read() jeden system plików, a następnie użyj metody write () inny system plików do wyprowadzania danych.

Definicje funkcji należące do podstawowych typów VFS znajdują się w plikach fs/*.c kod źródłowy jądra, podczas gdy podkatalogi fs/ zawierać określone systemy plików. Rdzeń zawiera również podmioty, takie jak cgroups, /dev и tmpfs, które są wymagane podczas procesu rozruchu i dlatego są zdefiniowane w podkatalogu jądra init/. Zauważ, że cgroups, /dev и tmpfs nie wywołuj funkcji „wielkiej trójki”. file_operations, ale bezpośrednio odczytywać i zapisywać w pamięci.
Poniższy diagram pokazuje, w jaki sposób przestrzeń użytkownika uzyskuje dostęp do różnych typów systemów plików powszechnie montowanych w systemach Linux. Struktury nie pokazane pipes, dmesg и POSIX clocks, które również implementują strukturę file_operations, dostępne przez warstwę VFS.

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

VFS to „warstwa opakowująca” między wywołaniami systemowymi a implementacjami niektórych file_operationsJak na przykład ext4 и procfs. Funkcje file_operations może wchodzić w interakcje ze sterownikami urządzeń lub urządzeniami dostępu do pamięci. tmpfs, devtmpfs и cgroups nie używaj file_operations, ale bezpośrednio uzyskać dostęp do pamięci.
Istnienie VFS zapewnia możliwość ponownego wykorzystania 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 jest powszechną praktyką wśród inżynierów oprogramowania! Jeśli jednak kod wielokrotnego użytku zawiera poważne błędy, cierpią na nie wszystkie implementacje, które dziedziczą wspólne metody.

/tmp: Prosta wskazówka

Łatwym sposobem wykrycia obecności VFS w systemie jest wpisanie mount | grep -v sd | grep -v :/, który pokaże wszystkie zamontowane (mounted) systemów plików, które nie są rezydujące na dysku i nie są NFS, co jest prawdą na większości komputerów. Jeden z wymienionych wierzchowców (mounts) VFS niewątpliwie /tmp, prawo?

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

Każdy zna to miejsce do przechowywania / tmp na nośniku fizycznym - szaleństwo! źródło.

Dlaczego przechowywanie jest niepożądane /tmp na nośnikach fizycznych? Ponieważ pliki w /tmp są tymczasowe, a urządzenia pamięci masowej są wolniejsze niż pamięć, w której tworzony jest tmpfs. Ponadto nośniki fizyczne są bardziej podatne na zużycie podczas nadpisywania niż pamięć. Wreszcie, pliki w /tmp mogą zawierać poufne informacje, więc ich usuwanie przy każdym ponownym uruchomieniu jest podstawową funkcją.

Niestety, niektóre skrypty instalacyjne dystrybucji Linuksa domyślnie tworzą /tmp na urządzeniu pamięci masowej. Nie rozpaczaj, jeśli stało się to również z twoim systemem. Wykonaj kilka prostych instrukcji z Arch Wikiaby to naprawić i pamiętaj, że pamięć przydzielona dla tmpfs staje się niedostępny do innych celów. Innymi słowy, w systemie z gigantycznym tmpfs i dużymi plikami może zabraknąć pamięci i ulec awarii. Kolejna wskazówka: podczas edycji pliku /etc/fstab, pamiętaj, że musi kończyć się znakiem nowej linii, w przeciwnym razie system się nie uruchomi.

/proc i /sys

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

procfs tworzy migawkę jądra i procesów, które monitoruje userspace, /proc jądro drukuje informacje o tym, co ma do dyspozycji, takie jak przerwania, pamięć wirtualna i harmonogram. Oprócz, /proc/sys to miejsce, w którym znajdują się parametry skonfigurowane za pomocą polecenia sysctl, dostępne dla userspace. Statusy i statystyki poszczególnych procesów wyświetlane są w katalogach /proc/.

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

Tutaj /proc/meminfo jest pustym plikiem, który mimo wszystko zawiera cenne informacje.

Zachowanie /proc files pokazuje, jak różne mogą być systemy plików dysków VFS. Po jednej stronie, /proc/meminfo zawierają informacje, które można wyświetlić za pomocą polecenia free. Z drugiej strony jest pusty! Jak to działa? Sytuacja przypomina słynny artykuł pt Czy księżyc istnieje, kiedy nikt na niego nie patrzy? Rzeczywistość i teoria kwantowa”napisany przez profesora fizyki Uniwersytetu Cornell, Davida Mermina, w 1985 roku. Faktem jest, że jądro zbiera statystyki pamięci, gdy wysyłane jest żądanie /proc, a właściwie w plikach /proc nie ma nic, gdy nikt nie patrzy. Jak zostało powiedziane Mermin„Podstawowa doktryna kwantowa mówi, że pomiar na ogół nie ujawnia istniejącej wcześniej wartości mierzonej właściwości”. (I rozważ pytanie o księżyc jako pracę domową!)
Pozorna pustka procfs ma sens, ponieważ informacje tam zawarte są dynamiczne. Nieco inna sytuacja z sysfs. Porównajmy, ile jest plików o rozmiarze co najmniej jednego bajta /proc i /sys.

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

Procfs ma jeden plik, a mianowicie wyeksportowaną konfigurację jądra, co jest wyjątkiem, ponieważ musi być wygenerowane tylko raz na rozruch. Z drugiej strony w /sys istnieje wiele większych plików, z których wiele zajmuje całą stronę pamięci. Zwykle pliki sysfs zawierają dokładnie jedną liczbę lub linię, w przeciwieństwie do tablic z informacjami uzyskanymi z odczytu plików takich jak /proc/meminfo.

cel sysfs - zapewniają właściwości odczytu/zapisu tego, co wywołuje jądro «kobjects» w przestrzeni użytkownika. Jedyny cel kobjects to liczenie linków: kiedy ostatni link do obiektu zostanie usunięty, system przywróci powiązane z nim zasoby. Niemniej jednak, /sys stanowi większość znanych „stabilny ABI dla przestrzeni użytkownika” rdzeń, którego nikt nigdy, w żadnych okolicznościach nie może "przerwa". Nie oznacza to, że pliki w sysfs są statyczne, co byłoby niezgodne z liczeniem referencji niestabilnych obiektów.
Stabilny ABI jądra ogranicza to, co może się w nim pojawić /sys, a nie to, co faktycznie jest obecne w danym momencie. Lista uprawnień do plików w sysfs zapewnia wgląd w to, jak konfigurowalne ustawienia dla urządzeń, modułów, systemów plików itp. mogą być konfigurowane lub odczytywane. Logicznym wnioskiem jest to, że procfs jest również częścią stabilnego ABI jądra, chociaż nie jest to wyraźnie stwierdzone w dokumentacja.

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

Pliki w sysfs opisują jedną konkretną właściwość dla każdej jednostki i mogą być odczytywalne, zapisywalne lub jedno i drugie. „0” w pliku oznacza, że ​​dysk SSD nie może zostać usunięty.

Zacznijmy drugą część tłumaczenia od tego jak monitorować VFS za pomocą narzędzi eBPF i bcc, a teraz czekamy na Wasze komentarze i tradycyjnie zapraszamy na otwarte webinarium, które poprowadzi nasz nauczyciel 9 kwietnia - Władimir Drozdecki.

Źródło: www.habr.com

Dodaj komentarz