1/50 Komputery Przemysłowe i Systemy Wbudowane Główny system plików Linux Iwona Kochańska Katedra Systemów Elektroniki Morskiej WETI PG October 5, 2016
Elementy wbudowanego OS Linux Toolchain kompilator i inne narzdzia do tworzenia kodu dla urzadzeń Bootloader inicjalizuje platform sprzętowa oraz ładuje jadro systemu Kernel serce systemu, zarzadza zasobami i komunikuje się ze sprzętem Root filesystem 2/50 biblioteki i programy uruchamiane w systemie
Główny system plików: root filesystem Jadro OS ma do dyspozycji główny system plików jako: ramdisk - przekazany przez bootloader jako wskaźnik urzadzenie blokowe zamontowane w linii poleceń jadra poprzez parametr root= Po zamontowaniu głównego systemu plików jadro uruchamia pierwszy program: init Program init rozpoczyna przetwarzanie skryptów i uruchamia inne programy poprzez wywołania funckji biblioteki, które z kolei dokonuja wywołań systemowych 3/50
Główny system plików - minimum init: uruchamia pierwsze skrypty i programy powłoka (shell): środowisko do wykonywania skryptów oraz linia poleceń użytkwonika demony (daemons): programy uruchamiane w tle biblioteki (libraries): statyczne i współdzielone pliki konfiguracyjne: jako pliki tekstowe ASCII, zwykle w /etc 4/50
Główny system plików - minimum węzły urzadzeń (device nodes): pliki specjalne umożliwiajace dostęp do sterowników urzadzeń /proc i /sys: wirtualne systemy plików reprezentujace dane jadra OS moduły jadra (kernel modules): zwykle w /lib/modules/[kernel version].... oraz programy realizuj ace oczekiwane funkcjonalności systemu wbudowanego. 5/50
Organizacja katalogów System operacyjny nie wymga specjalnej organizacji plików i katalogów (poza nazwa programu init= i rdinit=) Takiej specjalnej organizacji moga jednak oczekiwać uruchamiane programy Filesystem Hierarchy Standard (FHS) - standard definiuj acy rozmieszczenie plików i katalogów w systemach operacyjnych z rodziny Linux i Unix. 6/50
Organizacja katalogów /bin: podstawowe pliki wykonywalne (binaries) dostępne dla wszystkich użytkowników (np. cat, ls, cp). /dev: pliki urzadzeń /etc: pliki konfiguracji OS /lib: biblioteki dla programów z katalogów /bin/ i /sbin/. /proc: wirtualny system plików proc informuj acy o stanie systemu i poszczególnych procesów, w większości pliki tekstowe (np. network). 7/50
Organizacja katalogów /sbin: Pliki wykonywalne do zarzadzania systemem (system binaries; np. init, route, ifup). /sys: wirtualny system plików sysfs /tmp: pliki tymczasowe, których stan nie jest gwarantowany po zamknięciu systemu. /usr: tzw. drugorzędowa hierarchia dla danych (Unix system resources), dane tylko do odczytu. Powinnien zawierać co najmniej katalogi: /usr/bin, /usr/lib i /usr/sbin. Może być zamontowany na innej partycji niż główny system plików. /var: pliki często ulegaj ace zmianom (variable files) podczas działania OS, takie jak: logi, bazy danych, tymczasowe pliki e-mail. 8/50
Katalog podstawowy (staging directory) Utworzenie katalogu podstawowego na komputerze host-a 9/50
Prawa dostępu do plików Każdy proces (uruchomiony program) należy do określonego użytkownika oraz grupy użytkowników Użytkownik 32-bitowy identyfikator user ID (lub UID) informacja o użytkownikach jest przechowywana w /etc/passwd Grupa to 32-bitowy identyfikator group ID (lub GID) informacja o grupach jest przechowywana w /etc/group 10/50
Prawa dostępu do plików Użytkownik główny (root user): UID = 0 nazywany również super-użytkownikiem (super-user) ma wszelkie prawa do wszystkich zasobów OS Grupa główna (root group): GID = 0 Bezpieczeństwo w systemach Linux to zarz adzanie uprawnieniami użytkowników i ograniczanie dostępu do konta root-a 11/50
Prawa dostępu do plików Każdy plik i katalog ma swojego właściciela i grupę Poziom dostępu różnych użytkowników do zasobów - zbiór flag (access permission flags, mode of the file): trzy grupy po trzy bity: wartości grupy bitów: read (r), write (w), execute (x) 12/50
Prawa dostępu do plików Dodatkowa grupa 3 bitów: SUID (4): pozwala na uruchomienie pliku wykonywalnego z prawami właściciela tego pliku często ustawiana flaga daje użytkownikowi tymczasowe prawo używania praw root-a SGID (2): pozwala na uruchomienie pliku wykonywalnego z prawami grupy tego pliku Sticky (1): plik może być usunięty lub przemianowany tylko przez właściciela pliku lub katalogu, lub jeśli proces ma prawo ich modyfikacji[1]. często stosowany w katalogach: /tmp i /var/tmp, do których dostęp moga mieć wszyscy użytkownicy systemu wyklucza usuwanie przez użytkowników plików do nich nienależacych 13/50
Prawa dostępu do plików Polecenie chmod - ustawienie uprawnień Przykład: ustaw SUID dla /bin/ping 14/50
Prawa dostępu do plików w ścieżce głównej Prawa dostępu do plików, które będa umieszczone na platformie docelowej: wrażliwe zasoby - tylko dostęp dla root-a programy uruchamiane z prawami zwykłego użytkownia - w razie ataku z zewnatrz umożliwia one dostęp do ograniczonych zasobów przykład: Plik urzadzenia /dev/mem umożliwia dostęp do pamięci. Powinien więc być własnościa root-a w trybie 600 (brak praw odczytu i zapisu dla wszystkich poza właścicielem) 15/50
Programy głównego systemu plików: init Program init Pierwszy uruchamiany program ( PID 1 ). Uruchamiany jako własność root-a (potrzebny szeroki dostęp do zasobów platformy) Uruchamia skrypty powłoki, które uruchamiaja demony (programu działajace w tle, bez komunikacji z terminalem) 16/50
Programy głównego systemu plików: powłoka (shell) Programy powłoki (shell): Uruchamia skrypty i obsługuje linię poleceń Przekazuja informacje między programami Przydatne w procesie rozwoju, debugowania, testowania Raczej nie przydatne w gotowym urzadzeniu 17/50
Programy głównego systemu plików: powłoka (shell) Programy powłoki: bash (Bourne-Again Shell) - jedna z najpopularniejszych powłok systemów uniksowych. Domyślna w: większości dystrybucji systemu GNU/Linux systemie OS X od wersji 10.3 środowisku Cygwin dla systemów Win32. ash (The Almquist shell): systemy BSD. dużo mniejsza niż bash popularna w systemach wbudowanych obecna w BusyBox hush: bardzo mała powłoka (dla programów rozruchowych). przydatna w systemach o bardzo małej pamięci obecna w BusyBox Zawsze testuj skrypty powłoki na maszynie docelowej! 18/50
Programy głównego systemu plików: narzędzia (utlilities) Programy narzędziowe: sprawiaja, że powłoka jest użyteczna w minimalnej, podstawowej wersji systemu plików jest co najmniej 50 programów narzędziowych problem z kompilacja każdego z nich problem z rozmiarem plików wykonywalnych 19/50
BusyBox BusyBox - projekt zrealizowany w 1996 roku przez Bruce Perens, który zbudował instalacje Debiana mieszczac a się na dyskietce 1.44 MB korzysta z zasady 80:20 (80% najbardziej potrzebnej funkcjonalności implementowane jest jako 20% kodu) łaczy funkcje podstawowych narzędzi Uniksa w jednym pliku wykonywalnym. używany w zastępstwie pakietu GNU Coreutils w małych, jednodyskietkowych lub wbudowanych dystrybucjach Linuksa. działanie programu jest zależne od tego pod jaka nazwa zostanie wywołany. "uniwersalny scyzoryk dla wbudowanego Linuksa". 20/50
BusyBox zbiór apletów, każdy z nich udostępnia swoja funkcjonalność jako: [applet]_main. Przykład: polecenie: cat Składnia: implementacja: coreutils/cat.c $ busybox cat m y _ f i l e. t x t aplet: cat-main Polecenie busybox bez parametrów - lista dostępnych apletów 21/50
BusyBox Tworzenie symbolicznego linku z /bin/cat do /bin/busybox: Po wywołaniu komendy cat uruchamiany jest program busybox, który sprawdza parametr wejściowy: 22/50
BusyBox BusyBox ma ponad 300 apletów, w tym: program init kilka programów powłoki narzędzia do większości zadań administracyjnych prosty edytor vi Typowa instalacja BusyBox: pojedynczy program z linkami symbolicznymi dla każdego apletu. 23/50
Główny system plików - biblioteki Jeśli programy używaja bibliotek współdzielonych, ich kopie musza się znaleźć w katalogu głównym dla platformy docelowej Skad wiadomo które? Można skopiować wszystkie, ale pełna glibc jest duża (dziesiatki MB) Sprawdzenie, które biblioteki sa potrzebne 24/50
Główny system plików - biblioteki Sprawdzenie katalogu głównego: Można go zapamiętać w zmiennej SYSROOT: Sprawdzenie powiazań dla /lib/ld-linux-armhf.so.3: Itd... Wszystkie linki symboliczne oraz pliki powinny być skopiowane do katalogów platformy docelowej 25/50
Główny system plików - biblioteki Jak ograniczyć rozmiar bibliotek? Biblioteki i programy sa często kompilowane z tablica symboli dla debugera (opcja -g) Wyczyszczenie plików z tablic symboli pozwala zaoszczędzić miejsce: Czyszczenie modułów jadra - z opcja strip-unneeded 26/50
Pliki urzadzeń (device nodes) W systemach Unix wszystko jest plikiem - poza interfejsami sieciowymi, które sa gniazdami (sockets) Większość urzadzeń reprezentowanych jest w systemie jako pliki (device nodes) Plik device node może dotyczyć: urzadzenia blokowego (block device) - urzadzenia pamięci masowej typu karty SD, dyski twarde urzadzenia znakowego (character device) - wszystkie pozostałe urzadzenia (poza interfejsami sieciowymi) Lokalizacja plików urz adzeń: /dev Przykład: port szeregowy - plik /dev/ttys0 27/50
Wirtualny system plików proc i sysfs proc i sysfs - wirtualne systemy plików umożliwiajace kontrolę pracy jadra dane jadra usystematyzowane sa jako hierarchiczne pliki odczyt pliku formatowanego w locie przez funkcje jadra możliwy jest zapis do niektorych plików -> wołanie funkcji jadra z nowymi danymi montowane w katalogach /proc i /sys: 28/50
Wirtualny system plików proc proc - część systemu Linux od zawsze pierwotne przeznaczenie - przekazywanie informacji o procesach do przestrzeni użytkownika dla każdego procesu - katalog /proc/<pid> z informacja o jego stanie ps - szybka informacja o działajacych procesach /proc/cpuinfo - informacja o CPU /proc/interrupts - informacja o przerwaniach /proc/sys - pliki do obserwacji i zarzadzania stanem procesór jadra, pamięcia i siecia man page proc - pomoc (dokumentacja) 29/50
Wirtualny system plików sysfs sysfs - od wersji Linux 2.6 informacje o systemie w bardziej zorganizowanej formie wiele plików zorganizowanych w drzewo katalogów 30/50
Montowanie systemu plików Polecenie mount - umożliwia dołaczenie systemu plików do już istniejacej ścieżki Przykład: Główny system plików (root filesystem) - system plików na szczycie drzewa, montowany przez jadro OS podczas uruchamiania Montowanie systemu plików proc polecenie mount wymaga podania pliku urzadzenia, a taki nie istnieje dla proc można podać dowolna nazwę pliku urzadzenia. Przykład - dwa polecenia daja ten sam skutek: 31/50
Moduły jadra Moduły jadra - instalowane w głównym systemie plików za pomoca polecenia make modules_install Moduły (wraz z plikami konfiguracyjnymi dla polecenia modprobe) kopiowane sa do katalogu /lib/modules/<kernel version> W ten sposób tworzone jest powiazanie między jadrem a głównym systemem plików Aktualizacji j adra zawsze powinna towarzyszyć aktualizacja systemu plików! 32/50
Przenoszenie systemu plików na platformę docelowa Przeniesienie głównego systemu plików do katalogu głównego na platformie docelowej ramdisk: obraz systemu plików ładowany do RAM przez program rozruchowy łatwy do utworzenia, bez powiazań (np. do bibliotek współdzielonych) używany podczas aktualizacji głównego systemu plików (lub jego awarii) wczesna przestrzeń użytkownika w dystrybucjach Linux w małych systemach wbudowanych może być głównym systemem plików skompresowany ramdisk zajmuje bardzo mała ilość pamięci RAM zawartość ramdisk jest ulotna - dane stałe (np. konfiguracja) powinny być przechowywane w inny sposób 33/50
Przenoszenie systemu plików na platformę docelowa Przeniesienie głównego systemu plików do katalogu głównego na platformie docelowej obraz dyskowy (disk image): kopia głównego systemu plików przykłady obraz w formacie ext4 kopiowany z karty SD obraz w formacie jffs2ładowany do pamięci flash przez bootloader jest to najbardziej popularny sposób przenoszenia systemu plików 34/50
Tworzenie rozruchowego ramdisk Podczas rozruchu systemu Linux uruchamiany jest ramdisk rozruchowy (initial RAM filesystem, initramfs) Format cpio - stary format archiwum Unix, podobny do TAR i ZIP, ale łatwiejszy w dekodowaniu Do obsługi initramfs potrzebne jest ustawienie CONFIG_BLK_DEV_INITRD w jadrze Sposoby tworzenia rozruchowego ramdisk: samodzielne archiwum cpio - najbardziej elastyczny sposob, ale nie wszystkie programy rozruchowe umożliwiaja załadowanie niezależnego ramdisk, archiwum cpio wbudowane w jadro jako tabela urzadzeń przetwarzana przez jadro 35/50
Samodzielny ramdisk Utworzenie kopii systemu plików, skompresowanie i dodanie nagłówka U-Boot: Oszacowanie rozmiaru: uramdisk file - 2.9 MiB (bez plików jadra) zimage file - 4.4 MiB U-Boot - 440 KiB = potrzeba 7.7 MiB by uruchomić platformę 36/50
Samodzielny ramdisk Jeśli rozmiar jest problemem: Zmniejsz jadro (przez usunięcie niepotrzebnych sterowników i funkcji) Zmniejsz BusyBox (przez usunięcie niepotrzbnych narzędzi) Skompiluj BusyBox statycznie Użyj uclibc lub musl libc zamiast glibc 37/50
Konfiguracja kont użytkowników Zła praktyka: uruchamianie wszystkich programów jako root Dobra praktyka: używanie kont użytkowników o ograniczonych przywilejach, kiedy tylko to możliwe Konfiguracja kont użytkowników: /etc/passwd Jeden użytkownik = jedna linia w pliku: nazwa (login) hasło (lub x jeśli hasło jest w /etc/shadow) UID GID komentarz (może być pusty) ścieżka domowa 38/50
Konfiguracja kont użytkowników Przykład: pierwsza linia - root (UID 0), druga linia - daemon (UID 1): ustawienie /bin/false dla użytkownika daemon - brak możliwości logowania w powłoce Programy czytaja plik /etc/passwd - problem z bezpieczeństwem haseł! Hasła mog a być przechowywane w /etc/shadow (dostępnym tylko dla root-a) 39/50
Konfiguracja grup użytkwoników Grupy użytkowników - plik /etc/group. Format: Przykład: nazwa grupy hasło (x jeśli grupa nie ma hasła) GID opcjonalnie - lista użytkowników należacych do grupy 40/50
Dodanie użytkowników do głównego systemu plików Dodanie etc/passwd, etc/shadow (permission 600) i etc/group do głównego katalogu program init czyta plik /etc/inittab inittab restartuje getty po zakończeniu terminala powłoki getty - program do obsługi procedury logowania (część BusyBox) 41/50
Uruchomienie procesu demona Przykład: syslogd (zbiera logi od innych programów, głównie demonów) Uruchomienie demona - dodanie linii do etc/inittab: respawn - jeśli program zakończy działanie, automatycznie uruchom go ponownie -n - uruchom jako proces w tle Log zapisywany jest w /var/log/messages. 42/50
Konfiguracja sieci Podstawowa konfiguracja sieci - dla interfejsu Ethernet (eth0) i prostej konfiguracji IP v4 BusyBox ifup/ifdown - wystarczajace do najprostszych przypadków Główna konfiguracja sieci jest przechowywana w /etc/network/interfaces. Niezbędne lokalizacje w głównym katalogu: 43/50
Konfiguracja sieci etc/network/interfaces dla statycznego IP : etc/network/interfaces dla dynamicznego IP otrzymanego od DHCP: udchpcd - klient DHCP (BusyBox). Potrzebuje skryptu /usr/share/udhcpc/default.script Domyślna konfiguracja: examples//udhcp/simple.script. 44/50
Sieciowe składniki dla glibc glibc używa name service switch (NSS) do kontrolowania sposobu tlumaczenia nazw w numery identyfikowane w sieci: nazwy użytkowników -> UID przez plik /etc/passwd; usługi sieciowe ->numery portów przez plik /etc/services Konfiguracja - /etc/nsswitch.conf Wszystkie tłumaczenia odbywaja się przez odpowiednie pliki w /etc (nazwy hostów - dodatkowo z DNS) /etc/hosts powinien zawierać co najmniej adres localhost: 45/50
Sieciowe składniki dla glibc Biblioteki, które obsługuja tłumaczenie nazw: pluginy ładowane na podstawie zawartości nsswitch.conf, nie pokazuja się w zależności po wywołaniu readelf Dla platformy docelowej - skopiuj je z katalogu głównego: 46/50
Tworzenie systemu plików na podstawie tablicy urzadzeń gen_init_cpio - narzędzie jadra do tworzenia pliku cpio na podstawie informacji w pliku tekstowym device table, device table - pozwala zwykłemu użytkownikowi tworzyć pliki urzadzeń Dla innych formatów obrazów (niż cpio): jffs2: mkfs.jffs2 ubifs: mkfs.ubifs ext2: genext2fs 47/50
Tworzenie systemu plików na podstawie tablicy urzadzeń Składnia (dla każdego narzędzia): <name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count> type: f: zwykły plik d: katalog c: plik urzadzenia znakowego b: plik urzadzenia blokowego p: FIFO (kolejka) major i minor: numery urzadzeń start, inc, i count: - do tworzenia grup urzadzeń (poczawszy od minor w start) 48/50
Tworzenie systemu plików na podstawie tablicy urzadzeń Przykład device-table.txt: Użycie genext2fs do wygenerowania obrazu systemu plików (4 MiB = 4,096 bloków o domyślnym rozmiarze 1,024 bytes): 49/50
Umieszczenie głównego systemu plików na karcie SD Montowanie systemu plików z urzadzenia blokowego (karta SD) na pierwszej partycji SD znajduja się pliki do rozruchu (np. MLO i u-boot.img) Po umieszczeniu karty w slocie urzadzenia, ustaw linię poleceń jadra na root=/dev/mmcblk0p2 Sekwencja rozruchowa: 50/50