Jak mogę szybko utworzyć duży plik w systemie Linux ( Red Hat Linux )?
dd wykona zadanie, ale czytanie /dev/zero
i zapisywanie na dysku może zająć dużo czasu, gdy potrzebujesz pliku o wielkości kilkuset GB do testowania ... Jeśli musisz to powtarzać, czas naprawdę się sumuje.
Nie dbam o zawartość pliku, chcę tylko, aby został on szybko utworzony. Jak można to zrobić?
Użycie rzadkiego pliku nie zadziała w tym przypadku. Potrzebuję pliku do przydzielenia miejsca na dysku.
linux
file
filesystems
DrStalker
źródło
źródło
df
zgłosi? Testowanie aplikacji, która robi coś szczególnego. Odpowiedź zależy od tego, co chcesz przetestować. W każdym razie jestem trochę spóźniony - teraz widzę, żeOdpowiedzi:
dd
z innych odpowiedzi jest dobrym rozwiązaniem, ale jest powolne w tym celu. W Linuksie (i innych systemach POSIX) mamyfallocate
, która wykorzystuje żądaną przestrzeń bez konieczności pisania do niej, działa z większością nowoczesnych systemów plików na dyskach, bardzo szybko:Na przykład:
źródło
fallocate
jest dokładnie tym, czego szukałem.fallocate
) również nie będzie działać w systemie plików Linux ZFS - github.com/zfsonlinux/zfs/issues/326fallocate
jest częściąutil-linux
pakietu. To narzędzie zostało napisane przez Karela Zaka z RedHat, a kod źródłowy można znaleźć tutaj: kernel.org/pub/linux/utils/util-linuxTo częste pytanie - szczególnie w dzisiejszym środowisku środowisk wirtualnych. Niestety odpowiedź nie jest tak prosta, jak można by przypuszczać.
dd jest oczywistym pierwszym wyborem, ale dd jest zasadniczo kopią, która zmusza cię do zapisania każdego bloku danych (w ten sposób inicjując zawartość pliku) ... I ta inicjalizacja zajmuje tyle czasu we / wy. (Chcesz, aby trwało to jeszcze dłużej? Użyj / dev / random zamiast / dev / zero ! Wtedy użyjesz procesora, a także czasu I / O!) Ostatecznie jednak dd jest złym wyborem (choć zasadniczo domyślnie używane przez GUI maszyn wirtualnych „utwórz”). Na przykład:
obcięcie to kolejny wybór - i prawdopodobnie jest najszybszy ... Ale to dlatego, że tworzy „rzadki plik”. Zasadniczo rzadki plik to sekcja dysku, która ma wiele takich samych danych, a podstawowy system plików „oszukuje”, nie przechowując wszystkich danych, a jedynie „udając”, że wszystko tam jest. Tak więc, gdy używasz skracania, aby utworzyć dysk o pojemności 20 GB dla maszyny wirtualnej, system plików tak naprawdę nie przydziela 20 GB, ale oszukuje i mówi, że jest tam 20 GB zer, mimo że na dysku jest tylko jedna ścieżka może faktycznie (naprawdę) być w użyciu. Na przykład:
fallocate jest ostatecznym - i najlepszym - wyborem do użycia z alokacją dysku VM, ponieważ zasadniczo „rezerwuje” (lub „przydziela” całą przestrzeń, której szukasz, ale nie zawraca sobie głowy pisaniem czegokolwiek. kiedy używasz fallocate do utworzenia 20 GB miejsca na dysku wirtualnym, tak naprawdę dostajesz 20 GB pliku (nie jest to „rzadki plik” i nie będziesz się martwić, aby coś do niego zapisać - co oznacza, że praktycznie wszystko może być w tam - trochę jak nowy dysk!) Np .:
źródło
truncate
działa w JFS;fallocate
, nie tak bardzo. Jeden punkt: nie można podać liczby dziesiętnej w liczbach, musiałem to określić1536G
, a nie1.5T
.fallocate
stronie człowieka, to jest obsługiwane tylko nabtrfs
,ext4
,ocfs2
orazxfs
systemów plikówswapon
niestety nie działa na wstępnie przydzielonych zakresach, ostatnio sprawdziłem. Na liście mailingowej XFS pojawiła się dyskusja na temat opcji fallocate, która zamiast tego ujawnia stare dane z wolnego miejsca i nie ma zakresu oznaczonego jako wstępnie przydzielony, więc swapon będzie działać. Ale nie sądzę, żeby cokolwiek zostało zrobione./dev/random
może skończyć się przypadkowymi danymi i „Gdy pula entropii jest pusta, odczyty z / dev / random będą blokować do momentu zebrania dodatkowego hałasu otoczenia”, więc może to potrwać bardzo, bardzo długi czasLinux i wszystkie systemy plików
xfs_mkfile 10240m 10Gigfile
Linux i niektóre systemy plików (ext4, xfs, btrfs i ocfs2)
fallocate -l 10G 10Gigfile
OS X, Solaris, SunOS i prawdopodobnie inne UNIXy
mkfile 10240m 10Gigfile
HP-UX
prealloc 10Gigfile 10737418240
Wyjaśnienie
Wypróbuj
mkfile <size>
mój plik jako alternatywę dladd
. Z-n
opcją zapisywany jest rozmiar, ale bloki dyskowe nie są przydzielane, dopóki dane nie zostaną do nich zapisane. Bez tej-n
opcji miejsce jest wypełnione zerami, co oznacza zapis na dysk, co oznacza poświęcenie czasu.mkfile pochodzi z SunOS i nie jest dostępny wszędzie. Większość systemów Linux
xfs_mkfile
działa dokładnie tak samo, a nie tylko na systemach plików XFS, pomimo nazwy. Jest zawarty w xfsprogs (dla Debian / Ubuntu) lub podobnych nazwanych pakietach.Większość systemów Linux również ma
fallocate
tę funkcję, która działa tylko na niektórych systemach plików (takich jak btrfs, ext4, ocfs2 i xfs), ale jest najszybsza, ponieważ przydziela całą przestrzeń plików (tworzy pliki nie dziurawe), ale nie inicjuje żadnych z tego.źródło
mkfile 1g DELETE_IF_LOW_ON_SSD_SPACE.img
xfs_mkfile
jest zawarty w xfsprogs na Ubuntu i działa jak urok na moim ext3 fs. :)natychmiast utworzy plik o rozmiarze 10 M (M oznacza 1024 * 1024 bajtów, MB oznacza 1000 * 1000 - to samo co K, KB, G, GB ...)
EDYCJA: jak wielu zauważyło, nie spowoduje to fizycznego przydzielenia pliku na twoim urządzeniu. Dzięki temu możesz faktycznie utworzyć dowolny duży plik, niezależnie od dostępnego miejsca na urządzeniu, ponieważ tworzy on plik „rzadki”.
Robiąc to, będziesz odkładał fizyczny przydział do momentu uzyskania dostępu do pliku. Jeśli mapujesz ten plik do pamięci, możesz nie mieć oczekiwanej wydajności.
Ale nadal jest to przydatne polecenie, aby wiedzieć
źródło
fallocate
odpowiedź poniżej.Gdzie seek jest rozmiarem pliku, który chcesz w bajtach - 1.
źródło
truncate
wydaje się być znacznie lepsza.Przykłady, w których seek jest rozmiarem pliku, który chcesz w bajtach
Z strony podręcznika dd:
źródło
truncate
.Aby utworzyć plik 1 GB:
źródło
dd if=/dev/zero of=filename bs=20G count=1
utworzy tylko plik 2 GB! nie 20 GB.Nie wiem dużo o Linuksie, ale oto kod C, który napisałem, aby sfałszować ogromne pliki w DC Share wiele lat temu.
źródło
Możesz także użyć polecenia „tak”. Składnia jest dość prosta:
Naciśnij „Ctrl + C”, aby zatrzymać to, w przeciwnym razie zajmie całą dostępną przestrzeń.
Aby wyczyścić ten plik, uruchom:
wyczyści ten plik.
źródło
Nie sądzę, że będziesz dużo szybszy niż dd. Wąskim gardłem jest dysk; zapisanie setek GB danych zajmie to dużo czasu, bez względu na to, jak to zrobisz.
Ale oto możliwość, która może zadziałać dla twojej aplikacji. Jeśli nie zależy ci na zawartości pliku, co powiesz na utworzenie pliku „wirtualnego”, którego zawartość stanowi dynamiczne wyjście programu? Zamiast open () ing pliku, użyj popen (), aby otworzyć potok do zewnętrznego programu. Zewnętrzny program generuje dane, gdy tylko są potrzebne. Po otwarciu potoku działa on tak jak zwykły plik, ponieważ program, który otworzył potok, może fseek (), przewinąć do tyłu () itp. Będziesz musiał użyć pclose () zamiast close (), gdy jesteś zrobione z rurą.
Jeśli twoja aplikacja potrzebuje pliku o określonym rozmiarze, to do zewnętrznego programu będzie należeć śledzenie, gdzie jest „plik”, i wysłanie eof po osiągnięciu „końca”.
źródło
Jedno podejście: jeśli możesz zagwarantować, że niepowiązane aplikacje nie będą używać plików w sposób powodujący konflikt, po prostu utwórz pulę plików o różnych rozmiarach w określonym katalogu, a następnie w razie potrzeby utwórz łącza do nich.
Na przykład masz pulę plików o nazwie:
Następnie, jeśli masz aplikację, która potrzebuje pliku 1G o nazwie / home / oracle / logfile, uruchom „
ln /home/bigfiles/1024M-A /home/oracle/logfile
”.Jeśli znajduje się w osobnym systemie plików, będziesz musiał użyć dowiązania symbolicznego.
Pliki A / B / etc mogą być użyte, aby zapewnić, że nie będzie konfliktu między niepowiązanymi aplikacjami.
Operacja łącza przebiega tak szybko, jak to tylko możliwe.
źródło
Plik mk GPL jest tylko opakowaniem skryptu (ba) sh wokół dd; Plik mk BSD po prostu ustawia bufor na niezerowy i zapisuje go wielokrotnie. Nie spodziewałbym się, że ten pierwszy wykona dd. Ten ostatni może nieco przewyższyć dd, jeśli = / dev / zero, ponieważ pomija odczyty, ale wszystko, co robi znacznie lepsze, to prawdopodobnie tylko tworzenie rzadkiego pliku.
W przypadku braku wywołania systemowego, które faktycznie przydziela miejsce dla pliku bez zapisywania danych (a Linux i BSD tego brakuje, prawdopodobnie również Solaris), możesz uzyskać niewielką poprawę wydajności, używając ftrunc (2) / truncate (1) do rozszerzenia pliku do żądanego rozmiaru, zamapuj plik w pamięci, a następnie zapisz niezerowe dane w pierwszych bajtach każdego bloku dysku (użyj fgetconf, aby znaleźć rozmiar bloku dysku).
źródło
Bezwstydna wtyczka: OTFFS zapewnia system plików, który zapewnia dowolnie duże (cóż, prawie. Exabytes to obecny limit) pliki generowanej zawartości. Jest to tylko Linux, zwykły C i wczesna wersja alfa.
Zobacz https://github.com/s5k6/otffs .
źródło
To najszybsze, co mogę zrobić (co nie jest szybkie) z następującymi ograniczeniami:
fallocate
niedostępne)To jest sedno tego ...
W naszym przypadku dotyczy to wbudowanego systemu linux i działa to wystarczająco dobrze, ale wolałoby coś szybszego.
Do waszej dyspozycji polecenie
dd if=/dev/urandom of=outputfile bs=1024 count = XX
było tak wolne, że było bezużyteczne.źródło