Tüm bölümü veya sabit sürücüyü seyrek bir dosyaya kopyala


35

Bütün bir bölümü veya bütün bir sabit diski daha büyük bir harici diske kopyalamayı seviyorum ama seyrek bir dosya oluşturmayı seviyorum. Sık sık ddklonlama için kullanırım , ancak seyrek dosyaları desteklemiyor. Geçici bir çözüm olarak şöyle bir şey kullandım:

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

Ancak bu zevklerim için biraz fazla zor ve iptal edilirse işleme devam etmeme izin vermiyor. Bunun için bir NTFS aracı olması komiktir, ntfscloneancak Linux'un yerel dosya sistemleri için böyle bir araç yoktur (EXT2-4).

Bunun için daha iyi bir araç var mı, örneğin ddseyrek desteği olan bir değişken mi? Disk yedeklemeleri için bazı özel yazılımlar aramıyorum, ancak gerektiğinde döngü aygıtı olarak takabileceğim seyrek bir klon kopyası oluşturmak istiyorum.


7
Yaratıcı kullanım için +1 cp, bir disk görüntüsünü seyrek kopyalayabileceğiniz aklıma gelmedi. Yerden tasarruf etmem gerekirse, onları hep sıkıştırdım. Şimdi neden bu bir sorunun cevabı değil?
Caleb

Yanıtlar:


21

Sen istiyorsun dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
Harika! Kılavuz, "Kopyalama işlemi kullanıcı tarafından durdurulursa daha sonra herhangi bir pozisyonda devam etmek mümkündür" diyor. ve "-a spArse dosya yazma (varsayılan = hayır)". Tam olarak ne istersem! Teşekkürler!
Martin Scharrer

3
İnterneti ararken, bağımsız olarak geliştirilen ancak temelde aynı gibi görünen dd_rescuefarklı bir araç ddrescue(alt çizgi olmadan) olduğunu öğrendim dd_rescue. Sadece burada genel bir FYI olarak bahsediyorum.
Martin Scharrer

Evet, dd_rescueve ddrescueaynı şey değildir. Teorik olarak aynı işi yaparlar, ancak genellikle eski / orijinal ile daha iyi şanslar yaşadım dd_rescue.
Steven Pritchard

