HD를 무작위로 선택하는 빠른 방법은 무엇입니까?

HD를 무작위로 선택하는 빠른 방법은 무엇입니까?

하드 드라이브를 안전하게 암호화하는 방법에 대해 읽었으며 그 중 하나는 암호화된 데이터가 하드 드라이브의 다른 데이터와 구별되지 않도록 드라이브에 임의의 비트를 쓰는 것입니다.

dd if=/dev/urandom of=/dev/sda그런데 예전에 시도해보니 ETA가 며칠 정도 됐습니다. 대신에 urandom을 사용하는 것에 대해 봤지만 badblocks별로 도움이 되지 않는 것 같습니다. dd옵션이나 제가 놓쳤을 수 있는 것 등 속도를 높이는 데 도움이 되는 방법이 있는지, 아니면 속도가 HD의 한계일 뿐인지 궁금합니다 .

답변1

dd if=/dev/urandom of=/dev/sda, 또는간단히 cat /dev/urandom >/dev/sda, 임의의 데이터로 디스크를 채우는 가장 빠른 방법은 아닙니다. Linux는 /dev/urandom가장 빠른 암호화 RNG가 아닙니다./dev/urandom에 대한 대안이 있습니까?몇 가지 제안이 있습니다. 특히 OpenSSL에는 더 빠른 암호화 PRNG가 포함되어 있습니다.

openssl rand $(</proc/partitions awk '$4=="sda" {print $3*1024}') >/dev/sda

결국 개선 여부는 병목 현상이 발생하는 부분(CPU 또는 디스크)에 따라 달라집니다.

좋은 소식은 디스크를 임의의 데이터로 채우는 것이 별 도움이 되지 않는다는 것입니다. 첫째, 공통된 신화를 없애기 위해,오늘날의 하드웨어에서 제로 지우기 기능과 마찬가지로 우수함. 1980년대 하드 드라이브 기술에서는 0으로 하드 드라이브를 덮어쓰면 약간 더 비싼 하드웨어를 사용하여 복구할 수 있는 작은 잔여 전하가 남았습니다. 이는 임의의 데이터로 여러 번 덮어써야 합니다("Gutterman 삭제"). 오늘날 0으로 한 번이라도 덮어쓰면 실험실 조건에서도 현실적으로 복구할 수 없는 데이터가 남게 됩니다.

파티션을 암호화할 때 암호화된 데이터의 기밀을 유지하기 위해 디스크를 임의의 데이터로 채울 필요가 없습니다. 이는 암호화된 데이터가 사용하는 공간을 사용되지 않는 공간과 구별할 수 없게 만들어야 하는 경우에만 유용합니다. 무작위가 아닌 컨테이너 위에 암호화된 볼륨을 구축하면 암호화된 볼륨에서 한때 어떤 디스크 블록을 사용했는지 확인할 수 있습니다. 이는 파일 시스템의 최대 크기에 대한 좋은 힌트이지만(시간이 지남에 따라 더 나빠지더라도) 그 이상은 아닙니다.

답변2

OpenSSL을 사용하여 /dev/zero무작위 암호로 암호화하면 멋진 의사 무작위 데이터를 매우 빠르게 제공할 수 있습니다(CPU가 가속을 지원하는 경우).

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | dd of=/dev/sda

파이프라인을 통해 pv진행률/예상 도착 시간을 얻을 수 있습니다. 지금 (루트 셸에서) 실행 중인 명령은 다음과 같습니다.

DISK="sda"
DISKSIZE=$(</proc/partitions awk '$4=="'"$DISK"'" {print sprintf("%.0f",$3*1024)}')
apt-get install pv
openssl enc -aes-256-ctr -nosalt \
  -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" \
  < /dev/zero |
  pv --progress --eta --rate --bytes --size "$DISKSIZE" |
  dd of=/dev/"$DISK" bs=2M

