Raspberry Pi – Obraz skrojony na miarę

Hej! W dzisiejszym artykule dowiemy się jak przenieść obraz systemu, który fizycznie zajmuje np. 1 GB z karty o dużej pojemności na mniejszą kartę. W moim przypadku będzie to przeniesienie systemu zajmującego około 1,2 GB z karty 16 GB na kartę 2GB. Analogiczny ruch będziemy mogli wykonać w drugą stronę, czyli jeżeli braknie nam miejsca na aktualnej karcie możemy z łatwością przenieść cały sytem bez szwanku na większą kartę :)

Wszystkie operacje będę wykonywał na systemie linux, ponieważ zawiera on w sobie bardzo wygodne narzędzia do operowania na obrazach kart i partycjach.

Zgrywamy obraz z karty

Pierwsze co musimy znać to nazwę naszej karty w systemie. Aby ją poznać wpisujemy w terminalu polecenie lsblk lub uruchamiamy porgram GParted.

Jak widać w obu programach nasza karta jest podpisana jako /dev/mmcblk0 i tego będziemy się trzymali :)

Teraz za pomocą polecenia dd oraz opcjonalnie pv zgramy obraz karty na dysk.

Polecenie dd przepisuje bez żadnego sprawdzania bajt po bajcie zawartość pliku wejściowego do wyjściowego. Przyjmuje parametry if= oraz of=, które oznaczają kolejno nazwę pliku wejściowego oraz wyjściowego. Należy bezwzględnie pamiętać o tym, aby ich ze sobą nie pomylić bo możemy w ten sposób nieźle namieszać!

Za pomocą polecenia pv możemy na bieżąco monitorować postęp kopiowania.

Aby skopiować obraz karty do pliku wpisujemy do konsoli

sudo dd if=/dev/mmcblk0 of=~/Desktop/obraz.img

gdzie w parametrze if= podajemy ścieżkę do naszej karty, a w of ściężkę do pliku gdzie ma zapisać obraz.

Jeżeli chcemy na bieżąco widzieć postęp kopiowania i prędkość możemy wpisać

sudo dd if=/dev/mmcblk0 | pv -s 16G | dd of=~/Desktop/obraz.img

gdzie w parametrze -s wpisujemy rozmiar naszej karty.

Kiedy mamy już zgrany obraz z dużej karty musimy zamontować go w systemie, a następnie przyciąć do minimum.

Montowanie obrazu

Aby zamontować obraz jako normalne urządzenie w systemie wykonujemy następujące polecenia:

sudo modprobe loop
sudo losetup -f

Po wykonaniu tego drugiego polecenia konsola zwróci nam informację o adresie naszego wirtualnego urządzenia. Teraz montujemy nasz obraz pod tym adresem:

sudo losetup /dev/loop0 ~/Desktop/obraz.img
sudo partprobe /dev/loop0

Zmniejszanie rozmiaru partycji

Teraz za pomocą programu GParted możemy przyciąć nieco naszą partycję usuwająć z niej nieużywane miejsce.

sudo gparted /dev/loop0

Otworzy nam się okienko programu GParted z wybranym dyskiem /dev/loop0. Teraz wybieramy partycję, na której jest zainstalowany system (u mnie jest to partycja /dev/loop0p2) i zmniejszamy jej rozmiar do najmniejszego jaki możemy.

Następnie zatwierdzamy operacje zielonym ptaszkiem.

Kiedy GParted wykona swoją pracę możemy go wyłączyć, a następnie wpisać w konsoli

sudo losetup -d /dev/loop0

aby wyłączyć loop0.

Przycinamy obraz

Aby odpowiednio przyciąć obraz karty wpisujemy w konsoli polecenie

fdisk -l ~/Desktop/obraz.img

Naszym oczom powinien ukazać się mniej więcej taki wynik: To co nas interesuje to rozmiar bloku, który w moim przypadku wynosi 512 bajtów (na zrzucie 1 * 512 = 512 bytes) oraz ostatni blok zmniejszonej partycji, który w moim przypadku wynosi 31225855.

Będąc w posiadaniu tych informacji możemy ostatecznie przyciąć nasz obraz do pożądanych rozmairów wpisując polecenie

truncate --size=$[(OSTATNI_BLOK+1)*ROZMIAR_BLOKU] ~/Desktop/obraz.img

gdzie OSTATNI_BLOK to u mnie 31225855, a ROZMIAR_BLOKU to 512. Obcinamy o jeden blok dalej niż ostatni, stąd to +1 w równaniu.

Wgrywamy obraz na mniejszą kartę

Kiedy mamy już mały obraz możemy wgrać go na nową kartę zamieniając if= z of=

sudo dd if=~/Desktop/obraz.img | pv -s 16G | dd of=/dev/mmcblk0

Po wgraniu obrazu na kartę możemy odpalić jeszcze raz GParted i zwiększyć partycję, którą wcześniej zmniejszaliśmy tak, żeby wypełniła całą wolną przestrzeń.

Podobnie zrobimy, kiedy wgramy mniejszy obraz na większą kartę. Wystarczy otworzyć ją w programie GParted i rozszerzyć ile fabryka dała :) Jeżeli nie chcemy bawić się GPartedem, a mamy akurat Raspbiana to z pomocą polecenia raspi-config możemy wybraż opcję Expand filesystem, co da nam ten sam efekt.