Jak zmienić rozmiar pliku obrazu przed zapisaniem na karcie SD?

13

Próbowałem utworzyć nowy obraz Raspbian z innym jądrem (z obsługą CAN) i zainstalowanym Pythonem 3.3. Zamiast robić to wszystko na Raspberry Pi, pomyślałem, że byłoby to interesujące zrobić to na komputerze (postępując zgodnie z tymi instrukcjami ). Jednak po zamontowaniu obrazu i przygotowaniu go do pracy szybko zabrakło mi miejsca na dysku. Zakładam, że dzieje się tak, ponieważ rozmiar obrazu jest tylko wystarczająco duży, z oczekiwaniem, że użytkownik zmieni rozmiar systemu plików po zapisaniu go na karcie SD.

Czy można zmienić rozmiar obrazu i systemu plików przed zapisaniem go na karcie SD, aby móc wykonać więcej dostosowań bez wyczerpania miejsca?

DrAl
źródło
To pytanie prawdopodobnie ci pomoże.
Jivings
1
@ Jivings: wszystkie te odpowiedzi opisują, jak zmienić rozmiar obrazu po zapisaniu go na karcie SD. Wiem jak to zrobić; Interesuje mnie, jak zmienić rozmiar obrazu przed zapisaniem go na karcie SD.
DrAl

Odpowiedzi:

8

Oto jak zmienić rozmiar surowego pliku obrazu. Wiem, że to głupio uproszczone, ale zadziała.

