Kilka godzin temu, tj. 9 czerwca o godzinie 20:36 letniego czasu pacyficznego, Linus Torvalds na liście mailingowej linux-kernel obwieścił wydanie jądra w wersji 2.6.30. Zwyczajowo pojawiło się w nim sporo nowości i usprawnień, z którymi choćby pokrótce warto się zapoznać.
Dwóch autorów napisało niusa o wydaniu jądra Linux: Sparrow1 oraz przemoc, jednakże ta wersja jest obszerniejsza, dlatego by nie siać zamętu, druga informacja została usunięta. szmergiell
Po testowaniu i poprawkach naniesionych w linii 2.6.29 efekt projektu Fastboot polegający na wprowadzeniu asynchronicznych rozwiązań w procesie rozruchu, pozwalających np. na równoległe skanowanie urządzeń magazynujących, został domyślnie włączony. Można o nim przeczytać w artykule na LWN: An asynchronous function call infrastructure. Czas rozruchu powinien być teraz zauważalnie krótszy.
Tak jak i w poprzednim wydaniu pojawiły się nowe systemy plików:
- NILFS2 to system plików o budowie logu (ang. log-structured file system), w którym dysk jest traktowany jako ciąg następujących po sobie bloków (zwany logiem), a wszystkie operacje umieszczają dane na jego końcu. Tym samym nie ma nadpisywania danych, chyba że skończy się miejsce, wówczas zacznie się nowy cykl i zapis rozpocznie się od początku dysku. Takie podejście powoduje, że tworzenie nowych plików czy ich modyfikacja mogą być zamienione na sekwencyjne operacje, które są szybsze. Co więcej pady nie mogą zniszczyć systemu plików. Przy montowaniu wykrywany jest prawdziwy koniec logu i dalsza praca jest kontynuowana od tego miejsca. Miłą konsekwencją takiego rozwiązania jest to, iż log oferuje wgląd w historię wszelkich działań wykonywanych na dysku w przeszłości (z dokładnością do jego wielkości), co jest nazywane ciągłym snapshotowaniem (ang. continuous snapshotting), a sam NILFS2 pozwala na dostęp do tych snapshotów, umożliwiając także ich montowanie. Warto zapoznać się z dokumentacją i stroną projektu: http://www.nilfs.org/.
- EXOFS to tradycyjny uniksowy system plików działający na szczycie urządzeń OSD (ang. Object-based Storage Devices). OSD to realizacja koncepcji zrywającej z tradycyjnym interfejsem dostępu do urządzeń magazynujących na poziomie bloków na rzecz interfejsu na wyższym poziomie – tablicy obiektów, na których to operuje system operacyjny nie będąc świadomym jak w istocie odbywa się składowanie danych. W tej wersji jądra protokół OSD działa w oparciu o stos SCSI. Dokumentacja exofs, OSD i artykuł na LWN: Linux and object storage devices pozwolą lepiej zrozumieć to zagadnienie.
- FS-Cache to warstwa buforująca dla sieciowych systemów plików podobna do CacheFS obecnego na innych Uniksach. Dzięki niemu dane z sieciowych systemów plików mogą być trzymane na dysku, przyspieszając wiele operacji. Aktualnie wykorzystać ją potrafią jedynie NFS i AFS, ale warstwa ta jest ogólna, więc może być używana przez inne sieciowe systemy plików. Szczegółów dostarcza dokumentacja.
Tematu systemu plików nie wypełniają same nowości, ale także modyfikacje w istniejących rozwiązaniach (polecam podsumowanie pewnego wątku z listy mailingowej, który pojawił się po wydaniu wersji 2.6.29, dostępne na LWN: That massive filesystem thread):
- zmiana nazwy pliku lub jego przycięcie skutkuje niewidocznym wewnętrznym wykonaniem bezpośrednio po tych działaniach operacji
fsync()
w ext3, ext4 i btrfs, - domyślny sposób księgowania przy obsłudze ext3 zmieniono z
ordered
, w którym dane zapisywane są w systemie plików zawsze przed metadanymi w dzienniku, na wydajniejszywriteback
, w którym kolejność zapisów nie jest wymuszana, - nowy domyślny sposób aktualizacji czasu ostatniego dostępu do plików (tzw.
atime
) nazwanyrelatime
dokonujący owej aktualizacji tylko jeżeli obecny czas ostatniego dostępu jest wcześniejszy aniżeli utworzenia (tzw.ctime
) lub modyfikacji (tzw.mtime
), a także nie rzadziej niż raz na dzień.
W kwestiach sieciowych mamy następujące usprawnienia:
- Obsługa protokołu Reliable Datagram Sockets (RDS) o wysokiej przepustowości i małej zwłoce będącego niezawodnym protokołem komunikacji międzyprocesowej i systemem transportowym dla serwerów w klastrze. Używając go można na jednym gnieździe (ang. socket) prowadzić rozmowę z pozostałymi procesami w klastrze zamiast stosowania wielu gniazd jak ma to miejsce w przypadku gniazd zorientowanych na połączenia (ang. connection-oriented sockets) wykorzystywanych np. przez protokół TCP. Szczegóły są dostępne w dokumentacji.
- Wstępna implementacja jeszcze niezatwierdzonej poprawki (a więc w oparciu o aktualne drafty) do standardu IEEE 802.11, ochrzczonej mianem 802.11w, zwiększającej bezpieczeństwo ramek zarządzających.
- Wstępna obsługa NFS 4.1 w postaci mechanizmu sesji, który był niezbędny do zaimplementowania. Pozostałe funkcje są obecnie rozwijane poza drzewem. Skorzystanie z nowego protokołu wymaga aktualnej wersji
nfs-utils
.
Kernel doczekał się wsparcia kompresji algorytmami innymi niż GZIP, mianowicie BZIP2 i LZMA, które w porównaniu z GZIP zmniejszają jego rozmiar odpowiednio o około 10% w przypadku pierwszego i 33% w przypadku ostatniego. Choć oba są wolniejsze od GZIP (w obie strony), dekompresja LZMA trwa krócej niż BZIP2 , stąd można się spodziewać jej upowszechnienia z biegiem czasu w tym rejonie (w sferze typowo użytkowej dzięki 7-zip czy PeaZip radzi sobie doskonale).
Wywołania systemowe (ang. system calls) preadv()
i pwritev()
obecne już od jakiegoś czasu w systemach z rodziny BSD zagościły wreszcie także w Linuksie. Jak nazwa słusznie sugeruje to połączenie funkcjonalności odpowiednio syscalli pread()
z readv()
i pwrite()
z writev()
. Teraz możliwy będzie odczyt i zapis z zadanego offsetu w pliku (bez zmiany tego offsetu) bezpośrednio do wskazanych buforów. Bardziej zainteresowanych odsyłam do commitów: dac121, 6949a6 i f3554f.
Garść informacji dla programistów na poziomie jądra, czyli nowości, o których wypada wspomnieć:
- obsługa przerwań w wątkach (ang. threaded interrupt handlers), przez co w sterownikach możliwe jest ustawianie procedury obsługi przerwania działającej we własnym wątku i oczekuje się, że sterowniki będą z tego korzystać, ostatecznie pozwalając na usunięcie udogodnień takich jak przestarzałe i wysłużone tasklety – obecny od linii 2.3 mechanizm odroczonego wykonywania funkcji w przerwaniach programowych (więcej na LWN: Moving interrupts to threads; commit 3aa551),
- mutex z adaptacyjnym aktywnym oczekiwaniem (ang. adaptive spinning mutex) zaczerpnięty z drzewa -rt, zmieniający sposób rywalizacji o wzajemne wykluczanie na zbliżony zachowaniem do spinlocków o ile blokada założona jest na rdzeniu innym od tego wykonującego kod oczekujący na jej zdjęcie; zakłada się, że zdjęcie nastąpi w najbliższym czasie (szczegóły w commicie 0d66bf),
- pula wątków dla długo wykonujących się zadań (ang. slow work item execution thread pool), która w przeciwieństwie do workqueues nie posiada sztywnego modelu jednego wątku per rdzeń dla każdego właściciela takiej kolejki zadań, a dynamiczny, regulujący liczbę wątków w zależności od obciążenia (dokumentacja i opis na LWN: The slow work mechanism; commity 07fe7c, 109d92, 12e22c i 8f0aa2f),
- … i wiele innych niewymienionych tutaj – dokładniejsze informacje znajdziecie na LWN: API changes in the 2.6 kernel series.
Pozwolę sobie także przytoczyć za LWN (2.6.30 merge window, part I; 2.6.30 merge window, part II) jakie nowe sterowniki urządzeń dołączono do tego jądra:
- blokowe: host adaptery PCI-Express SAS 6Gb/s, Marvell MMC/SD/SDIO,
- graficzne: AMD R6xx/R7xx GPUs (tylko 2D na razie), framebuffer dla Samsung S3C,
- sieciowe: modemy USB Qualcomm Serial, karty Marvell Libertas 8686 SPI 802.11b/g, karty bezprzewodowe PCI/PCIe Marvell 88w8xxx TOPDOG, adaptery bezprzewodowe Prism54 SPI (stlc45xx), adaptery bezprzewodowe USB Atmel at76c503/at76c505/at76c505a, urządzenia OpenCores 10/100 Mbps Ethernet MAC, urządzenia USB Atheros “otus” 802.11n i adaptery serwerowe PCIe Neterion X3100 Series 10GbE,
- dźwiękowe: telefony Mitac MIO A701, kodeki Wolfson Micro WM8400 oraz WM9705, moduły Wolfson Microelectronics 1133-EV1, urządzenia DAC Atmel Audio Bitstream, kontrolery Atmel AC97, transmitery S/PDIF Asaki-Kasei AK4104, karty Echo Audio IndigoIOx i IndigoDJx, karty Turtle Beach Classic, Fiji i Pinnacle, karty dźwiękowe Asus Xonar Essence STX oraz urządzenia audio HTC Magician,
- Video/DVB: kamery USB Mars-Semi MR97310A, szerokopasmowe tunery CMOS Freescale MC44S803, kamery USB oparte na SQ Technologies SQ905 i SQ905C, interfejsy sensorów kamer i.MX3x/i.MX1/i.MXL, demodulatory satelitarne ST STV0900, krzemowe tunery ST STV6110, krzemowe tunery Zarlink ZL10036, tunery oparte na LG Electronics LGDT3305, urządzenia USB Hauppauge HD PVR, odbiorniki DVB-T USB2.0 Intel CE6230, urządzenia USB przechwytywania obrazu Conexant cx231xx i demodulatory Legend Silicon LGS8913/LGS8GL5/LGS8GXX DMB-TH,
- procesorowe i systemowe: płyty referencyjne oparte na SuperH SH7786, ESPT-Giga SH7763, platformy referencyjne SMSC z procesorami SH7709S, systemy Palm LifeDrive i Tungsten|T5, płyty główne Brivo Systems LLC ACS-5000, platformy Dave/DENX QongEVB-LITE, płyty deweloperskie Marvell RD-78×00-mASA, procesory Marvell PXA168 i PXA910, procesory TI OMAP850, płyty OMAP 3430 SDP, tablety internetowe Nokia RX-51, systemy Teltonika 3G Router RUT100, rdzenie Faraday FA526, rozwiązania SoC z rodziny Cortina Systems Gemini, płyty PowerPC GE Fanuc SBC310 i PPC9A, płyty Freescale Media5200, systemy AMCC Redwood(460SX), płyty Phytec phyCORE-MPC5200B-IO (pcm032), płyty Freescale MPC8544 (“Socrates”), procesory Tensilica S6000, referencyjne zestawy tworzenia kamer IP S6105 i płyty oparte na Merisc AVR32,
- różne: akceleratory kryptograficzne AMCC PPC4xx, urządzenia PCI Adrienne Electronics Corporation do kodów czasowych, skanery kodów kreskowych Symbol 6608, kontrolery E-Ink Broadsheet/Epson S1D13521, kontrolery i2c NXP Semiconductor PCA9665, układy sensoryczne Siemens Syleus i Hades, układy sensoryczne National Semiconductor LM9524, interfejsy I2C monitorowania kontrolerów Hot Swap Linear Technology LTC4215, kontrolery pamięci IBM DDR2 PPC4xx, huby I/O AMD8111 HyperTransport, układy AMD8131 HyperTransport PCI-X Tunnel, regulatory napięcia PMIC TI TWL4030/TWL5030/TPS695x0, kontrolery do gier DragonRise, urzadzenia DAC National Semiconductor DAC124S085 SPI, kontrolery LED Rohm BD2802 RGB, kontrolery flashowych pamięci NAND TXx9 SoC i interfejsy sprzętowego monitorowania ACPI ASUS ATK0110.
Na powyższej liście (jak i we wcześniej podanych nowościach) nie znalazły się nawet-jeszcze-nieeksperymentalne sterowniki, tzw. staging drivers, które są trzymane z jądrem w celach czysto deweloperskich, tzn. aby ułatwić zarządzanie kodem (poprzez trzymanie go w jednym miejscu) i procesem późniejszego właściwego włączania ich do jądra.
Zmian w jądrze jest naturalnie dużo więcej niż udało mi się przedstawić, dlatego na koniec dla wytrwałych lista zmian z megabajtami tekstu. Szybkiej lektury życzę. Jeszcze cieplutkie archiwum ze źródłami nowego jądra jest standardowo dostępne pod adresem: http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.bz2
PS Oczywiście Tux ponownie został maskotką jądra wygryzając z tej pozycji diabła tasmańskiego. Widać nie będzie Tuz Racera. 🙁
Dodaj komentarz