내 아이디어는 다음과 같습니다.이 답변, 동일한 문제가 발생한 후불합리한 존, WHO댓글을 달았습니다.위의 Giles의 답변과 관련하여. 이로 인해 새 RAID 어레이의 삭제 속도가 11MB/s에서 약 300MB/s로 증가하여 주당 필요한 시간이 10시간으로 단축되었습니다.

위의 명령문 대신에 더 복잡한 명령문을 사용할 수 있어야 한다는 점을 덧붙이고 싶습니다만, 16MB의 출력만 생성되도록 허용하는 버그가 있습니다. (이 버그는 2016년 1월에 접수되었습니다.)openssl rand #of_bytesopenssl enc ...ssl

그리고 답변에 따르면이 문제openssl, 그리고 계속해서 CPU가 병목 현상을 일으킨다고 가정하면 별도의 코어에서 여러 병렬 프로세스를 실행하고 FIFO를 사용하여 이를 결합함으로써 속도를 더욱 향상시킬 수 있습니다.

답변3

openssl이 나에게 적합하지 않은 것 같습니다. 제공된 솔루션에서 "알 수 없는 옵션" 및 기타 문제가 발생했습니다. 그래서 결국 fio 프로그램을 선택하게 되었습니다.

fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0

24개의 HDD에 19TB의 데이터를 저장하는 데 3시간이 걸리는 것 같습니다. 약 1,800MB/초

smp-016:~ # fdisk -l /dev/md0
Disk /dev/md0: 18890.1 GB, 18890060464128 bytes

smp-016:~ # fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
fill: (g=0): rw=write, bs=512M-512M/512M-512M/512M-512M, ioengine=libaio, iodepth=4
fio-2.2.10
Starting 1 process
Jobs: 1 (f=1): [W(1)] [2.7% done] [0KB/1536MB/0KB /s] [0/3/0 iops] [eta 03h:01m:11s]

이것이 실제로 무작위 데이터이기를 바랍니다. 매뉴얼 페이지에는 fio "기본값: 버퍼를 임의의 데이터로 채웁니다."라고 나와 있습니다.http://linux.die.net/man/1/fio

보안/암호화 목적으로 이 작업을 수행하는 것이 아니라 나중에 읽는 테스트가 단지 0이 아닌 실제 데이터인지 확인하기 위한 것입니다. SSD/NVMe 전처리에도 동일한 fio 명령을 사용할 수 있습니다. /dev/zero만 사용하면 디스크 수준 압축으로 인해 실제 쓰기 횟수가 "속일" 수 있기 때문입니다. -loops=2벤치마킹 목적으로 새 SSD라면 플래그를 추가 하겠지만 .

정말로 안전하길 원한다면 해당 -randrepeat=bool 옵션을 사용할 수 있습니다. 이렇게 하면 "결과가 실행 중에 반복될 수 있도록 예측 가능한 방식으로 난수 생성기를 시드합니다. 기본값: true"가 전환되지만 저는 여전히 그렇게 하지 않습니다. 가지고 있지 않습니다. 그것이 얼마나 안전한지 결정하십시오.

또한 일부 기업용 HDD에는 암호화 키를 순환하여 기록된 모든 데이터를 즉시 안전하게 삭제할 수 있는 SED(자체 암호화 드라이브) 기능이 있습니다.

마지막으로 저는 과거에 CD 및 USB 부팅 옵션이 모두 있고 SourceForge에서 호스팅되는 오픈 소스 프로젝트인 DBAN(일명 Darik's Boot and Nuke)을 사용했습니다. 이 프로그램은 하드 드라이브의 데이터까지 안전하게 삭제하도록 설계되었습니다. 영구적으로 삭제되었습니다." 삭제되어 더 이상 복구할 수 없습니다."

답변4

Marco의 답변을 완성하려면 더 빠른 난수 생성기가 필요합니다.

간단한 프로그램을 사용 하여 boost::random.dd

부스트를 선택하면 사용할 수 있습니다이것예를 들어, experiment필요에 맞게 기능을 변경하세요.

관련 정보