2009-09-14 18 views
35

Czy istnieje jakiś nowy/lepszy sposób sprzężenia zwrotnego dla pojedynczych partycji z pliku zawierającego tabelę partycji na Linuksie? Widzę następujące, ale są nieco przestarzałe.sprzężenie zwrotne montowanie pojedynczych partycji z pliku zawierającego tabelę partycji na Linuksie

http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-01/7183.html

http://lists.gnu.org/archive/html/grub-devel/2005-01/msg00077.html

ftp://ftp.hq.nasa.gov/pub/ig/ccd/enhanced_loopback/

+0

http://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device || http://superuser.com/questions/117136/how-can-i-mount-a-partition-od-dd-created-image-a-block-device-e-g-hdd-u || http://unix.stackexchange.com/questions/9099/reading-a-filesystem-from-a-whole-disk-image –

Odpowiedz

25

Powiedzmy $ obraz jest ustawiony na ścieżce do pliku obrazu. Można napisać mały skrypt za pomocą

fdisk -u sectors -l $IMAGE 

aby uzyskać listę partycji wewnątrz obrazu. A następnie za pomocą sekwencji

mount -o ro,loop,offset=$OFFSET -t auto $IMAGE /media/$DEST 

Jeżeli przesunięcie jest obliczane oznacza informacje z fdisk (sektor początkowy * rozmiar sektora w bajtach) i $ DEST unikalną nazwę dla każdej partycji.

To nie jest bezpośrednio rozwiązanie, ale mam nadzieję, że całkiem dobry wskazówka, jak go zrealizować. Jeśli wykonasz zadanie raz, masz mały, ładny początek dla jakiegoś narzędzia kryminalistycznego!

+1

Podczas gdy ta odpowiedź działa, bardziej aktualna odpowiedź kpartx jest naprawdę lepsza; daje jedno polecenie, które udostępnia wszystkie partycje. – mkj

+1

Podczas gdy kpartx jest dobrym narzędziem, nie jest dostępne w każdym systemie. Kilka systemów wbudowanych, nad którymi pracuję, nie ma ich natywnie i potrzebuję zamontować partycje obrazów dyskowych, a nawet podrzędnych partycji. – gnac

+0

przykładowa aplikacja powyższej odpowiedzi dla obrazów Raspibian: http://raspberrypi.stackexchange.com/a/13138/359 –

62

Możesz zrobić to w ten sposób bez większych kłopotów:

# kpartx -v -a logging-test.img 
add map loop0p1 (251:0): 0 497664 linear /dev/loop0 2048 
add map loop0p2 (251:1): 0 66605058 linear /dev/loop0 501758 
add map loop0p5 (251:2): 0 66605056 251:1 2 
# ls /dev/mapper/ 
control loop0p1 loop0p2 loop0p5 
# mount /dev/mapper/loop0p1 /mnt/test 
# mount | grep test 
/dev/mapper/loop0p1 on /mnt/test type ext2 (rw) 
# 

i usunięcia z urządzenia po zakończeniu pętli:

# kpartx -v -d logging-test.img 
del devmap : loop0p2 
del devmap : loop0p1 
loop deleted : /dev/loop0 
# 
+10

Powinieneś również wspomnieć o -d, by zedrzeć konfigurację. –

+1

Dobra uwaga, dzięki! Teraz nie ma już pełnoekranowego obrazu, aby go zagrać, więc potrzebujący mogą potrzebować pomocy kpartx :-) –

+4

Aby go zniszczyć, wystarczy zamienić "-a" na "-d"; w tym przykładzie będzie to kpartx -v -d logging-test.img – mkj

35

Jeśli masz v2.21 util-linux lub wyższy, można to zrobić z losetup. Użyj (--partscan) opcję -P czytać tablicę partycji i tworzyć węzły urządzeń dla każdej partycji:

# losetup --show -f -P test.img 
/dev/loop0 

# ls /dev/loop0* 
/dev/loop0 
/dev/loop0p1 
/dev/loop0p2 

# mount /dev/loop0p1 /mnt/tmp 
+1

nie działa dla mnie. używając util-linux-ng 2.22.2, otrzymuję tylko/dev/loop0 ... –

+2

Użyłem luki z util-linux 2.22.2 z powodzeniem jak opisano powyżej (Mageia 3 package util-linux-2.22.2-5.mga3 .src.rpm). – kbulgrien

+0

Jedną z rzeczy, które zauważyłem, jest to, że używanie root zamiast sudo miało wpływ na to, czy zadziałało, czy nie. – kbulgrien

3

Ok, to pytanie jest eony stary, ale tylko dla Sako kompletności: This here wydaje się dużo łatwiejsze do mnie .

Cytat:

rmmod loop 
modprobe loop max_part=63 
losetup -f /path/to/your/disk/image.raw 
mount /dev/loop0p1 /mnt/path 
+1

To nie działa w systemie Ubuntu 14.04, ponieważ moduł 'loop' jest wbudowany, więc' rmmod' nie działa. Jak to naprawić: http://askubuntu.com/a/673257/52975 –

5

losetup -P automatyzacja

losetup -P jest najlepszą metodą wychodząc w Ubuntu 16.04, o którym mowa w https://stackoverflow.com/a/15200862/895245, oto funkcje automatyzujące jeśli dalej. Zastosowanie:

$ los my.img 
/dev/loop0 
/mnt/loop0p1 
/mnt/loop0p2 

$ ls /mnt/loop0p1 
/whatever 
/files 
/youhave 
/there 

$ sudo losetup -l 
NAME  SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                      DIO 
/dev/loop1   0  0   0 0 /full/path/to/my.img 

$ # Cleanup. 
$ losd 0 
$ ls /mnt/loop0p1 
$ ls /dev | grep loop0 
loop0 

Źródło:

los() (
    img="$1" 
    dev="$(sudo losetup --show -f -P "$img")" 
    echo "$dev" 
    for part in "$dev"?*; do 
    if [ "$part" = "${dev}p*" ]; then 
     part="${dev}" 
    fi 
    dst="/mnt/$(basename "$part")" 
    echo "$dst" 
    sudo mkdir -p "$dst" 
    sudo mount "$part" "$dst" 
    done 
) 
losd() (
    dev="/dev/loop$1" 
    for part in "$dev"?*; do 
    if [ "$part" = "${dev}p*" ]; then 
     part="${dev}" 
    fi 
    dst="/mnt/$(basename "$part")" 
    sudo umount "$dst" 
    done 
    sudo losetup -d "$dev" 
) 
0

Niektóre bardziej automatyki do poprzednich odpowiedzi, które były świetne.

Aby jeszcze bardziej uprościć zadanie (co jest potrzebne, jeśli robisz to często), możesz użyć mojego skryptu mountimg, aby zrobić wszystko za Ciebie.Wystarczy dostać od https://github.com/AlexanderAmelkin/mountimg i używać tak:

mountimg disk_image.img $PARTNO /mnt/mountpoint 

Można także określić typ systemu plików oraz wszelkie inne dodatkowe opcje montowania, jeśli chcesz:

mountimg disk_image.img $PARTNO /mnt/mountpoint -t vfat -o codepage=866,iocharset=utf-8 

Kiedy skończysz z partycji wystarczy umount go:

umount /mnt/mountpoint