Technik przyspieszania startu Ubuntu jest wiele, ale zaprezentuje tą najbardziej skuteczną. Wykorzystamy do tego mechanizm, który normalnie jest zaimplementowany w tej dystrybucji. Ten mechanizm to Readahead.
Bierze on udział podczas startu systemu. Kiedy uruchamiacie kernel bez parametru quiet można zobaczyć komunikat Reading files needed to boot. W tym momencie zaczyna działanie readahead. Działa on na zasadzie wcześniejszego wczytania do RAMu wszystkich potrzebnych plików w trakcie startu systemu i przy użyciu tych plików przez system zostają użyte te w RAMie, a nie z dysku. A wiadomo, że RAM jest szybszy od dysku. Przez co skraca się czas dostępu do danych. Jeszcze na sam początek powiem, że to nie jest to trik dla początkujących.
Pierwsze zawsze co musi zrobić ten mechanizm to mieć listę plików, którą należy wczytać do pamięci. Można ją prosto utworzyć za pomocą polecenia readahead-watch. Jak łatwo się domyśleć ten sposób zużywa więcej pamięci podczas startu systemu. Więc jeśli macie mniej 1 GB to raczej bym nie ryzykował z zastosowaniem tego triku. Nie ma nic za darmo.
Sposób nadaje się do przyspieszania otwierania również aplikacji, nie tylko systemu. Ale w tym artykule zajmiemy się tylko przyspieszaniem systemu. Każdy po przeczytaniu będzie mógł sam przyspieszyć sobie swoje ulubione programy. Powodem dla którego stosowałem tą technikę był strasznie długi czas ładowania systemu od momentu GDM do pełnego pulpitu. Czyli momentu w którym już mogę bez żadnych opóźnień działać na komputerze. Po dodaniu kolejnych bajerów do systemu, które mają startować razem z nim (nowe usługi, programy uruchamiane na starcie), czas podnoszenia się zaczyna się wydłużać. Szczególnie w wymienionym przeze mnie momencie.
Moja maszyna to Intel Core Duo 1,6 GHz (dwa rdzenie), 2 GB RAMu, 5400 RPM dysk twardy. Powyłączałem wcześniej już usługi z których nie korzystam, a były włączone domyślnie (samba, nfs, cups), zaraz po zainstalowaniu. Tego procesu nie będę tu opisywał, bo to temat na oddzielny artykuł. Wraz z Gnome'm wstają mi następujące programy: Conky, Cairo-Dock, Desklets, Screenlets, Wallpaper-Tray. Całość wstaje w ponad minutę, dokładnie 1:28. Sam system do momentu GDM wstaje w 32 sekund. Później się strasznie dłuży. Przejdźmy najpierw do przyspieszenia tej pierwszej części startu, sprzed logowania.
Profilowanie - tak nazywa się proces ponownego sporządzenia listy plików potrzebnej do startu Ubuntu. Jako, że od momentu zainstalowania systemu, przechodzi on sporo aktualizacji czy dodawania nowych usług i lista plików staje się już nie aktualna. Po za tym Canonical przygotował taką listę tylko z plikami, które na pewno będą używane podczas uruchamiania. A przecież nic nie szkodzi dorzucić do listy nowe pliki. Zanim zaczniemy robić cokolwiek polecam zmierzenie czasu podnoszenia się na dwie części. Najpierw od momentu wybrania Ubuntu z listy GRUBa, do momentu gotowości komputera do zalogowania się. Druga część to od momentu potwierdzenia enterem hasła do momentu pojawienia się pełnego pulpitu. Do pierwszej czynności można użyć programu Bootchart chociaż ja wole bardziej tradycyjne metody, czyli normalny stoper. Bootchart nadaje się raczej do wyłączania usług.
Uruchamiamy ponownie komputer. Jak pokazuje się GRUB zaznaczamy Ubuntu jeśli do tej pory nie był zaznaczony domyślnie. Przechodzimy w tryb tymczasowej edycji menu GRUBa naciskając przycisk e. Zaznaczamy linijkę z kernelem (zaczyna się od słowa kernel). Edytujemy to linijkę, znów naciskamy e. Na samym końcu linijki dopisujemy słowo profile. Po wpisaniu naciskamy enter.
Botujemy z tą tymczasową opcją klawiszem b. System będzie podnosił się znacznie dłużej niż normalnie z tego powodu, że właśnie zapisuje nową listę plików. Może to potrwać nawet 5 minut, w zależności od konfiguracji. Można zaobserwować duże użycie dysku, po diodzie odczytu. Powinien nam się załadować ekran logowania. Nie logujemy się tylko uruchamiamy ponownie system. Teraz od momentu wybrania systemu z GRUB'a do ekranu logowania sprawdzamy ile nam system przyspieszył.
Kiedy robić ponowne reprofilowanie startu systemu? Po każdej aktualizacji jądra, po każdym dodaniu nowej usługi, która ma być uruchamiana podczas startu systemu. W takiej sytuacji pojawiają się nowe pliki, które będą używane podczas startu, warto je dodać listy plików. Po prostu powtarzamy tą samo co od początku zawartości tej podstrony.
To było proste. Teraz trochę trudniejsze zadanie. Wykorzystamy mechanizm readahead do wczytania naszych plików podczas logowania się do naszego konta.
Otwieramy sobie konsole i tworzymy katalog .readahead w katalogu domowym. Teraz uruchamiamy ponownie komputer, dochodzimy do ekranu logowania i nie logujemy się. Przechodzimy do terminala naciskając CTRL+ALT+F1. Logujemy się w nim i wpisujemy polecenie:
| sudo readahead-watch -o ~/.readahead/gnome.root / |
Polecenie to spisuje wszystkie pliki z głównego systemu plików / do pliku ~/.readahead/gnome.root. Polecenie zwróci zachętę dopiero po jakimś czasie, więc trzeba czekać cierpliwie. Można obserwować diodę twardego. Nie wylogujemy się tylko wracamy do środowiska graficznego - CTRL+ALT+F7. Teraz normalnie się logujemy w GDM. Może to trochę potrwać dłużej niż normalnie, ponieważ w tle logowania proces readahead-watch luka jakie pliki są używane do procesu logowania się i je spisuje do pliku. Gdy system się już całkiem zaloguje, pulpit się pokaże, wracamy z powrotem do terminala nr 1 (CTRL+ALT+1). Wstukujemy:
| sudo killall readahead-watch |
To zabije proces readahead-watch i skończy obserwowanie plików. Starczy danych zebranych. Jako że poprzednie polecenie było uruchomione z sudo więc plik gnome.root należy do root'a. Trzeba go przepisać na siebie:
| sudo chown -R <nazwa_użytkownika>:<grupa_użytkownika> ~/.readahead |
Oczywiście w miejsca <nazwa_użytkownika> i <grupa_użytkownika> wstawiamy odpowiednie swoje dane. Teraz trzeba wyczyścić listę plików, które zebraliśmy.
| cat ~/.readahead/gnome.root | xargs -i ls -lk {} | sort -rn -k +5 | less |
Sortowanie wyników też trochę trwa, więc zanim się coś pojawi w oknie terminala, trzeba będzie chwilkę poczekać. Jeśli nic sie nie pojawia naciśnijcie cokolwiek. W programie Less wyświetli się lista plików posortowana od największego do najmniejszego. Wielkości podane są w kilobajtach. Uruchamiamy ulubiony edytor tekstu i edytujemy plik ~/.readahead/gnome.root. W tym pliku są ścieżki dostępu do plików zaobserwowanych przez readahead-watch. Wywalamy wszystkie pliki z tej listy, które mają więcej niż 10 MB. Np. jeśli mamy film 700 MB na pulpicie to na pewno będzie wczytany podczas uruchamiania Gnome'a (o ile wszystko mamy na jednej partycji). Jeżeli go nie usuniemy z listy to będzie wczytany przez readahead. Nie dość, że nie potrzebnie opóźni uruchamianie systemu, to jeszcze zaśmieci pamięć. Tak samo usuwamy z listy wszystkie tymczasowe pliki, bo nie ma sensu ich ładować w trakcie uruchamiania systemu, ponieważ za kilka dni ich może już nie być, bo sami je skasujemy/przeniesiemy. Nie potrzebnie potem readahead będzie robić się odwołania do tych plików. Czasami się zdarza, że system wczytuje jakieś pliki ze śmietnika. Trzeba je będzie też usunąć (ścieżka dostępu do śmietnika to ~/.local/share/Trash/). Albo przed sporządzaniem listy wyczyścić śmietnik.
Jak zauważyliście w pliku gnome.root są tylko pliki znajdujące się na partycji z punktem montowania /. Jeśli katalog /home jest punktem montowania innej partycji wtedy trzeba jego też poobserwować. Czyli restartujemy jeszcze raz i powtarzamy czynności powyższe tyle, że zmienia się nieco komenda readahead-watch. Teraz obserwujemy odwołania do plików na partycji /home.
| sudo readahead-watch -o ~/.readahead/gnome.home /home |
Dalej powtarzamy te same czynności. Gdy chcemy wyświetlić posortowane wyniki w programie Less dajemy:
| cat ~/.readahead/gnome.home | xargs -i ls -lk {} | sort -rn -k +5 | less |
I tak samo jak wcześniej wyrzucamy wszystkie za duże pliki (większe niż 10 MB) i tymczasowe. Najlepiej zostawić po prostu wczytywanie ustawień programów, które są w katalogu domowym użytkownika.
Teraz trzeba zapodać readahead tą listę podczas startu systemu. Najlepiej w tym przypadku do tego się nadaje plik /etc/rc.local. Otwieramy go w edytorze i przed exit 0 dajemy poniższy kod:
| for list in /home/<nazwa_użytkownika>/.readahead/* do readahead-list $list done |
Oczywiście za <nazwa_użytkownika> wstawiamy odpowiednią nazwę katalogu domowego użytkownika. Pętla zostanie wykonana tyle razy ile jest plików w katalogu .readahead. A powinno ich być jeden lub dwa, w zależności ile razy powtórzyliśmy proces zbierania danych. Dobrze jest usunąć pliki zapasowe, które się tam znajdują (wszystkie które się kończą na ~). Polecenie readahead-list wczyta pliki z plików gnome.root i gnome.home (jeśli jest).
Teraz możemy zrestartować i zmierzyć nowy czas. Na pewno będzie mniejszy. Ja zaoszczędziłem jakieś 25 sekund. A to dużo. System zaczął mi startować w 45 sekund. Ten sposób jest dobry jeśli mamy jednego użytkownika w systemie. Gdy jest ich więcej i jeszcze ktoś korzysta z systemu, ma swoje konto, dla niego nie będzie przyspieszenia, ponieważ skrypt rc.local wczytuje dane tylko dla jednego użytkownika. Przez co inny użytkownik będzie nie potrzebnie czekał na wczytanie i tak nie swoich plików z katalogu domowego użytkownika, który popełnił ten sposób. Jeśli jest więcej użytkowników w systemie polecam przeczytać następną stronę. Następny sposób już nie jest aż tak skuteczny jak ten, ale też przyspieszy.
Możemy zauważyć znaczny wzrost aktywności dyskowej. W momencie ładowania systemu, są wczytywane pliki użytkownika. Jak pojawi się ekran logowania GDM przez jakiś czas, sekundę, będzie on nie aktywny, ponieważ pliki użytkownika są jeszcze wczytywane.
Jeśli chcemy aby readahead czytał pliki różnych użytkowników, powtarzamy dla każdego tworzenie listy plików. Opisane to poprzednim rozdziale tego artykułu. Gdy dla wszystkich użytkowników potworzymy listy plików, pousuwamy nie potrzebne pliki z listy (powtarzam z listy, a nie z dysku), możemy przejść do skryptu, który uruchomi readahead.
Nie wpisujemy niczego do pliku /etc/rc.local. Do tego wykorzystamy swój plik. Wchodzimy do katalogu /etc/X11/Xsession.d/ i tworzymy pusty plik o nazwie 00readahead (na początku dwa zera). Następnie go edytujemy (oczywiście z uprawnieniami root'a). Wpisujemy do niego:
| for list in ~/.readahead/* do readahead-list $list & done wait |
Czym różnią się dwa sposoby? Pierwszy wczytywał pliki jednego użytkownika jeszcze przed logowaniem, a drugi wczytuje pliki użytkownika po zalogowaniu się w GDM. Do tego ten drugi pauzuje ładowanie profilu użytkownika na moment wczytywania jego plików (polecenie wait). To trochę wydłuża ładowanie. Ale jak napisałem ten sposób jest nieco mniej wydajny.
U mnie ten proces znacznie przyspieszył start systemu, dzięki czemu miałem zysk 30 sekund, wykorzystując pierwszy sposób ładowania plików z mojego profilu. Zapewne nie wszyscy będą mieli aż tak obciążony system na starcie, więc też możecie skrócić znacznie czas ładowania. 30 sekund to już dużo, szczególnie że ma się masę programów, które startują razem z środowiskiem graficznym, opóźniając jego uruchomienie i stan gotowości.
Jeśli specjalnie nie odczuliście przyspieszenia, jeszcze raz przejrzyjcie czy nie przeoczyliście jakiś plików do wyrzucenia z listy plików gnome.root i gnome.home. Jeżeli pomysł na przyspieszenie startu systemu się nie podoba możemy cofnąć zmiany, usuwając wpisy z rc.local, skasować pliki z ~/.readahead i 00readahead.
Na koniec daje filmy z startu mojego systemu. Pierwszy prezentuje start systemu po przeprowadzeniu ponownego profilowania systemu, ale jeszcze bez użycia readahead do ładowania profilu użytkownika. Jak pisałem wcześniej mam trochę uruchomionych programów na starcie, które lubią dużo zeżreć zasobów. Ale mi się przydają. System do ekranu logowania wstawał 32 sekundy, a całkiem do użytku nadawał się po prawie półtorej minuty. To strasznie długo. Trochę go zaśmieciłem, a nie chciałem niczego wyrzucać (taki komputerowy instynkt zbieractwa, wszystko może się przydać
).
). Poniżej film po użyciu readahead w celu przyspieszenia ładowania systemu. Czas do ekranu logowania wzrósł nieco (39 sekund), ponieważ wraz z systemem wczytywane do RAMu są pliki z profilu. A czas do całkowitego startu systemu wynosi 58 sekund. Czyli pół minuty mniej. A to szybciej o 34%. A to już różnica.
Czas mierzyłem stoperem, z przerwą na wpisanie loginu i hasła.



