Artykuł przedstawia budowę spersonalizowanego systemu Debian Live za pomocą narzędzia live-build.
Po więcej informacji zapraszam
TUTAJ [1]
Zaczynamy od instalacji pakietu live-build za pomocą preferowanego menedżera pakietów
apt-get install live-build
!!! UWAGA !!! - Pakiet debootstrap w wersjach wcześniejszych niż 1.0.47 (obecnie w sid), zawiera błąd uniemożliwiający poprawne działanie pakietu live-build. Jeżeli zatem nie używamy Debiana w wersji Sid, należy zaktualizować debootastrap ręcznie. Najprościej można to zrobić następująco:
nano /etc/apt/sources.list
dopisujemy linię:
deb http://ftp.us.debian.org/debian sid main
aktualizujemy repozytoria:
apt-get update
instalujemy debootstrap z Sid'a:
apt-get -t sid install debootstrap
Wracamy do /etc/apt/sources.list, usuwamy dopisaną wcześniej linię i ponownie aktualizujemy repozytoria:
apt-get update
O bardziej kompleksowych i eleganckich metodach można przeczytać TUTAJ [2]
Przygotowujemy miejsce w którym powstanie nasz obraz i wchodzimy do środka:
mkdir live && cd live
!!! Uwaga - wszystkie ścieżki podawane w dalszej części artykułu jako punkt wyjścia będą zakładać powyższy katalog live
Tyle przygotowań - czas wyprodukować nasz system.
Sprowadza się to w zasadzie do wydania dwóch komend:
lb config [parametr1] [parametr2] [itp] [itd]
Za pomocą której ustalamy szczegóły konfiguracji systemu.
lb build
Za pomocą której nakazujemy rozpoczęcie budowy obrazu, według sprecyzowanej wyżej konfiguracji.
W najprostszym wypadku możemy się ograniczyć do :
lb config
lb build
Uzyskamy w ten sposób domyślny nieciekawy obraz .iso. Nam zależy jednak na spersonalizowanym systemie, a zatem musimy zagłębić się nieco w meandry lb config.
KONFIGURACJA SYSTEMU
Kompletna lista parametrów dla lb config znajduje się w:
man lb_config
Poniżej przedstawiam kilka najbardziej użytecznych:
"-d" -Służy do wyboru preferowanej gałęzi Debiana. Przykład:
-d sid
"-b" -Określa typ budowanego obrazu. Jeżeli planujemy umieszczenie systemu na pendrivie, warto użyć opcji hdd - uzyskamy w ten sposób obraz z rozszerzeniem .img zamiast domyślnego .iso ,dzięki czemu będziemy, w razie czego, mogli później łatwo edytować gotowy już system. Przykład:
-b hdd
"--archive-areas" -Domyślne ustawienia pozwalają jedynie na instalcję oprogramowania z sekcji "main". Za pomocą tego parametru możemy wskazać by do naszej dyspozycji na etapie budowy obrazu, były również sekcje contrib i non-free (co jest szczególnie istotne w przypadku gdy potrzebny jest nam niewolny firmware). Przykład:
--archive-areas "main contrib non-free"
"-a" -Określa architekturę tworzonego systemu (domyślnie - taka jak system gospodarz). Przykład:
-a i386
"--linux-flavours" -Umożliwia wybór jednego lub więcej dystrybucyjnych kerneli dla naszego systemu. Pierwszy podany będzie wybierany domyślnie podczas startu. Dla architektury i386, dodawane są domyślnie zarówno 686 jak i 486. Jeżeli nie chcemy aby 486 był dodawany, należy posłużyć się wpisem takim jak w poniższym przykładzie.Przykład:
--linux-flavours 686-pae
"--interactive shell" -Do tego parametru nie potrzeba żadnych dodatkowych opcji. Użycie go spowoduje, że w odpowiedniej fazie budowy obrazu nastąpi pauza i pojawi się możliwość ręcznej konfiguracji systemu przez chroot. Wygląda to po prostu tak, że budowa się zatrzymuje i pojawia się linia komend (z gotowym chrootem do naszego Debiana Live). Możemy w tutaj robić wszystko od instalacji pakietów poprzez ustawianie haseł, dodawanie użytkowników itd. Po zakończeniu dłubania, opuszczamy chroot komendą exit, co spowoduje automatyczne wznowienie procesu budowy.
"--bootappend-live" -Umożliwia dodanie na stałe odpowiednich parametrów startowych do naszego systemu. Przykład:
--bootappend-live "boot=live config quiet locales=pl_PL.UTF-8 keyboard-layouts=pl username=NAZWA_UŻYTKOWNIKA"
Parametry boot=live oraz config powinny być zawsze obecne, reszta według uznania.
Oto kilka ciekawszych opcji (więcej można znaleźć m.in. w man'ach live-config i live-boot):
"quiet" -Powoduje ograniczenie ilości komunikatów wyświetlanych w trakcie startu systemu.
"locales=pl_PL.UTF-8" -Ustawia polską lokalizację systemu.
"keyboard-layouts=pl" -Ustawia polski układ klawiatury.
"username=NAZWA_UŻYTKOWNIKA" -Zmienia nazwę domyślnie tworzonego użytkownika na podaną (patrz ZARZĄDZANIE UŻYTKOWNIKAMI)
"user-default-groups=GRUPA1,GRUPA2,GRUPA3" -Dodaje domyślnego użytkownika do podanych grup (domyślnie użytkownik dodawany jest do grup: audio cdrom dip floppy video plugdev netdev powerdev scanner bluetooth)
"timezone=Europe/Warsaw" -Zmienia strefę czasową na wskazaną.
"hostname=NAZWA_HOSTA" -Zmienia nazwę hosta na wskazaną.
"noautologin" -Wyłącza automatyczne logowanie na konto domyślnego użytkownika.
"persistence" -Umożliwia zachowywanie zmian dokonanych w systemie (patrz PERSISTENCE).
"persistence-encryption=luks" -Umożliwia zachowywanie zmian w systemie na zaszyfrowanym nośniku (patrz PERSISTENCE).
"--debian-installer" -Dodaje wybrany instalator Debiana do tworzonego obrazu. Oznacza to że nasz pendrive z Debianem Live, będzie mógł służyć równocześnie do klasycznej instalacji "zwyczajnego" Debiana na dysku twardym. Instalator będzie normalnie dostępny z poziomu bootloadera. Dostępne opcje to m.in standardowe: cdrom netinst businesscard. Najciekawszą jest jednak opcja: live. Jej użycie spowoduje, że w razie instalacji, na dysk instalowany będzie nasz system live. Przykład:
--debian-installer live
"--mirror-bootstrap" -Umożliwia wybór mirror'a Debiana używanego podczas budowy systemu. Domyślnie jest to http://ftp.de.debian.org/debian więc nie ma potrzeby tego zmieniać, ale w razie jakichś problemów z serwerem można sobie inny ustawić. Przykład:
--mirror-bootstrap http://ftp.pl.debian.org/debian/
Tyle teorii. W praktyce wygląda to następująco. Będąc w naszym katalogu "live" wydajemy komendę:
lb config -d wheezy -b hdd --archive-areas "main contrib non-free" --interactive shell --linux-flavours 686-pae --bootappend-live "boot=live config quiet locales=pl_PL.UTF-8 keyboard-layouts=pl persistence" --mirror-bootstrap http://ftp.pl.debian.org/debian/
oraz
lb build
Rozpocznie się budowa systemu według konfiguracji, którą podaliśmy z lb config. W normalnych okolicznościach nasza praca na tym się kończy - jednak w powyższym przykładzie posłużyliśmy się parametrem --interactive shell. Jak wspomniałem wcześniej, spowoduje to ,że proces budowy zostanie w odpowiednim momencie wstrzymany, dając nam możliwość ręcznej konfiguracji systemu, w tym co najistotniejsze, instalacji dodatkowych pakietów. Należy koniecznie pamiętać by wznowić proces budowy komendą exit, gdy już naniesiemy wszystkie pożądane poprawki.
Po zakończeniu procesu budowy, gotowy obraz będzie czekał w naszym katalogu "live" pod nazwą binary.hybrid.iso lub binary.img (w zależności jaką opcję dodaliśmy wcześniej w lb config do parametru -b).
Dla porządku powiedzmy, że w wyniku powyższej konfiguracji uzyskamy:
Obraz .img Debiana Live Wheezy z jądrem 3.2.0.4 686-pae, polską lokalizacją i układem klawiatury oraz możliwością zapisywania zmian (o ile zastosujemy się do instrukcji w dziale PERSISTENCE - poniżej). Jako mirror, w procesie budowy wykorzystany będzie http://ftp.pl.debian.org/debian/
. W trakcie budowy udostępniona będzie linia komend za pomocą której będziemy mogli dokonać pożądanych zmian w systemie (np zainstalować dodatkowe pakiety za pomocą apt-get install, czy ustawić hasło roota).
Jeżeli jesteśmy niezadowoleni z uzyskanego rezultatu i chcemy powtórzyć całą procedurę z nowymi opcjami konfiguracyjnymi, musimy wydać (będąc w katalogu live) komendę:
lb clean --purge
Cała konfiguracja zostanie w ten sposób "zresetowana", usunięty zostanie również poprzedni obraz binary.img/iso
PERSONALIZACJA ZA POMOCĄ PLIKÓW KONFIGURACYJNYCH
Zamiast wpisywania całego wianuszka opcji bezpośrednio do lb config, tak jak zostało to przedstawione powyżej, można posłużyć się bardziej eleganckim rozwiązaniem w postaci gotowych plików konfiguracyjnych. Będzie to znaczne udogodnienie, jeżeli planujemy w dalszej lub bliższej przyszłości powtórzyć proces budowy. Pliki te warto zachować sobie gdzieś na dysku, aby mieć gotową konfigurację systemu zawsze pod ręką.
Na początek będąc w pustym katalogu live wydajemy komendę:
lb config
W jej wyniku powstaną 3 nowe katalogi auto, config i local Nas interesują szczególnie dwa pierwsze. W katalogu auto należy umieścić skrypt o nazwie config zwierający wszystkie pożądane przez nas parametry lb config. Szablon tegoż skryptu możemy znaleźć w
/usr/share/doc/live-build/examples/auto/
Są tam również szablony dwóch innych skryptów, których nie będziemy tu wykorzystywać, jednak dla porządku przekopiujmy wszystko do katalogu auto
Będąc w katalogu live, komenda:
cp /usr/share/doc/live-build/examples/auto/* auto/
Ok, czas wpisać do skryptu "config", nasze parametry dla lb config. Otwieramy go ulubionym edytorem tekstu i dopisujemy pożądane parametry. Finalnie ma to wyglądać np w ten sposób:
#!/bin/sh
lb config noauto \
-d wheezy \
-b hdd \
--archive-areas "main contrib non-free" \
--linux-flavours 686-pae \
--bootappend-live "append boot=live config quiet locales=pl_PL.UTF-8 keyboard-layouts=pl persistence" \
--mirror-bootstrap http://ftp.pl.cdebian.org/debian/ \
"${@}"
Możemy dodawać tyle parametrów ile chcemy, jednak należy zwrócić szczególną uwagę na znak backslash na końcu każdej linii.
Teraz czas na listę dodatkowych pakietów. Tutaj sprawa jest jeszcze prostsza. Przechodzimy do katalogu:
config/package-lists
i tworzymy za pomocą ulubionego edytora plik zawierający listę pakietów do zainstalowania. Nazwa pliku może być dowolna, jednak musi posiadać rozszerzenie .list.chroot Czyli np:
moje_programy.list.chroot
W plik wpisujemy po prostu nazwy pakietów jedna pod drugą np:
xorg
fluxbox
iceweasel
mc
firmware-iwlwifi
wicd
Istnieje również możliwość dodawania własnych repozytoriów. W tym celu tworzymy plik:
config/archives/moje_repozytorium.list.chroot
do którego wpisujemy odpowiedni adres np:
deb http://moblock-deb.sourceforge.net/debian wheezy main
Klucz GPG, którym repozytorium jest podpisane wklejamy do:
config/archives/moje_repozytorium.key.chroot
Można w końcu skopiować własne paczki .deb do katalogu:
config/packages.chroot/
Zostaną one automatycznie zainstalowane w trakcie budowy obrazu.
Gdy wszystkie pliki zostały już przygotowane, wystarczy wydać polecenie
lb build
Tak jak poprzednio - gotowy obraz będzie czekał w naszym katalogu live, pod nazwą binary.img lub binary.hybrid.iso
Jeżeli nie jesteśmy zadowoleni z otrzymanego obrazu i chcemy spróbować jeszcze raz, czyścimy poprzednią konfigurację komendą:
lb clean --purge
Trzeba jednak pamiętać, że wszystkie nasze pliki konfiguracyjne z pakietami, parametrami dla lb config pozostaną bez zmian. lb clean czyści jedynie te parametry, które do lb config dodane zostały ręcznie. Listy konfiguracyjne musimy edytować sami.
ZARZĄDZANIE UŻYTKOWNIKAMI
Domyślny użytkownik (login=user hasło=live) nie jest "na stałe" obecny w systemie, lecz za każdym razem od nowa tworzony podczas startu systemu. Włączone jest również jego autologowanie oraz "wszystko-mogące" uprawnienia sudo bez podawania hasła. Hasło roota nie jest w ogóle ustawione. Możemy oczywiście zmienić tą konfigurację na bardziej klasyczną:
autologowanie wyłączamy dodając do --bootappend-live opcję:
noautologin
Tworzenie domyślnego użytkownika wyłączamy dodając do --bootappend-live opcję:
noconfig=user-setup
UWAGA - powyższą opcję należy podać ZAMIAST standardowej opcji config (patrz wyżej)
Aby ustawić hasło roota i dodać własnego użytkownika, na etapie ustalania opcji konfiguracyjnych systemu używamy paramnetru --interactive shell (patrz wyżej). Po uzyskaniu w trakcie budowy systemu dostępu do linii komend ustawiamy hasło root za pomocą:
passwd
i dodajemy użytkownika:
useradd NAZWA_UŻYTKOWNIKA
W przypadku systemu z persistence - czyli możliwością zachowywania zmian, możliwe jest również dodanie użytkownika bezpośrednio z poziomu działającego gotowego systemu.
KOPIOWANIE NA PENDRIVE
Gotowy obraz możemy wypalić na płycie, lub co wygodniejsze pod każdym względem - umieścić na pendrivie. W tym celu należy posłużyć się programem dd:
dd if=/ścieżka/do/obrazu.iso of=/dev/sdX
gdzie sdX to nasz pendrive. W razie wątpliwości symbol pendrive można sprawdzić np w gparted.
dd kopiuje obraz bezpośrednio na pendrive - nie na partycję (dlatego w poleceniu jest sdX a nie np sdX1). Wszystkie dane obecne na pendrivie zostaną utracone. Po tej operacji na pendrivie znajdzie się partycja z systemem live, odpowiadająca wielkością naszemu obrazowi. Reszta miejsca będzie niezagospodarowana - co wykorzystamy już niebawem.
PERSISTENCE - czyli możliwość zapisywania zmian
W klasycznym systemie Live użytkownik nie ma możliwości zapisywania zmian. W zależności od tego do czego wykorzystujemy naszego Debiana live - może być to bardzo uciążliwe. W gotowym systemie nie da rady bowiem zainstalować dodatkowych programów czy chociażby zachować zakładek w przeglądarce internetowej. Oczywiście da się to w łatwy sposób zmienić. Persistence, czyli możliwość zapisywania zmian w systemie Live można osiągnąć na kilka sposobów. Tutaj zajmiemy się metodą polegającą na wykorzystaniu pozostałej po instalacji pustej przestrzeni na pendrivie.
Wpinamy pendrive i za pomocą preferowanego programu partycjonującego tworzymy dodatkową partycję na dostępnej przestrzeni.
Za pomocą fdisk wygląda to następująco:
fdisk /dev/sdX
klawiszem n tworzymy nową partycję
zatwierdzamy enterem typ partycji (domyślnie podstawowa)
zatwierdzamy enterem początek partycji
zatwierdzamy enterem koniec partycji
zapisujemy zmiany klawiszem w
Uzyskamy w ten sposób jedną dużą podstawową partycję zajmującą całość dostępnej wolnej przestrzeni na naszym pendrivie.
Pozostało nam sformatowanie nowej partycji. Tutaj ważna uwaga. Aby nasz Debian Live mógł ją wykorzystać do zapisywania zmian, partycja musi posiadać etykietę persistence. Możemy to ustawić przy okazji formatowania:
mkfs.ext2 -L persistence /dev/sdXY
gdzie X to symbol pendriva a Y - numer partycji (czyli zapewne sdb2)
Teraz montujemy partycję:
mount /dev/sdXY /mnt
i za pomocą ulubionego edytora tekstu tworzymy plik:
nano /mnt/persistence.conf
A do środka wpisujemy:
/ union
Powyższy wpis spowoduje, że wszelkie zmiany jakich dokonamy w systemie live, zostaną zapisane na naszej partycji. Jeżeli z jakichś powodów chcemy, żeby zapisywane były jedynie zmiany dokonane w konkretnych katalogach np tylko /home i /usr/bin, wpisujemy:
/home union
/usr/bin union
Na koniec musimy sprawić aby Debian live startował z parametrem persistence
Można to osiągnąć na kilka sposobów:
Przy starcie systemu na ekranie bootloadera naciskamy klawisz TAB i wpisujemy:
persistence
Jest to tyle niewygodne że trzeba o tym pamiętać przy każdym starcie systemu.
Na etapie budowy systemu używamy opcji persistence z parametrem --bootappend-live np:
--bootappend-live "boot=live config persistence"
Przypominam, że należy to wpisać bezpośrednio do lb config ( np lb config --bootappend-live "boot=live config persistence") lub dodać do skryptu auto/config.
Jeżeli użyliśmy na etapie budowy systemu opcji "-b hdd" (czyli nasz obraz ma rozszerzenie .img), możemy po prostu zamontować partycję z naszym systemem:
mount /dev/sdX1 /mnt
i za pomocą edytora tekstu dodać parametr persistence do pliku:
/mnt/syslinux/live.cfg
Powinno to wyglądać np w ten sposób:
label live-686-pae menu label ^Live (686-pae) menu default linux /live/vmlinuz initrd /live/initrd.img append boot=live config persistence
SZYFROWANA PARTYCJA PERSISTENCE
Jeżeli boimy się, że zgubimy gdzieś pendrive i niepowołane osoby poznają nasze hasła do poczty itd. możemy stworzyć sobie zaszyfrowaną partycję na persistence.
!!! UWAGA !!! Do poprawnego działania zaszyfrowanej partycji persistence wymagany jest pakiet cryptsetup. Musimy go zainstalować na etapie budowy systemu. Po informacje jak to zrobić odsyłam wyżej.
Tworzenie partycji wygląda tak jak poprzednio, na razie jednak jej nie formatujemy, lecz wydajemy polecenie:
cryptsetup luksFormat /dev/sdXY
Zostaniemy poproszeni o potwierdzenie i wpisanie dużego YES. Następnie musimy ustalić hasło.
Wpisujemy je raz... i drugi
Właśnie zaszyfrowaliśmy naszą partycję. Teraz trzeba ją sformatować, dodać etykietę persistence i utworzyć na niej plik persistence.conf z odpowiednim wpisem (tak jak poprzednio)
A więc:
cryptsetup luksOpen /dev/sdXY NAZWA
Jako NAZWA wpisujemy cokolwiek (ważne tylko żebyśmy zapamiętali co wpisaliśmy :D )
Formatujemy i ustawiamy etykietę:
mkfs.ext2 -L persistence /dev/mapper/NAZWA
Jako NAZWA podajemy to co wpisaliśmy w poprzednim poleceniu.
Montujemy i tworzymy plik persistence.conf z odpowiednią zawartością (jak wyżej)
mount /dev/mapper/NAZWA /mnt
nano /mnt/persistence.conf
Odmontowujemy:
umount /mnt
i zamykamy nasz sejf :)
cryptsetup luksClose NAZWA
Teraz wszystkie zmiany jakich dokonamy w naszym systemie będą bezpiecznie schowane na zaszyfrowanej partycji.
Oczywiście tak jak w poprzednim przypadku musimy upewnić się, że nasz system będzie startował z parametrem persistence. Dodatkowo w przypadku zaszyfrowanej partycji, oprócz parametru persistence potrzebny będzie jeszcze jeden:
persistence-encryprion=luks
Jeżeli zamierzamy uruchamiać system z zaszyfrowaną partycją na komputerze, którego dysk również zawiera zaszyfrowane partycje warto dodać jeszcze jeden parametr:
persistence-media=removable
Dzięki temu poinformujemy Debiana Live żeby ignorował i nie pytał o hasło (którego podanie i tak nic by nie dało) do zaszyfrowanych partycji wykrytych na lokalnym dysku twardym.
Na koniec dodatek na temat zaszyfrowanych partycji.
Powyższy opis przedstawia - jak powinno to wyglądać w teorii. Niestety na dzień dzisiejszy w pakiecie live-boot istnieje błąd powodujący, że system nie potrafi poprawnie wykryć i zamontować zaszyfrowanej partycji. Innym słowy zmiany nie zostają zachowane. Co prawda błąd został już poprawiony, jednak poprawka znajduje się jedynie w live-boot4.0, która to wersja tkwi w expernimentalu. Żeby było zabawniej, obecna wersja z experimental nie działa z Wheezym i Sidem. Na szczęście można to obejść.
W tym miejscu podziękowania dla użytkownika dzz
z forums.debian.net
Oto sposób jak sprawić żeby Debian live działał poprawnie z zaszyfrowaną partycją:
Pobieramy pakiet live-boot4.0~a7-1 TUTAJ [3]
UWAGA musi to być właśnie ta wersja - skrypty w nowszych wersjach nie działają poprawnie na Wheezym i Sidzie.
Rozpakowujemy:
ar -xv live-boot_4.0~a7-1_all.deb
Rozpakowujemy dalej:
tar xJf data.tar.xz
Interesuje nas zawartość katalogu lib/live. W środku znajdziemy katalog boot i skrypt boot.sh - kopiujemy je w bezpieczne miejsce, a całą resztę możemy wywalić.
W ten sposób weszliśmy w posiadanie kompatybilnych z Wheezym i Sidem skryptów w których błąd z wykrywaniem zaszyfrowanej partycji został poprawiony. Teraz musimy je wsadzić do naszego Debiana Live.
Montujemy partycję z naszym live systemem:
mount /dev/sdX1 /mnt
i kopiujemy /mnt/live/initrd.img do przygotowanego wcześniej katalogu. Powiedzmy że ten katalog nazywa się fixme
w naszym katalogu fixme tworzymy następny katalog uz.
Czyli ostatecznie mamy katalog fixme a w środku skopiowane z Debiana live initrd.img i pusty katalog uz
Definiujemy sobie zmienną:
INITRD=initrd.img
i koniecznie będąc w katalogu uz dajemy:
fakeroot zcat ../$INITRD | cpio -i
Obecnie w katalogu uz powinna znajdować się rozpakowana zawartość initrd.img z Debiana Live. Naszym zadaniem jest podmienić:
fixme/uz/lib/live/boot
fixme/uz/lib/live/boot.sh
na te,które pozyskaliśmy wcześniej z pakietu live-boot_4.0~a7-1_all.deb
Gdy już to zrobimy, wracamy do katalogu uz i wykonujemy:
fakeroot find . -print0 | cpio -0 -H newc -o | gzip -c > ../initrd.rebuilt
W katalogu fixme czeka już na nas poprawiony initrd.rebuilt
Nadajemy mu wykonywalność:
chmod +x initrd.rebuilt
zmieniamy nazwę:
mv initrd.rebuilt initrd.img
i umieszczamy na swoim miejscu, czyli w /mnt/live (o ile zamontowaliśmy partycję z debianem live w /mnt). Stary initrd.img należy oczywiście usunąć.
Hurra - nasz Debian Live poprawnie wykrywa zaszyfrowana partycję na persistence.