Mam dysk, powiedzmy / dev / sda.
Oto fdisk -l:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
Muszę zrobić obraz do przechowywania na naszym serwerze plików do użycia w flashowaniu innych urządzeń, które produkujemy, więc chcę tylko zajętego miejsca (tylko około 4 GB). Chcę zachować MBR itp., Ponieważ to urządzenie powinno być gotowe do rozruchu, gdy tylko kopia zostanie ukończona.
Jakieś pomysły? Wcześniej używałem dd if=/dev/sda of=[//fileserver/file]
, ale w tym czasie moja główna kopia była na idei flash 4GB.
linux
hard-drive
dd
Jonathan Henson
źródło
źródło
dd conv=sparse
.Odpowiedzi:
Kiedyś miałem podobny problem z osadzonymi dystrybucjami Linuksa - pozbyć się wszystkich śmieci przed skompresowaniem obrazu.
dd if=/dev/zero of=asdf.txt
. Poczekaj, aż umrze. Usuń plik asdf.txt.Właśnie napisałeś zera do całego wolnego miejsca na urządzeniu.
Teraz weź obraz dysku i uruchom go przez gzip. Voila, rzadki obraz.
Prawdopodobnie nie skaluje się zbyt dobrze i może powodować problemy, jeśli rzeczywiście chcesz zapisać na dysk, ale hej.
Możesz wziąć migawkę rsync dysku na inny wolumin, wyzerować go, a następnie wziąć obraz dysku.
Uwaga: może to być niebezpieczne dla dysku SSD, użytkownik powinien rozważyć tę operację przed zatwierdzeniem.
źródło
dd if=sda2.gz | gunzip > /dev/sda2
orazdd if=/dev/sda2 | gzip > sda2.gz
of
ścieżką dla każdej partycji.Zakładając, że chcesz zapisać
/dev/sdXN
się/tgtfs/image.raw
i jesteś root:mkdir /srcfs && mount /dev/sdXN /srcfs
Użyj zerofill lub po prostu:
dd if=/dev/zero of=/srcfs/tmpzero.txt
aby wypełnić nieużywane bloki zerem (poczekaj, aż całkowicie wypełni system plikówrm /srcfs/tmpzero.txt
)Zrób zdjęcie za pomocą dd i użyj conv = sparse, aby zerować zera w locie:
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
Jeśli chcesz użyć kompresji, nie musisz dziurkować zer za pomocą dd, ponieważ bloki zerowe są wysoce ściśliwe:
PS: Należy pamiętać, że nie jest to dobry pomysł na nośnikach pamięci opartych na pamięci flash (tzn. Źródłowym systemem plików jest SSD)
źródło
dd conv=sparse
.btrfs snapshot
ibtrfs send
narzędzi) jest lepszym rozwiązaniem IMHO.gz
na swoimPATH
(tak jak ja, na GParted Live), możesz użyćgzip -c
zamiast tego.Użyj dd z opcją liczenia.
W twoim przypadku korzystałeś z fdisk, więc przyjmuję to podejście. Twój „sudo fdisk -l” wyprodukował:
Należy zwrócić uwagę na dwie rzeczy: 1) rozmiar jednostki i 2) kolumnę „Koniec”. W twoim przypadku masz cylindry, które są równe 8225280 bajtów. W kolumnie „Koniec” sda8 kończy się na 525 (czyli 525 [jednostkach] * 16065 * 512 = ~ 4,3 GB)
dd może robić wiele rzeczy, takich jak rozpoczynanie po przesunięciu lub zatrzymywanie po określonej liczbie bloków. Zrobimy to drugie, używając opcji count w dd. Polecenie wyglądałoby następująco:
Gdzie -bs jest rozmiarem bloku (najłatwiej jest użyć jednostki używanej przez fdisk, ale dowolna jednostka zrobi to tak długo, jak długo opcja liczenia jest zadeklarowana w tych jednostkach), a liczba to liczba jednostek, które chcemy skopiować (uwaga zwiększamy liczbę o 1, aby przechwycić ostatni blok).
źródło
fdisk -l -u=cylinders /dev/sda
Podczas gdy
/dev/zero
zajmowanie wolnego miejsca na dysku i używaniedd conv=sparse
/gz -c
jest możliwe, na ogromnych dyskach z pustą przestrzenią działającą w 100 GB pamięci,/dev/zero
ing jest boleśnie powolne - nie wspominając o tym, jak zauważono w innych odpowiedziach,/dev/zero
zapisując SDD do EOF.Oto, co zrobiłem, gdy wpadłem na taką sytuację:
Na Live CD lubuntu, używanym
gparted
do „zmniejszania” dysku do minimalnego możliwego rozmiaru, pozostawiając nieprzydzielone miejsceSłuży
dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
do tworzenia szybko skompresowanego obrazu (nie trzeba dodawać, że możesz pominąć kompresję, jeśli masz wystarczająco dużo miejsca do przechowywania surowych danych (lub w inny sposób chcesz zmniejszyć obciążenie procesora)dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
do kopiowania danych z powrotem na inny dyskgparted
ponownie do „rozszerzania” partycjiNie próbowałem tego na wielu partycjach, ale uważam, że powyższy proces można dostosować do kopiowania „partycji”, jeśli najpierw utworzona zostanie tablica partycji na dysku docelowym i skopiowane zostaną tylko dane zawarte na partycji
dd
- odczyt / zapis przesunięć (skip
/seek
opcjadd
odpowiednio) byłaby wymagana odpowiednio.źródło
count
parametruNie możesz
dd
jest narzędziem bardzo niskiego poziomu i nie ma możliwości rozróżnienia plików od pustej przestrzeni.Z drugiej strony pusta przestrzeń będzie się bardzo, bardzo ładnie kompresować, więc jeśli martwisz się tylko o przestrzeń dyskową, nie na przykład o czas zapisu, po prostu prześlij ją przez gzip.
źródło
Zakładając, że reszta dysku jest pusta (wszystkie zera), możesz przesłać DD przez gzip, co powinno całkiem ładnie skompresować puste miejsce. Możesz użyć narzędzia takiego jak zeroofree, aby upewnić się, że puste miejsce jest rzeczywiście puste, więc ładnie się kompresuje.
Jeśli użyjesz narzędzia takiego jak partimage , clonezilla lub niektóre z innych narzędzi do klonowania linuxa, większość z nich zajmie się tobą automatycznie.
źródło
Przyjęta odpowiedź jest nieprawidłowa. Zgadzam się z powyższym komentarzem. Używam dd z parametrem count do regularnego tworzenia kopii zapasowej dysku. Po prostu zamień BACKUP_FOLDER i literę urządzenia na „X”:
Zdefiniuj ostatnio używany blok dysku:
Następnie klonowanie dysku (z wyjątkiem pustej przestrzeni):
źródło