1. Linux / GNU / Dystrybucje / Pakiety
Na początek trochę podstaw...
Co to jest Linux? - to tylko jądro systemu operacyjnego które w 1994 roku zaczął tworzyć student Politechniki Helsinskiej Linus Torvalds, ale powszechnie Linuxami się nazywa wszystkie odmiany Unix'a korzystające z tego jądra wraz oprogramowaniem systemowym.
Oprogramowanie systemowe które wchodzi w skład "Linuxów" to w 90% wynik pracy programistów z całego świata zapoczątkowanej na początku lat 80tych w ramach projektu GNU - prawidłową nazwą dla tego co potocznie nazywamy Linuxem jest GNU Unix.
Dystrybucje
Linux dociera do uzytkownikow w postaci tzw. dystrybucji. Dystrybucja to po prostu wersja instalacyjna oprogramowania Linuxowego.
Najbardziej popularne systemy do ogólnego stosowania to dystrybucje takie jak RedHat, Debian, Mandrake, Suze. Istnieją dystrybucje specjalistyczne np Lineo (urzadzenia wbudowane, zegarki, mikrokontrolery takze motoroli), Movix - multimedialne stacje do otwwarzania DVD/Divx/Mp3, Knoppix - wersja demonstracyjna Debiana uruchamiajaca sie z CDROM'u bootowalnego - nie wymaga instalacji na dysku twardym.
Pakiety
Dla ulatwienia instalowania i pielegnowania dystrybucji opracowane zostalo oprogramowanie do zarzadzania pakietami oprogramowania sa dwa dominujace systemy: RPM opracowany przez RedHat i wykorzystywany przez Mandrake, Suze i innych oraz system DEB opracowany przez Debiana.
Pakiet to wersja instalacyjna danego programu, dokumentacji lub plikow konfiguracyjnych która opisuje zaleznosci miedzy roznymi pakietami oprogramowania i zapewnia bezkonfliktowe instalowanie i odinstalowanie oprogramowania.
W przeciwienstwie do wiekszosci aplikacji Windows, instalacja oprogramowania z pakietu ma charakter pasywny, pakiet jest wczytywany przez program instalacyjny preinstalowany w systemie, sprawdzane są wszystkie zależności i jeśli są spełnione i nie wykryto żadnych konfliktów oprogramowanie z pakietu zostaje zainstalowane w systemie. Podobny bezpieczniejszy sposób instalowania programów stosuje od niedawna Microsoft w postaci plików MSI oraz mozilla pliki XPI.
Istnieją programy wspomagające instalowanie pakietów przez wykrywanie i zaspokajanie wszystkich niespełnionych zależności - korzystamy z takiego programu - apt/synaptic (jest to program z Debiana dostosowany do pracy w systemach zgodnych z RedHat)
Nasz MiniLinux jest rodzajem dystrybucji Linuxa opartej o inną dystrybucję (jak Knoppix) i wykorzystującą system pakietów RPM obecnie RedHat 8.0.
Licencja
Oprogramowanie tworzące GNU Unix'a tworzone jest w 99% na licencji GPL - Gnu Public Licence, która gwarantuje:
-
bezplatne korzystanie z oprogramowania
-
dostępność kodu źródłowego
-
brak możliwości zawłaszczenia oprogramowania przez jakąkolwiek firmę
Ciekawostki
-
95% kodu źródłowego wszystkich dystrybucji linuxa jest identyczne
-
GNU Unix powstał zanim powstał Linux, w ramach projektu GNU rozwijane jest inne jądro o architekturze mikrokernela Hurd (Linux to jądro monolityczne), ale ciągle jest w fazie testów i prawdopodobnie nigdy nie doścignie Linuxa.
-
Moze byc "Linux" bez Linuxa, np dystrybucja Debian pozwala na korzystanie z jądra Hurd
-
Wiele oprogramowania rozwijanego dla Linuxa dostępne jest na innych platformach systemowych KDE na Windows i FreeBSD, Konqueror jako przeglądarka internetowa Safari dla Macintoszach
-
Można sobie wyobrazić również nie Unix'a z Linuxem na pokladzie w tym kierunku idzie dystrybucja Lindows, która ma być systemem biurkowym dla przecietnego uzytkownika
2. MiniLinux
Minilinux to maly linux z duzego linuxa
Duza dystrybucja oparta o system RPM np. RedHat-> BUDOWANIE -> Dystrybucja do systemow wbudowanych MiniLinux.
Zalety:
-
zgodnosc ze standardowym srodowiskiem wytworczym
-
latwa pielegnowalnosc (w wypadku bugfixow up2date na systemie matce i przebudowanie)
-
latwe modyfikowanie instalowanych komponentow (files.txt files-ekgraf.txt)
Wady:
-
duzy rozmiar w porownaniu z typowymi systemami typu embedded duzy rozmiar (X'y,C++ = 50MB), (X'y,C++,PyQt,ghostscript,Omni= 215MB)
-
skomplikowane dodawanie elementów spoza dystrybucji (wniosek -> nalezy starac sie korzystac ze standardowych elementów linuxa, ideał: tylko standardowe elementy)
Istnieje mozliwosc dalszych optymalizacji rozmiaru, aby radykalnie zmniejszyc rozmiar MiniLinuxa należałoby:
-
Zrezygnowac z Xwindows na rzecz wyswietlania przy pomocy Qt-embedded (koszt ok 1500$)
-
Skrupulatnie (rowniez z pomocą deps.py) wykryc i usunąć nie używane pliki z instalacji.
-
Zaimplementowana jest metoda brute-force usuwania plikow (nalezy podac w momencie startu systemu opcje mkdist" (wiecej ~/minilnux/bin/mkdist.py i ~/minilinux/etc/minilinux.d/19mkdist) wykrywa i usuwa pliki ktore nie zostaly użyte w czasie korzystania z systemu - testy pokazują że w inkubatorze rozmiar systemu zmniejsza się o 50%, jest to jednak metoda ryzykowna - nie ma pewności że nie usunęliśmy pliku który potrzebny byłby w innym uruchomieniu programu - trudno przejść wszystkie scieżki
3. Budowanie systemu
System budowany jest w podkatalogu minilinux katalogu domowego uzytkownika przez wywolanie w rs/cfg/minilinux polecen make ( patrz plik Makefile) opisanych w MiniLinux z podaniem argumentu SYSTEM=inkub lub SYSTEM=ekgraf. Proces budowania łączy własne pliki konfiguracyjne, pliki dostępnych w systemie matce (na serwerze) oraz aplikację zainstalowaną w katalogu użytkownika określonym przez parametr SYSTEM=.
Budowanie systemu kończy się operacją minimalizowania rozmiaru przed wszystkim przez usunięcie informacji debugowych (reguła strip).
3.1. Struktura systemu (plików)
Drzewo katalogu root złożone jest z następujących elementów (katalog, reguła Makefile): -
katalogi /bin i /etc brane są z cfg/minilnux/dirs
-
katalog /sbin z narzędziami systemowymi jest tworzony jest głownie w oparciu o
System busybox oraz files.txt
-
katalogi /boot z jądrem tworzony regułą boot
-
katalog uchywtów urządzeń tworzony regułą devs
-
katalogi /usr i pozostale tworzone są w regule files z wykorzystaniem programów deps.py, linksresolve.py, konfiguracja instalowanych modułów dla deps.py przechowywana jest w plikach files.txt oraz files-ekgraf.txt
-
katalog z aplikacją /ekgraf czy /inkub (parametr SYSTEM=) kopiowany z $HOME
3.2. Zaszyste w Makefile elementy systemu
Zawartość katalogu root częściowo tworzona jest w oparciu o zaszyte reguły w Makefile'u projektu, dotyczą one najbardziej podstawowych elementów dystrybucji jak jądro, uchwyty urządzeń czy katalogi tymczasowe. Pozostałe elementy włączane są w sposób bardziej przejrzysty i konfigurowalny poprzez pliki files.txt i files-SYSTEM.txt opisane poniżej. Oto przykłady zaszytych reguł w Makefile:
-
regula tworzenia uchwytow urzadzeni (/dev)
devs:
$(CP) /dev/lp*
/dev/psaux
/dev/initctl
/dev/agpgart
/dev/kmem
/dev/mem
/dev/psaux
/dev/ram
/dev/hd[a-d][0-9]
/dev/tty[0-9]
/dev/ttyS[0-9]
/dev/console
/dev/std*
/dev/null
/dev/zero
/dev/itam-* $(MINILINUX)/
-
głowna reguła tworzenia systemu plików
files: files.txt
# utworzenie niektórych katalogów standardowych do montowania zasobow
-mkdir -p
$(MINILINUX)/proc
$(MINILINUX)/mnt/ram
$(MINILINUX)/mnt/smb
$(MINILINUX)/mnt/data
$(MINILINUX)/var
# utworzenie linkow w katalogach roboczych (tmp i var)
# przechowywanych w pamieci ram (tmpfs)
-ln -s /mnt/ram $(MINILINUX)/tmp
-ln -s /tmp/var/log $(MINILINUX)/var/log
# przekopiowanie katalogow wlasnych minilinuxa
cp -a dirs/* $(MINILINUX)
chown -R root.root $(MINILINUX)/*
# przekopiowanie programow wypisanych w files*.txt
# z usunieciem katalogów manuali
cat files.txt files-$(SYSTEM).txt |
deps.py -f - |
python linkresolve.py |
grep -v usr/man |
while read file;
do $(CP) $$file $(MINILINUX);
done
# utworzenie linków do programu busybox
./busyboxlinks.py
# rozne drobne patche
ln -s bash $(MINILINUX)/bin/sh
ln -s /sbin/env $(MINILINUX)/usr/bin
# tablica lokalnych systemow plikow
cp fstab.$(SYSTEM) $(MINILINUX)/etc/fstab
# reczne czyszczenie modulow dri z inkubatora
-[ "$(SYSTEM)" = inkub ] && rm -Rf $(MINILINUX)/usr/X11R6/lib/modules/dri
# reczne kopiowanie modulow pythona dla ekgrafu (nie uzywamy systemowego)
-[ "$(SYSTEM)" = ekgraf ] && $(CP) $(PYTHONDIR) $(MINILINUX)
3.3. Narzędzia do instalowania modułów określonych w plikach konfiguracyjnych files*.txt
3.3.1. deps.py
deps.py to program wykrywający zależności w podanych modułach (patrz. deps.py --help) którego wynikiem działania jest lista plików do przekopiowania (p. reguła files) na jego wejscie podawane są pliki konfiguracyjne files*.txt
deps.py rozpoznaje następujące zależności:
-
zależności między programami wykonywalnymi - rekurencyjnie odnajduje wszystkie potrzebne biblioteki dynamiczne dla podanego programu
[bartek@matrix rs]$
deps.py -b /opt/bin/python
/lib/ld-linux.so.2
/lib/libc.so.6 /lib/libdl.so.2
/lib/libgcc_s.so.1
/lib/libm.so.6
/lib/libpthread.so.0
/lib/libutil.so.1
/opt/bin/python
/usr/lib/libstdc++.so.5
-
zależności pakietów rpm zarówno w domenie systemu rpm jak i zależności binarnych (j.w.)
[bartek@matrix rs]$ deps.py -b rpm:dhclient
/lib/ld-linux.so.2
/lib/libc.so.6
/sbin/dhclient
/sbin/dhclient-script
/usr/share/doc/dhclient-3.0pl1/dhclient.conf.sample
/usr/share/man/man5/dhclient.conf.5.gz
/usr/share/man/man5/dhclient.leases.5.gz
/usr/share/man/man5/dhcp-options.5.gz
/usr/share/man/man8/dhclient-script.8.gz
/usr/share/man/man8/dhclient.8.gz
vs pelne zaleznosci RPM
[bartek@matrix rs]$ deps.py -b RPM:dhclient
/sbin/dhclient
/sbin/dhclient-script
...
/bin/arch
/bin/bash
/bin/bash2
/bin/dmesg
/etc/bashrc
/etc/csh.cshrc
/etc/csh.login
/etc/exports
...
/usr/share/doc/bash-2.05b/CHANGES
/usr/share/doc/bash-2.05b/COMPAT
/usr/share/doc/bash-2.05b/FAQ
/usr/share/doc/bash-2.05b/INTRO
...
razem 810 plików !!!
ponieważ rpm dhclient wymaga m.in initscripts
a initscripts wymaga modutils, util-linux,
SysVinit, net-tools, fileutils itd... itd...
importowane moduły pythona uruchamia podane programy pythonowe i wykrywa wszystkie moduly ktore zostaly przez nie zaimportowane
#wszystko co potrzeba by uruchomic program deps.py
[bartek@matrix tools]$ deps.py -b /opt/bin/python deps.py
/home/bartek/rs/lib/python/sitecustomize.pyc
/lib/ld-linux.so.2
/lib/libc.so.6
/lib/libdl.so.2
/lib/libgcc_s.so.1
/lib/libm.so.6
/lib/libpthread.so.0
/lib/libutil.so.1
/usr/lib/libstdc++.so.5
/opt/bin/python
/opt/lib/python2.3/UserDict.pyc
/opt/lib/python2.3/codecs.pyc
/opt/lib/python2.3/copy_reg.pyc
/opt/lib/python2.3/encodings/__init__.pyc
/opt/lib/python2.3/encodings/aliases.pyc
/opt/lib/python2.3/encodings/iso8859_2.pyc
/opt/lib/python2.3/encodings/utf_8.pyc
/opt/lib/python2.3/fnmatch.pyc
/opt/lib/python2.3/getopt.pyc
/opt/lib/python2.3/glob.pyc
/opt/lib/python2.3/lib-dynload/strop.so
/opt/lib/python2.3/linecache.pyc
/opt/lib/python2.3/os.pyc
/opt/lib/python2.3/popen2.pyc
/opt/lib/python2.3/posixpath.pyc
/opt/lib/python2.3/re.pyc
/opt/lib/python2.3/site-packages/japanese/__init__.py
/opt/lib/python2.3/site-packages/japanese/aliases/__init__.py
/opt/lib/python2.3/site.pyc
/opt/lib/python2.3/sre.pyc
/opt/lib/python2.3/sre_compile.pyc
/opt/lib/python2.3/sre_constants.pyc
/opt/lib/python2.3/sre_parse.pyc
/opt/lib/python2.3/stat.pyc
/opt/lib/python2.3/string.pyc
/opt/lib/python2.3/types.pyc
/opt/lib/python2.3/warnings.pyc
przykład pliku konfiguracyjnego takiego jak files.txt
# python (nasz nie z dystrybucji serwera)
/opt/bin/python
#python - parser xml dla pythona
/usr/lib/libexpat.so
# moduł ghostcript wraz modułami od których zależy - RPM- drukowanie
RPM:fontconfig
# fonty dla Xwindows bez modułów wymaganych
# (np. bez serwera fontow ktorego nie uzywamy)
rpm:XFree86-75dpi-fonts
# modul dhcclient rpm:dhclient
# bilblioteki qt i pyqt - mozna uzywac wildcardow
/opt/devel/pyqt-3.8/*.* /opt/devel/qt-2.3.1/lib
3.3.2. Inne
linksresolve.py - wykrywanie zaleznosci symbolicznych - rozwiniecie danego linku symbolicznego na wszystkie jego dolinkowania az do pliku docelowego
[bartek@matrix minilinux]$
echo /lib/ld-linux.so.2 |
linkresolve.py /lib/ld-linux.so.2 /lib/ld-2.3.2.so
busyboxlinks.py - wytworzenie linków symbolicznych programów obsługiwanych przez busybox