Jak zbudować obraz karty SD bez karty SD?

2

Mamy proces skryptowy, który tworzy wbudowaną instalację Debian Jesse na karcie SD. Odpowiednie części skryptu wyglądają tak:

export DISK=/dev/sdb
umount ${DISK}1   # make sure no partitions mounted at the moment
umount ${DISK}2   # ditto
dd if=/dev/zero of=${DISK} bs=1M count=16   # zero partition table zone, overkill
sfdisk --in-order --Linux --unit M ${DISK} <<-__EOF__    # make partitions
    1,48,0xE,*
    ,,,-
__EOF__

mkfs.vfat -F 16 ${DISK}1 -n boot    # install file systems
mkfs.ext4 ${DISK}2 -L rootfs

Po tym, auto mounter wydaje się włączać i ponownie instalować kartę SD, więc możemy robić takie rzeczy jak:

cp -v ${DIR}/u-boot/spl/u-boot-spl.bin /media/$username/boot/BOOT.BIN
cp -v ${DIR}/u-boot/u-boot.img /media/$username/boot/
cp -v ${DIR}/u-boot/uEnv.txt /media/$username/boot/
rsync -axHAX --progress ${DIR}/jessieRoot/ /media/$username/rootfs/

Po tym jak jeden z nas to zrobi, możemy użyć dd kopiować zawartość karty i dzielić się nią ze sobą, wykorzystując więcej kart SD dd.

PROBLEM z tym jest dwojaki: 1) Jest teraz bardzo specyficzny dla Ubuntu / komputera (zakładając, że karta jest na sdb, itp. 2) Potrzebuje rzeczywistej karty, więc nie nadaje się do komputera kompilacji.

Czy istnieje sposób na wykonanie powyższego bez karty?

Próbowałem użyć dd po prostu utworzyć plik 8G, a następnie uruchomić sfdisk na tym (wszystko jest plikiem, prawda?) i ta część działała. Ale nie jest jasne, jak uruchomiłbym mkfs części do pracy, wydają się chcieć pracować na plikach urządzeń blokowych, a nie na podregionach pojedynczego pliku, w którym znajduje się tablica partycji. A potem mam problem z montażem. Zakładam, że używam jakiegoś zaklęcia mount -o loop, ale znowu nie wiem, jak to zrobić w podregionie pliku obrazu wirtualnego, zawsze to robię z plikami .iso.

(Zapraszam do bycia pedantycznym, nie jestem ekspertem (oczywiście) z tego rodzaju rzeczami. Dostaję trochę tego, a inne części wydają się trochę magiczne ...)

Travis Griggs
źródło

Odpowiedzi:

4

Myślę ta strona ma wszystko, czego potrzebujesz.

  • zamiast sdb skorzystaj z urządzenia loopback

  • zamiast rzeczywistej karty skorzystaj z wirtualnego systemu plików

  • jesteś na dobrej drodze, korzystając z dd, aby utworzyć plik dla wirtualnego systemu plików.

  • jesteś na dobrej drodze za pomocą urządzenia pętli zwrotnej. Sztuczka polega na zamontowaniu urządzenia pętli zwrotnej w przesunięciach, w których znajdują się partycje.

To jest artykuł.

Wirtualny system plików to system plików, który istnieje w pliku   kolej istnieje na dysku fizycznym. Jest wiele wspaniałych rzeczy, które możesz   zrobić z wirtualnymi systemami plików; powodem, dla którego się z nimi bawiłem, był   skonfigurować maszynę wirtualną na hoście linuxowym. Inne zastosowania obejmują   szyfrowanie systemów plików bez szyfrowania całych dysków; Mac OS X   Sejf plików szyfruje katalogi domowe użytkowników w ten sposób. Może poszedłeś   naprzód i zrobił sobie jedną gigantyczną partycję, a następnie zrealizował dla jednego   powód, dla którego chcesz mieć wiele partycji! Wirtualny   systemy plików mogą w tym pomóc (w pewnym stopniu).

Jak więc stworzyć wirtualny system plików? Łatwy. Pierwsza rzecz   trzeba zrobić plik, w którym będzie mógł funkcjonować system plików. To jest gdzie   'dd' zaczyna wchodzić. Rozważmy na przykład następujące polecenie:

dd if = / dev / zero z = ~ / myFileSystem.img bs = 1024 liczba = 1048576

