Gắn kết phân vùng duy nhất từ ​​hình ảnh của toàn bộ đĩa (thiết bị)


117

Tôi đã tạo một hình ảnh của toàn bộ đĩa của tôi với

dd if=/dev/sda of=/media/external_media/sda.img

Bây giờ vấn đề là tôi muốn gắn kết một hệ thống tập tin ext4 trên đĩa đó nhưng

mount -t ext4 -o loop /media/external_media/sda.img /media/sda_image

rõ ràng đưa ra một lỗi siêu khối vì hình ảnh chứa toàn bộ đĩa (MBR, các phân vùng khác) không chỉ là phân vùng tôi cần. Vì vậy, tôi đoán tôi nên tìm cách làm cho hình ảnh đĩa hiển thị trong /dev/thư mục ...

Có ai biết làm thế nào để làm điều đó?

PS: Tôi luôn có thể ddsao lưu hình ảnh vào đĩa gốc, nhưng điều đó sẽ rất bất tiện (Tôi đã cập nhật HĐH và tôi muốn giữ nguyên như vậy)

Câu trả lời:


142

Lấy bố cục phân vùng của hình ảnh

$ sudo fdisk -lu sda.img
...
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
...
  Device Boot      Start         End      Blocks   Id  System
sda.img1   *          56     6400000     3199972+   c  W95 FAT32 (LBA)

Tính toán độ lệch từ điểm bắt đầu của hình ảnh đến phân vùng bắt đầu

Quy mô ngành * Bắt đầu = (trong trường hợp) 512 * 56 = 28672

Gắn nó vào / dev / loop0 bằng cách sử dụng offset

sudo losetup -o 28672 /dev/loop0 sda.img

Bây giờ phân vùng nằm trên / dev / loop0 . Bạn có thể fsck nó, gắn kết nó vv

sudo fsck -fv /dev/loop0
sudo mount /dev/loop0 /mnt

Vô song

sudo umount /mnt
sudo losetup -d /dev/loop0

Cảm ơn bạn rất nhiều! Làm việc như người ở! Bạn đã tạo ra một ngày của tôi (và cứu một Ocelot vô tội khỏi bị xóa một cách tàn nhẫn; P)
Nicola Feelrin

8
Ít nhất là trên bash, shell thậm chí có thể làm toán cho bạn:sudo losetup -o $((56*512)) /dev/loop0 sda.img
Enno Gröper

1
Điều này không chỉ hữu ích, điều này là hoàn toàn tuyệt vời.
andho

Nếu có .img1 và .img2 thì sao? "win8.raw1 * 2048 718847 358400 7" và "win8.raw2 718848 52426751 25853952 7"
Enkouyami

6
Thậm chí đơn giản hơn : mount -o loop,offset=$((56 * 512)) sda.img /mnt. Nguồn: madduck.net/blog/ Từ
Ostrokach

105

Cập nhật cho Ubuntu 16.04: Với bản mới losetup, giờ đây việc này trở nên dễ dàng hơn:

sudo losetup -Pf disk_image.raw

Xem phần còn lại của câu trả lời cho các phiên bản cũ hơn của Ubuntu.


Một giải pháp dễ dàng là sử dụng kpartx : nó sẽ tìm ra bố cục phân vùng và ánh xạ từng phần vào một thiết bị khối. Sau đó, tất cả những gì bạn phải làm là gắn kết cái bạn muốn.

Mở Terminal, xác định vị trí ảnh đĩa và nhập lệnh này:

$ sudo kpartx -av disk_image.raw 
add map loop0p1 (252:2): 0 3082240 linear /dev/loop0 2048
add map loop0p2 (252:3): 0 17887232 linear /dev/loop0 3084288

Điều này được tạo ra loop0p1loop0p2dưới /dev/mapper. Từ đầu ra, bạn có thể thấy kích thước của các phân vùng giúp bạn xác định chúng. Bạn có thể gắn kết cái bạn muốn với:

$ sudo mount /dev/mapper/loop0p2 /mnt

