Anında doldurma / doldurma yolu çok fazla disk alanı?


45

Bir Linux VM'de, NAGIOS izlemesini sadece VM'yi kapatmaktan veya sanal NIC bağlantısını kesmekten daha derin bir şekilde TEST ETMEK İSTİYORUM; Kısa bir süre için boş alanın% birkaçını işgal ederek test etmek veya "bir disk alanı alarmını zorlamak" istiyorum.

Sadece kullanabileceğimi biliyorum.

dd if=/dev/zero of=/tmp/hd-fillup.zeros bs=1G count=50

veya bunun gibi bir şey ... ama bu zaman alır ve sistemi yükler ve test dosyalarını rm ile kaldırırken tekrar zaman gerektirir.

Sistemi yüklemeyen ve çok zaman alan bir bölümü doldurmanın hızlı (neredeyse anında) bir yolu var mı? Boşluk ayıran fakat onu "doldurmayan" bir şeyi düşünmek im.


Üzgünüm, bunun bir >> ext3 dosya sistemi olduğunu söylemeyi unuttum.
Axel Werner,

Fallocate'i desteklemek için ext4'e yükseltmeniz gerekir.
Rui F Ribeiro

1
Zip bombası her zaman işe yarıyor
galois

1
@ Jaska Bir cevap ver. Başlığı okurken aldığım ilk fikir
Crowley

Neden kullanmayın /dev/full? (Var olduğunu varsayarak). echo 'test' > /dev/fullDebian'ı dene .
Ismael Miguel

Yanıtlar:


63

Bir Linux sisteminde dosya oluşturmanın en hızlı yolu fallocateşunları kullanmaktır :

fallocate -l 50G file 

Adamdan:

fallocate, bir dosyayı ayırmak veya önceden tahsis etmek için ayrılan disk alanını değiştirmek için kullanılır.
Fallocate sistem çağrısını destekleyen dosya sistemlerinde, bloklar ayrılarak ve başlatılmamış olarak işaretlenerek veri bloklarına GÇ gerektirmeden ön dağıtım işlemi hızlı bir şekilde yapılır. Bu, bir dosyayı sıfırlarla doldurmaktan çok daha hızlıdır.
XFS (Linux 2.6.38’den beri), ext4 (Linux 3.0’dan beri), Btrfs (Linux 3.7’den beri) ve tmpfs (Linux 3.5’ten beri) için destek.


1
Neden onu geçiyorsun sudo?
gerrit

1
@gerrit Cevabı bu noktaya eklendi.
Rui F Ribeiro

