Niedawno zdałem sobie sprawę, że możemy zużyć cat
tyle dd
, ile jest i tak naprawdę szybciejdd
Wiem, że dd
było to przydatne w przypadku taśm, w których rozmiar bloku rzeczywiście miał znaczenie dla poprawności, a nie tylko wydajności. Czy w dzisiejszych czasach są sytuacje, w których dd
można zrobić coś, czego cat
nie można? (Uważam, że różnica wydajności mniejsza niż 20% jest nieistotna.)
Przydałyby się konkretne przykłady!
Odpowiedzi:
Z wyglądu
dd
jest narzędziem systemu operacyjnego IBM, które zachowało swój obcy wygląd (przekazywanie parametrów), który wykonuje niektóre bardzo rzadko używane funkcje (takie jak konwersje EBCDIC do ASCII lub odwracanie endianizmu… obecnie nie jest to powszechna potrzeba).I używany do myślenia , że
dd
był szybszy do kopiowania dużych bloków danych na tym samym dysku (ze względu na bardziej efektywne wykorzystanie buforowania), ale to nie jest prawda , przynajmniej w dzisiejszych systemach Linux.Myślę, że niektóre
dd
opcje są przydatne podczas pracy z taśmami, gdzie czytanie odbywa się naprawdę w blokach (sterowniki taśm nie ukrywają bloków na nośniku pamięci tak, jak robią to sterowniki dysków). Ale nie znam szczegółów.Jedną rzeczą
dd
, której nie można (łatwo) zrobić za pomocą innego narzędzia POSIX, jest pobranie pierwszych N bajtów strumienia. Wiele systemów może to zrobićhead -c 42
, alehead -c
chociaż jest to wspólne, nie ma go w POSIX (i nie jest dziś dostępne np. W OpenBSD). (tail -c
jest POSIX). Ponadto, nawet jeślihead -c
istnieje, może odczytać zbyt wiele bajtów ze źródła (ponieważ korzysta z wewnętrznego buforowania stdio), co jest problemem, jeśli czytasz ze specjalnego pliku, w którym samo czytanie ma wpływ. (Obecne jądra GNU odczytują dokładną liczbęhead -c
, ale FreeBSD i NetBSD używają stdio.)Mówiąc bardziej ogólnie,
dd
zapewnia interfejs do bazowego interfejsu API plików, który jest unikalny wśród narzędzi uniksowych:dd
może tylko nadpisywać lub obcinać plik w dowolnym momencie lub wyszukiwać w pliku. (Jest todd
wyjątkowa umiejętność, i jest to duża; dość dziwniedd
najlepiej znana jest z rzeczy, które mogą zrobić inne narzędzia.)>
przekierowania w powłoce.>>
przekierowaniem w powłoce lub za pomocątee -a
.Jeśli chcesz skrócić plik, usuwając wszystkie dane po pewnym czasie , jest to obsługiwane przez jądro i interfejs API C za pośrednictwem
truncate
funkcji, ale nie jest ujawniane przez żadne narzędzie wiersza poleceń, z wyjątkiemdd
:Jeśli chcesz zastąpić dane w środku pliku, znowu jest to możliwe w underyling API, otwierając plik do zapisu bez obcinania (i
lseek
w razie potrzeby wywołując przejście do żądanej pozycji), aledd
można tylko otworzyć plik bez obcinanie lub dołączanie lub wyszukiwanie w powłoce ( bardziej złożony przykład ).Więc… Jako narzędzie systemowe
dd
jest prawie bezużyteczne. Jako narzędzie do przetwarzania tekstu (lub pliku binarnego) jest bardzo cenne!źródło
trunc
iseek
jest użytecznydd
).dd
może odczytać dane binarne z niewidzialnych deskryptorów plików bez potencjalnego zniszczenia nieprzeczytanych danych z powodu buforowania standardowego. Zobacz tutaj przykład: etalabs.net/sh_tricks.htmlhead -c N
wywołujeread
i nigdy nie wykracza poza N. W NetBSD 5.1,head -c
połączeniagetc
. We FreeBSD 7.4head -c
wywołaniafread
.dd
naraża również O_DIRECT (itp.) Na wykonywanie skryptów powłoki, co moim zdaniem jest również unikalne.truncate
pozwala obcinać lub rozszerzać pliki, eliminując w ten sposób inne użyciedd
.dd
Komenda zawiera wiele opcji, że kot nie jest w stanie pomieścić. Być może w twoich przypadkach użycia kot jest praktycznym zamiennikiem, ale nie zastępuje dd.Jednym z przykładów byłoby użycie
dd
do skopiowania części czegoś, ale nie całej. Być może chcesz wyrwać niektóre bity ze środka obrazu ISO lub tablicy partycji z dysku twardego na podstawie znanej lokalizacji na urządzeniu. Za pomocądd
możesz określić opcje rozpoczęcia, zatrzymania i ilości, które pozwalają na te działania.Te opcje
dd
sprawiają, że jest on niezbędny do precyzyjnej manipulacji danymi, podczas gdycat
* może działać tylko na obiektach, urządzeniach lub strumieniach całego pliku.* Jak zauważył Gilles w komentarzach, można łączyć się
cat
z innymi narzędziami do izolowania części czegoś, alecat
nadal działa na całym obiekcie.źródło
dd
w rzeczywistości nie ma nic wspólnego z urządzeniami niskiego poziomu, wymaga wejścia,/dev
podobnie jak inne. Możesz skopiować całą partycję za pomocącat
lub jej część za pomocątail +c $(($start+1)) | head -c $count
.cat | head | tail
aby pobrać kilka ostatnich MB, wirowanie dysku zasysa księżyc bliżej ziemi.Nikt jeszcze nie wspomniał, że możesz użyć dd do tworzenia rzadkich plików , choć
truncate
można go również użyć do tego samego celu.Jest to prawie natychmiastowe i tworzy dowolny duży plik, który można wykorzystać jako plik pętli zwrotnej na przykład:
Zaletą jest to, że początkowo używa tylko jednego bloku miejsca na dysku, a następnie rośnie tylko w razie potrzeby (formatowanie ext4 pliku 10 GB zużywa 291 MB w moim systemie). Służy
du
do sprawdzania, ile miejsca na dysku jest faktycznie używane -ls
zgłasza tylko maksymalny rozmiar pliku, do którego może wzrosnąć.źródło
ls -ls
pokazuje rzadki rozmiar.dd of=sparse-file bs=1 count=0 seek=10G
byłoby równoważne ztruncate -s 10GB sparse-file
. Dość mylącetruncate
idd
mieć dokładnie przeciwną interpretacjęGB
vs.G
...man dd
mówi:MB =1000*1000, M =1024*1024
i tak dalej. Iman truncate
mówi:MB 1000*1000, M 1024*1024
więc nie ma różnicy. Używam obudd
itruncate
z GNU coreutils. Ty też powinieneś to zrobić! :-)Często zastępuj określone segmenty dysku twardego zwykłym przykładem. Na przykład możesz chcieć usunąć swój MBR za pomocą tego polecenia:
Możesz również tworzyć przy nim puste pliki (powiedzmy na obrazy dysków pętli):
źródło
head -c
? Udostępnij test porównawczy !dd
jest bardzo przydatny do tworzenia kopii zapasowych sektora rozruchowego dysku twardego lub innego urządzenia pamięci masowej (dd if=/dev/sda of=boot_sector.bin bs=512 count=1
), a następnie przepisywania go (dd if=boot_sector.bin of=/dev/sda
). Jest to również przydatne do tworzenia kopii zapasowych nagłówków zaszyfrowanych woluminów.cat
być może uda się to zrobić, ale nie ufałbym temu w części przepisywania. Trudno jestcat
odczytać / zapisać tylko określoną liczbę bajtów.źródło
Ostatnio miałem okazję sklonować kilka partycji o rozmiarze 100 GB z GB po raz pierwszy w mojej historii linuksowania (por.
cp -ar
Lubrsync
które służyły mi wiele razy). Oczywiście zwróciłem się dodd
tego, ponieważ wszyscy wiedzą, że tego używasz ... i byłem przerażony występem. Wkrótce doprowadziło mnie trochę googlinguddrescue
, z którego korzystałem już kilka razy i działa znakomicie (znacznie szybciej niż dd).źródło
ddrescue
jest świetny, szczególnie do pobierania danych z uszkodzonych dysków.Oto kilka sztuczek dd, które wymyśliłem przez lata ..
Wytnij i wklej w nieprzyjaznym bicie w trybie tty lub nieinteraktywnym
Jeśli jesteś w sytuacji, gdy EOF / ^ D / ^ F nie zostanie wykryty, możesz użyć dd do przesłania plików tekstowych do hosta. Ponieważ przestanie czytać automatycznie po określonej ilości bajtów.
Użyłem tego jeszcze w zeszłym roku podczas ćwiczenia bezpieczeństwa, w którym mogliśmy uzyskać powłoki non-tty na zdalnym hoście i potrzebowaliśmy przenieść pliki.
W rzeczywistości zrobiłem nawet kilka plików binarnych, kodując je base64 i używając powolnego, ale niezawodnego skryptu dekodowania base64 w czystym stylu.
Super fajna sztuczka polega na tym, że gdy dd jest uruchomiony, jeśli wyślesz mu sygnał USR1, wyemituje swój bieżący status (odczytane bajty, bajty na sekundę ..)
Uniwersalny filtr stanu przepustowości
Napisałem to, aby działało jako czysty filtr postępu dla każdego programu, który emituje dane przez standardowe wyjście. (Uwaga: prawie wszystko wysyła dane przez stdout - w przypadku programów, które tego nie robią, możesz oszukiwać, jeśli nie przeszkadzają ci przy użyciu / dev / stdout jako nazwy pliku. Ale pomysł jest w zasadzie za każdym razem, gdy dostajesz X ilość bajtów, wydrukuj znaki skrótu (jak oldschoolowy FTP, gdy miałeś włączony tryb skrótu)
(Uwaga) Plik postępu jest kiepski, był to głównie dowód koncepcji. Gdybym to zrobił, użyłbym zmiennej.
wycinanie i krojenie plików za pomocą anonimowych uchwytów plików powłoki
Oto niezwykle pseudo-kodowy przykład tego, w jaki sposób można podpisać plik tar, który można wyodrębnić bez błędów, wprowadzając dane tar za pomocą anonimowego uchwytu pliku - bez użycia plików tmp do przechowywania częściowych danych pliku.
Tl; dr to: uważam, że dd jest niezwykle przydatny. A to tylko trzy przykłady, które mogę wymyślić z góry.
źródło
Możesz przekierować część treści wyjściowej. Jest to szczególnie przydatne, jeśli chcesz pisać
sudo
:Poza tym
sudo
jest to równoważne z:lub do tego:
źródło