İsteğe bağlı olarak büyük bir “sahte” dosya oluşturma


16

Ben benzer özel bir dosya oluşturmak istiyorum /dev/nullya /dev/randomdosya yok, değil gerçekte var ama aslında dosyanın görünür büyüklüğü bir üst sınır olabilir sen hariç hepsi aynı mesafede okuyabilir.

Başka bir deyişle, dosyayı "cat" ben dosya 500 bit tüm çıktı ve sonra durur (kap 500GB olarak kabul varsayalım) özel bir dosya oluşturmak istiyorum. 500 GB'lık gerçek bir dosyayla aynı şekilde davranması gerekir, ancak yer kaplamadan. Bu dosyanın içeriği hepsi olabilir, mesele yok \0gibi 'ler /dev/null, ya da sadece küçük bir dize üzerinden gönderilen ve üzerinde, ya da her neyse ediliyor.

Bu yapılabilir bir şey mi? Uzaktan bulabildiğim tek şey, man sayfalarından bahsediyor mknod, ama bunlar çok yardımcı olmadı.

Yanıtlar:


17

Belirli dosya sistemlerinde belirli bir boyutta görünecek , ancak aslında diskte bu kadar yer kullanmayacak seyrek bir dosya oluşturabilirsiniz .

$ dd if=/dev/null of=sparse bs=1024 count=1 seek=524288000
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.4444e-05 s, 0.0 kB/s
$ ls -l sparse 
-rw-rw-r--. 1 ignacio ignacio 536870912000 May  9 22:25 sparse
$ du -h sparse
0   sparse

Bu mükemmel çalışıyor. En iyi durumda, çıktının ne olduğunu gerçekten yazabileceğim bir çözüm umuyordum (verilere baktığınız her arama pozisyonu için, bu pozisyonda bir karma veya bu satırlar boyunca bir şey olurdu), ama bu oldukça dışarıdaydı Orada. Bu kesinlikle şimdilik çalışıyor, teşekkürler!
Vasat Gopher

1
@MediocreGopher, FUSE ile kesinlikle böyle bir şey yapabilirsiniz .
cjm

1

Bahsedilen taşınabilir dd / seek tabanlı çözümün ötesinde, bazı Unixlerin özel komutları vardır:

En azından Solaris , MacOS / X ve Irix'de :

mkfile -n 500m sparseFile

HP-UX üzerinde PreAlloc AIX lmktemp üzerinde. ve birçok Linux dağıtımı kısaldı


1

Dosyayı tekrar aramanıza gerek yoksa, adlandırılmış bir yöneltme kullanabilirsiniz:

mkfifo my_special_file
yes | head -n 100 > my_special_file&
cat my_special_file

Elbette, kanalda veri oluşturmak için karmaşık bir komut dosyası da dahil olmak üzere başka herhangi bir komutu kullanabilirsiniz.


0

Dd ile, bir blok boyutu ve bir sayı belirtebilir ve böylece boyutu şu şekilde sınırlayabilirsiniz:

dd if=/dev/urandom count=5 bs=1024 > nullfile

Ondan okumak istiyorsanız, sadece yönlendirin:

dd if=/dev/urandom count=5 bs=1024 | yourReadingProcess 

Eski zamanlarda, yaptığım her linux kurulumu, bazı ağ araçları, portmap, inet.d ve benzerleri ve inet.d'de, bazı hizmetlerin her zaman belirtildiği yerlerde, doğru hatırlıyorsam, bunlardan biri chargen olarak tanımlandı / adlandırıldı.

(... bir dakika sonra ...)

Evet. / Etc / services dizininde şunları bulabilirsiniz:

chargen         19/tcp          ttytst source
chargen         19/udp          ttytst source

Bu yüzden bir şey test etmek için bir hizmet ve ağ üzerinden chars - belki rastgele - gönderir sanırım. Bilgisayarımda yalnızca /etc/xinet.d/chargen buluyorum. Daha fazla bilgi var:

# default: off
# description: An xinetd internal service which generate characters.  The
# xinetd internal service which continuously generates characters until the
# connection is dropped.  The characters look something like this:
# !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
# This is the tcp version.

Ancak, amacınız için nasıl kullanacağımı bilmiyorum.

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.