Raport o rozwoju projektu FreeBSD od kwietnia do czerwca 2019 roku. Wśród zmian można wymienić:
- Ogólne i systemowe pytania
- Zespół zarządzający podjął decyzję o utworzeniu grupy roboczej w celu zbadania możliwości przetłumaczenia tekstów źródłowych z centralnie zarządzanego systemu kontroli wersji Subversion do zdecentralizowanego systemu Git.
- Przeprowadzono testowanie fuzzingowe jądra FreeBSD przy użyciu systemu i naprawiono szereg błędów, które przy tym się ujawniły. Dodano warstwę do testowania fuzzingowego bibliotek dla kompatybilności z 32-bitowym środowiskiem na systemach z 64-bitowym rdzeniem. Zrealizowano możliwość uruchamiania syzkaller w wirtualnych maszynach opartych na bhyve. W następnym etapie planowane jest rozszerzenie zasięgu testów systemowych wywołań, zaangażowanie sanitizera LLVM do weryfikacji jądra, wykorzystanie netdump do zapisywania zrzutów jądra podczas awarii w testach fuzzingowych itd.
- Rozpoczęto pracę nad aktualizacją implementacji zlib na poziomie jądra. Aby umożliwić jądru dostęp do kodu zlib, katalog contrib/zlib został przemianowany na sys/contrib/zlib, a także przemianowano plik nagłówkowy crc.h, aby uniknąć konfliktu z zlib/crc.h. Przeprowadzono czyszczenie przestarzałego kodu, zależnego od zlib i inflate. Następnie planuje się zapewnienie możliwości kompilacji jądra zarówno ze starym, jak i nowym zlib w celu stopniowego przejścia na nową wersję funkcji wykorzystujących kompresję;
- Zaktualizowano infrastrukturę emulacji środowiska Linux (Linuxulator). Rozszerzono wsparcie dla narzędzi debugujących Linux, takich jak narzędzie strace. Do portów dodano pakiet linux-c7-strace, który można używać do śledzenia wykonywalnych plików Linux zamiast standardowych narzędzi truss i ktrace, które na razie nie potrafią dekodować niektórych specyficznych dla Linux flag i struktur. Ponadto dodano pakiet linux-ltp z plikami wykonywalnymi Linux Test Project i rozwiązano problemy z kompatybilnością z plikami wykonywalnymi skompilowanymi z nowymi wersjami glibc;
- Implementacja operacji opóźnionego czyszczenia powiązań do fizycznych stron pamięci (delayed invalidation) w mechanizmie pmap została przetworzona na wykorzystanie algorytmu przetwarzania kolejki działającego bez blokad, co pozwoliło na rozwiązanie problemów ze skalowalnością podczas wykonywania dużej liczby równoległych operacji unmap;
- Zmodyfikowano mechanizm blokowania vnode podczas wykonywania wywołań systemowych z rodziny execve(), co pozwoliło zwiększyć efektywność działania podczas jednoczesnego wykonywania execve() dla tego samego pliku (na przykład przy realizacji operacji kompilacji z równoległym uruchamianiem kompilatora);
- Bezpieczeństwo
- W hipervizorze bhyve kontynuowane są usprawnienia wsparcia dla migracji Live gości z jednego hosta na inny oraz funkcjonalności Save/Restore, umożliwiającej zamrożenie systemu gościa z zachowaniem stanu w pliku, a następnie wznowienie wykonywania.
- Dzięki wykorzystaniu biblioteki libvdsk w bhyve dodano wsparcie dla obrazów dysków w formacie QCOW2. Wymagana jest instalacja
wersji bhyve, która została przetłumaczona na użycie obiektów operacji plikowych opartych na libvdsk. W okresie sprawozdawczym w libvdsk przeprowadzono również prace nad uproszczeniem integracji wsparcia dla nowych formatów, poprawiono wydajność odczytu i zapisu, dodano wsparcie dla Copy-On-Write. Z pozostałych zadań zauważono integrację libvdsk z głównym rdzeniem bhyve; - Do portów dodano system zbierania informacji o ruchu
, który pozwala tworzyć pułapki na złośliwe zapytania sieciowe (sprawdzane są IP i domeny z czarnych list) oraz wysyłać dane o wykrytej aktywności na scentralizowany serwer w celu późniejszego zablokowania lub analizy prób ataków; - Do portów dodano platformę do wykrywania ataków, analizy logów i śledzenia integralności plików (fork Ossec z wsparciem dla integracji z );
- Subsystem sieciowy
- Zaktualizowano sterownik ena z wsparciem dla drugiej generacji adapterów sieciowych ENAv2 (Elastic Network Adapter), używanych w infrastrukturze Elastic Compute Cloud (EC2) do organizacji komunikacji między węzłami EC2 z prędkościami do 25 Gb/s. W sterowniku ena dodano wsparcie NETMAP.
- Nowy stos MMC/SD oparty na frameworku CAM został przyjęty w FreeBSD HEAD, co umożliwia podłączanie urządzeń z interfejsem SDIO (Secure Digital I/O). Na przykład, SDIO jest wykorzystywane w modułach WiFi i Bluetooth dla wielu płyt, takich jak Raspberry Pi 3. Nowy stos również umożliwia używanie interfejsu CAM do przesyłania poleceń SD z aplikacji w przestrzeni użytkownika, co daje możliwość tworzenia sterowników urządzeń działających na poziomie użytkownika. Rozpoczęto prace nad stworzeniem sterowników dla bezprzewodowych chipów Broadcom działających w trybie FullMAC (na chipie działa podobieństwo własnego systemu operacyjnego z realizacją własnego bezprzewodowego stosu 802.11);
- Trwają prace nad wdrożeniem NFSv4.2 (RFC-7862) dla FreeBSD. Nowa wersja NFS dodała wsparcie dla funkcji posix_fadvise, posix_fallocate, trybów SEEKHOLE/SEEKDATA w lseek, operację lokalnego kopiowania fragmentów pliku na serwerze (bez przesyłania do klienta).
Obecnie dla FreeBSD zaimplementowano podstawowe wsparcie dla operacji LayoutError, IOAdvise, Allocate i Copy. Pozostaje do wdrożenia operacja Seek, niezbędna do używania lseek(SEEKHOLE/SEEKDATA) z NFS. Wsparcie dla NFSv4.2 planowane jest do włączenia w FreeBSD 13;
- Systemy przechowywania i systemy plików
- Projekt modernizacji sterownika subsystemu FUSE (File System in USErspace) zbliża się do zakończenia, pozwalającego na tworzenie implementacji systemów plików w przestrzeni użytkownika. Pochodnie sterownik był przestarzały i zawierał wiele błędów. W ramach projektu modernizacji sterownika wdrożono wsparcie dla protokołu FUSE 7.23 (wcześniej wspierana była wersja 7.8, wydana 11 lat temu), dodano kod do weryfikacji praw dostępu po stronie jądra („-o default_permissions”), dodano wywołania VOP_MKNOD, VOP_BMAP i VOP_ADVLOCK, zapewniono możliwość przerywania operacji FUSE, dodano wsparcie dla nie nazwanych kanałów i unix-socketów w fusefs, a także wprowadzono możliwość użycia kqueue dla /dev/fuse, zezwolono na aktualizację parametrów montowania przez „mount -u”, dodano wsparcie dla eksportu fusefs przez NFS, wprowadzono przyjęcie RLIMIT_FSIZE, dodano flagi FOPEN_KEEP_CACHE i FUSE_ASYNC_READ, wprowadzono znaczące optymalizacje wydajności i poprawiono organizację pamięci podręcznej;
- Do kodu stronicowania pamięci w obszarze swap dodano obsługę operacji BIO_DELETE, co pozwala na korzystanie z komendy TRIM podczas usuwania bloków z dysków SSD, aby wydłużyć ich żywotność.
- Wsparcie sprzętowe
- Kontynuowane są prace nad implementacją wsparcia dla SoC ARM64 Broadcom BCM5871X z procesorami ARMv8 Cortex-A57, które są przeznaczone do użycia w routerach, bramach i sieciowych magazynach danych. W omawianym okresie poprawiono wsparcie wewnętrznych i zewnętrznych szyn iProc PCIe, dodano wsparcie dla Ethernet BNXT, a także trwają prace nad wykorzystaniem wbudowanego silnika kryptograficznego w celu przyspieszenia IPsec. Integracja kodu z gałęzią HEAD planowana jest na drugą połowę roku.
- Rozpoczęto prace nad wsparciem 64-bitowego SoC NXP LS1046A opartego na procesorze ARMv8 Cortex-A72 z zintegrowanym silnikiem przyspieszającym przetwarzanie pakietów sieciowych, 10 Gb Ethernet, PCIe 3.0, SATA 3.0 oraz USB 3.0. Już zrealizowano wsparcie dla podstawowej platformy (multi-user SMP) oraz SATA 3.0. W przygotowaniu jest wsparcie USB 3.0, SD/MMC oraz I2C. Planuje się wsparcie dla Ethernet, GPIO oraz QSPI. Zakończenie prac i włączenie do gałęzi HEAD planowane jest w czwartym kwartale 2019 roku.
- Zaktualizowane sterowniki mlx5en i mlx5ib dla adapterów Ethernet i InfiniBand Mellanox ConnectX-4 [Lx], ConnectX-5 [Ex] oraz ConnectX-6 [Dx]. Dodano wsparcie dla adapterów Mellanox Socket Direct (ConnectX-6), które umożliwiają osiągnięcie przepustowości do 200 Gb/s na szynie PCIe Gen 3.0. Dla wielordzeniowych chipów 'BlueField' dodano wsparcie dla sterownika RShim. Do portów dodano pakiet mstflint z zestawem narzędzi diagnostycznych dla adapterów Mellanox.
- Aplikacje i system portów
- Zaktualizowane komponenty stosu graficznego. Wykonano portowanie sterownika drm.ko (Direct Rendering Manager) z jądra Linux 5.0. Sterownik ten traktowany jest jako eksperymentalny i dodany do drzewa portów jako graphics/drm-devel-kmod. Ponieważ sterownik wykorzystuje zaktualizowany framework Linux KPI dla zgodności z API DRM jądra Linux, wymaga FreeBSD CURRENT do działania. Z Linuksa portowany jest również sterownik drm vboxvideo.ko dla wirtualnego GPU VirtualBox. Pakiet Mesa został zaktualizowany do wersji 18.3.2 i przeszkolony do użycia LLVM z portu devel/llvm80 zamiast devel/llvm60.
- Drzewo portów FreeBSD przekroczyło granicę 37000 portów, a liczba otwartych PR wynosi 2146. W okresie sprawozdawczym wprowadzono 7837 zmian od 172 deweloperów. Trzech nowych uczestników otrzymało prawa commitera. Wśród znaczących aktualizacji wersji portów znajdują się: MySQL 5.7, Python 3.6, Ruby 2.5, Samba 4.8, Julia 1.0, Firefox 68.0, Chromium 75.0.3770.100. Wszystkie porty w języku Go przełączono na użycie flagi „USES=go”. Dodano flagę „USES=cabal” dla menedżera pakietów Cabal, używanego do kodu w Haskellu. Włączono rygorystyczny tryb ochrony stosu. Domyślnie propozycja wersji Python 3.6 zamiast 2.7.
- Przygotowano wydanie narzędzia , oferującego odpowiednik /sbin/sysctl, korzystający z do wyjścia i zapewniający rozszerzony zestaw opcji. Nsysctl może być używany do wizualnego monitorowania stanu wartości sysctl oraz przedstawiania informacji o obiektach w ustrukturyzowanej formie. Możliwe jest wyjście w formatach XML, JSON i HTML;
Źródło: opennet.ru
