Pasang partisi tunggal dari gambar seluruh disk (perangkat)

117

Saya membuat gambar seluruh disk saya dengan

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

Sekarang masalahnya adalah saya ingin me-mount filesystem ext4 yang ada di disk itu tetapi

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

jelas memberikan kesalahan superblock karena gambar berisi seluruh disk (MBR, partisi lain) bukan hanya partisi yang saya butuhkan. Jadi saya kira saya harus menemukan cara untuk membuat gambar disk muncul di /dev/folder ...

Adakah seseorang yang tau bagaimana cara melakukannya?

PS: Saya selalu dapat ddmengembalikan gambar ke disk asli, tapi itu akan sangat merepotkan (saya memperbarui OS dan saya ingin tetap seperti itu)

Nicola Feltrin
sumber

Jawaban:

142

Dapatkan tata letak partisi gambar

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

Hitung offset dari awal gambar ke awal partisi

Ukuran sektor * Mulai = (dalam hal ini) 512 * 56 = 28672

Pasang di / dev / loop0 menggunakan offset

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

Sekarang partisi berada di / dev / loop0 . Anda dapat fsck , mount dll

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

Lepas

sudo umount /mnt
sudo losetup -d /dev/loop0
mengatur
sumber
Terima kasih banyak! Bekerja seperti pesona! Anda membuat hari saya (dan menyelamatkan Ocelot yang tidak bersalah dari dihapus secara brutal; P)
Nicola Feltrin
8
Setidaknya pada bash, shell bahkan dapat melakukan matematika untuk Anda:sudo losetup -o $((56*512)) /dev/loop0 sda.img
Enno Gröper
1
Ini tidak hanya membantu, ini benar-benar hebat.
andho
Bagaimana jika ada .img1 dan .img2? "win8.raw1 * 2048 718847 358400 7" dan "win8.raw2 718848 52426751 25853952 7"
Enkouyami
6
Bahkan lebih sederhana: mount -o loop,offset=$((56 * 512)) sda.img /mnt. Sumber: madduck.net/blog/…
ostrokach
105

Pembaruan untuk Ubuntu 16.04: Dengan yang baru losetupini sekarang lebih mudah:

sudo losetup -Pf disk_image.raw

Lihat sisa jawaban untuk versi Ubuntu yang lebih lama.


Solusi mudah menggunakan kpartx : ia akan mengetahui tata letak partisi dan memetakan masing-masing ke perangkat blok. Setelah itu yang harus Anda lakukan adalah me-mount yang Anda inginkan.

Buka Terminal, cari gambar disk, dan masukkan perintah ini:

$ 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

Ini dibuat loop0p1dan di loop0p2bawah /dev/mapper. Dari output Anda dapat melihat ukuran partisi yang membantu Anda mengidentifikasi mereka. Anda dapat memasang yang Anda inginkan dengan:

$ sudo mount /dev/mapper/loop0p2 /mnt

Atau, perangkat blok terdeteksi oleh Nautilus dan Anda dapat memasangnya dari bilah samping:

masukkan deskripsi gambar di sini

Setelah selesai, unmount apa yang Anda mount dan hapus pemetaan perangkat:

$ sudo umount /mnt
$ sudo kpartx -d disk_image.raw
Joni
sumber
Jawaban luar biasa, cepat dan mudah, menghindari langkah perkalian itu bagus
Penatua Geek
sudo apt-get install kpartx- untuk mendapatkan akses ke kpartx. The kpartxlink dalam awal posting adalah 'jebakan' menurut saya. Tautan yang menyiratkan menginstal perangkat lunak adalah tidak boleh.
Hannu
1
@Hannu, tautan yang berintegrasi dengan Pusat Perangkat Lunak adalah praktik umum pada askubuntu , meskipun dalam kasus khusus ini ikon yang khas dapat ditambahkan dan URL harus diperbarui.
Joni
losetup -Pfsebelumnya telah disebutkan oleh askubuntu.com/a/496576/52975 Saya sarankan Anda setidaknya menautkan ke jawaban itu.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
FYI, losetup -Pf ..perintah itu akan membuat perangkat seperti /dev/loopXpYitu yang masih perlu kamu mount. Anda dapat menemukan Xdari melihat output dari losetupperintah. Ini Yadalah nomor partisi.
Gunchars
26

Sunting : berfungsi dengan util-linux> = 2.21 . Pada saat penulisan, pengiriman Ubuntu hanya dengan versi 2.20

Dari man losetup :

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

Jadi lari saja

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

untuk membuat node perangkat untuk setiap partisi gambar disk Anda pada perangkat loop pertama yang tidak digunakan dan mencetaknya ke stdout. Jika menggunakan /dev/loop0perangkat itu akan membuat setidaknya /dev/loop0p1Anda akan dapat melakukan mount seperti biasa.