1
Herhangi birinin merak etmesi durumunda, Ctrl-C ile kopyayı istediğiniz zaman durdurabilirsiniz. Size o anki pozisyonunuzu gösterecek -sve orijinal komuta pozisyonu ekleyerek yeniden başlatmak için bu değeri kullanabilirsiniz . (Öyle görünüyordu dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
Steven Pritchard

1
@Steven Pritchard: Konumu hatırlamana gerek yok. Günlük dosyası olacak üçüncü bir dosya adı belirtin ve yeniden başlatıldığında bunu okuyacak ve kaldığı yerden devam edecektir.
Tanith Rosenbaum,

20

Sadece bütünlüğü sağlamak için kurtarma çağrısı . --sparseVeya -Sbayrak hedef seyrek yazılmasına izin verir:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

Veya uzun seçenekli:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

Veya MiB’leri tercih ederseniz :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Kurtarmanın yarıda kesilmesine ve devam ettirilmesine izin vermek için, bir günlük dosyasını da kullanabilirsiniz:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

GNU ddrescueve dd_rescuefarklı programlar olduğuna dikkat edin . Ancak GNU ddrescuedaha yaygın görünüyor. Örneğin, zaten GRML ile paketlenmiştir .


Restorasyonu geri yüklerken görüntünün herhangi bir özel işlemine gerek var mı, bir kurtarma kurtarması için kullanılan komutu verebilir misiniz?
user12439,

Teorik olarak size kurtarma için kullandığınız depolama ortamı genellikle sadece yedek diske yazma için dd kullanabilmesi için, daha güvenilir olması gerekiyordu: dd if=sda1.raw of=/dev/sdb1. Bununla birlikte, geri yükleme için ddrescue uygulamasını kullanmak için, kurtarma için kullandığınız kaynağı / hedefi yeni bir kaynak / hedefe değiştirirsiniz, tercihen yeni bir günlük dosyası ile. Mümkünse (genellikle değil), verileri doğrudan hatalı kaynak diskten yedek diske kopyalamak için ddrescue uygulamasını kullanabilirsiniz .
zaTricky

3

GNU gd'de seyrek dosya desteği sağlamak için 2007'de sunulan bir düzeltme eki vardı , ancak bunu çekirdek çekirdeklere (en azından 8.4 itibariyle) getirmemiş gibi görünüyor. Dd'nin o zamandan bu yana çok fazla değiştiğinden şüpheliyim, yama mevcut sürüme karşı çok fazla çalışma olmadan geçerli olabilir.

Ayrıca cp, sorunuzdaki yaratıcı kullanımdan gerçekten etkilendim ve devam ettirmek için onu kullanmaya devam etti (işte kaynak ~ 80M'den devam ederek):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Düzenleme: tırmalamak. İkincisi ddelbette çıktı dosyasındaki yanlış pozisyonu aramak olacaktır, çünkü girdiyle aynı uzunlukta değildir.


1
Bhinesley'in cevabında olduğu gibi, dd'nin ilerlemesini doğru bir şekilde sürdürmek için kaydetmesi en iyisi olacaktır. Bu yaklaşımı hem ilk çalıştırma hem de devam ettirme için kullanacak ve her iki paralel gd'yi bağımsız olarak kaydedecek olsaydınız, çıktının ne kadar uzağa bakılacağını bilebilirsiniz. Zamanım varsa, bunun üzerinde çalışmayı deneyeceğim.
Eli Heady,

2
Yamaya bağlantı için teşekkürler. Kendim gibi bir şeyi programlamayı düşünmeye başlamıştım :-) Seyrek dosyalar gönderilemediğinden kodunuz çalışmaz.
Martin Scharrer

Evet, daha yeni kendim keşfettim. Ah, delice yeni kullanımlar bulmak eğlenceliydi cp- teşekkürler!
Eli Heady,

1
2012'de dd taahhüdü: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: conv = seyrek seçenek için destek ekleyin" ("(iwrite): Bir NUL bloğu yazısını bir aramaya dönüştürün eğer istenirse. ")
osgx

1

Sadece 2 kuruş ekledim. Ham diskten seyrek bir dosya oluşturmanın bir başka yolu da qemu-img kullanmaktır:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Bunu tek bir bölümde de kullanabilirsiniz. Ayrıca, ham diski / bölümü qemu-img'nin desteklediği herhangi bir formata dönüştürme seçeneğiniz de vardır (QCOW2, VHD [x], vmdk, vb.)


1

Başka bir seçenek rsync'dir . Örneğin:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Açıklama:

  • -S/ --sparseyazma sırasında seyrek blokları atlamak için
  • -P/ --partial --progressilerlemeyi göstermek ve kısmen aktarılmış dosyaları saklamak için
  • --copy-devices cihaz içeriğini kopyalamak için

--appendKesilen bir kopyaya devam etmek için ekleyebilir (veya --append-verifyyeni ve eski veri eşleşmeleri üzerinde sağlama toplamı onaylamak için)

Düzenleme : Sadece copy-devices.diff'in göz önünde bulunduğunu ve birçok sistemde bulunmayabileceğini fark ettim ( Fedora , Ubuntu , Debian ve diğerleri de dahil)


0

Not: Bu açıklamalarda açıklanan nedenlerden dolayı işe yaramaz, referans için buraya bırakıyorum.

Kill -USR1 kullanarak dd istatistiklerini izleyin:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Atla / ara'yı kullanarak devam et:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

$ İ_bytes olmadan devam etmek daha zor olurdu. Makinenin çökmesi ya da her neyse, dd istatistiklerini bir dosyaya kaydetmek muhtemelen en kolay yoldur.


İkincisi cp, mevcut dosyanın üzerine yazacak, değil mi? skipVe diğer seçeneklerini biliyorum dd. Mesele cpkısmı.
Martin Scharrer,

Evet, haklısın.
bhinesley


0

Neden basitçe:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
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.