dd diskin tamamında, ancak boş bölüm istemiyorsanız


33

Bir diskim var / dev / sda deyin.

İşte fdisk -l:

 Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          27      209920   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              27         525     4000768    5  Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5              27         353     2621440   83  Linux
/dev/sda6             353         405      416768   83  Linux
/dev/sda7             405         490      675840   83  Linux
/dev/sda8             490         525      282624   83  Linux

Ürettiğimiz diğer cihazları yanıp sönmek için dosya sunucumuzda depolamak için bir resim yapmam gerekiyor, bu yüzden sadece kullanılan alanı istiyorum (sadece yaklaşık 4 gb). Ben mbr vb tutmak istiyorum ... çünkü bu cihaz kopya biter bitmez önyükleme hazır olması gerekir.

Herhangi bir fikir? Daha önce kullanıyordum dd if=/dev/sda of=[//fileserver/file], ama o zaman, ana kopyam 4 gb flash ide üzerindeydi.


2
@Sudoer hariç aşağıdaki tüm cevaplar yanlıştır. Doğru cevap kullanmaktır dd conv=sparse.
Bahamat

@ bahamat, hayır, gzip veriyi sıkıştıracağından daha iyidir.
psusi

1
Bu seyrek olarak aynı şey değil.
bahamat

@ Bahamat, soru özellikle ifade için sormuyor; Görüntünün daha az yer kaplaması için.
psusi

Yanıtlar:


37

Günün içine gömülü Linux dağıtımlarında da benzer bir sorunla karşılaştım - görüntüyü sıkıştırmadan önce tüm önemsiz şeylerden kurtulun.

dd if=/dev/zero of=asdf.txt. Ölene kadar bekleyin. Asdf.txt dosyasını silin.

Cihazdaki tüm boş alanlara sıfır yazdınız.

Şimdi bir disk görüntüsü alın ve gzip üzerinden çalıştırın. Voila, seyrek görüntü.

Muhtemelen çok iyi ölçeklenmiyor ve diske yazmanız gerekiyorsa sorunlara neden olabilir, ancak hey.

Diskin rsync görüntüsünü başka bir birime götürebilir, sıfıra çekebilir ve ardından bu disk görüntüsünü alabilirsiniz.

Not: SSD için tehlikeli olabilir, kullanıcı taahhütte bulunmak için bu işlemi dikkate almalıdır.


Eğer gzip ile çalıştırırsam, kullanmadan önce açmam gerekecek mi? Ve gzip içinden geçirerek, dd işlemi sırasında sadece boru yapıyorum mu?
Jonathan Henson

3
Evet. dd if=sda2.gz | gunzip > /dev/sda2vedd if=/dev/sda2 | gzip > sda2.gz
Rob Bos,

3
"Aygıttaki tüm boş alana sıfır yazdınız". Bölünme demek istiyorsun, cihaz değil. Bu komutu, ofher bölüm için bir yolla çalıştırmanız gerekir .
jiggunjer

Fiziksel ortam bir SSD ise, şimdi cihazdaki her sektörün kullanıldığını düşünebilir. Bu, SSD'ye çalışacak daha az yedek sektör verecek ve bunun sonucunda da performansı düşürebilecektir. Sürücü ve bellenim TRIM desteğine sahipse, bu koşul yalnızca dosyayı tekrar silene kadar geçerli olacaktır. Görüntüyü oluştururken dosyayı yerinde tutarsanız, görüntüyü geri yükledikten sonra dosyayı yeniden silmeniz gerekir. Görüntü SSD'ye geri yüklüyse bu yararlı olabilir.
kasperd

Akılda tutulması gereken birkaç ek endişeler var. Bu yöntem dosya sisteminin okuma-yazma işlemine bağlanmasını gerektirdiğinden, kopyalama işlemi devam ederken temel dosya sisteminde değişiklik yapılması tutarsız bir görüntüye yol açabilir. Bir keresinde, ortaya çıkan kopyanın o kadar tutarsız olduğunu gördüm ki, fsck kopyadaki tutarsızlıkları onarmaya çalışırken gerçekten farklılaşacaktı. Ayrıca cihazın doldurulması, medyaya yazmaya ihtiyaç duyan diğer işlemlerin başarısız olmasına neden olabilir.
kasperd

17

Kaydetmek /dev/sdXNistediğinizi /tgtfs/image.rawve kök olduğunuzu varsayalım:

  1. mkdir /srcfs && mount /dev/sdXN /srcfs

  2. Zerofill ya da just kullanın: dd if=/dev/zero of=/srcfs/tmpzero.txtkullanılmayan blokları sıfırla doldurmak için (dosya sistemini tamamen doldurmasını bekleyin rm /srcfs/tmpzero.txt)

  3. Görüntüyü dd ile çekin ve anında sıfırlama yapmak için conv = sparse kullanın: dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw

Sıkıştırma kullanmak istiyorsanız, sıfır blokları yüksek oranda sıkıştırılabildiğinden sıfırları dd ile delmeniz gerekmez:

dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw

Not: Bunun flash bellek tabanlı bir depolama ortamında iyi bir fikir olmadığını unutmamalısınız (örn. Kaynak dosya sisteminiz SSD)


5
Bu doğru cevap. Kullanın dd conv=sparse.
Bahamat

1
Flaş depolamada bunu yapmanın nesi yanlış?
Dan

2
@Dan (donanıma ve yazılım tasarımına ve konfigürasyonuna bağlı olarak) SSD'nize geniş yazmalara neden olabilir ve ömrünü kısaltabilir. ve genel olarak, verileri eski diskten yenisine (veya OP'nin yapmak istediği gibi) taşımak için sorun yok, ancak disk / bölüm düzeyinde yedekleme, HDD'lerde bile düzenli yedekleme ve geri yükleme için iyi bir çözüm değildir. dosya düzeyinde yedekleme (yani bir dosya sisteminden diğerine dosyalarla başa çıkma) veya dosya sistemi düzeyinde yedekleme (BTRFS gibi dosya sistemleriyle btrfs snapshotve btrfs sendaraçlarla) IMHO için daha iyi bir çözümdür.
Sudoer

