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:

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

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:

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ć:

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.


Przypisy:

  1. http://live.debian.net/manual/current/html/live-manual.en.html
  2. http://dug.net.pl/tekst/163/priorytety_pakietow_%28apt_pinning__pin_priority%29/
  3. http://snapshot.debian.org/package/live-boot/4.0%7Ea7-1/#live-boot_4.0:7e:a7-1