Ngoài ra, thiết bị khối được Nautilus phát hiện và bạn có thể gắn thiết bị từ thanh bên:

nhập mô tả hình ảnh ở đây

Khi bạn đã hoàn tất, ngắt kết nối những gì bạn đã gắn và xóa ánh xạ thiết bị:

$ sudo umount /mnt
$ sudo kpartx -d disk_image.raw

Câu trả lời tuyệt vời, nhanh chóng và dễ dàng, tránh bước nhân là tốt
Elder Geek

sudo apt-get install kpartx- để có quyền truy cập vào kpartx. Theo tôi, kpartxliên kết ở đầu bài là một "cái bẫy". Liên kết ngụ ý cài đặt phần mềm là không.
Hannu

1
@Hannu, các liên kết tích hợp với Trung tâm phần mềm là một thông lệ phổ biến trên Askubfox , mặc dù trong trường hợp cụ thể này, biểu tượng điển hình có thể được thêm vào và URL phải được cập nhật.
Joni

losetup -Pfđã được đề cập trước đây bởi Askubfox.com/a/496576/52975 Tôi khuyên bạn ít nhất nên liên kết với câu trả lời đó.
Ciro Santilli 心 心 事件

1
FYI, losetup -Pf ..lệnh sẽ tạo các thiết bị như thế /dev/loopXpYmà bạn vẫn cần phải gắn kết. Bạn có thể tìm thấy Xtừ việc nhìn vào đầu ra của losetuplệnh. Số Yphân vùng.
Gunchars

26

Chỉnh sửa : hoạt động với produc-linux> = 2.21 . Tại thời điểm tàu viết ubuntu với phiên bản 2.20 chỉ

Từ người đàn ông losetup :

       -P, --partscan
          force kernel to scan partition table on newly created loop device

Vì vậy, chỉ cần chạy

$ sudo losetup -f --show -P /path/to/image.img

để tạo các nút thiết bị cho mọi phân vùng ảnh đĩa của bạn trên thiết bị lặp không sử dụng đầu tiên và in nó ra thiết bị xuất chuẩn. Nếu sử dụng /dev/loop0thiết bị, nó sẽ tạo ra ít nhất /dev/loop0p1là bạn sẽ có thể gắn kết như bình thường.


2
Tôi tìm phiên bản này ở losetupđâu? Cái tôi có trong Ubuntu 14.04 có một manpage từ tháng 7 năm 2003 (produc-linux) và không có tùy chọn `-P` (hoặc bất cứ thứ gì khác) để quét các phân vùng.
Hannu

1
Xin lỗi, tôi đã nhầm, tôi đã sử dụng tùy chọn này trên Arch Linux đi kèm với phiên bản mới hơn của gói linux-linux. Có vẻ như Ubuntu đang bị kẹt một cách đáng buồn trên phiên bản 2.20.1 đã được phát hành vào tháng một năm 2012! Các --partscantùy chọn đã được giới thiệu trong util-linux 2.21
Ludovic Ronsin

1
Vâng, gnome-diskscó một tùy chọn để gắn hình ảnh đĩa và phân vùng của nó. (<- đó là để cài đặt và sử dụng bash / Terminal, Diskstrong dấu gạch ngang cũng tìm thấy nó).
Hannu

2
Đây phải là câu trả lời được chấp nhận ...
matthid

@matthid Thậm chí có thể thay đổi một câu trả lời được chấp nhận? Điều này là tốt (và câu trả lời kpartx thực sự phụ thuộc vào phiên bản này losetup), nhưng nó mới hơn gần ba năm so với câu trả lời được chấp nhận, đó là cách để làm điều đó vào thời điểm đó.
Auspex

9

Hãy thử gnome-disk-image-mounter:

gnome-disk-image-mounter sda.img

Không sudoyêu cầu. Nó sẽ được gắn tại /media/your_user_name/partition_name, giống như các ổ USB.


