Utwórz plik testowy z dużą ilością zerowych bajtów

25

Wiem, jak utworzyć pusty plik:

touch /var/tmp/nullbytes

ale jak mogę utworzyć plik 1 MB, który zawiera tylko nullbytes w linii poleceń za pomocą bash?

rubo77
źródło
Dotyczy pytania SU: superuser.com/q/609020/151431
terdon
1
+1. Interesujące pytanie. Czy ktoś mógłby uprzejmie opracować, w jakich scenariuszach taki plik byłby wymagany…?
Kent Pawar
1
Potrzebowałem go, aby zasymulować awarię na chkrootkit: unix.stackexchange.com/questions/86866/…
rubo77,

Odpowiedzi:

56

Z GNU truncate:

truncate -s 1M nullbytes

(zakładając, nullbytesże wcześniej nie istniał) utworzyłby rzadki plik o rozmiarze 1 MB. Jest to plik, który wygląda na wypełniony zerami, ale nie zajmuje miejsca na dysku.

Bez truncatemożesz ddzamiast tego użyć :

dd bs=1048576 seek=1 of=nullbytes count=0

(w przypadku niektórych ddimplementacji można zastąpić 1048576 1M)

Jeśli wolisz przydzielić miejsce na dysku , w systemie Linux i niektórych systemach plików możesz:

fallocate -l 1M nullbytes

Przydziela to miejsce bez faktycznego zapisywania danych na dysku (miejsce jest zarezerwowane, ale oznaczone jako niezainicjowane).

dd < /dev/zero bs=1048576 count=1 > nullbytes

Faktycznie zapisze zera na dysku. Jest to najmniej wydajne, ale jeśli chcesz, aby dyski obracały się podczas uzyskiwania dostępu do tego pliku, to ten, na który chcesz się wybrać.

Lub sposób @ mikeserv na podstęp dddo wygenerowania bajtów NUL:

dd bs=1048576 count=1 conv=sync,noerror 0> /dev/null > nullbytes

Alternatywa dla GNU head, która nie wymaga określania rozmiaru bloku (1M jest OK, ale na przykład 10G nie):

head -c 1M < /dev/zero > nullbytes

Lub, aby uzyskać pasek postępu:

pv -Ss 1M < /dev/zero > nullbytes
Stéphane Chazelas
źródło
Nie używaj truncatedo tworzenia pustego pliku, który będzie używany jako wolumin wymiany… to nie zadziała! ddZamiast tego użyj w tym przypadku.
Elias Probst
1
@EliasProbst, zamiast tego kopia ITYM z / dev / zero , nie używaj rzadkiego pliku . ddmogę tworzyć rzadkie pliki, tak jak pokazałem.
Stéphane Chazelas
2
fallocate to najlepszy i szybki sposób na tworzenie, ponieważ rezerwuje miejsce i robi to szybko, ale nie przeszkadza, aby cokolwiek napisać ( stackoverflow.com/questions/257844/... )
curratore
... lub bs=1kx1k. Lub <&1 dd bs=1kx1k conv=sync,noerror count="$rpt" | cat >filedosłownie napisać na dysk. Jednak nie w 100% na ile efektywność może zostać utracona w wymuszaniu błędu odczytu.
mikeserv
27
dd if=/dev/zero of=/var/tmp/nullbytes count=1 bs=1M
Zelda
źródło