Jestem absolwentem chemii obliczeniowej z dostępem do klastra Linux. Klaster składa się z bardzo dużego (25 TB) serwera plików, do którego podłączonych jest kilkadziesiąt węzłów obliczeniowych. Każdy węzeł obliczeniowy składa się z 8 do 24 rdzeni Intel Xeon. Każdy węzeł obliczeniowy zawiera także dysk lokalny o wielkości około 365 TB.
Ponieważ serwer plików jest rutynowo dostępny dla kilkunastu użytkowników w grupie badawczej, serwer plików jest używany głównie do długotrwałego przechowywania plików (jest on tworzony kopii zapasowej co noc, podczas gdy dyski lokalne węzłów obliczeniowych nigdy nie są tworzone). Dlatego administrator systemu polecił nam przeprowadzać symulacje na dyskach lokalnych - które mają szybsze operacje we / wy niż serwer plików - aby nie spowalniać serwera plików dla innych użytkowników.
Tak więc uruchamiam symulacje na lokalnych dyskach, a następnie, po ich zakończeniu, kopiuję pliki trajektorii - prowadzę symulacje dynamiki molekularnej - na serwer plików w celu przechowywania. Załóżmy, że mam plik o nazwie trajektorii traj.trr
w katalogu na dysku lokalnym węzła, /home/myusername/mysimulation1/traj.trr
. Do długotrwałego przechowywania, zawsze skopiować traj.trr
do katalogu na serwerze plików, ~/mysimulation1/traj.trr
gdzie ~
reprezentuje mój katalog na serwerze plików, /export/home/myusername
. Po skopiowaniu go zwykle używam du -h
do sprawdzenia, czy /home/myusername/mysimulation1/traj.trr
ma ten sam rozmiar pliku co ~/mysimulation1/traj.trr
. W ten sposób mogę przynajmniej mieć pewność, że transfer do serwera plików powiódł się. Na przykład:
cd /home/myusername/mysimulation1/
cp -v traj.trr ~/mysimulation1/
du /home/myusername/mysimulation1/traj.trr -h
du ~/mysimulation1/traj.trr -h
Jeśli dwa wywołania du -h
dadzą ten sam rozmiar pliku, który można odczytać dla człowieka, to mogę być całkiem pewny, że przesyłanie / kopiowanie powiodło się. (Moje typowe traj.trr
pliki mają rozmiar od około 15 do 20 GB, w zależności od dokładnej symulacji, którą uruchomiłem.) Jeśli uruchomię du
(tj. Bez -h
przełącznika) na dwóch traj.trr
plikach, ich rozmiary w bajtach są zwykle bardzo, bardzo podobne - - zwykle w ciągu zaledwie kilku bajtów. Używam tej ogólnej metody przez ostatnie półtora roku, bez żadnych problemów.
Jednak ostatnio napotkałem następujący problem: czasamidu -h
zgłasza, że rozmiar dwóchtraj.trr
plików jest różny o kilka GB. Oto przykład:
cd /home/myusername/mysimulation1/ # this is the local disk
cp -v traj.trr ~/mysimulation1/
du traj.trr -h
cd ~/mysimulation1/ # this is the fileserver
du traj.trr -h
Dane wyjściowe z obu wywołań du -h
są odpowiednio następujące:
20G traj.trr
28G traj.trr
Uważam, że ten pierwszy (tj. Na traj.trr
dysku lokalnym /home/myusername/mysimulation1/
) ma prawidłowy rozmiar pliku, ponieważ oczekuje się, że moje trajektorie symulacji będą miały około 15 do 20 GB każdy. Ale w jaki sposób plik na serwerze plików może być większy ? Widziałem, jak może być mniejszy, jeśli jakoś się cp
nie powiedzie. Ale nie rozumiem, jak może być większy .
Otrzymuję podobne wyniki, gdy wykonuję te same polecenia, co powyżej, ale bez -h
przełącznika podanego do du
:
20717480 traj.trr
28666688 traj.trr
Czy potrafisz wymyślić jakiś powód różnicy?
Jeśli przez jakiś nieoczekiwany przypadek du
jakoś źle funkcjonuje, mogę się z tym pogodzić. Ale naprawdę muszę się upewnić, że kopia traj.trr
na serwerze plików jest kompletna i identyczna z wersją źródłową na dysku lokalnym. Muszę usunąć plik lokalny, aby mieć wystarczającą ilość miejsca na dysku lokalnym, aby uruchomić nowe symulacje, ale nie mogę sobie pozwolić na traj.trr
uszkodzenie wersji serwera plików.
Format .trr (od GROMACS dynamiki molekularnej opakowaniu) to format binarny, a nie tekst. Dlatego nie jestem pewien, czy pliki mogą być wiarygodnie porównane przez program taki jak diff
.
źródło
md5sum
lubsha1sum
na plikach. Czy oni pasują?md5sum
dwa pliki. Dwie sumy kontrolne są zgodne. To chyba dwa pliki są takie same?ls -l
? Poleceniedu
informuje, ile miejsca na dysku zajmuje plik, a nie jak duży jest plik. Na rozmiar dysku może mieć wpływ system plików i jego strategie alokacji.ls -l -h
mówi, że oba pliki mają 20 GB. Podobnie,ls -l
mówi, że oba pliki mają 21214683940 bajtów. Sądzę więc, że pliki mają ten sam rozmiar, ale nie używają takiej samej ilości miejsca na dysku (zgodnie zdu
).Odpowiedzi:
Naprawdę powinieneś użyć czegoś takiego jak
md5sum
lub,sha1sum
aby sprawdzić integralność.Jeśli naprawdę chcesz użyć rozmiaru użyj
ls -l
lubdu -b
.du
Narzędzie normalnie pokazuje tylko użycie dysku pliku, czyli ile z systemu plików używanego przez nią. Ta wartość zależy całkowicie od systemu plików kopii zapasowej i innych czynników, takich jak pliki rzadkie.Przykład:
Mamy dwa pliki zawierające 512 MB zer. Pierwszy z nich jest przechowywany rzadko i nie zajmuje miejsca na dysku, a drugi zapisuje każdy bajt jawnie na dysku. - Ten sam plik, ale zupełnie inne użycie dysku.
Ta
-b
opcja może być dla Ciebie dobra:źródło
Jest to powszechny problem, gdy umieszczasz te same dane na 2 różnych dyskach twardych. Będziesz chciał uruchomić
du
komendę z dodatkowym przełącznikiem, zakładając, że ma go - co powinno, biorąc pod uwagę, że są to węzły Linux.Przełącznik?
Przykład
Powyższe systemy plików są dyskami lokalnymi (
/root
), a drugi/home/sam
to udział NFS z mojego serwera NAS.Więc co tam?
To wprawia w zakłopotanie wiele osób, ale pamiętaj, że kiedy pliki są przechowywane na dysku, zajmują bloki miejsca, nawet jeśli wykorzystują tylko część tych bloków. Po uruchomieniu
du
bez--apparent-size
rozmiaru uzyskuje się rozmiar na podstawie ilości wykorzystanego miejsca na dysku, a nie faktycznego miejsca zajętego przez plik (i).zamiast tego używasz sumy kontrolnej?
Jest to prawdopodobnie lepsza opcja, jeśli martwisz się porównaniem 2 drzew plików. Za pomocą tego polecenia można obliczyć sumę kontrolną dla wszystkich plików, a następnie obliczyć końcową sumę kontrolną sum kontrolnych. W tym przykładzie użyto,
sha1sum
ale można równie łatwo użyćmd5sum
zamiast tego.Przykład
Widzimy więc, że 2 drzewa są identyczne.
(Uwaga: polecenie find wyświetli listę plików, które pojawiły się w systemie plików. Jeśli więc porównujesz dwa katalogi z innego systemu plików (np. Ext3 vs. APFS), musisz najpierw posortować pliki przed ostatecznym sha1sum. (Dodane przez Xianjun Dong)
źródło
Krótka odpowiedź: nie testuj rozmiaru pliku, sprawdź status powrotu polecenia. Status zwrotu jest jedynym wiarygodnym wskaźnikiem powodzenia kopiowania (bez porównania dwóch bajtów bajt po bajcie, bezpośrednio lub pośrednio - co jest zbędne, jeśli kopiowanie się powiodło).
Sprawdzanie rozmiaru pliku nie jest bardzo użytecznym sposobem sprawdzania, czy kopiowanie się powiodło. W niektórych przypadkach może to być przydatny sprawdzian poczytalności, na przykład podczas pobierania pliku z sieci. Ale tutaj jest lepszy sposób.
Wszystkie polecenia uniksowe zwracają status wskazujący, czy się udało: 0 dla sukcesu, 1 lub więcej dla błędów. Więc sprawdź status wyjścia
cp
.cp
normalnie wydrukuje komunikat błędu, jeśli się nie powiedzie, wskazując, jaki jest błąd. W skrypcie status wyjścia ostatniego polecenia znajduje się w zmiennej magicznej$?
.Zamiast sprawdzać, czy
$?
wynosi zero, możesz użyć operatorów logicznych.Jeśli uruchamiasz skrypt i chcesz, aby skrypt przestał działać w przypadku niepowodzenia dowolnego polecenia, uruchom
set -e
. Jeśli dowolne polecenie zakończy się niepowodzeniem (tzn. Zwróci niezerowy status), skrypt natychmiast zakończy działanie z tym samym statusem co polecenie.Powód, dla którego skopiowany plik był większy, musi być taki, że był to plik rzadki . Plik rzadki to surowa forma kompresji, w której bloki zawierające tylko bajty puste nie są przechowywane. Podczas kopiowania pliku
cp
polecenie odczytuje i zapisuje bajty zerowe, więc tam, gdzie w oryginale brakowało bloków, kopia zawiera bloki pełne bajtów zerowych. W systemie Linuxcp
polecenie próbuje wykryć rzadkie pliki, ale nie zawsze się to udaje;cp --sparse=always
czyni to trudniejszym kosztem bardzo niewielkiego wzrostu czasu procesora.Mówiąc bardziej ogólnie,
du
mogą zwracać różne wyniki z powodu innych form kompresji. Skompresowane systemy plików są jednak rzadkie. Jeśli chcesz poznać rozmiar pliku wyrażony w liczbie bajtów w pliku, w przeciwieństwie do liczby bloków dysku, których używa, użyjls -l
zamiastdu
.źródło