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.