İpucu: yoksa gzüzerinde senin PATH(ı did not gibi GParted Live), kullanabilirsiniz gzip -cyerine.
XtraSimplicity

11

Sayma seçeneği ile, dd kullanın.

Senin durumunda fdisk kullanıyordun, ben de bu yaklaşımı kullanacağım. "Sudo fdisk -l" ifadeniz:

    Disk /dev/sda: 64.0 GB, 64023257088 bytes
    255 heads, 63 sectors/track, 7783 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x0000e4b5

    Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1          27      209920   83  Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2              27         525     4000768    5  Extended
    Partition 2 does not end on cylinder boundary.
    /dev/sda5              27         353     2621440   83  Linux
    /dev/sda6             353         405      416768   83  Linux
    /dev/sda7             405         490      675840   83  Linux
    /dev/sda8             490         525      282624   83  Linux

Dikkat etmeniz gereken iki şey 1) birim büyüklüğü ve 2) "Son" sütunu. Senin durumunda 8225280 Bayt'a eşit silindirleriniz var. "Son" sütununda sda8 525'te sona erer (bu 525 [birim] * 16065 * 512 = ~ 4.3GB'dir)

dd, ofsetten sonra başlamak veya belirli sayıda bloktan sonra durmak gibi birçok şey yapabilir. Dd'deki count seçeneğini kullanarak ikinciyi yapacağız. Komut aşağıdaki gibi görünecektir:

    sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526

-Bs blok boyutu ise (fdisk'in kullandığı birimi kullanmak en kolay olanıdır, ancak sayma seçeneği bu birimlerde bildirildiği sürece herhangi bir birim yapacaktır) ve sayı, kopyalamak istediğimiz birim sayısıdır (not son bloğu yakalamak için sayımı 1 arttırıyoruz.)


Bilginize: silindirlerde birimleri göstermek için kullanınfdisk -l -u=cylinders /dev/sda
xinthose

3
Neden bu kabul edilen cevap değil? Kaynağı değiştirmeyen en az müdahaleci seçenek gibi görünüyor.
kullanıcı33326

@ user33326 çünkü bu cevap, bir diske bölümlenmemiş alanın kopyalanmaması, bölümlerdeki kullanılmayan alanların kopyalanmaması, OP'nin neye önem verdiğinin iyi olması.
GDorn

8

İken /dev/zeroserbest disk alanı ve kullanımını ing dd conv=sparse/ gz -cboşluk, GBS 100s çalışan dev diskler üzerinde mümkündür /dev/zeroacı yavaş ing - diğer bir cevap belirtildiği gibi, söz değil /dev/zeroEOF email SDD ing.

İşte bu duruma girdiğimde yaptığım şey:

  • Bir lubuntu canlı CD'sinde, gparteddiski mümkün olan en küçük boyuta 'küçültmek' için kullanılır , böylece kalan alan ayrılmaz


  • dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz Hızlı sıkıştırılmış görüntüyü oluşturmak için kullanılır (Söylemeye gerek yok, ham verileri depolamak için yeterli alana sahipseniz (veya CPU yüklemesini azaltmaya meyilliyse) sıkıştırmayı atlamak isteyebilirsiniz.


  • dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY Verileri farklı diske kopyalamak için kullanılır
  • Bölmeyi gparted'genişletmek' için tekrar kullanılır

Birden fazla bölüm için denemedim, ancak hedef diskteki bölüm tablosu ilk önce oluşturulduysa ve yalnızca bölüm içinde yer alan veriler dd- okuma / yazma ofsetleri aracılığıyla kopyalanırsa yukarıdaki işlemin "bölümleri" kopyalamak için uyarlanabileceğini düşünüyorum. skip/ seekseçeneği ddsırasıyla) gerekli olacaktır.


1
Bu gerçek cevap, sadece countparametre kullanın
Gordy

7

Yapamazsın ddçok düşük seviyeli bir araçtır ve dosyalar ile boş alanlar arasında ayrım yapmanın bir yolu yoktur.

Öte yandan, boş alan çok, çok güzel bir şekilde sıkışır, bu nedenle yalnızca saklama alanı ile ilgileniyorsanız, örneğin yazma süresiyle ilgilenmiyorsanız, sadece gzip üzerinden geçirin.


7
Boş alanın daha önce kullanılmadığını varsayarsak. Sıkıştırmanın beklendiği gibi çalışmasını sağlamak için önce boş alanı sıfır olarak doldurabilirsiniz.
Sirex

1
Doğru. Ve bu sadece süreci zorlaştırıyor ve daha da uzun sürmesini sağlıyor.
c2h5oh

6

Sürücünün geri kalanının boş olduğunu varsayalım (tüm sıfırlar), DD'nizi gzip ile sıkıştırabilirsiniz; Boş alanınızın gerçekte boş olduğundan emin olmak için sıfırsız gibi bir araç kullanabilirsiniz , böylece güzel sıkıştırılır.

Partimage , clonezilla veya diğer linux cloning araçlarından bazıları gibi bir araç kullanırsanız , bunun sizin için otomatik olarak hallederler.


Partimage ve Clonezilla atlamak için aslında akıllı yeterli okuma . doğrusu buna yazma sıfır size güvenmek yerine, boş alan ve daha sonra damla dd varsa veya gzip veya bunları okuduktan sonra sıfırları sıkıştırmak
psusi

2

Kabul edilen cevap doğru değil. Yukarıdaki yorumu kabul ediyorum. Kullanmak dd ile sayımı düzenli aralıklarla benim diski yedeklemek için parametresi. BACKUP_FOLDER ve cihazınızın harfini "X" ile değiştirmeniz yeterlidir:

Diskin son kullanılan bloğunu tanımlayın:

ct=$(fdisk -l | awk '$1 == "/dev/sdX" { print $3 }')

Sonra diski klonlamak (boş alanı hariç):

dd if=/dev/sdX bs=512 count=$ct | gzip > BACKUP_FOLDER/sdX_$(date +"%Y-%m-%d").img.gz >>"$LOG"
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.