Mam dysk twardy wypełniony zerami.
Jak sprawdzić, czy wszystkie bity na dysku twardym są zerami przy użyciu bash?
hard-drive
bash
ubuntu-12.10
gkfvbnhjh2
źródło
źródło
Odpowiedzi:
od
zastąpi przebiegi tej samej rzeczy*
, dzięki czemu można łatwo użyć go do skanowania w poszukiwaniu niezerowych bajtów:źródło
| head
do tego koniec, aby jeśli okaże się, że dysk nie jest wyzerowany, zatrzymuje się po wygenerowaniu wystarczającej ilości danych wyjściowych, aby pokazać ten fakt, zamiast zrzucić cały dysk na ekran.Napisałem do tego krótki program w C ++, źródło dostępne tutaj .
Aby zbudować:
Aby uruchomić:
Wyświetli pozycję i wartość niezerowych bajtów. Możesz przekierować to wyjście do pliku za pomocą
>
np .:Możesz spróbować zmienić w
BUFFER_SIZE
celu zwiększenia wydajności. Nie jestem pewien, jaka może być optymalna wartość. Pamiętaj, że wpływa to również na częstotliwość drukowania postępu, co nieco wpłynie na prędkość (drukowanie na konsoli jest wolne ). Dodaj,2>/dev/null
aby pozbyć się postępu produkcji.Wiem, że nie używa to standardowej wersji bash ani nawet poleceń wbudowanych, ale nie powinno to wymagać żadnych dodatkowych uprawnień. Rozwiązanie @Hennes jest jeszcze szybsze (tak naprawdę niczego nie zoptymalizowałem - jest to naiwne rozwiązanie); jednak ten mały program może dać ci lepsze pojęcie o tym, ile bajtów pominął wycieracz i w jakiej lokalizacji. Jeśli wyłączysz wyjście postępu, będzie ono nadal szybsze niż większość dysków twardych dla konsumentów może odczytać (> 150 MB / s), więc nie jest to duży problem.
Szybsza wersja z mniej szczegółowym wyjściem jest dostępna tutaj . Jednak nadal jest nieco wolniejszy niż rozwiązanie @Hennes. Ten jednak zakończy pracę z pierwszą napotkaną niezerową postacią, więc jest potencjalnie znacznie szybszy, jeśli w pobliżu strumienia znajduje się niezerowa postać.
Dodanie źródła do posta, aby zachować odpowiedź, bardziej niezależną:
źródło
iszero /dev/sda
raczej niż wymagającego potoku z czymś takimiszero < /dev/sda
?int main(int argc, char *argv[])
i wtedyFILE* file = fopen(argv[1], "r");
. Prawidłowo wykonane, obejmowałoby sprawdzenie, czy argument rzeczywiście istnieje, sprawdzenie błędu powiodło się otwarcie (wykonaj dodatkoweferror
sprawdzenie pofopen
), itp., Ale zbyt wiele problemów dla programu do wyrzucania.gcc
niekoniecznie jest dostępny we wszystkich dystrybucjach Linuksa bez pobierania dodatkowych pakietów. Z drugiej strony numpy nie jest częścią standardowych pakietów Pythona ...-O3
i-march=native
możesz zauważyć pewne przyspieszenia; to powinno upewnić się, że GCC włącza automatyczną wektoryzację i używa najlepszego dostępnego dla twojego procesora (AVX, SSE2 / SSE3 itp.). Oprócz tego możesz grać z wielkością bufora; różne rozmiary buforów mogą być bardziej optymalne z wektoryzowanymi pętlami (grałbym z 1 MB +, obecnie jeden to 1kB).@Bob
) na czacie: chat.stackexchange.com/rooms/118/root-accessRozszerzenie odpowiedzi Gordona
pv
wskazuje, jak daleko jest ten proces:źródło
To wydaje się brzydkie nieefektywne rozwiązanie, ale jeśli musisz sprawdzić tylko raz:
dd if=/dev/sdX | tr --squeeze-repeats "\000" "T"
Używanie dd do odczytu z dysku
sdX
. (zamień X na dysk, z którego chcesz czytać), anastępnie tłumacz wszystkie niedrukowalne bajty zerowe na coś, co możemy obsłużyć.
Następnie albo zliczamy bajty, które możemy obsłużyć i sprawdzamy, czy jest to poprawna liczba (użyj
wc -c
do tego), albo pomijamy liczenie i używamy-s
lub,--squeeze-repeats
aby wycisnąć wszystkie wielokrotne wystąpienia do jednego znaku.Dlatego
dd if=/dev/sdX | tr --squeeze-repeats "\000" "T"
powinien wydrukować tylko jeden T.Jeśli chcesz to robić regularnie, potrzebujesz czegoś bardziej wydajnego.
Jeśli chcesz to zrobić tylko raz, ta kludge może sprawdzić, czy normalna wycieraczka działa i czy możesz jej zaufać.
źródło
Aby to sprawdzić, zobaczysz na liście wszystkie bloki, które nie pasują
Lub użyj złych bloków, aby je napisać i sprawdzić:
Domyślnym testem destrucive jest moje bezpieczne usunięcie
Jeśli ktokolwiek może coś odzyskać po zapełnieniu dysku naprzemiennymi zerami i jedynkami, to ich dopełnienie, następnie wszystkie jedynki, a następnie wszystkie zera, przy każdym sprawdzeniu, czy zadziałało, powodzenia!
Sprawdza również przed instalacją nowe dyski
dla innych opcji
Nie mówię, że jest szybki, ale działa ...
źródło
Najlepsze z obu światów. To polecenie pominie złe sektory:
Użyj,
kill -USR1 <pid of dd>
aby zobaczyć postęp.źródło
Jakiś czas temu byłem ciekawy
AIO
. Rezultatem był przykładowy program testowy, który sprawdza, czy istnieją sektory (bloki 512 bajtów)NUL
. Możesz to zobaczyć jako wariant rzadkiego detektora obszarów plików . Myślę, że źródło mówi wszystko.NUL
wyprowadzany, wygląda to tak0000000000-eof
. Zauważ, że w programie jest sztuczka, funkcjafin()
nie jest wywoływana w linii 107 celowo, aby dać pokazane wyjście.AIO
nie jest tak prosty jak inne sposoby,AIO
jest to jednak prawdopodobnie najszybszy sposób na utrzymanie zajętości dysku , ponieważNUL
porównywanie odbywa się podczas wczytywania następnego bloku danych. (Możemy nakładać kilka milisekund przez nakładanie sięAIO
, ale naprawdę nie sądzę, że jest to warte wysiłek.)true
jeśli plik jest czytelny i wszystko działało. Nie zwraca,false
jeśli plik nie jestNUL
.NUL
nadal działa, ponieważ bufory pamięci już zawierająNUL
. Jeśli ktoś myśli, że to wymaga naprawy, w wierszu 95memcmp(nullblock, buf+off, SECTOR)
można przeczytaćmemcmp(nullblock, buf+off, len-off<SECTOR : len-off : SECTOR)
. Ale jedyną różnicą jest to, że „raportowanie końcowe” może być nieco losowe (nie dotyczy pliku, który jest całkowicieNUL
).memcmp()
rozwiązuje również inny problem na platformach, które nieNUL
alloc()
edują pamięci, ponieważ kod tego nie robi. Ale może to być widoczne tylko w plikach mniejszych niż 4 MiB, alechecknul
prawdopodobnie jest to zwykła przesada w przypadku tak małego zadania;)HTH
źródło
Chciałem opublikować to sprytne rozwiązanie z podobnego, ale wcześniejszego pytania zadanego przez użytkownika, który nie logował się przez pewien czas:
źródło