Tüm disk görüntüsünden tekli bölümü bağla (cihaz)


117

İle tüm diskimin bir görüntüsünü yaptım

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

Şimdi sorun şu ki, o diskte bulunan bir ext4 dosya sistemi kurmak istiyorum.

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

Açıkçası, sadece ihtiyacım olan bölümü değil, tüm diski (MBR, diğer bölümler) içerdiğinden, süper blok hatası veriyor. Sanırım disk görüntüsünü /dev/klasörde göstermenin bir yolunu bulmalıyım ...

Bunu nasıl yapacağını bilen var mı?

Not: ddGörüntüyü her zaman orijinal diske yedekleyebilirim, ancak bu çok rahatsız edici olurdu (İşletim sistemini güncelledim ve olduğu gibi tutmak istiyorum)

Yanıtlar:


142

Resmin bölüm düzenini al

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

Görüntünün başlangıcından bölüm başlangıcına kadar ofseti hesapla

Sektör boyutu * Başlat = (bu durumda) 512 * 56 = 28672

Ofset kullanarak / dev / loop0 üzerine monte edin

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

Şimdi bölüm / dev / loop0 konumunda . Sen fsck , mount vb.

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

unmount

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

Çok teşekkür ederim! Bir cazibe gibi çalıştı! Günümü yaptın (ve masum bir Ocelot'un vahşice silinmesini
engelledin

8
En azından sudo losetup -o $((56*512)) /dev/loop0 sda.img
kısaca

1
Bu sadece yardımcı değil, kesinlikle harika.
andho

Ya bir .img1 ve .img2 varsa? "win8.raw1 * 2048 718847 358400 7" ve "win8.raw2 718848 52426751 25853952 7"
Enkouyami

6
Hatta daha basit: mount -o loop,offset=$((56 * 512)) sda.img /mnt. Kaynak: madduck.net/blog/…
ostrokach 10:15

105

Ubuntu 16.04 Güncellemesi: Yeni sürümlelosetup bu artık daha kolay:

sudo losetup -Pf disk_image.raw

Ubuntu'nun eski versiyonları için cevabın kalan kısmına bakınız.


Kolay bir çözüm kpartx kullanıyor : bölme düzenini çözecek ve her birini bir blok aygıtına eşleyecektir . Bundan sonra tek yapmanız gereken istediğiniz olanı monte etmektir.

Terminal'i açın, disk görüntüsünü bulun ve şu komutu girin:

$ 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

Bu yarattı loop0p1ve loop0p2altında /dev/mapper. Çıktıdan, onları tanımlamanıza yardımcı olan bölümlerin boyutlarını görebilirsiniz. İstediğiniz birini monte edebilirsiniz:

$ sudo mount /dev/mapper/loop0p2 /mnt

Alternatif olarak, blok aygıtı Nautilus tarafından algılanır ve yan çubuktan monte edebilirsiniz:

görüntü tanımını buraya girin

İşiniz bittiğinde, monte ettiklerinizi çıkarın ve cihaz eşlemesini kaldırın:

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

Mükemmel cevap, hızlı ve kolay, çarpma basamağından kaçınmak güzeldir
Elder Geek

sudo apt-get install kpartx- kpartx'e erişmek için. kpartxYazının başında bağlantı Bence bir 'tuzak' olduğunu. Yazılım yüklemeyi ima eden bağlantıların bir hayır-hayır olduğunu.
Hannu

1
@Hannu, Software Center ile bütünleşen bağlantılar askubuntu üzerinde yaygın bir uygulamadır , ancak bu durumda tipik simge eklenebilir ve URL güncellenmelidir.
Joni

losetup -PfDaha önce askubuntu.com/a/496576/52975 tarafından belirtilmişti, en azından bu cevaba bağlanmanızı tavsiye ederim.
Ciro Santilli,

1
Bilginize, losetup -Pf ..komut /dev/loopXpYhala monte etmeniz gereken gibi cihazlar yaratacaktır . Komutun Xçıkışına bakarken bulabilirsiniz losetup. Bu Ybölüm numarasıdır.
Gunchars

26

Düzenleme : util-linux> = 2.21 ile çalışır . Ubuntu yazarken sadece 2.20 versiyonuyla geliyor.

Gönderen adam losetup :

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

Yani sadece koş

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

ilk kullanılmamış döngü aygıtında disk görüntüsünüzün her bölümü için aygıt düğümleri oluşturmak ve stdout'a yazdırmak için. Eğer /dev/loop0cihazı kullanıyorsanız , en azından /dev/loop0p1her zamanki gibi monte edebileceğinizi göreceksiniz.


2
Bu sürümünü nereden bulabilirim losetup? Ubuntu 14.04'te sahip olduğumun Temmuz 2003'ten itibaren bir manpage'i var (bölüm linux) ve bölümleri taramak için '-P' seçeneği (veya başka bir şey) yok.
Hannu

1
Üzgünüm, bir hata yaptım, bu seçeneği Linux Linux paketinin daha yeni bir sürümü ile birlikte gelen Arch Linux'ta kullanıyorum. Ubuntu’nun Ocak 2012’de piyasaya sürülen 2.20.1 sürümünde ne yazık ki sıkışmış olduğu görülüyor! Bu --partscanseçenek util-linux
2.21'de

1
Eh, gnome-disksbir disk görüntüsü monte etmek için bir seçeneğiniz var ve bölümleri. (<- bu yüklemek ve bash / Terminal kullanımı için, Disksçizgi de onu bulur).
Hannu

2
Bu kabul edilen cevap olmalı ...
matthid

@ matthid Kabul edilen bir cevabı değiştirmek bile mümkün mü ? Bu iyidir (ve kpartx cevabı aslında bu versiyona bağlıdır losetup), ancak kabul edilen cevabın neredeyse üç yıl daha yeniydi - o zaman bunu yapmanın yolu buydu.
Auspex

9

Deneyin gnome-disk-image-mounter:

gnome-disk-image-mounter sda.img

Hiçbir sudogerekli. Aynı /media/your_user_name/partition_nameUSB sürücüler gibi monte edilecektir .


1
16.04 tarihinde iyi çalışıyordu. Daha yeni bir 18.04 yükledim ve araçlar / dev / loopXX sanal aygıtına erişebilmek için sudo şifresi ister :(
Laurent

7

losetup -P otomasyon

losetup -Phttps://askubuntu.com/a/496576/52975 adresinde belirtildiği gibi Ubuntu 16.04'te başlayan en iyi yöntemdir, ilerde otomatikleştirmek için işlevler. Kullanımı:

$ 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

Kaynak:

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

döngü modülü max_part config

Bu, 16.04'ten önce iyi bir yöntemdir.

loop Ubuntu 14.04 'te çekirdek içine yerleştirilmiş bir çekirdek modülüdür.

Doğru yapılandırırsanız, Linux aygıtları sizin için otomatik olarak böler.

cat /sys/module/loop/parameters/max_part

loopcihazların kaç bölüm üretebileceğini söylüyor .

Öyle 0hiçbir otomatik bölme bunun neden olduğu Ubuntu 14.04 üzerinde varsayılan olarak.

Bunu değiştirmek için şunu ekleyebiliriz:

options loop max_part=31

veya içindeki bir dosyaya /etc/modprobe:

GRUB_CMDLINE_LINUX="loop.max_part=31"

için /etc/default/grubve daha sonra sudo update-grub.

Bir modül parametresi nasıl ayarlanır, ayrıca aşağıdakileri kapsar: Çekirdek modül parametreleri nasıl eklenir?

Yeniden başlatmanın ardından ne zaman:

sudo losetup -f --show my.img

görüntüyü bir /dev/loopXcihaza ve bölümleri otomatik olarak cihaza bağlar /dev/loopXpY.

Öyleyse, yeniden başlatmaya istekli iseniz en uygun yöntem budur.

Ayrıca bakınız


5

Tüm disk görüntüsünü eklemek için losetup kullanın.

# sudo losetup /dev/loop2 sda.img

Daha sonra bir md aygıtı oluşturmak için mdadm kullanın ve tüm bölümler için blok aygıtları oluşturulacaktır.

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

Şimdi bölümleme aygıtlarını görmelisiniz.

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

Komik bir hüner :) var
Johan Boule

4

En basit yöntem, bence , StackOverflow'taki bu cevabındamount -o loop,offset=... belirtildiği gibi kullanıyor . Fikir aşağıdaki gibidir:

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

Bu yöntem en iyisidir, çünkü takılı bölümü ayarladıktan sonra döngü aygıtını silmeyi gerektirmez.

Görevi daha da kolaylaştırmak için (sık sık yaparsanız gerekli), betiğimi mountimgsizin için her şeyi yapmak için kullanabilirsiniz. Sadece https://github.com/AlexanderAmelkin/mountimg adresinden edinin ve şöyle kullanın:

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

İsterseniz dosya sistemi türünü ve diğer ek mount seçeneklerini de belirleyebilirsiniz:

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

Bölünme bittiğinde, basitçe umount:

umount /media/sda_image
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.