Polecenie to odczyta 1 048 576 bloków z / dev / zero i napisze je   do ~ / myFileSystem.img; każdy blok ma 1024 bajty, co daje 1   plik gigabajta zawierający wszystkie zera. Rzeczywiste wartości, których używasz   ponieważ wielkość bloku (bs) i liczba nie są naprawdę ważne, kluczem jest   aby uzyskać prawidłową matematykę: bs * count = imageSize.

Więc teraz masz swój plik; świetny. Nadszedł czas, aby stworzyć system plików!   ta część jest jeszcze łatwiejsza ... stworzymy system plików EXT2, używając   następujące polecenie:

mke2fs myFileSystem.img

Możesz zauważyć ostrzeżenie, mówiąc, że myFileSystem.img nie jest   zablokuj urządzenie, czy chcesz kontynuować? Przejdziemy do tego w jednym   po drugie, na razie, śmiało i powiedz tak. Wszystko powinno być gładkie,   będzie wyglądać tak, jakbyś utworzył system plików na rzeczywistym dysku   napęd. Masz teraz wirtualny system plików! Jedyna rzecz do zrobienia   jest zamontowany system plików, dzięki czemu można uzyskać do niego dostęp ...

mkdir / mnt / virtual

mount -o loop ~ / myFileSystem.img / mnt / virtual

Teraz każdy plik, który umieścisz w / mnt / virtual, jest w rzeczywistości umieszczany bezpośrednio   w myFileSystem.img! Czy to nie było takie proste?

Fantastyczny. Skoro już wiesz, jak utworzyć wirtualny zbiór plików, dlaczego nie   zrobić wirtualny obraz dysku? Jaka jest różnica, o którą pytasz? Dysk   obraz będzie miał tablicę partycji, która definiuje pewną liczbę   partycje, a każda partycja zawiera własny system plików; więc a   wirtualny system plików jest w zasadzie „wirtualną partycją” wirtualnego   obraz dysku; obraz dysku wirtualnego zawiera wiele wirtualnych   systemy plików i wirtualna tablica partycji, która opisuje, gdzie   granice każdej partycji są.

Tworzenie obrazu dysku wirtualnego rozpoczyna się tak samo; pierwsza rzecz   potrzeba jest dużym pustym plikiem, właśnie utworzonym powyżej. Tym razem jednak   zamiast tworzyć system plików, będziemy chcieli podzielić plik na partycje   za pomocą fdisk. Aby uczynić rzeczy trochę przyjemniejszymi, zamierzamy   rzuć urządzenia loopback do miksu. Powinieneś się upewnić   obsługa urządzenia sprzężenia zwrotnego włączona w jądrze (większość dystrybucji to robi   domyślnie; ale jeśli jesteś kompilatorem jądra Linuksa, możesz   chcę sprawdzić). Stworzymy więc duży plik i dołączymy go do pętli zwrotnej   urządzenie w następujący sposób:

dd if = / dev / zero z = ~ / myDisk.img bs = 1024 liczba = 1048576

losetup / dev / loop0 ~ / myDisk.img

Dołączając obraz dysku do urządzenia pętli zwrotnej, możemy użyć   / dev / loop0 w taki sam sposób, w jaki użylibyśmy ~ / myDisk.img; podstawowa różnica   jest to, że / dev / loop0 jest tak zwanym „urządzeniem blokowym”. Miałbyś   zapytać kogoś z większym doświadczeniem niż to, co mam dokładnie   dostaje cię, ale wiem, że narzędzia systemu plików działają   lepiej z urządzeniami blokowymi niż z plikami płaskimi. Plus, to jest   zabawa.

Tak dobrze, mamy duży pusty plik dołączony do urządzenia loopback   (/ dev / loop0) ... teraz nadszedł czas na utworzenie partycji na obrazie dysku.   Aby to zrobić, uruchomimy fdisk na naszym urządzeniu loopback:

fdisk / dev / loop0

Pozwala stworzyć trzy partycje ... jeśli to robisz, powinieneś   już znasz fdisk, więc utwórz następujące:         System Boot Start Start Blocks Id System

/ dev / loop0p1 1 17 136521 83 Linux

/ dev / loop0p2 18 80 506047+ 82 Wymiana Linuksa

/ dev / loop0p3 81 130 401625 83 Linux

