Komut satırını kullanarak dosyaları nasıl düzeltebilirsiniz?


18

Aşağıdaki Python kodunun konsol eşdeğeri nedir:

target = file("disk", "w")    # create a file
target.seek(2*1024*1024*1024) # skip to 2 GB
target.write("\0")
target.close()

Belki biraz büyümüştür? Fikir, sanallaştırmada kullanım için 2 GB görünen boyutta bir dosya yapmaktır.

kvm disk -cd whatever.iso #Only allocate space as necessary

ddseeksistem çağrısını açığa çıkaran tek geleneksel araç (bkz. dd vs cat - dd bugünlerde hala geçerli mi? ancak bu kedinin tipik akım birleşimleri üzerinde derisini almanın başka yolları var.
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


8

Genel olarak, sadece kullanın dd; ancak KVM sanallaştırmasının kullanımından bahsettiğiniz gibi şunları kullanmayı düşünebilirsiniz qemu-img:

qemu-img create -f raw disk 2G

ddChris Down'un cevabındaki komutla aynı şeyi etkili bir şekilde yapıyor.

Hangi komutu kullandığınızdan bağımsız olarak, sanallaştırmada kullanmak için, fallocateparçalanmayı önlemek ve performansı artırmak için blokları önceden ayırmayı şiddetle öneririm .

fallocate -l 2G disk

Yine de tüm platformlarda ve dosya sistemlerinde mevcut değildir. Bu sıfır yazmaz, ancak dosyayı genişletmek zorunda kaldığında daha sonra isteğe bağlı yapmak yerine dosyaya bloklar atar.


Alıntı bir yazım hatası mı?
badp

@badp evet, düzeltildi.
gertvdijk

2
qemu-imgve ddher ikisi de dosya boyutunu (ftruncate) ayarlamak için bir sistem çağrısı gerçekleştirir , ancak kendilerini ve bağlandıkları kütüphaneleri yüklemek için çok daha fazlasını gerçekleştirir. Ve bu bakımdan, ddçok daha etkili olacaktır qemu-img(bu çok daha büyük ve çok daha fazla kütüphaneye bağlıdır). GNU truncatedaha da etkili olacak. ddaynı zamanda her yerde bulunma avantajına sahiptir. fallocateGerçi iyi bir nokta .
Stéphane Chazelas

@StephaneChazelas Ben yorumunuzu tamamen ikinci. Cevabımı qemu-img, KVM sanallaştırmasının kullanımında bariz bir alternatif olduğuna işaret etmek için düzenledim .
gertvdijk

14

Şununla seyrek bir dosya oluşturabilirsiniz dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk

4
Ayrıca, 2Gbir GNU uzantısıdır dd. bs=1024 seek=2097152GNU'nuz yoksa kullanabilirsiniz dd.
Chris Down

Heh, Gbir uzantısıdır ve bu gg ait OpenBSD sürümü tarafından desteklenmeyen ... ama, Mve Kbu yüzden belki, desteklenen seek=2048Mneler platformlar sen hedefleme bağlı olarak biraz daha okunabilir
Earlz


@DanielFanjul Neden? Kesinlikle hiçbir fark yoktur, bayt yazılmaz.
Chris Down

@ChrisDown Çünkü / dev / null okuduğunuzda veri içermiyor, / dev / zero ise infinte sıfırlar içeriyor. Oh, say = 1, yazılacak bayt sayısı sıfır olmamalıdır.
Daniel Fanjul

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.