Jak wypełnić dysk twardy w systemie Linux

23

Wykonuję testy fragmentu kodu i chcę wypełnić dysk twardy danymi. znalazłem to dd może zrobić ogromne pliki w jednej chwili, ale df nie zgadza się. Oto co próbowałem:

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

ls -lh pokazuje plik 10G. Jednak, df -h pokazuje, że partycja się nie zmniejszyła. Więc co muszę zrobić, aby to zrobić df rozpoznasz teraz dane? Mam nadzieję na coś szybkiego, który koduję w teście jednostkowym.

User1
źródło
Będziesz miał więcej szczęścia, jeśli zapytasz na serverfault.com
BTW, 10 * 1024 * 1024 * 1024 jest taki sam jak 10 * 2 ** 30, nieco prostszy.
deltaray

Odpowiedzi:

25

Kłopot z seek=<big number> Sztuczka polega na tym, że system plików jest (zazwyczaj) sprytny: jeśli część pliku nigdy nie została zapisana (a zatem wszystkie są zerami), nie przejmuje się przydzielaniem na nią miejsca - więc, jak widzieliście, może mieć plik 10 GB, który nie zajmuje miejsca (jest to znane jako „plik rzadki” i może być bardzo przydatne w niektórych przypadkach, np. w niektórych implementacjach baz danych).

Możesz wymusić przydzielenie miejsca (na przykład):

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

zajmie to znacznie więcej czasu, ale faktycznie wypełni dysk. Zalecam, aby rozmiar bloku był znacznie większy niż jeden, ponieważ określa to, ile systemu wywołuje dd proces sprawia, że ​​im mniejszy rozmiar bloku, tym więcej wywołań systemowych, a więc im wolniej będzie działać. (Choć ponad 1 MB lub tak, prawdopodobnie nie zrobi to wielkiej różnicy i może nawet spowolnić ...)

psmears
źródło
Zwykle używam bs = (cokolwiek połowa rozmiaru pamięci podręcznej jest na dysku, który piszę). Dotąd działało to dobrze, gdy obrazowanie partycji na większe dyski twarde w celu późniejszej zmiany rozmiaru. ETA: krytyczne słowo PÓŁ.
atroon
18

Jako inna opcja, możesz użyć tak wraz z pojedynczym łańcuchem i jest to około 10 razy szybsze niż uruchomienie dd if = / dev / urandom = bigfile. Lubię to

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
deltaray
źródło
O dziwo, jest to tak szybkie, jak użycie dd if = / dev / zero = nazwa pliku bs = 1M.
bhinesley
Składnia jest łatwa do zapamiętania.
AWT
7

Stworzyłeś tak zwany „plik rozrzedzony” - plik, który, ponieważ większość jest pusta (tzn. Czyta z powrotem jako 0), nie zajmuje miejsca na dysku oprócz tego, co jest rzeczywiście napisane (1B, po 10 GB luki).

Nie sądzę, byś mógł tworzyć ogromne pliki, biorąc rzeczywiste miejsce na dysku w jednej chwili - zajmowanie przestrzeni fizycznej oznacza, że ​​system plików musi przydzielić bloki dysku do pliku.

Myślę, że utknąłeś w starym stylu „dd if = / dev / zero of = nazwa pliku bs = 100M liczba = 100”, co jest ograniczone przez prędkość zapisu sekwencyjnego napędu.

qdot
źródło
6

Jeśli testujesz tylko przypadki z wypełnionymi systemami plików, być może powodzenie jest wystarczające. I jeszcze szybciej! na przykład

fallocate -l 150G

uchihaangel
źródło
2
Wymaga podania nazwy pliku: fallocate -l 150G foo. Niemniej jednak +1 za wymienienie narzędzia.
Kamil Maciorowski
3

Przestań używać seek i użyj bardzo dużego bs i / lub count. Jak to robisz rzadki plik i oczywiście nie musisz tego robić.

Ignacio Vazquez-Abrams
źródło
3

Jeśli chcesz dosłownie wypełnić dysk twardy, zrób to:

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

Opcjonalnie możesz określić liczbę, jeśli chcesz ograniczyć rozmiar, ale jeśli pominiesz licznik, będzie on działał tylko do wyczerpania miejsca na dysku.

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

Jak wspomniano w psmears, uzyskasz lepszą wydajność, jeśli ustawisz rozmiar bloku na 1 MB (bs = 1M) zamiast 1 B (bs = 1). Nadal zajmie to trochę czasu, ale jeśli chcesz sprawdzić postęp swojego polecenia, otwórz oddzielną konsolę i uruchom następujące polecenia:

ps aux | grep dd

Użyj PID dd w tym poleceniu (zamień PID na PID dd):

kill -USR1 PID

Następnie spójrz na swój terminal dd. Oczywiście ma to ograniczone zastosowanie, gdy próbujesz tylko wypełnić dysk (możesz użyć df lub du, aby sprawdzić odpowiednio wolne miejsce na dysku lub rozmiar pliku). Są jednak inne momenty, w których przydatny jest postęp w dd.

Dodatkowy kredyt: jednym z praktycznych zastosowań zerowania wolnego miejsca jest to, że później możesz usunąć „zero” plików i zadać całą partycję (lub dysk, jeśli wyzerowałeś wszystkie partycje) do pliku obrazu dysku (powiedz , disk-backup.dd), a następnie skompresuj plik. Wolne miejsce jest teraz wysoce ściśliwe, więc skompresowany obraz dd będzie dużo mniejszy niż oryginalne urządzenie blokowe, którego zawartość zawiera.

Shenanigans: zapisz duży plik zer i wyślij go e-mailem do wszystkich znajomych. Powiedz im, że to coś naprawdę fajnego.

rob
źródło
2

Tworzysz nie rzadki plik 1 TB za pomocą następującego polecenia:

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

Było to przydatne w testowaniu tego, co się dzieje, gdy limity są przekroczone lub system plików się zapełnia.

df -h pokazuje, że dostępna przestrzeń staje się mniejsza.

user75112
źródło