Linux'ta bir sabit disk nasıl doldurulur


24

Bir parça kod sınaması yapıyorum ve bir sabit sürücüyü verilerle doldurmak istiyorum. ddAnında büyük dosyaları yapabilir, ancak dfaynı fikirde olmadığını buldum . İşte denedim:

dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))

ls -lhbir 10G dosyasını gösterir. Ancak, df -hbölüm küçülmediğini gösterir. Öyleyse df, verilerin şimdi alındığını algılamak için ne yapmam gerekiyor ? Birim testinde kodladığım hızlı bir şey umuyorum.


Eğer serverfault.com de sorarsan daha şanslı olacak

BTW, 10 * 1024 * 1024 * 1024, 10 * 2 ** 30 ile aynıdır, Biraz daha basittir.
deltaray

Yanıtlar:


26

seek=<big number>Püf noktası ile ilgili sorun , dosya sisteminin (genellikle) zekice olmasıdır: bir dosyanın bir kısmı hiç yazılmadıysa (ve bu nedenle hepsi sıfırsa), bunun için herhangi bir yer ayırmak için zahmete girmez. Görüldüğü gibi, hiç yer kapamayan 10GB bir dosyanız olabilir (bu, "seyrek dosya" olarak bilinir ve bazı durumlarda, örneğin belirli veritabanı uygulamaları gibi çok yararlı olabilir).

Tahsis edilecek alanı zorlayabilirsiniz (örneğin):

dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))

bu daha uzun sürecek, ancak diski gerçekten dolduracak. Blok boyutunun bir taneden daha yüksek olmasını öneriyorum, çünkü bu ddişlemin kaç sistem çağrısı yapacağını belirleyecektir - blok boyutu ne kadar küçükse, o kadar fazla sistem çağrısı ve dolayısıyla daha yavaş çalışması. (1 MB veya daha fazla olsa da, muhtemelen pek bir fark yaratmayacak ve hatta işleri yavaşlatabilir ...)


Genellikle bs = kullanıyorum (yazdığım sürücüde önbellek boyutunun yarısı ne olursa olsun). Bu, daha sonra yeniden boyutlandırma için bölümleri daha büyük sabit disklere görüntülerken bugüne kadar iyi çalıştı. ETA: Kritik kelime HALF.
atroon

20

Bunun başka bir seçeneği olarak, evet'i tek bir dize ile birlikte kullanabilirsiniz ve dd if = / dev / urandom of = largefile komutundan yaklaşık 10 kat daha hızlıdır. Bunun gibi

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile

Bu, şaşırtıcı bir şekilde, = dosyaadı bs = İM = dd if = / dev / zero kullandığı kadar hızlıdır.
bhinesley

Sözdizimi de hatırlaması kolaydır.
AWT

7

"Seyrek dosya" olarak bilinen bir şey yarattınız - birçoğu boş olduğu için (yani \ 0 olarak okur), gerçekte yazılanların yanı sıra diskte yer kaplamaz (1B, 10GB’dan sonra) boşluk).

Çok büyük dosyalar yapabileceğinizi sanmıyorum, anlık disk alanını anında almak - fiziksel alan almak, dosya sisteminin disk bloklarını dosyanıza ayırması gerektiği anlamına gelir.

Sürücü sıralı yazma hızınızla sınırlanan eski moda "dd if = / dev / zero / = dosya adı bs = 100M count = 100" ile sıkışıp kaldığınızı düşünüyorum.


6

Eğer sadece dosya sistemleri dolu olan durumları test ediyorsanız, belki de yanılma yeterlidir. Ve daha hızlı! Örneğin

fallokat -l 150G


3
Bu belirtilmesi bir dosya adı gerekir: fallocate -l 150G foo. Bununla birlikte, araçtan bahsettiği için +1.
Kamil Maciorowski


3

Sabit sürücüyü tam olarak doldurmak istiyorsanız, şunu yapın:

dd if=/dev/zero of=zeros bs=1M

Boyutu sınırlamak istiyorsanız, isteğe bağlı olarak sayım belirleyebilirsiniz, ancak sayımı atlarsanız, disk alanı bitinceye kadar çalışır.

dd if=/dev/zero of=zeros bs=1M count=10240

Psmears'in bahsettiği gibi, blok boyutunu 1 B (bs = 1) yerine 1 MB (bs = 1M) olarak ayarlarsanız daha iyi performans elde edersiniz. Bu biraz zaman alacaktır, ancak komutunuzun ilerleyişini kontrol etmek istiyorsanız, ayrı bir konsol açın ve şu komutları çalıştırın:

ps aux | grep dd

Bu komutta dd PID değerini kullanın (PID'yi dd PID ile değiştirin):

kill -USR1 PID

Öyleyse git ve terminaline bak. Tabii ki, bu sadece sürücüyü doldurmaya çalışırken sınırlı bir kullanım alanıdır (sırasıyla boş disk alanını veya dosya boyutunu kontrol etmek için sadece df veya du kullanabilirsiniz). Bununla birlikte, dd çıktısını ilerletmek için kullanışlı olan başka zamanlar da vardır.

Ekstra kredi: boş alanı sıfırlamak için pratik bir kullanım, daha sonra "sıfır" dosyalarını silebilir ve tüm bölümü (veya tüm bölümleri sıfırladıysanız diski) bir disk görüntü dosyasına (örneğin, dd) silebilirsiniz. , disk-backup.dd), ardından dosyayı sıkıştırın. Boş alan artık oldukça sıkıştırılabilir olduğundan, sıkıştırılmış dd görüntünüz, içerdiği orijinal blok cihazdan çok daha küçük olacaktır.

Shenanigans: büyük bir sıfır dosyasını sıkıştırın ve tüm arkadaşlarınıza e-posta ile gönderin. Onlara bunun gerçekten harika bir şey olduğunu söyle.


2

Aşağıdaki komutu ile seyrek 1 TB dosyası oluşturun:

dd if=/dev/zero of=bigfile1 bs=10000000000 count=512

Bu, kotalara ulaşıldığında veya bir dosya sistemi dolduğunda ne olduğunu test etmek için kullanışlıdır.

df -h mevcut alanı küçülterek gösterir.

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.