Utwórz pusty obraz o rozmiarze, który chcesz rozwinąć w oryginale (w moim przykładzie używam 5 GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Dołącz to do oryginalnego obrazu:

cat /path/to/temp_image >> /path/to/rasperrypi.img

Zmień rozmiar systemu plików, który znajduje się na końcu dysku (zwykle jest to ten, który chcesz większy):

resize2fs -f /path/to/rasperrypi.img

Gotowy! Twój dysk powinien być teraz o 5 GB większy!

Jivings
źródło
Brzmi idealnie, dziękuję: przetestuję to dziś wieczorem.
DrAl
5
Właśnie próbowałem tego i kiedy przechodzę do etapu resize2fs (po dodaniu 1 GB do pliku), pojawia się komunikat „Zła liczba magiczna w superbloku podczas próby otwarcia 2012-12-16-wheezy-raspbian.img Couldn” t znaleźć prawidłowy superblok systemu plików. ” Wszelkie sugestie dotyczące tego, co robię źle?
DrAl
Wydaje mi się, że to problem z tym, że próbuję zmienić rozmiar całego obrazu (odpowiednik / dev / sda) zamiast partycji (odpowiednik / dev / sda2). Mogę się jednak mylić i wypróbowałem kilka innych rzeczy bez powodzenia (np. Zmiana rozmiaru partycji za pomocą fdisk, która wydaje się działać, ale nie pomaga mi zmienić rozmiaru systemu plików).
DrAl
3
Dobra, znalazłem odpowiedź na ostatni kawałek z odrobiną googlingu: Musiałem stworzyć urządzenie pętli wskazujące partycję na obrazie. Zrobiłem to, pobierając sektor początkowy drugiej partycji fdisk -l file.img(był to 122880), a następnie losetup --offset $((122880 * 512)) /dev/loop0 file.img. Mógłbym wtedy wykorzystać resize2fsna /dev/loop0i posprzątać z losetup -d /dev/loop0. Jeśli zaktualizujesz swoją odpowiedź, aby ją uwzględnić, oznaczę ją jako odpowiedź zaakceptowaną. Dzięki za wskazanie mi właściwego kierunku.
DrAl
1
@DrAl Hej, próbowałem swoje rozwiązanie korzystając resize2fsna /dev/loop0ale dostałem dostaję kernel panic podczas startu mówiąc wielkość superblock i rozmiar partycji nie pasują: The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocksmasz natknąć się coś takiego?
GuySoft
4

To jest synteza odpowiedzi powyżej i gdzie indziej, które działały dla mnie - wykonaj kopię zapasową swojego obrazu na wypadek pomyłki:

Najpierw powiększ plik obrazu (tutaj dodajemy 1 GB na końcu):

truncate -s +1G ./image.img

Następnie zamapuj cały obraz jako urządzenie pętlowe, abyśmy mogli zaczepić się o tablicę partycji

sudo losetup /dev/loop0 ./image.img

W celu odniesienia w przyszłości pozwala to zrzucić:

sudo fdisk -l /dev/loop0

Wyjście wygląda następująco:

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

Teraz przerobimy ostatnią partycję, usuwając ją, a następnie odtwarzając w tej samej lokalizacji początkowej, tego samego typu, ale innej lokalizacji końcowej. Zanotuj więc kolumnę „Start” dla loop0p2 (partycja 2 - partycja Linux) - użyjemy jej później - tutaj jest jej 122880.

sudo fdisk /dev/loop0

Wpisz następujące informacje - są bezpieczne, aby wejść - nic trwałego się nie zdarzy, dopóki nie przeczytasz poniższego wyjaśnienia:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. wystarczy nacisnąć Enter, aby zaakceptować wartość domyślną
  9. p

Krok 1 - wydrukuj bieżącą tabelę. Kroki 2-3 - usuń partycję 2, Kroki 4-8 - odtwórz partycję 2 z nowym punktem końcowym (domyślnie jest to koniec obrazu), Krok 9 - wydrukuj nową tabelę.

Zakładając, że nowo wydrukowana tabela jest identyczna z tabelą oryginalną, z wyjątkiem wartości końcowej i wartości bloków (tj. Rozmiar się zmienił), którą jesteś gotowy zatwierdzić.

Wchodzić w aby zatwierdzić zmianę, a następnie enter, qaby wyjść.

Możesz usunąć to urządzenie pętli zwrotnej, zrobimy kolejne dla drugiej partycji. Zapamiętaj początkowe przesunięcie zanotowane i użyte powyżej - użyjemy go ponownie:

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

Spowoduje to utworzenie nowego mapowania /dev/loop0 wskazywanie tylko na partycji 2 - dla odniesienia 512 to rozmiar sektora widoczny na pierwszym fdiskwyjściu.

Teraz zmień rozmiar partycji, aby wypełnić dostępne miejsce:

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

Gotowe - teraz posprzątaj:

sudo losetup -d /dev/loop0
Greg
źródło
dzięki ... powyższe instrukcje nie działały dla mnie, ale to zadziałało. Dostałem ostrzeżenie podczas pisania tablicy partycji: `` Polecenie (m dla pomocy): w Tabela partycji została zmieniona. Wywołanie ioctl () w celu ponownego odczytania tablicy partycji. Ponowne czytanie tabeli partycji nie powiodło się: Niepoprawny argument Jądro nadal używa starej tabeli. Nowa tabela będzie używana przy następnym restarcie lub po uruchomieniu partprobe (8) lub kpartx (8). `` Po prostu zignorowałem to i było w porządku.
StFS
Doskonały! Jesteś jedynym, który podał prawidłową odpowiedź! Dzięki.
yushulx
3

Dla tych, którzy mają Oracle VM VirtualBox, jest to dość łatwe.

Na komputerze z systemem Windows wygląda to następująco:

input.imgjest tutaj obraz, którego rozmiar należy zmniejszyć, i output.imgjest to obraz końcowy - w tym przykładzie zdefiniowano go jako 7000 MB dużego.

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

Mam nadzieję, że to trochę pomoże.

Markus
źródło
Dzięki za to rozwiązanie, bardzo przebiegły. To jedyny, jaki udało mi się znaleźć, który jest bezpłatny i działa idealnie w systemie Windows. Miałem pewne problemy z kartami 16 GB, które nie były tego samego rozmiaru i potrzebowałem zmienić rozmiar mojego obrazu.
Josh
Wystąpił błąd paniki jądra. Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX
Zauważ, że to obcina obraz - stracisz dane, jeśli jest jakiś znak powyżej 7000 MB - polecenia nie będą ostrzegać ani narzekać.
Mike Redrobe
2

Oto jak zmienić rozmiar surowego pliku obrazu. Wiem, że to głupio uproszczone, ale zadziała.

Utwórz pusty obraz o rozmiarze, który chcesz rozwinąć w oryginale (w moim przykładzie używam 5 GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Dołącz to do oryginalnego obrazu:

cat /path/to/temp_image >> /path/to/rpi.img

Następnie zmień rozmiar partycji i systemu plików. Najpierw uzyskaj przesunięcie partycji;

fdisk -l /path/to/rpi.img

Wyniki w tabeli takiej jak ta:

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

Zwróć uwagę na przesunięcie początkowe drugiej partycji

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

Na koniec odmontuj / dev / loop

losetup -d /dev/loop0

Gotowy! Twój dysk powinien być teraz o 5 GB większy!

Jonas Stumph Stevnsvig
źródło