Ludovic Ronsin
sumber
2
Di mana saya menemukan versi ini losetup? Yang saya miliki di Ubuntu 14.04 memiliki manual dari Juli 2003 (util-linux) dan tidak ada opsi `-P` (atau apa pun) untuk memindai partisi.
Hannu
1
Maaf, saya membuat kesalahan, saya telah menggunakan opsi ini pada Arch Linux yang datang dengan versi yang lebih baru dari paket util-linux. Tampaknya Ubuntu sayangnya terjebak pada versi 2.20.1 yang telah dirilis pada Januari 2012! The --partscanpilihan telah diperkenalkan di util-linux 2.21
Ludovic Ronsin
1
Nah, gnome-disksmemiliki opsi untuk me-mount image disk dan partisi itu. (<- itu untuk menginstal dan menggunakan bash / Terminal, Disksdi dasbor menemukannya juga).
Hannu
2
Ini seharusnya jawaban yang diterima ...
matthid
@matthid Apakah mungkin untuk mengubah jawaban yang diterima? Ini bagus (dan jawaban kpartx sebenarnya tergantung pada versi ini losetup), tetapi hampir tiga tahun lebih baru dari jawaban yang diterima — yang merupakan cara untuk melakukannya pada saat itu.
Auspex
9

Coba gnome-disk-image-mounter:

gnome-disk-image-mounter sda.img

Tidak sudodiperlukan Ini akan dipasang di /media/your_user_name/partition_name, sama seperti drive USB.

Mihai Capotă
sumber
1
Bekerja dengan baik pada 16.04. Saya baru saja menginstal 18,04 baru dan alat meminta kata sandi sudo untuk mengakses perangkat virtual / dev / loopXX :(
Laurent
7

losetup -P otomatisasi

losetup -Padalah metode terbaik yang dimulai di Ubuntu 16.04 sebagaimana disebutkan di https://askubuntu.com/a/496576/52975 , berikut adalah fungsi untuk mengotomatisasi jika lebih lanjut. Pemakaian:

$ 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

Sumber:

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

modul loop max_part config

Ini adalah metode yang layak sebelum 16.04.

loop adalah modul kernel, dibangun ke dalam kernel di Ubuntu 14.04.

Jika Anda mengonfigurasinya dengan benar, Linux secara otomatis membagi perangkat untuk Anda.

cat /sys/module/loop/parameters/max_part

mengatakan berapa banyak partisi loopyang dapat dihasilkan perangkat.

Secara 0default pada Ubuntu 14.04 itulah sebabnya tidak ada pemisahan otomatis.

Untuk mengubahnya, kita dapat menambahkan:

options loop max_part=31

ke file di /etc/modprobe, atau:

GRUB_CMDLINE_LINUX="loop.max_part=31"

ke /etc/default/grubdan kemudian sudo update-grub.

Cara mengatur parameter modul juga dibahas di: Bagaimana cara menambahkan parameter modul kernel?

Setelah reboot, ketika Anda melakukannya:

sudo losetup -f --show my.img

itu me-mount gambar ke /dev/loopXperangkat, dan secara otomatis me-mount partisi ke /dev/loopXpYperangkat.

Jadi ini adalah metode yang paling nyaman jika Anda bersedia untuk reboot.

Lihat juga

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
5

Gunakan losetup untuk melampirkan seluruh gambar disk.

# sudo losetup /dev/loop2 sda.img

Kemudian gunakan mdadm untuk membuat perangkat md dan memblokir perangkat akan dibuat untuk semua partisi.

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

Sekarang Anda akan melihat perangkat partisi.

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
Mike Bappe
sumber
Itu trik yang lucu :)
Johan Boulé
4

Cara paling sederhana, menurut saya, adalah menggunakan mount -o loop,offset=...seperti yang disebutkan dalam jawaban ini di StackOverflow . Idenya adalah sebagai berikut:

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

Metode ini paling baik karena tidak perlu menghapus perangkat loop setelah Anda umount partisi yang di-mount.

Untuk lebih menyederhanakan tugas (yang diperlukan jika Anda sering melakukannya), Anda dapat menggunakan skrip saya mountimguntuk melakukan segalanya untuk Anda. Cukup dapatkan dari https://github.com/AlexanderAmelkin/mountimg dan gunakan seperti ini:

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

Anda juga dapat menentukan tipe sistem file dan opsi pemasangan tambahan lainnya jika Anda suka:

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

Setelah selesai dengan partisi, cukup umountdengan:

umount /media/sda_image
Alexander Amelkin
sumber