3
" fallocateKök ayrıcalıklara ihtiyaç var" Sistemimde yok (Ubuntu'nun aşağısındaki Linux Mint 17.3, dolayısıyla Debian). (ext4 dosya sistemi)
TJ Crowder

1
+1, OP açıkça dosya sisteminin ext3 olduğunu belirtti.
syneticon-dj

1
@RuiFRibeiro, teşekkürler! sles11sp4 için bir dosya oluşturabildim, dosyayı ext4 ile biçimlendirdim, ancak nereye RW modunda yükleyemedim. daha sonra / var / log / messages'de bir çekirdek mesajı buldum, ext4 yalnızca salt okunur olarak desteklendi. : /
Axel Werner

13

Diğer alternatifler şunlardır:

  1. Alarm eşiklerini mevcut kullanımın yakınında veya altında bir şeye değiştirmek
  2. sınırlı inode, size veya diğer özelliklere sahip çok küçük bir test bölümü oluşturmak için.

Eğer varsa, root rezerv yüzdesine girmek gibi şeyleri test edebilmek de faydalı olabilir.


root rezerv yüzdesi normalde % 10'dur, eğer siz ince ayarlamazsanız, büyük disk bölümlerinde / modern disklerde çok fazla sistem israfına yol açar. Alarmları tanımlarken, hesaba katsanız iyi edersiniz.
Rui F Ribeiro

İlk şey için +1. yüz kat gerçek. neden cehennemde bir makine diskinde bir şey yaratmalıyım? testim sırasında bir şey (coredump, büyük geçici dosyalar üreten toplu iş, ... gibi) sınama sırasında gerçekleşir ve tüm disk yanlışlıkla yenilirse?
Fiisch

2
@Fisch - Neden? Uyarı eşiğinizin doğru olduğundan emin olmak için ve disk alanı boşluğu yüzdesi yerine inode boş yüzdesini (daha önce de gördüğüm) yanlışlıkla ayarlamak gibi bir şey yapmadığınızdan emin olun. Eğer bir diski uyarı eşiğine doldurduğunuz için bir şey başarısız olursa, uyarı eşiğiniz çok düşüktür - uyarmanın asıl amacı işlerin kopmaya başlamadan önce sizi uyarması gerektiğidir .
Johnny

Cat, iyi nokta. Ama benim için çözüm yok. VM yapılandırması üzerinde denetime sahip değilim (bölümleri veya sanal diskleri değiştiremiyorum) veya NAGIOS Sunucusu üzerinde denetime sahip değilim.
Axel Werner

2
@AxelWerner Bir dosyayı "sahte" partitiion olarak geridönüşebilir misiniz? Bu hala hiçbir şeyi ciddi şekilde etkilemeden test etmenize izin verir. Desteklenen dosya sistemlerinden biriyle biçimlendirin ve yanınızdayken de oynayabilirsiniz.
Tonny

9
  1. fallocate -l 50G big_file

  2. truncate -s 50G big_file

  3. dd of=bigfile bs=1 seek=50G count=0

Çünkü bu üç yol bir bölümü hızlı bir şekilde doldurabilir.

Kullanım Eğer gibi gg , genellikle ile deneyebilirsiniz aramak . Sadece ayarla seek=file_size_what_you_needve ayarla count=0. Bu sisteme bir dosya olduğunu söyleyecektir ve onun boyutu sizin belirlediğiniz şeydir, ancak sistem aslında onu yaratmayacaktır. Ve bu şekilde kullanılırsa, bölüm boyutundan daha büyük bir dosya oluşturabilirsiniz.


Örnek, mevcut 3G'den daha az olan bir ext4 bölmesinde. Neredeyse hiç blok alanı gerektirmeyen, meta veri olarak bulunan bir 5T dosyası oluşturmak için dd kullanın .

df -h . ; dd of=biggerfile bs=1 seek=5000G count=0 ; ls -log biggerfile ; df -h .

Çıktı:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda9        42G   37G  2.8G  94% /home
0+0 records in
0+0 records out
0 bytes copied, 4.9296e-05 s, 0.0 kB/s
-rw-rw-r-- 1 5368709120000 Jun 29 13:13 biggerfile
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda9        42G   37G  2.8G  94% /home

1
cevabınıza biraz daha bilgi ekleyebilir misiniz?
Kedi

Sadece aynı soruyu başka şekilde arayan insanlar için bitmiş bir soruya daha fazla düşünme ekliyorum. görmezden gelme.
Se

Bu count=0yöntem oldukça ilginç, bir örnek ekledim.
agc

7
ddYukarıdaki örneğin, seyrek bir dosya tahsis edebileceğini unutmayın . Bu durumda dosya boyutu 50G, aslında sadece bir blok kullanıyor (ya da değil) ve bu yüzden disk dolmuyor. YMMV.
MAP

2
Önerinizi ext3 dosya sistemimde test ettim. beklendiği gibi çalışmadı. kesmek ve dd büyük bir dosya boyutunda bir dosya oluşturdu, ancak "df -h" tanımıyordu. hala aynı boş hd alanı gösterir.
Axel Werner

0

Ayrıca çok sayıda Linux tabanlı sistemde desteklenen stres araçlarından da yararlanabilirsiniz:

stress-ng --fallocate 4 --fallocate-bytes 70% --timeout 1m --metrics --verify --times
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.