<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4674062119306020635</id><updated>2011-04-21T22:57:33.849+02:00</updated><category term='tgz'/><category term='gif'/><category term='metody obliczeniowe'/><category term='praca'/><category term='plone'/><category term='plot'/><category term='Dłubiemy w systemie'/><category term='lzm'/><category term='maple'/><category term='grafika'/><category term='cms'/><category term='encoding'/><category term='slax'/><category term='eksport'/><category term='moduły'/><category term='liveCD'/><category term='zlecenia'/><category term='optymalizacja'/><category term='kompilacja'/><category term='konfiguracja'/><title type='text'>make brain || rm -rf /</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hwastu.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://hwastu.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Hwast</name><uri>http://www.blogger.com/profile/02577205600305386900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4674062119306020635.post-4087220558686362854</id><published>2009-02-05T21:37:00.008+01:00</published><updated>2009-02-06T17:55:04.155+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='moduły'/><category scheme='http://www.blogger.com/atom/ns#' term='konfiguracja'/><category scheme='http://www.blogger.com/atom/ns#' term='kompilacja'/><category scheme='http://www.blogger.com/atom/ns#' term='Dłubiemy w systemie'/><title type='text'>Dłubiemy w systemie - cz. 2: Konfiguracja i kompilacja jądra</title><content type='html'>Poniższy opis odnosi się do Linuksa w wersji 2.6.x. W przypadku kompilacji jądra serii 2.4 i    2.6 występują subtelne różnice.&lt;br /&gt;&lt;br /&gt;Przebieg kompilacji i instalacji jądra możemy bardzo ogólnie opisać w paru      punktach:&lt;ul&gt;&lt;li&gt;Zdobycie źródeł, oraz     informacji o sprzęcie&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Konfiguracja – od zera, lub z     wykorzystaniem istniejącej konfiguracji&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Kompilacja&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Obrazu jądra&lt;/li&gt;&lt;li&gt;Modułów&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Instalacja (kolejność nie ma     znaczenia)&lt;ul&gt;&lt;li&gt;Modułów&lt;/li&gt;&lt;li&gt;Skopiowanie lub przeniesienie      obrazu jądra do &lt;span style="font-family:Courier New,monospace;"&gt;/boot&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Wygenerowanie ramdysku &lt;span style="font-family:Courier New,monospace;"&gt;initrd&lt;/span&gt; i umieszczenie go w /boot (opcjonalnie – w przypadku gdy      główny system plików, którego obsługa jest niezbędna do      załadowania systemu nie został wkompilowany na stałe w jądro,      lub w przypadku korzystania z duetu bufora ramki (frame buffer,      pozwalający na osiągnięcie wysokiej rozdzielczości w      konsoli, a także 32 bitowej palety kolorów, co pozwala m.in.      oglądać filmy w czystej konsoli (po uprzednim ustawieniu      wyjscia video w naszym ulubionym odtwarzaczu na bufor ramki)) i      tzw. bootsplash'a, czyli grafiki/animacji wyświetlanej podczas      uruchamiania systemu)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Konfiguracja bootloadera     (dodanie nowych wpisów dla nowego kernela)&lt;/li&gt;&lt;li&gt;Reboot i pacierz ;)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pierwszym krokiem jest zaopatrzenie     się w źródła jądra. Archiwa 'waniliowego' (czyli gołego, bez dodatkowych patchsetów dostępnych w dystrybucyjnych     Linuksach) kernela możemy pobrać ze strony     &lt;a href="http://www.kernel.org/"&gt;http://www.kernel.org&lt;/a&gt;. Naukę     kompilacji najlepiej przeprowadzać pod Slackware, ponieważ nie     korzysta on z żadnych patchsetów, co pozwoli nam na uniknięcie     przykrych niespodzianek typu „Po kompilacji jądra nie działa mi skaner” (bo jego sterownik dostępny był w postaci patcha     lub wchodził w skład patchsetu). Jeśli już musimy kompilować     jądra np. pod Mandrivą, Fedorą czy Ubuntu zalecam aby     zaopatrzyć się w pakiet ze źródłami jądra pochodzący z     repozytorium. W ten sposób otrzymamy kompletne, połatane źródła     Linuksa.&lt;br /&gt;&lt;br /&gt;Źródła „jajka” najczęściej umieszcza się     w /usr/src. Po wypakowaniu archiwum naszym oczom ukaże się     katalog linux-wersja. Warto utworzyć sobie dowiązanie     symboliczne /usr/src/linux prowadzące do źródeł naszego     jądra.&lt;/p&gt;     &lt;p&gt;Niektóre programy podczas      kompilacji wymagają dostępu do źródeł jądra. Przykładem      mogą być sterowniki dostarczane w postaci kodu źródłowego,      z którego budowany jest moduł jądra. Jeśli w systemie mamy      kilka kerneli, może pojawić się pytanie – skąd wiadomo w      którym katalogu szukać źródeł jądra? Modyfikacja      dowiązania &lt;span style="font-family:Courier New,monospace;"&gt;/usr/src/linux&lt;/span&gt;      przy każdym uruchomieniu systemu na danym jądrze jest      rozwiązaniem bardzo nieeleganckim, poszukiwanie źródeł w      &lt;span style="font-family:Courier New,monospace;"&gt;/usr/src/ &lt;/span&gt;z      wykorzystaniem &lt;span style="font-family:Courier New,monospace;"&gt;uname      -r&lt;/span&gt; także nie jest zbyt szczęśliwym wyjściem z      sytuacji bo te niekoniecznie muszą się znajdować akurat tam.      Dlatego istnieją inne dowiązania -  &lt;span style="font-family:Courier New,monospace;"&gt;/lib/modules/`uname      -r`/source&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sam katalog &lt;span style="font-family:Courier New,monospace;"&gt;/lib/modules&lt;/span&gt;&lt;br /&gt; jak sama nazwa wskazuje jest miejscem, w którym przechowywane      są skompilowane moduły jądra, w każdej chwili gotowe do      załadowania.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Jeśli      chodzi o informacje na temat sprzętu – podstawowe informacje      możemy otrzymać poprzez wykorzystanie polecenia&lt;span style="font-family:Courier New,monospace;"&gt;lspci&lt;/span&gt;, &lt;span style="font-family:Courier New,monospace;"&gt;lsusb&lt;/span&gt; oraz &lt;span style="font-family:Courier New,monospace;"&gt;dmesg&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Czym      są moduły?&lt;br /&gt;Większość ficzerów możemy zbudować w      postaci modułu, zamiast integrować z samym jądrem (co ma      wpływ na wielkość jego obrazu). Główną zaletą modułów      jest możliwość ich ładowania i usuwania z pamięci, czyli      poszerzanie/zwężanie możliwości naszego Linuksa i to bez      potrzeby ponownego uruchamiania systemu (Co ma niebagatelne      znaczenie np. w przypadku serwerów)! Ficzery z których      korzystamy rzadko, a są pamięciożerne (np. obsługa systemów      plików – jeśli nie używamy danego systemu plików na danej      maszynie, lub rzadko zachodzi taka potrzeba) warto kompilować      do postaci modułu (załóżmy, że zdarza się, iż raz na      miesiąc musimy coś przekopiować z cudzego dysku na którym      wykorzystuje się inny system plików. Trzymanie w pamięci      funkcji odpowiedzialnych za jego obsługę jest marnotrawieniem      czasu, podobnie jak kompilacja osobnego jądra wyposażonego w      daną funkcjonalność. W takim przypadku mamy możliwość      załadowania modułu na czas wykonania odpowiednich zadań i      późniejsze ich wyłączenie, bez ponownego startu systemu).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ogromne pole do popisu dają tzw. SoftLevele, dostępne m.in. w Gentoo,      które pozwalają tworzyć osobne profile skryptów startowych,      w zależności od parametru podanego w bootloaderze. Co to      oznacza w praktyce? Jeśli np. w domu korzystamy z połączenia      kablowego, natomiast na uczelni przesiadamy się na sieć      bezprzewodową, to możemy z poziomu bootloadera zadecydować      m.in. które skrypty startowe zostaną załadowane (możemy      stworzyć 2 skrypty startowe, z czego 1 odpowiada za załadowanie      modułów do obsługi karty wlan oraz podniesienie odpowiednich      interfejsów, a drugi dotyczy tradycyjnej karty sieciowej). I      nie marnujemy czasu na kompilację 2 linuksów, tym samym      oszczędzając wolną pamięć.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Kwestia      konfiguracji – tysiące przeróżnych HOWTO's i Artykułów      powstało na ten temat. Najlepszą metodą na opanowanie tej      sztuki jest eksperymentowanie i samodzielne próby. Dobrą      techniką jest użycie konfiguracji wykorzystywanej w jądrze      dystrybucyjnym i jego modyfikacja pod kątem własnych potrzeb.      Jeśli jądro zostało skompilowane z obsługą &lt;span style="font-family:Courier New,monospace;"&gt;IKCONFIG_PROC&lt;/span&gt;      (&lt;i&gt;„General Setup” →  „Enable access to .config through      /proc/config.gz”&lt;/i&gt;, wymaga uwcześniejszego zaznaczenia      opcji &lt;i&gt;„Kernel .config support”&lt;/i&gt; znajdujuącego się w      tym samym podmenu) możemy wyświetlić config kernela przy      pomocy polecenia &lt;span style="font-family:Courier New,monospace;"&gt;zcat      /proc/config.gz&lt;/span&gt;. W przeciwnym wypadku kopia pliku      konfiguracyjnego powinna znajdować się w katalogu /boot.&lt;br /&gt;Moja      rada: Początkujący powienien trzymać się zasady, że jeśli      nie jest pewien jakiejś opcji to powinien jej nie ruszać.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Konfiguracja jądra zawiera się w      1 pliku tekstowym &lt;span style="font-family:Courier New,monospace;"&gt;.config&lt;/span&gt;      (kropka na początku nazwy), znajdującym się w katalogu      źródeł. Jego modyfikacji, czyli „skrajania kernela na      miarę”, możemy dokonywac na kilka sposobów:&lt;br /&gt;&lt;li&gt;Edycję pliku przy pomocy    ulubionego edytora tekstowego, jednak jest to rozwiązanie dla    masochistów ;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Użycie jednego z kilku    dostępnych narzędzi (wywołujemy poprzez polecenie &lt;span style="font-family:Courier New,monospace;"&gt;make    nazwa_narzędzia&lt;/span&gt;):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Courier New,monospace;"&gt;menuconfig&lt;/span&gt;      – tekstowy edytor wykorzystujący bibliotekę ncurses. W tym      przypadku symbol gwiazdki ('*') oznacza 'wkompilowane w jądro',      duża litera 'M' oznacza moduł, natomiast puste pole to      wyłączenie danej funkcji z jądra. Jeśli '*'/'M'/' ' jest      otoczone ostrymi nawiasami – osnacza to, iż dana opcja może      zostać wkompilowana w jądro na stałe, jako moduł, lub wcale.      Nawias indeksowy oznacza, że dana opcja nie może pojawić się      w postaci modułu. Przykładem może być widoczna na obrazku      obsługa modułów (2 pozycja w menu). Myśliki oznaczają brak      możliwości zmiany statusu. Strzałka za nazwą oznacza, iż      opcja posiada podmenu.&lt;br /&gt;&lt;br /&gt;Podsumowując - jest to najlepsze      narzedzie, ze względu na przejrzystość interfejsu oraz      niewielkie zależności software'owe.&lt;/p&gt;      &lt;div id="Ramka1" dir="ltr" style="border: medium none ; padding: 0in; background: rgb(255, 255, 255) none repeat scroll 0% 0%; float: left; width: 5.4in; height: 4.29in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;       &lt;p style="margin-top: 0.08in;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;Ilustracja 2:       xconfig (biblioteka QT)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;      &lt;/div&gt;       &lt;div id="Ramka2" dir="ltr" style="border: medium none ; padding: 0in; background: rgb(255, 255, 255) none repeat scroll 0% 0%; float: left; width: 5.36in; height: 4.17in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;       &lt;p style="margin-top: 0.08in;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;Ilustracja 3:       gconfig (GTK)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;      &lt;/div&gt;       &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;xconfig&lt;/span&gt;&lt;/span&gt;,      &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;gconfig&lt;/span&gt;&lt;/span&gt;      – graficzne narzędzie do konfiguracji jądra, których      filozofia i obsługa jest analogiczna do menuconfig. Ich wadą      jsą zależności – poza systemem Xwindow      (X.Org/XFree86[starsza wersja]) wymagane są także odpowiednie      biblioteki, np. Qt, czy GTK. Niewątpliwą zaletą tych 2      rozwiązań jest przejrzystość.&lt;/p&gt;      &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;oldconfig&lt;/span&gt;&lt;/span&gt;      – po wcześniejszym skopiowaniu pliku konfiguracyjnego      pochodzącego ze starszego lub nowszego jądra w katalogu ze      źródłami, narzędzie to uaktualnia jego zawartość (jeśli w      skopiowanym .config'u któraś z opcji się nie pojawiła,      dopisuje ją i ustawia jej domyślny atrybut)&lt;/p&gt;      &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;defconfig&lt;/span&gt;&lt;/span&gt;      – tworzy nowy .config używając domyślnych ustawień.&lt;/p&gt;     &lt;/li&gt;&lt;/ul&gt;   &lt;/li&gt;  &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;Więcej aktualnych informacji  można uzyskać poprzez komendę &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;make  help&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Praktyczne i uniwersalna wskazówka z  mojej strony: Takie rzeczy jak obsługa kontrolera dysków, czy  systemu plików znajdującego się na głównej partycji zawsze  warto integrować z jądrem. Są to rzeczy z których korzystać  będziemy zawsze, więc zbudowanie ich w postaci modułów nie  przyniesie nam żadnych korzyści (chyba że jest się deweloperem  jakiejś dystrybucji odpowiedzialnym za sam kernel i chce się  zapewnić uniwersalność, połączoną z możliwościa wyłączenia  niepotrzebnych sterowników &lt;i&gt;[z tym, że jeśli ktoś się chwyta  za takie rzeczy to posiada odpowiednią wiedzę i nie trzeba go  pouczać]&lt;/i&gt;). W przeciwnym wypadku musimy pamiętać nie tylko o  wygenerowaniu initrd, ale także o włączeniu odpowiedniej opcji w  jądrze, która umożliwia zastosowanie tego rozwiązania.&lt;/p&gt;  &lt;p style="margin-bottom: 0in;"&gt;Dlaczego?&lt;br /&gt;Jak już wcześniej  wspominałem – moduły znajdują się na dysku twardym, w katalogu  /lib/modules/wersja_jądra/. Aby się do nich dostać wymagana jest  obsługa kontrolera i systemu plików. Nie jesteśmy w stanie  wczytac sterownika, które zapewnia obsługę danego urządzenia,  jeśli znajduje się na tym urządzeniu (tutaj goraco pozdrawiam  producentów napedów blu-ray, którzy sterowniki umieszczają na  krążkach blue-ray ;) ). Aby ominąć ten problem, należy umieścić  sterownik w ram dysku (initrd).&lt;/p&gt;  &lt;p style="margin-bottom: 0in;"&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0in;"&gt;Przejdźmy do kolejnego kroku –  czyli właściwej kompilacji. Możemy kompilowac na dwa sposoby:&lt;/p&gt;  &lt;ul&gt;&lt;ul&gt;&lt;li value="1"&gt;&lt;p style="margin-bottom: 0in;"&gt;Używając jednego   polecenia: &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;make   all&lt;/span&gt;&lt;/span&gt; lub &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;make&lt;/span&gt;&lt;/span&gt;   (bo domyślnym targetem dla make jest 'all'), które: skompiluje   jądro (&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;make   vmlinux&lt;/span&gt;&lt;/span&gt;), utworzy jego skompresowany obraz (&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;make   bzImage&lt;/span&gt;&lt;/span&gt;), oraz zbuduje moduły (&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;make   modules&lt;/span&gt;&lt;/span&gt;).&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;Używając 2 poniższych poleceń,   etap po etapie, zachowując przy tym większą kontrolę nad całym   procesem kompilacji oraz umożliwiając łatwe zdiagnozowanie   której części procesu kompilacji dotyczy ew. błąd.&lt;br /&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;make   bzImage&lt;/span&gt;&lt;/span&gt; &lt;i&gt;(bzImage wyzwala vmlinux – wystarczy   zajrzeć do Makefile znajdującego się w podkatalogu &lt;/i&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;i&gt;arch/`uname   -m`/&lt;/i&gt;&lt;/span&gt;&lt;i&gt;)&lt;/i&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;make   modules&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;Teraz przechodzimy do instalacji  nowego jądra. Instalujemy moduły następującym poleceniem:&lt;/p&gt;&lt;/ul&gt; &lt;ul&gt;&lt;ul&gt;&lt;li value="1"&gt;&lt;p style="margin-bottom: 0in;"&gt;make modules_install&lt;/p&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-bottom: 0in;"&gt; Tutaj możemy również skorzystać z  jednego polecenia, lub wykonać cały zabieg ręcznie:&lt;/p&gt;&lt;/ul&gt; &lt;ul&gt;&lt;ul&gt;&lt;li value="1"&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;make   install&lt;/span&gt;&lt;/span&gt; – to polecenie skopiuje obraz jądra do   /boot, doda odpowiedni wpisy do bootloadera. Podczas instalacji   wykorzystywany jest skrypt ~/bin/installkernel, /sbin/installkernel   lub jądro jest instalowane w $(INSTALL_PATH) i automatycznie   uruchamiany jest wyzwalacz dla LILO (dodanie wpsiu do booltoadera).&lt;/p&gt;   &lt;p style="margin-bottom: 0in;"&gt;Lub poprzez:&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;cp arch/`uname -m`/boot/bzImage   /boot/jajko-wersja oraz ręczne dodanie wpisów do bootloadera.   Jeśli korzystamy z LILO, modyfikujemy plik &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="background: rgb(230, 230, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;/etc/lilo.conf&lt;/span&gt;&lt;/span&gt;,   zachowując składnię przedstawioną poniżej:&lt;br /&gt;&lt;br /&gt;&lt;p class="code"&gt;image=/boot/nazwa_obrazu opcje  #sciezka do        obrazu jadram         oraz ew. opcje        (dla jądra, dla        framebuffera, czy        def. softlevelu)&lt;br /&gt;label=nowe_jajko    #label czyli tresc        etykiety w menu LILO&lt;br /&gt;initrd=/boot/initrd-2.2.12-20.img  #opcjonalnie&lt;br /&gt;read-only&lt;br /&gt;root=/dev/sda1    #tutaj podajemy        partycję główną&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;W przypadku GRUB'a edytujemy &lt;span style="font-family:Courier New,monospace;"&gt;/etc/grub.conf&lt;/span&gt;, &lt;span style="font-family:Courier New,monospace;"&gt;/boot/grub/menu.lst&lt;/span&gt;&lt;span style="font-family:Times New Roman,serif;"&gt;/boot/grub/grub.conf&lt;/span&gt;, wg schematu:&lt;br /&gt;&lt;p class="code"&gt;title nowe_jajko&lt;br /&gt;root (hd0,0)&lt;br /&gt;kernel sciezka_do_obrazu_jadra opcje&lt;br /&gt;initrd sciezka_do_initrd&lt;/p&gt;&lt;ul&gt;&lt;ul&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;Jeśli istnieje taka potrzeba –   należy jeszcze utworzyć plik initrd, np. przy pomocy narzędzia   &lt;span style="font-family:Courier New,monospace;"&gt;mkinitrd&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;Po kazdej rekompilacji jądra (a   dokładnie – przebudowie modułów) należy pamiętać iż   sterowniki dostarczane w postaci zewnętrznych modułów, jak np.   nvidia-drivers, wymagają reinstalacji.&lt;/p&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4674062119306020635-4087220558686362854?l=hwastu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwastu.blogspot.com/feeds/4087220558686362854/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4674062119306020635&amp;postID=4087220558686362854' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/4087220558686362854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/4087220558686362854'/><link rel='alternate' type='text/html' href='http://hwastu.blogspot.com/2009/02/dubiemy-w-systemie-cz-2-konfiguracja-i.html' title='Dłubiemy w systemie - cz. 2: Konfiguracja i kompilacja jądra'/><author><name>Hwast</name><uri>http://www.blogger.com/profile/02577205600305386900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4674062119306020635.post-7797394050648961876</id><published>2008-10-23T19:02:00.014+02:00</published><updated>2009-02-05T21:55:56.812+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='optymalizacja'/><category scheme='http://www.blogger.com/atom/ns#' term='kompilacja'/><category scheme='http://www.blogger.com/atom/ns#' term='Dłubiemy w systemie'/><title type='text'>Dłubiemy w systemie - cz. 1: Kompilacja oprogramowania</title><content type='html'>&lt;p&gt;Chciałbym tym wpisem rozpocząć krótką serie, w której opisywać będę najpopularniejsze metody dostrajania systemu i oprogramowania. Zaczynamy!&lt;/p&gt;&lt;p&gt;Ręczna kompilacja oprogramowania.&lt;br /&gt;Zanim zaczniemy zastanówmy się dlaczego warto cokolwiek ręcznie kompilować. No właśnie - po co? Najczęstsze przyczyny to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Brak danego programu/biblioteki repozytorium dystrybucji,&lt;/li&gt;&lt;li&gt;Chęć lepszego dostosowania oprogramowania do naszych potrzeb,&lt;/li&gt;&lt;li&gt;Optymalizacja kodu (flagi kompilatora, flagi linkera, stripowanie),&lt;/li&gt;&lt;li&gt;Chcemy zaingerować w kod programu/biblioteki (łaty, własne modyfikacje)&lt;/li&gt;&lt;li&gt;Gdy nie mamy dostępu do root'a, a koniecznie musimy zainstalować jakiś program, podczas gdy admin wypoczywa przy szklance soku w Pcimiu Dolnym.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Pierwszym krok""iem jest zaopatrzenie się w odpowiednie narzędzia - niezbędny będzie kompilator (gcc), linker (ld, wchodzi w skład binutils), biblioteki (przede wszystkim glibc-devel), automake, autoconf i inne. Skąd mieć pewność, że mamy wszystko co potrzebne - o tym za chwilę.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Następny krok to zaopatrzenie się w źródła (kod źródłowy) danego programu/biblioteki. W tym celu musimy udać się na stronę danego projektu lub zapytać wujka google'a. Najczęściej występują w postaci archiwum tar skompresowanych gzip'em/bzip'em (*.tar.gz, *.tar.bz2, czasem skracane do *.tgz, *.tbz2). Naukę najlepiej zacząć od niewielkich programów, np. &lt;em&gt;irssi&lt;/em&gt; - konsolowy klient IRC.&lt;/p&gt;&lt;p&gt;W konsoli przechodzimy do katalogu, gdzie zapisaliśmy archiwum (zalecam wypakowywanie do pustego katalogu), następnie rozpakowujemy je poleceniem:&lt;/p&gt;&lt;p&gt;&lt;p class="code"&gt;$ tar &lt;strong&gt;j&lt;/strong&gt;xvf nazwa_archiwum.tar.&lt;strong&gt;bz2&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style="font-family:lucida grande;"&gt;lub&lt;br /&gt;&lt;/span&gt;&lt;p class="code"&gt;$ tar &lt;strong&gt;z&lt;/strong&gt;xvf nazwa_archiwum.tar.&lt;strong&gt;gz&lt;/strong&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Flaga (opcja) '&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;z&lt;/span&gt;&lt;span&gt;' informuje program &lt;em&gt;tar&lt;/em&gt;, że mamy do czynienia z archiwum spakowanym &lt;em&gt;gzip&lt;/em&gt;em, a w przypadku '&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;j&lt;/span&gt;&lt;span&gt;' - &lt;em&gt;bzip&lt;/em&gt;em. '&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;x&lt;/span&gt;&lt;span&gt;' mówi że chcemy coś wypakować, '&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;v&lt;/span&gt;&lt;span&gt;' oznacza tryb "gadatliwy" (ang. &lt;em&gt;verbose&lt;/em&gt;), a '&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;f&lt;/span&gt;&lt;span&gt;' wskazuje, że chcemy rozpakować plik, którego nazwa jest dalej.  Szczegółowe opisy opcji polecenia tar można znaleźć w &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;man tar&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Jeśli w wyniku tego procesu otrzymamy nowy podkatalog - przechodzimy do niego (ok. 85% przypadków).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Na moment zostawię konsolę w spokoju, aby poruszyć kwestię optymalizacji. Informacje o tym jak ustawiać flagi, które z nich są 'bezpieczne', a które nie, można znaleźć w &lt;a href="http://repo.dobremiasto.net/articles/wstep_do_kompilacji_oprogramowania"&gt;Hoppke Repo.&lt;/a&gt; Dodam tylko, że zauważyłem, iż w ostatnim czasie stosowanie flagi &lt;em&gt;-fomit-frame-pointer&lt;/em&gt; dla C++ (&lt;em&gt;&lt;span style="font-family:courier new;"&gt;$CXXFLAGS&lt;/span&gt;&lt;/em&gt;) przestało powodować problemy (sam używam tej flagi, korzystam z &lt;em&gt;gcc &lt;/em&gt;serii 4.3).Nawet jeśli ktoś nie ma zamiaru skupiać się na studiowaniu flag kompilatora, to nie zaszkodzi na stałe ustawić &lt;a href="http://gentoo-wiki.com/Safe_Cflags"&gt;popularnych i bezpiecznych flag&lt;/a&gt; dla konkretnego modelu procesora. Chyba, że zależy nam na przenośności (np. tworzymy paczkę, która ma być dostępna dla każdego użytkownika danej dystrybucji), wtedy najlepiej kompilować pod &lt;em&gt;i686&lt;/em&gt; (&lt;em&gt;pentium pro&lt;/em&gt; i nowsze).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Wróćmy do procesu kompilacji. Etapem wstępnym do właściwej kompilacji jest konfiguracja. Odbywa się to poprzez wywołanie skryptu &lt;em&gt;configure &lt;/em&gt;&lt;/span&gt;&lt;span&gt;z odpowiednimi opcjami. Własnie - jakimi opcjami? Listę dostępnych opcji uzyskamy po wpisaniu:&lt;/span&gt;&lt;/p&gt;&lt;p class="code"&gt;$ ./configure --help&lt;/p&gt;&lt;p&gt;&lt;span&gt;Część opcji występuje zawsze, lub bardzo często, natomiast spora część bywa unikatowa, tylko dla danego oprogramowania. Ich opisy znajdziemy po wywołaniu w.w. polecenia, ale pozwolę sobie opisać (moim zdaniem) najważniejszą, czyli &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;--prefix=...&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Czym jest prefix? W Linuksie oraz Uniksie stosuje sie filozofię, iż biblioteki lądują w katalogu &lt;em&gt;lib&lt;/em&gt;, binarki w &lt;em&gt;bin&lt;/em&gt; lub &lt;em&gt;sbin&lt;/em&gt;, pliki nagłówkowe w &lt;em&gt;includes&lt;/em&gt; itd. Są to &lt;a href="http://www.pathname.com/fhs/"&gt;założenia standardu FHS&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;Prefix definuje ścieżkę gdzie umieszczona ma zostać w.w. struktura. Prosze zauważyć że podobne katalogi znajdziemy w &lt;span style="font-family:courier new;"&gt;/&lt;/span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/usr&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/usr&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/local&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, a czasem &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/opt/nazwa_programu/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;. Za pomocą prefiksu definiujemy gdzie zainstalujemy dany program. Ktoś teraz zapyta: &lt;em&gt;"super, mamy wybór gdzie chcemy instalować oprogramowanie, ale co nam to daje i dlaczego ten nawiedzony człowiek nazwał to najwazniejsza opcją?"&lt;/em&gt; Otóż jest kilka istotnych powodów:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Wyobraźmy sobie sytuację, że posiadamy konto shellowe, bez uprawnień pozwalających na instalację pakietów binarnych, czy zapisu w &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/usr&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/usr/local&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, czy &lt;span style="font-family:courier new;"&gt;/opt&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;. W takim przypadku możemy ustawić prefix na miejsce, do którego mamy pełne prawa i gdzie nie zajrzy nam inny użytkownik - takim miejscem jest katalog domowy użytkownika, jednak by nie robic sobie balaganu proponuje utworzyc specjalny katalog na wlasne oprogramowanie i dodac go do sciezki podanej w prefixie. Przyklad użycia:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;p class="code"&gt;$ ./configure --prefix=~/moje_programy [--inne-opcje]&lt;/p&gt;&lt;span&gt;Przy zastosowaniu takiego egzotycznego prefiksu standardowo nie będziemy mogli uruchamiać programów poprzez samo wpisane ich nazwy. Musimy podawać pełną ścieżkę do binarki - czyli &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;~/moje_programy/bin/nazwa_programu&lt;/span&gt;&lt;/span&gt;&lt;span&gt;. Da się to łatwo zmienić. Wystarczy zmodyfikować zmienną środowiskową &lt;span style="font-family:courier new;"&gt;$PATH&lt;/span&gt; przechowującą listę katalagów, gdzie powłoka ma szukać programów. Poszczególne ścieżki oddzielone są dwukropkami, a im wcześniej dana lokalizacja występuje tym wyższy ma priorytet. W praktyce wystarczy zmodyfikować/utworzyć ~/.bashrc (ukryty (kropka na początku nazwy) plik teksotwy, którego zawartość jest wykonywana podczas każdego uruchomienia powłoki BASH). Umieszczamy w nim następującą linijkę (najlepiej dopisać do końca):&lt;br /&gt;&lt;p class="code"&gt;export PATH=~/moje_programy/bin:$PATH&lt;/p&gt;&lt;br /&gt;Jak widać nowa ściezka będzie miała najwyższy priorytet (jeśli w systemie jest już zainstalowany dany program, ale np. jego wersja/konfiguracja nam nie odpowiada, to mamy pewność, że po wpisaniu samej nazwy polecenia uruchomi się "nasz" program). Aby 'wczytać' nowe ustawienia wydajemy polecenie:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p class="code"&gt;$ source ~/.bashrc&lt;/p&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Domyślną wartością opcji &lt;em&gt;prefix &lt;/em&gt;&lt;/span&gt;&lt;span&gt;jest &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/usr/local&lt;/span&gt;&lt;/span&gt;&lt;span&gt;. Jak mówi FHS jest to specjalne miejsce na oprogramowanie instalowane lokalnie, wydzielone w celu uniknięcia 'kolizji' plików należących do pakietów binarnych (dla których przeznaczono &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/usr&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) z 'naszymi' podczas ew. aktualizacji systemu. Nie polecam instalacji z prefixem do &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/usr&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, chyba że wiemy co robimy (np. konfigurujemy żródła z myślą o budowie pakietu binarnego dla naszej ulubionej dystrybucji)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;To właśnie &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;./configure&lt;/span&gt;&lt;/span&gt;&lt;span&gt; i jego opcje są jedna z największych zalet własnoręcznej kompilacji i systemów typu source-based. Możemy zdecydowac, z których funkcji programu będziemy korzystać i (co za tym idzie) maja zostać wkompilowane, a które sa z naszego punktu zbędne i chcemy odchudzić  z nich program. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Działanie skryptu możemy podzielic na 2 fazy - sprawdzającą i generującą. Podczas pierwszej sprawdzana jest dostępność niezbędnych bibliotek i narzędzi w systemie, im więcej ficzerów (opcji, funkcji - używam tutaj popularnego spolszczenia od ang. '&lt;em&gt;features&lt;/em&gt;') wybierzemy (&lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;--with-costam&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) tym większe zalezności ("&lt;em&gt;wymagania software'owe&lt;/em&gt;") będzie miał nasz kompilat. Działa to również w drugą stronę - jeśli &lt;span style="font-family:courier new;"&gt;./configure&lt;/span&gt; przerywa działanie i krzyczy że brakuje mu &lt;em&gt;libcośtam&lt;/em&gt; najpierw sprawdzamy czy dana biblioteka/narzędzie nie ma związku z ficzerem, którego nie zamierzamy używać - jeśli tak to możemy spokojnie ogołocić nasz program z danej funkcji uruchamiając skrypt jeszcze raz, tym razem z dodatkową opcja --without-cośtam. W przeciwnym wypadku - musimy "spełnić zależności" czyli doinstalowac co trzeba. Jeśli mimo tego &lt;span style="font-family:courier new;"&gt;./configure&lt;/span&gt; dalej nie 'widzi' biblioteki/narzędzia, to nie trzeba się załamywać - prawdopodobnie to wina nietypowego prefiksu i wystarczy odp. skonfigurować konsolidator dynamiczny/zmienną środowiskową &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;$PATH&lt;/span&gt;&lt;/span&gt;&lt;span&gt; aby rozwiązać problem, ale to już temat na osobny wpis.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Drugą fazą procesu jest automatyczne tworzenie plików &lt;/span&gt;&lt;span&gt;&lt;em&gt;&lt;span style="font-family:courier new;"&gt;makefile&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span&gt;, które są fundamentem kolejnego etapu, czyli właściwej kompilacji. I tu niespodzianka bo..&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;..właściwa kompilacja sprowadza się tylko do jednego polecenia:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;$ make [opcje]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Warto wspomnieć o opcji &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;-jN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (gdzie &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;span&gt; to liczba procesorów + 1). Definiuje ona  maksymalną ilość operacji wykonywanych jednocześnie.&lt;br /&gt;Jeśli zdefiniowaliśmy własne flagi kompilatora i eksportujemy je globalnie (np. w &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/etc/profile&lt;/span&gt;&lt;/span&gt;&lt;span&gt; albo &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;/etc/make.conf&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) lub lokalnie (np. w &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;~/.bashrc&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) wystarczy nam samo polecenie &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;make&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.  W przeciwnym wypadku właśnie w tej chwili możemy podać nasze flagi kompilatora. Przykład:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;$ CFLAGS="-march=athlon-xp -O2 -fomit-frame-pointer -DNDEBUG" CXXFLAGS=$CFLAGS LDFLAGS="-s -z combreloc" make -j2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Jeśli otrzymamy komunikat informujący o 'braku celu do wykonania' oznacza to, że pliki &lt;em&gt;makefile&lt;/em&gt;, z których korzysta &lt;span style="font-family:courier new;"&gt;make&lt;/span&gt; nie zostały utworzone. Prawdopodobnie przeoczyliśmy, że &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;./configure&lt;/span&gt;&lt;/span&gt;&lt;span&gt; zakończyło się niepowodzeniem.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Ostatnim krokiem jest instalacja. Służy do tego proste polecenie:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;# make install&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Prosze zwrócić uwagę na znak zachęty - jest to &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;#&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, ponieważ tę operację wykonujemy z root'a (tzn. wykonujemy ją z poziomu tego użytkownika, który ma prawo zapisu w katalogu podanym jako prefiks. Jeśli instalujemy oprogramowanie w naszym katalogu domowym, możemy ten krok wykonać z poziomu zwykłego użytkownika).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Co prawda mamy możliwość odinstalowania programu poprzez wywołanie polecenia &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;make uninstall&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; w katalogu, jednak nie jest to najwygodniejsze rozwiązanie ponieważ:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;w przypadku instalacji kilku wersji, z tym samym prefiksem, może dojść do usunięcia plików, których nie chcielibyśmy stracić&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;musimy trzymać katalog 'roboczy', lub pamiętać jakich opcji/prefiksów używaliśmy aby w celu usunięcia programu z systemu wypakować źródła, uruchomić &lt;span style="font-family:courier new;"&gt;./configure&lt;/span&gt; jeszcze raz, a zaraz po nim &lt;span style="font-family:courier new;"&gt;make uninstall&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Lepsze metody? Tworzenie pakietów! I wcale nie trzeba studiować dokumentacji, a potem wklepywać poleceń jedno po drugim - istnieje automat, zastępujący polecenie &lt;span style="font-family:courier new;"&gt;make install&lt;/span&gt;.  Ten automat to &lt;a href="http://www.asic-linux.com.mx/%7Eizto/checkinstall/"&gt;checkinstall&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Jego użycie nie powino sprawiać większych problemów, można tworzyć zarówno pakiety TGZ (Slackware, Zenwalk i pochodne), DEB (Debian, Ubuntu i pochodne) oraz RPM (Red Hat, CentOS, Fedora Core i pochodne). &lt;/p&gt;&lt;p&gt;Mimo wszystko jeśli chce się zostać developerem "pełną gębą" (dokładniej opiekunem kilku pakietów) jakiejś dystrybucji, założyć własne repozytorium, czy 'paczkować' programy z poza repozytorium i umieszczać np. na linuxpackages.net, wypada poznać natywne (klasyczne) metody tworzenia pakietów. Checkinstall jest świetnym narzędziem, ale nie oferuje 100% kontroli nad tym co się dzieje. Jeśli tworzymy pakiety binarne tylko dla siebie, będzie niezastąpiony.&lt;/p&gt;&lt;p&gt;W następnej części cyklu opiszę klasyczną metodę tworzenia pakietów TGZ dla Slackware. Podstawy już są ;) Zapraszam do komentowania.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4674062119306020635-7797394050648961876?l=hwastu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwastu.blogspot.com/feeds/7797394050648961876/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4674062119306020635&amp;postID=7797394050648961876' title='Komentarze (4)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/7797394050648961876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/7797394050648961876'/><link rel='alternate' type='text/html' href='http://hwastu.blogspot.com/2008/10/dubiemy-w-systemie-cz-1-kompilacja.html' title='Dłubiemy w systemie - cz. 1: Kompilacja oprogramowania'/><author><name>Hwast</name><uri>http://www.blogger.com/profile/02577205600305386900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4674062119306020635.post-9080950803549952822</id><published>2008-10-22T15:17:00.007+02:00</published><updated>2009-02-05T21:32:16.322+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maple'/><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='gif'/><category scheme='http://www.blogger.com/atom/ns#' term='plot'/><category scheme='http://www.blogger.com/atom/ns#' term='metody obliczeniowe'/><category scheme='http://www.blogger.com/atom/ns#' term='eksport'/><title type='text'>Maple12 i Wolne Oprogramowanie</title><content type='html'>&lt;p&gt;W trakcie wykładu z Metod Obliczeniowych prowadzący ogłosił mały konkurs polegający na opisaniu i ew. prezentacji sposobu eksportu animowanych 'plotów' wygenerowanych w programie Maple (został napisany w Javie i jest w pełni przenośny między wszystkimi platformami, na których działa JRE) do dowolnego formatu (animowana grafika, wideo). Postanowiłem podjąć się wyzwania i przy okazji pokazać jakie możliwości niesie ze sobą wolne oprogramowanie.&lt;/p&gt;&lt;p&gt;Pierwszym pomysłem było zastosowanie pętli for w której przy każdym wykonaniu bloku instrukcji rysowany byłby plot dla konkretnej klatki a następnie eksportowany do formatu gif. W trakcie prac zupełnie przypadkowo odkryłem, że Maple w wersji 12 ma zaimplementowany eksport do animowaych gif'ów. Nie było sensu dalszych prac nad wynajdowaniem koła od nowa. Pierwszy próg pokonany.&lt;/p&gt;&lt;p&gt;Poniżej prezentuję małe HOWTO które stworzyłem przy okazji zabawy:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Eksport do GIF'a (animowana grafika):&lt;/span&gt;&lt;br /&gt;Klikamy prawym przyciskiem myszy na danym plocie, wybieramy export -&gt; Graphics Interchange Format, definiujemy ścieżkę do której ma nastąpić eksport i zapisujemy. Dla ułatwienia następnych kroków zalecam eksportować do pustego katalogu.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Eksport do MPEG (video):&lt;/span&gt;&lt;br /&gt;a) Korzystając z instrukcji zawartych w punkcie 1, eksportujemy animacje w Maple'u do formatu gif, do pustego katalogu (aby ułatwić sobie dalsze kroki).&lt;br /&gt;&lt;br /&gt;b) Otwieramy okno terminalu i przechodzimy do katalogu gdzie zapisalismy naszą animację w formacie gif. Konwertujemy animowanego gif'a na pliki w formacie jpg, gdzie każdy z nich zawiera 1 klatkę animacji. Ilość plików jest zależna od ilości klatek. Do tego celu używamy narzędzia convert dostępnego w pakiecie ImageMagick:&lt;br /&gt;&lt;p class="code"&gt;$ convert nazwa.gif nazwa_%05d.jpg&lt;/p&gt;W wyniku otrzymamy serie plików graficznych w formacie jpg zawierajacych numer klatki w nazwie (nazwa_00001.jpg, nazwa_00002.jpg itd.)&lt;br /&gt;&lt;br /&gt;c) Za pomocą narzędzia ffmpeg sklejamy pliki jpg w film mpg:&lt;br /&gt;&lt;p class="code"&gt;$ ffmpeg -r `ls -l *.jpg | wc -l` -i nazwa_%05d.jpg -y -an nazwa.mpg&lt;/p&gt;(&lt;span style="font-family:courier new;"&gt;`ls -l *.jpg | wc -l`&lt;/span&gt; zwraca nam ilosc plików z rozsz. jpg w danym katalogu)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Eksport do innych formatów video&lt;/span&gt; sprowadza sie do encodingu przy pomocy np. mencodera (kuzyn mplayer'a) filmu w formacie mpg.&lt;br /&gt;Bardzo interesującym rozwiązaniem są nowoczesne kontenery audio/video, dzięki którym możemy np. stworzyć 1 plik video z zaimplementowanymi kilkoma ścieżkami dzwiękowymi/napisami (np. tłumaczenia w przypadku międzynarodowej konferencji naukowej - każdy otrzymuje ten sam plik z filmem i samodzielnie decyduje w jakim języku chce go oglądać).&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4674062119306020635-9080950803549952822?l=hwastu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwastu.blogspot.com/feeds/9080950803549952822/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4674062119306020635&amp;postID=9080950803549952822' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/9080950803549952822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/9080950803549952822'/><link rel='alternate' type='text/html' href='http://hwastu.blogspot.com/2008/10/maple12-i-wolne-oprogramowanie.html' title='Maple12 i Wolne Oprogramowanie'/><author><name>Hwast</name><uri>http://www.blogger.com/profile/02577205600305386900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4674062119306020635.post-6831871577152306765</id><published>2008-10-20T20:38:00.008+02:00</published><updated>2008-10-21T11:08:01.319+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cms'/><category scheme='http://www.blogger.com/atom/ns#' term='grafika'/><category scheme='http://www.blogger.com/atom/ns#' term='zlecenia'/><category scheme='http://www.blogger.com/atom/ns#' term='praca'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>Zlecenie dla Politechniki Śląskiej wykonane.</title><content type='html'>&lt;p&gt;Jakiś czas temu dostałem propozycję stworzenia skórki dla Plone (systemu zarządzania treścią (CMS) stworzonym w języku Python) dla pewnego instytutu Politechniki Śląskiej. Zlecenie w głównej mierze polegało na stworzeniu nowego kaskadowego arkuszu styli (CSS) oraz przygotowaniu odpowiednich elementów graficznych. Ponieważ dłubanie w samym silniku systemu nie należało do moich kompetencji musiałem kombinowac w jaki sposób wpleść specjalnie przygotowane elementy graficzne w określony układ. Nieocenionym narzędziem w pracy okazała się wtyczka dla Firefoxa i pochodnych - &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt;. Cała oprawa graficzna została stworzona w wolnym i darmowym (licencja GNU GPL) &lt;a href="http://gimp.org/"&gt;GIMPie&lt;/a&gt;. Poznałem kilka nowych sztuczek i wzbogaciłem swoje portfolio o kolejne zlecenie dla PŚ - skromna inwestycja w przyszłość.&lt;br /&gt;Jeśli zleceniodawca również wyrazi zgodę - opublikuje motyw graficzny na jednej z wolnych licencji.&lt;/p&gt;&lt;p&gt;Link do strony wkrótce.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4674062119306020635-6831871577152306765?l=hwastu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwastu.blogspot.com/feeds/6831871577152306765/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4674062119306020635&amp;postID=6831871577152306765' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/6831871577152306765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/6831871577152306765'/><link rel='alternate' type='text/html' href='http://hwastu.blogspot.com/2008/10/zlecenie-dla-politechnice-lskiej.html' title='Zlecenie dla Politechniki Śląskiej wykonane.'/><author><name>Hwast</name><uri>http://www.blogger.com/profile/02577205600305386900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4674062119306020635.post-7160184774851598565</id><published>2008-10-18T21:33:00.004+02:00</published><updated>2009-02-05T21:31:05.173+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='moduły'/><category scheme='http://www.blogger.com/atom/ns#' term='konfiguracja'/><category scheme='http://www.blogger.com/atom/ns#' term='lzm'/><category scheme='http://www.blogger.com/atom/ns#' term='liveCD'/><category scheme='http://www.blogger.com/atom/ns#' term='tgz'/><category scheme='http://www.blogger.com/atom/ns#' term='slax'/><title type='text'>Slax i tworzenie własnych modułów</title><content type='html'>Swego czasu zastanawiałem się nad stworzeniem swojej dystrybucji LiveCD lub modyfikacją istniejącej, tak aby odpowiadała moim wymaganiom - tzn. posiadało to co jest mi niezbędne i tylko to. Całkiem niedawno na jednym z for linuksowych napotkałem na pytanie początkującego użytkownika o sposób tworzenia własnych modułów w postaci archiwum LZM dla dystrybucji SLAX 6.x. Postanowiłem poszerzyć swoje horyzonty i poszperać za dobrym manualem i udało mi się spłodzić małe howto. Z góry zaznaczam, że bardzo przydatna (niezbędna?) przy tworzeniu własnych modułów jest wiedza i doświadczenie nt. budowy pakietów *.tgz wykorzystywanych w Slackware (o tym może kiedyś napiszę).&lt;br /&gt;&lt;br /&gt;Tyle słowem wstępu, przejdźmy do właściwej części wpisu.&lt;br /&gt;Mamy do wyboru kilka dróg:&lt;br /&gt;&lt;span class="MsgBodyText"&gt;&lt;ul type="square"&gt;&lt;li&gt; od zera:&lt;br /&gt;&lt;ol type="1"&gt;&lt;br /&gt;&lt;li&gt; tworzymy paczkę *.tgz z plikami konfiguracyjnymi i dodatkowym oprogramowaniem - wszystko wrzucamy w 1 pakiet&lt;br /&gt;&lt;/li&gt;&lt;li&gt; konwertujemy paczkę na archiwum lzma:&lt;br /&gt;&lt;p class="code"&gt;tgz2lzm pakiet.tgz moduł.lzm&lt;/p&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;  łączymy różne pakiety tgz i ew. dołączamy własne pliki konfiguracyjne:&lt;br /&gt;&lt;ol type="1"&gt;&lt;br /&gt;&lt;li&gt; rozpakowujemy paczki *.tgz do wcześniej utworzonego katalogu, np. /tmp/my_lzm_package/&lt;br /&gt;&lt;p class="code"&gt;installpkg -root /tmp/my_lzm_package pakiet.tgz&lt;/p&gt;W ten sposób otrzymujemy drzewko katalogów w /tmp/my_lzm_package zawierające binarki, biblioteki itp. składniki danego pakietu.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Jeśli trzeba to wprowadzamy własne modyfikacje&lt;br /&gt;&lt;/li&gt;&lt;li&gt; konwertujemy drzewko katalogów na archiwum (moduł) lzma:&lt;br /&gt;&lt;p class="code"&gt;dir2lzm /tmp/my_lzm_package paczka.lzm&lt;/p&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; modyfikacja istniejącego modułu (*.lzm):&lt;br /&gt;&lt;ol type="1"&gt;&lt;br /&gt;&lt;li&gt; Rozpakowujemy archiwum lzm&lt;br /&gt;&lt;p class="code"&gt;lzm2dir modul.lzm /tmp/my_lzm_package &lt;/p&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Postępujemy jak przy sposobie wyżej, z tym że 1 punkt mamy już z głowy. Możemy np. podmienić splashscreen wyświtlany podczas uruchamiania gimpa/xine lub dodać jakiś soft.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Przeglądanie zawartości modułów lzm pod dowolną dystrybucją (Uwaga! wymaga obsługi systemu plików squashfs w jądrze):&lt;br /&gt;&lt;ol type="1"&gt;&lt;br /&gt;&lt;li&gt; Archiwa lzm możemy montować, tak jak obrazy *.iso, pendrive, czy płytki CD/DVD. Tworzymy katalog gdzie zamontujemy moduł:&lt;br /&gt;&lt;p class="code"&gt;mkdir /mnt/moduly&lt;/p&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; ... i montujemy:&lt;br /&gt;&lt;p class="code"&gt;&gt;mount -t squashfs -o loop /sciezka/do/modulu.lzm /mnt/moduly&lt;/p&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Pamiętajmy, że gdy skończymy przeglądanie zawartości i/lub będziemy chcieli podmontować inny moduł, należy najpierw odmontować dotychczas zamontowane archiwum lzm:&lt;br /&gt;&lt;p class="code"&gt;umount /mnt/moduly&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ul&gt;Jeśli masz doświadczenie z tworzeniem pakietów binarnych dla slackware to pewnie już się domyślasz w jaki sposób kompilować soft ze źródeł i od razu tworzyć z niego moduły. Jeśli nie - to w przyszłości zamierzam napisać co nieco na ten temat.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jako wychowanemu na Slackware bardzo podoba mi się Slax oraz sposób tworzenia modułów. Myślę, ze to dobra alternatywa dla tworzenia własnego przenośnego distro od zera. Wystarczy utworzyć odpowiedni moduł zawierający certyfikat sieci eduroam i bez własnego komputera można cieszyć się uczelnianym WiFi, wykorzystując swoje ulubione narzędzia ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4674062119306020635-7160184774851598565?l=hwastu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwastu.blogspot.com/feeds/7160184774851598565/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4674062119306020635&amp;postID=7160184774851598565' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/7160184774851598565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/7160184774851598565'/><link rel='alternate' type='text/html' href='http://hwastu.blogspot.com/2008/10/slax-i-tworzenie-wasnych-moduw.html' title='Slax i tworzenie własnych modułów'/><author><name>Hwast</name><uri>http://www.blogger.com/profile/02577205600305386900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4674062119306020635.post-3040212141515397216</id><published>2008-10-18T00:13:00.000+02:00</published><updated>2008-10-18T00:21:14.035+02:00</updated><title type='text'>Hello World!</title><content type='html'>Witam,&lt;br /&gt;Jakis czas temu zdarzyło mi się popełnić kilka komentarzy, o charakterze uzupełniającym treść wpisu na pewnym blogu, a raczej stronie domowej.. Pomyślałem, że może warto zacząć spisywać na bieżąco swoje doświadczenia oraz przemyslenia zwiazane z systemem operacyjnym czy realizają przeróżnych projektów.&lt;br /&gt;Co z tego wyjdzie? Zobaczymy..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4674062119306020635-3040212141515397216?l=hwastu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwastu.blogspot.com/feeds/3040212141515397216/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4674062119306020635&amp;postID=3040212141515397216' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/3040212141515397216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4674062119306020635/posts/default/3040212141515397216'/><link rel='alternate' type='text/html' href='http://hwastu.blogspot.com/2008/10/hello-world.html' title='Hello World!'/><author><name>Hwast</name><uri>http://www.blogger.com/profile/02577205600305386900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