Po utworzeniu partycji zapisz zmiany i zamknij fdisk.   Następnie musimy utworzyć systemy plików na każdej partycji.   Pamiętasz, jak łatwo było z powrotem z Virtual Filesystem? Nie tak   już dużo ...

Ale nie panikuj ... problem polega na tym, że „mkfs” nie mogą „sięgnąć”   nasz obraz dysku wirtualnego i stworzyć system plików tylko na indywidualne   przegroda. Rzeczywiście, jeśli spróbujesz, prawdopodobnie skończysz wycierać swoje   obraz dysku wirtualnego i konieczność ponownego uruchomienia fdisk. Więc co robić ... co   do zrobienia?? Urządzenia pętli zwrotnej na ratunek. To, co zrobimy, to dołączyć   urządzenie sprzężenia zwrotnego do pliku myDisk.img w określonych przesunięciach, gdzie   zaczyna się każda partycja.

Pomocne jest wtedy obejrzenie partycji w kategoriach bloków.   Wykonaj następujące polecenie:

fdisk -ul / dev / loop0

powinien wyglądać (miejmy nadzieję dokładnie) tak:

Dysk / dev / loop0: 1073 MB, 1073741824 bajty

255 głów, 63 sektory / tor, 130 cylindrów, łącznie 2097152 sektorów

Jednostki = sektory 1 * 512 = 512 bajtów

  Device Boot      Start         End      Blocks   Id  System

/ dev / loop0p1 63 273104 136521 83 Linux

/ dev / loop0p2 273105 1285199 506047+ 82 Wymiana systemu Linux

/ dev / loop0p3 1285200 2088449 401625 83 Linux

Te liczby są ważne dla matematyki ... użyjemy przegranej   polecenie, tak jak przedtem, tylko tym razem dotrzemy konkretnie   na początku każdej z trzech partycji. losetup przyjmuje offsety jako   liczba bajtów do pominięcia na początku pliku. Wyjście   z fdisk -ul / dev / loop0 pokazuje, że pierwsza partycja zaczyna się od   blok 63, i że każdy blok ma 512 bajtów. Więc partycja 1 zaczyna się od   bajt 32 256

losetup -o 32256 / dev / loop1 / dev / loop0

To polecenie osiąga 32 256 bajtów w / dev / loop0 i montuje je w   / dev / loop1. Pamiętaj, że od dołączenia / dev / loop0 do myDisk.img   plik jest taki sam, jak osiągnięcie 32 256 bajtów w tym pliku ...   śledzić? Ok dobrze. Ta sama logika dla partycji 2 i 3:

losetup -o 139829760 / dev / loop2 / dev / loop0

losetup -o 658022400 / dev / loop3 / dev / loop0

Mamy teraz cztery urządzenia loopback; / dev / loop0 jest dołączony do   plik myDisk.img. / dev / loop1 to pierwsza partycja wirtualna   dysk reprezentowany przez / dev / loop0; / dev / loop2 to 2-ty i / dev / loop3   jest 3-ty.

Teraz nadszedł czas, aby stworzyć te systemy plików! Tak jest teraz   łatwe jak tworzenie zwykłego systemu plików, ponieważ to wszystko robimy.   Pamiętaj, że mkfs nie wie, że urządzenie nie jest urządzeniem fizycznym! Dobrze   zrobić trzy rodzaje systemów plików, system plików ext2 dla partycji 1,   system wymiany plików dla partycji 2 i system plików XFS dla partycji   3:

mkfs / dev / loop1

mkswap / dev / loop2

mkfs.xfs / dev / loop3

Ponieważ loop1, loop2 i loop3 są związane bezpośrednio z loop0, a loop0 jest   ~ / myDisk.img, wszystko, co tylko zrobiliśmy do loop1, loop2 i loop3   dotyczy bezpośrednio myDisk.img! Możemy teraz zamontować / dev / loop3, dla   instancja na / mnt / virtual jako system plików XFS i używaj jej jako   zwykły system plików!

Mam więc nadzieję, że uznasz to za pomocne ... możesz zrobić całkiem fajne rzeczy   z wirtualnymi systemami plików i obrazami dysków wirtualnych; i pętla zwrotna   urządzenia sprawiają, że wszystko staje się gładkie.

f01
źródło
1
To było bardzo pomocne. Dziękuję Ci!
Travis Griggs