Jak zamontować `img` utworzony za pomocą / bin / dd dysku twardego?

19

Kiedyś tworzyłemdd kopię zapasową dysku o pojemności 80 GB

dd if=/dev/sdb of=~/sdb.img

Teraz muszę uzyskać dostęp do niektórych plików na tym dysku, ale nie chcę kopiować pliku „.img” z powrotem na dysk.

mount ~/sdb.img /mnt/sdbteż nie działa. Zwraca:

mount: you must specify the filesystem type

Próbowałem znaleźć typ systemu plików file -s

fox@shoebox $ file -s sdb.img
sdb.img: x86 boot sector; partition 1: ID=0x12, starthead 1, startsector 63, 10233342 sectors; partition 2: ID=0xc, active, starthead 0, startsector 10233405, 72517410 sectors; partition 3: ID=0xc, starthead 0, startsector 82750815, 73545570 sectors, code offset 0xc0

Czy można zamontować sdb.img, czy muszę użyć, ddaby przywrócić dysk?

lis
źródło

Odpowiedzi:

27

Podczas korzystania ddna /dev/sdbzamiast /dev/sdb1lub /dev/sdb2, skopiować wszystkie te partycje od wspomnianego dysku w jednym pliku.

Musisz zamontować każdą partycję osobno.


Aby zamontować partycję z pliku , musisz najpierw dowiedzieć się, gdzie w pliku znajduje się ta partycja.

Korzystając z twoich danych wyjściowych file -s sdb.img, znajdujemy startsectorsdla każdej partycji:

sdb.img: sektor rozruchowy x86; partycja 1 : ID = 0x12, starthead 1, startsector 63 , 10233342 sektory; partycja 2 : ID = 0xc, aktywny, sektor startowy 0, sektor startowy 10233405 , 72517410 sektorów; partycja 3 : ID = 0xc, starthead 0, sektor startowy 82750815 , 73545570 sektorów, przesunięcie kodu 0xc0

Partycja      Startsector
1 63
2 10233405
3 82750815

Aby zamontować pojedynczą partycję, gdzie X jest jej sektor startowy , uruchom:

mount ~/sdb.img /mnt/sdb -o offset=$((X*512))

Aby zamontować drugą partycję , musisz uruchomić:

mount ~/sdb.img /mnt/sdb2 -o offset=$((10233405*512))

sidenote: upewnij się, że /mnt/sdb2istnieje przed uruchomieniem tego.

Baw się dobrze!


aktualizacja: W odpowiedzi założyłem, że rozmiar sektora dla twojego obrazu był 512, zobacz to pytanie, jak to obliczyć.

Stefan
źródło
Możesz również uzyskać sekcje startowe w formacie tabelarycznym, używając informacji file -l sdb.imgzamieszczonych w odpowiedzi na twoje pytanie: unix.stackexchange.com/questions/2668/…
student
@student: Tylko korekta dla przyszłych czytelników: To byłoby fdisk -lnie file -l.
Runium 27.04.13
Dalsze wyjaśnienia - możesz uzyskać liczbę 512 bajtów sektorów, dodając opcję -u do tego polecenia - więcfdisk -u -l sdb.img
Aaron Mason
Jeśli wersja filejest mniej rozmowny domyślnie spróbuj dodać -kprzełącznik, aby uzyskać rodzaj wyjścia pokazaną na odpowiedź - tak: file -k FILENAME.img.
Christian Pietsch,
7

W systemie Linux polecenia montowania w ramach zaakceptowanej odpowiedzi domyślnie utworzą urządzenie pętli. Zakładając, że pełny obraz dysku ma prawidłową tablicę partycji (którą jądro jest w stanie zrozumieć), możesz użyć losetup(8)bezpośrednio, aby zaoszczędzić kłopotów z obliczaniem przesunięć. Nie ma również potrzeby stosowania dodatkowych narzędzi, takich kpartxjak sugerowane w innej odpowiedzi . Będzie to w zasadzie to samo, co następuje:

losetup -Prf sdb.imgpołączy pierwsze wolne urządzenie ( -f) jako readonly ( -r) z plikiem obrazu sdb.img. Ta -Popcja zmusza jądro do skanowania tablicy partycji tego urządzenia pętli i utworzy urządzenia pętli dla każdej partycji.

Możesz więc otrzymać coś takiego:

$ lsblk
NAME      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0       7:0    0 167.7G  1 loop
├─loop0p1 259:0    0   500M  1 loop
└─loop0p2 259:1    0 167.2G  1 loop
...

Możesz teraz zamontować każdą partycję, oczywiście tylko do odczytu, w wybranym punkcie montowania.

$ mount -r /dev/loop0p1 /tmp/backup_sdb1

Trzymanie wszystkiego tylko do odczytu jest opcjonalne, ale może być dobrym rozwiązaniem dla obrazu zapasowego.

aktualizacja: w 2012 r. -Pdodano opcję Ut-Linux-2.21. W związku z tym nie była dostępna w momencie pisania zaakceptowanej odpowiedzi. Zauważ też, że to i inne odpowiedzi są specyficzne dla systemu Linux. OpenBSD i NetBSD mają dyski vnode zarządzane przez vnconfig(8)FreeBSD i dyski pamięci zarządzane przez mdconfig(8).

escrl
źródło
2

Alternatywnie możesz użyć miłego narzędzia o nazwie kpartx. Ze strony podręcznika:

kpartx - Twórz mapy urządzeń z tabel partycji

Oznacza to, że możesz utworzyć „pseudo urządzenie” z partycjami urządzenia bezpośrednio z pliku img:

$ kpartx -av sdb.img
add map loop0p1 (254:2): 0 2048 linear /dev/loop0 0
add map loop0p2 (254:3): 0 31162 linear /dev/loop0 2048
$ lsblk
.
.
.
loop0                     7:0    0  16.2M  0 loop
├─loop0p1               254:2    0     1M  0 part
└─loop0p2               254:3    0  15.2M  0 part

Następnie możesz zamontować /dev/mapper/loop0p2na przykład, jeśli chcesz drugą partycję na obrazie.

Omer Dagan
źródło