1
Đã hoạt động tốt vào ngày 16.04. Tôi mới cài đặt 18.04 mới và các công cụ yêu cầu mật khẩu sudo để truy cập vào thiết bị ảo / dev / loopXX :(
Laurent

7

losetup -P tự động hóa

losetup -Plà phương pháp tốt nhất bắt đầu trong Ubuntu 16.04 như được đề cập tại https://askubfox.com/a/496576/52975 , đây là các chức năng để tự động hóa nếu tiếp tục. Sử dụng:

$ 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

Nguồn:

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"
)

cấu hình vòng lặp max_part config

Đây là một phương pháp tốt trước ngày 16.04.

loop là một mô-đun hạt nhân, được tích hợp vào kernel trong Ubuntu 14.04.

Nếu bạn định cấu hình đúng, Linux sẽ tự động chia nhỏ các thiết bị cho bạn.

cat /sys/module/loop/parameters/max_part

cho biết có bao nhiêu loopthiết bị phân vùng có thể tạo ra.

Theo 0mặc định, trên Ubuntu 14.04, đó là lý do tại sao không có tự động chia tách xảy ra.

Để thay đổi nó, chúng ta có thể thêm:

options loop max_part=31

vào một tập tin trong /etc/modprobe, hoặc:

GRUB_CMDLINE_LINUX="loop.max_part=31"

đến /etc/default/grubvà sau đó sudo update-grub.

Cách đặt tham số mô-đun cũng được đề cập tại: Cách thêm tham số mô-đun hạt nhân?

Sau khi khởi động lại, khi bạn thực hiện:

sudo losetup -f --show my.img

nó gắn hình ảnh vào một /dev/loopXthiết bị và tự động gắn các phân vùng vào /dev/loopXpYthiết bị.

Vì vậy, đây là phương pháp thuận tiện nhất nếu bạn sẵn sàng khởi động lại.

Xem thêm


5

Sử dụng losetup để đính kèm toàn bộ hình ảnh đĩa.

# sudo losetup /dev/loop2 sda.img

Sau đó sử dụng mdadm để tạo một thiết bị md và các thiết bị khối sẽ được tạo cho tất cả các phân vùng.

# sudo mdadm --build --level=0 --force --raid-devices=1 /dev/md2 /dev/loop2
mdadm: array /dev/md2 built and started.

Bây giờ bạn sẽ thấy các thiết bị phân vùng.

nile-172-b0fef38-76:/mnt/sdb1 # ls -l /dev/md2*
brw-rw---- 1 root disk   9, 2 Oct 10 12:37 /dev/md2
brw-rw---- 1 root disk 259, 0 Oct 10 12:37 /dev/md2p1

Đó là một trò đùa vui nhộn :)
Johan Boulé

4

Theo tôi, cách đơn giản nhất là sử dụng mount -o loop,offset=...như đã đề cập trong câu trả lời này trên StackOverflow . Ý tưởng là như sau:

fdisk -l $IMAGE
# calculate the offset in bytes
mount -o loop,offset=$OFFSET $IMAGE $MOUNTPOINT

Phương pháp này là tốt nhất vì nó không yêu cầu xóa thiết bị lặp sau khi bạn bỏ qua phân vùng được gắn.

Để đơn giản hóa hơn nữa nhiệm vụ (cần thiết nếu bạn thực hiện thường xuyên), bạn có thể sử dụng tập lệnh của tôi mountimgđể làm mọi thứ cho bạn. Chỉ cần lấy nó từ https://github.com/AlexanderAmelkin/mountimg và sử dụng như thế này:

mountimg /media/external_media/sda.img 2 /media/sda_image

Bạn cũng có thể chỉ định loại hệ thống tệp và bất kỳ tùy chọn gắn kết bổ sung nào khác nếu bạn muốn:

mountimg /media/external_media/sda.img 2 /media/sda_image -t vfat -o codepage=866,iocharset=utf-8

Khi bạn hoàn thành với phân vùng, chỉ cần umountnó:

umount /media/sda_image
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.