Raport o rozwoju projektu FreeBSD od stycznia do marca 2020 roku. Z wprowadzonych zmian można wyróżnić:
- Ogólne i systemowe pytania
- Z drzewka źródłowego FreeBSD-CURRENT usunięto zestaw kompilatorów GCC oraz nieużywane narzędzia gperf, gcov i gtc (kompilator devicetree). Wszystkie platformy, które nie wspierają Clang, zostały przekonwertowane na zewnętrzny zestaw narzędzi budowlanych, instalowanych z portów. W systemie bazowym dostarczana była przestarzała wersja GCC 4.2.1, a integracja nowszych wersji była niemożliwa z powodu przejścia na licencję GPLv3 w wersji 4.2.2, co zostało uznane za niedopuszczalne dla podstawowych komponentów FreeBSD. Aktualne wydania GCC, w tym GCC 9, jak wcześniej, można zainstalować z pakietów i portów.
- W infrastrukturze emulatora środowiska Linux (Linuxulator) dodano wsparcie dla wywołania systemowego sendfile, trybu TCP_CORK (wymaganego dla nginx), flagi MAP_32BIT (rozwiązującej problem z uruchamianiem pakietów z Mono z Ubuntu Bionic). Rozwiązano problemy z rozwiązywaniem DNS przy użyciu glibc nowszej niż 2.30 (np. z CentOS 8).
W infrastrukturze ciągłej integracji zapewniono uruchamianie zadań dla LTP (Linux Testing Project) działających pod Linuxulatorem w celu testowania poprawności wprowadzanych zmian w kodzie wspierających Linux. Około 400 testów kończy się błędem i wymaga poprawek (niektóre błędy są spowodowane fałszywymi alarmami, inne wymagają trywialnych poprawek, ale są też takie, które wymagają dodania wsparcia dla nowych wywołań systemowych). Przeprowadzono prace nad czyszczeniem kodu Linuxulatora i uproszczeniem procesu debugowania. Przygotowano, ale jeszcze nie poddano recenzji, poprawki z wsparciem dla rozszerzonych atrybutów i wywołania systemowego fexecve. - Trwają posiedzenia grupy roboczej stworzonej w celu migracji kodu źródłowego z centralizowanego systemu zarządzania kodem Subversion do zdecentralizowanego systemu Git. Raport z propozycjami migracji jest w trakcie przygotowywania.
- W (linker czasu działania) poprawiono tryb bezpośredniego wykonania ("/libexec/ld-elf.so.1 {ścieżka} {argumenty}").
- Projekt fuzzingu jądra FreeBSD z wykorzystaniem systemu syzkaller wciąż się rozwija. W okresie sprawozdawczym rozwiązano problemy w stosie sieciowym oraz w kodzie odpowiadającym za obsługę tabeli deskryptorów plików, ujawnione za pomocą syzkaller. Na podstawie diagnozowanych błędów w stosie SCTP wprowadzone zmiany uprościły debugowanie. Do zestawu stress2 dodano reguły do identyfikacji potencjalnych regresji. Dodano wsparcie dla fuzzingu nowych wywołań systemowych, w tym copy_file_range(), __realpathat() oraz wywołań podsystemu Capsicum. Prace nad objęciem warstwy emulacji Linux fuzzingiem trwają. Dokonano analizy i usunięcia błędów wskazanych w najnowszych raportach Coverity Scan.
- W systemie ciągłej integracji nastąpiła zmiana w wykonywaniu wszystkich testów z gałęzi head wyłącznie przy użyciu clang/lld. Podczas testowania dla RISC-V zapewniono utworzenie pełnego obrazu dysku do uruchomienia testów w QEMU przy użyciu OpenSBI. Dodano nowe zadania do testowania obrazów oraz maszyn wirtualnych powerpc64 (FreeBSD-head-powerpc64-images, FreeBSD-head-powerpc64-testvm).
- Trwa praca nad przeniesieniem zestawu testowego Kyua z portów (devel/kyua) do systemu podstawowego, aby rozwiązać problemy (pakiety instalują się bardzo wolno), które występują przy użyciu Kyua na nowych architekturach, dla których rozwój prowadzony jest z wykorzystaniem emulatora lub FPGA. Integracja z systemem podstawowym znacznie uprości testowanie platform wbudowanych oraz integrację z systemami ciągłej integracji.
- Rozpoczęto projekt optymalizacji wydajności sterownika mostów sieciowych , który używa jednego mutexu do blokowania danych wewnętrznych, co uniemożliwia osiągnięcie pożądanej wydajności w systemach z dużą liczbą środowisk jail lub maszyn wirtualnych połączonych w jedną sieć. Na tym etapie do kodu dodano testy, aby zapobiec powstawaniu regresji podczas modernizacji obsługi blokad. Rozważa się możliwość wykorzystania ConcurrencyKit do równoległego przetwarzania obsługujących transmisję danych (bridge_input(), bridge_output(), bridge_forward(), …).
- Dodano nowe wywołanie systemowe sigfastblock, pozwalające wątkowi określić blok pamięci dla szybkiego obsługiwacza sygnałów w celu zwiększenia wydajności obsługi wyjątków.
- W jądrze dodano wsparcie dla instrukcji atomic LSE (Large System Extension), wspieranych przez systemy ARMv8.1. Te instrukcje są niezbędne do poprawy wydajności przy pracy na płytach Cavium ThunderX2 i AWS Graviton 2. Wprowadzone zmiany definiują obecność wsparcia LSE i dynamicznie włączają realizację atomic na ich podstawie. W testach wykorzystanie LSE pozwoliło na 15% redukcję czasu procesora zużywanego podczas kompilacji jądra.
- Przeprowadzono optymalizację wydajności oraz rozszerzono funkcjonalność narzędzi dla plików wykonywalnych w formacie ELF.
Dodano wsparcie dla cachowania informacji debugowania DWARF, rozwiązano problemy w narzędziach elfcopy/objcopy, dodano obsługę DW_AT_ranges,
w readelf zrealizowano możliwość dekodowania flag PROTMAX_DISABLE, STKGAP_DISABLE oraz WXNEEDED, jak również Xen i GNU Build-ID.
- Bezpieczeństwo
- Aby poprawić działanie FreeBSD w chmurowych środowiskach Azure, prowadzone są prace nad zapewnieniem wsparcia dla mechanizmu HyperV Socket, który umożliwia korzystanie z interfejsu socket do komunikacji systemu gościa z otoczeniem gospodarza bez potrzeby konfigurowania sieci.
- Prowadzone są prace nad zapewnieniem powtarzalnych kompilacji FreeBSD, które pozwalają upewnić się, że pliki wykonywalne komponentów systemu są zbudowane dokładnie z podanych źródeł i nie zawierają nieautoryzowanych zmian.
- Do narzędzia elfctl dodano możliwość zarządzania aktywacją dodatkowych mechanizmów ochrony (ASLR, PROT_MAX, stack gap, mapowanie W+X) na poziomie pojedynczych procesów.
- Systemy przechowywania i systemy plików
- Prowadzone są prace nad realizacją możliwości działania NFS nad zaszyfrowanym kanałem komunikacyjnym opartym na TLS 1.3, zamiast korzystania z Kerberos (tryb sec=krb5p), który ogranicza się do szyfrowania tylko wiadomości RPC i realizowany jest jedynie programowo. Nowa realizacja wykorzystuje stos TLS dostarczany przez jądro, umożliwiający wykorzystanie sprzętowego przyspieszenia. Kod NFS nad TLS jest już prawie gotowy do testów, ale nadal wymaga prac nad obsługą podpisanych certyfikatów klientów oraz dostosowaniem stosu TLS w jądrze do wysyłania danych NFS (łatki do odbioru są już gotowe).
- Wsparcie sprzętowe
- Prowadzone są prace nad dodaniem wsparcia dla chińskich CPU x86 Hygon opartych na technologiach AMD;
- W ramach CheriBSD, gałęzi FreeBSD dla badawczej architektury procesora (Capability Hardware Enhanced RISC Instructions) kontynuowana jest realizacja wsparcia dla procesora ARM Morello, który będzie obsługiwał system zarządzania dostępem do pamięci CHERI, oparty na modelu ochrony projektu Capsicum. Chip Morello został zaprezentowany w 2021 roku. Aktualnie prace koncentrują się na dodaniu wsparcia dla platformy Arm Neoverse N1, leżącej u podstaw Morello. Prezentacja początkowego portu CheriBSD dla architektury RISC-V. Trwają prace nad rozwojem CheriBSD dla prototypu odniesienia CHERI opartego na architekturze MIPS64.
- Kontynuowane jest portowanie FreeBSD dla 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. Aktualnie przygotowuje się sterowniki QorIQ i LS1046A, GPIO, QorIQ LS10xx AHCI, VF610 I2C, Epson RX-8803 RTC, QorIQ LS10xx SDHCI do włączenia do głównej wersji FreeBSD.
- Do wersji 2.1.1 zaktualizowano sterownik ena z wsparciem dla drugiej generacji adapterów sieciowych ENAv2 (Elastic Network Adapter), używanych w infrastrukturze Elastic Compute Cloud (EC2) do komunikacji między węzłami EC2 przy prędkościach do 25 Gb/s. Przygotowywana jest aktualizacja do ENA 2.2.0.
- Kontynuowane są prace nad ulepszeniem portu FreeBSD dla platformy powerpc64. Główna uwaga skupiona jest na zapewnieniu wysokiej jakości pracy na systemach z procesorami IBM POWER8 i POWER9. W raporcie okresowym dokonano przejścia FreeBSD-CURRENT na użycie kompilatora LLVM/Clang 10.0 oraz łączenia lld zamiast GCC. Domyślnie dla systemów powerpc64 włączono ELFv2 ABI, a wsparcie dla ELFv1 ABI zostało zakończone. W FreeBSD-STABLE nadal pozostaje gcc 4.2.1. Rozwiązano problemy z driverami virtio, aacraid oraz ixl. Na systemach powerpc64 zapewniono możliwość uruchomienia QEMU bez wsparcia dla Huge Pages.
- Kontynuowana jest praca nad wsparciem architektury RISC-V. W obecnej wersji FreeBSD udanie uruchamia się na płytce SiFive Hifive Unleashed, dla której przygotowano sterowniki
UART, SPI i PRCI, wsparcie dla oprogramowania OpenSBI i SBI 0.2. W okresie sprawozdawczym prace koncentrowały się na migracji z GCC na clang i lld.
- Aplikacje i system portów
- Kolekcja portów FreeBSD przekroczyła granicę 39 tysięcy portów, a liczba niezamkniętych PR nieco przekracza 2400, z czego 640 PR nie zostało jeszcze rozpatrzonych. W raportowanym okresie wprowadzono 8146 zmian od 173 programistów. Czterech nowych uczestników (Loïc Bartoletti, Mikael Urankar, Kyle Evans, Lorenzo Salvadore) otrzymało prawa commitera. Dodano flagę USES=qca i usunięto flagę USES=zope (z powodu niekompatybilności z Pythonem 3). Trwają prace nad usunięciem Pythona 2.7 z drzewa portów – wszystkie porty uzależnione od Pythona 2 muszą zostać przeniesione na Pythona 3 lub zostaną usunięte. Menedżer pakietów pkg zaktualizowano do wersji 1.13.2.
- Zaktualizowane komponenty stosu graficznego oraz porty związane z xorg.
Serwer X.org zaktualizowano do wersji 1.20.8 (wcześniej dostarczano gałąź 1.18), co pozwoliło na domyślne przejście FreeBSD na użycie backendu udev/evdev do obsługi urządzeń wejściowych. Pakiet Mesa został domyślnie przełączony na użycie rozszerzenia DRI3 zamiast DRI2. Trwają prace nad aktualizacją sterowników graficznych, stosu urządzeń wejściowych oraz komponentów drm-kmod (port zapewniający działanie modułów DRM amdgpu, i915 i radeon, wykorzystujący framework linuxkpi w celu zapewnienia zgodności z Direct Rendering Manager jądra Linux). - Pulpit KDE Plasma, KDE Frameworks, KDE Applications oraz Qt są utrzymywane w aktualnym stanie i zaktualizowane do najnowszych wydań. Do portów dodano nową aplikację kstars (atlas gwiazd).
- Prace nad usuwaniem regresyjnych zmian w menedżerze okien xfwm4, które pojawiły się po aktualizacji Xfce do wersji 4.14, zostały zrealizowane (na przykład pojawiały się artefakty podczas dekorowania okien).
- Port z Wine zaktualizowano do wydania Wine 5.0 (wcześniej oferowano 4.0.3).
- Od wersji 1.14 w kompilatorze języka Go dodano oficjalne wsparcie dla architektury ARM64 dla FreeBSD 12.0.
- OpenSSH w systemie bazowym zaktualizowano do wydania 7.9p1.
- Wdrożono i umieszczono w portach (devel/libsysctlmibinfo2) bibliotekę sysctlmibinfo2, która zapewnia API do dostępu do sysctl MIB oraz wykonuje translację nazw sysctl na identyfikatory obiektów (OID).
- Przygotowano aktualizację dystrybucji , reprezentującej edycję FreeBSD, dostosowaną do użycia jako przenośne biurko, ładowane z pendrive'a. Środowisko graficzne opiera się na menedżerze okien . Do montowania nośników stosuje się (obsługiwane montowanie CD9660, FAT, HFS+, NTFS, Ext2/3/4), do konfiguracji sieci bezprzewodowej — , a do zarządzania głośnością — .
- Rozpoczęto nad przygotowaniem pełnej dokumentacji dla menedżera środowisk jail . Przygotowywany jest do wydania pot 0.11.0, w którym pojawią się narzędzia do zarządzania stosem sieciowym.
Źródło: opennet.ru
