dd의 명령 옵션 bs=1024 count=1과 bs=1 count=1024의 차이점은 무엇입니까?

dd의 명령 옵션 bs=1024 count=1과 bs=1 count=1024의 차이점은 무엇입니까?

멍청한 1KB 파일을 생성하는 다음 두 명령을 모두 고려하십시오.

dd if=/dev/urandom of=test.file bs=1024 count=1

dd if=/dev/urandom of=test.file bs=1 count=1024

첫 번째 명령은 1024바이트의 블록 크기와 1의 블록 수를 사용하고, 두 번째 명령은 그 반대를 사용합니다.

내 생각에는 차이가 없으며 블록 크기를 제한하는 것은 RAM 관련 문제입니다. 사용 가능한 메모리보다 큰 블록 크기를 가질 수 없습니다.

두 번째 케이스 대신 첫 번째 케이스를 사용하고 싶거나 사용해야 하는 특별한 경우가 있나요? 그리고 그 반대?

답변1

기본적으로 이해하는 것처럼 첫 번째 버전은 1024바이트의 읽기를 한 번 수행한 다음 읽기에서 반환된 바이트 수만큼 쓰기를 수행하는 반면, 두 번째 버전은 각각 1바이트의 읽기 및 쓰기를 1024회 수행합니다. 일반 파일을 복사하는 경우 블록 크기가 클수록(I/O 수가 적어짐) 약간 더 효율적일 수 있습니다. 이것은 아마도 사실일 것입니다 /dev/urandom.

dd하지만 특수 파일(예: 장치)에 사용할 때는 주의가 필요합니다 . 예를 들어,

dd if=(어떤 입력이든)  =의(자기 테이프 장치)  bs=1024 개수=1

1024바이트의 테이프 블록 하나를 씁니다. dd … bs=1 count=1024각각 1바이트의 1024개 블록을 씁니다. 이것들은 동일하지 않습니다. 1024개의 작은 블록은 레코드 간 간격으로 인해 하나의 큰 블록보다 테이프에서 더 많은 공간을 차지하며 테이프를 읽는 데 문제가 발생할 수 있습니다. 귀하의 질문과 더 관련이 있으며, if=에서 ( )를 읽으면 /dev/random사용 가능한 만큼의 높은 엔트로피 바이트만 반환됩니다. 따라서 첫 번째 버전에서는 1024바이트 미만을 얻을 수 있습니다. 그러나 1바이트를 읽으려고 할 때 엔트로피 풀이 비어 있으면 데이터를 사용할 수 있을 때까지 읽기가 차단(즉, 대기)되므로 두 번째 버전에서는 1024바이트를 얻을 수 있습니다(임의로 시간이 걸릴 수 있음). 오랜 시간).

테이프 드라이브에 대한 내용을 확대하려면 다음을 수행하십시오.

dd if=(적절한 입력)  =의(자기 테이프 장치)  bs=512 카운트=2

512바이트의 테이프 블록 두 개를 씁니다. 후속

dd if=(자기 테이프 장치)  =의(무엇이든)  bs=1024 개수=1

첫 번째 블록만 읽을 수도 있습니다. 즉, 처음 512바이트입니다.

그리고 (명명된) 파이프는 다음과 같은 문제를 나타낼 수 있습니다 /dev/random. 대규모 읽기는 사용 가능한 바이트로만 반환됩니다. 따라서 첫 번째 버전에서는 1024바이트 미만을 얻을 수도 있습니다. 그러나 한 번에 1바이트를 읽으려고 하면 데이터를 사용할 수 있을 때까지 읽기가 대기하므로 두 번째 버전에서는 1024바이트(또는 최소한 EOF까지 읽음)를 얻을 수 있습니다.

관련 정보