내부 디스크에서 USB SSD 드라이브로 특정 유형의 대용량 파일을 많이 전송해야 합니다. 전송해야 하는 파일의 크기는 5~200GB 범위입니다. 모든 파일 전송의 전반적인 진행 상황을 모니터링하고 빠른 속도로 USB 디스크로 전송하고 싶습니다.
나는 rsync로 시작했고 다음이 최고의 속도 결과를 제공한다는 것을 알았습니다.
rsync -W --size-only --protocol=29 --block-size=131072 --no-compress --info=progress2 /home/user/rosbags/*.bag /media/upload_disk/
이를 통해 150-180MB/s의 전송 속도를 얻을 수 있으며 전송해야 하는 모든 파일의 전체 진행 상황을 알 수 있습니다. rsync의 프로토콜을 버전 29 이하로 변경하는 데 도움이 되는 것으로 보이며 15-20% MB/s를 추가합니다. 이것이 제한 요소가 되지 않도록 특별히 청크 크기를 최대로 설정했습니다. -W(전체 파일) 설정을 사용하고 있으므로 델타 압축 대신 일반 전송을 사용해야 합니다. 내 가정은 이것이 직접 복사에서 얻은 것과 유사해야 한다는 것입니다. 그러나 설정을 오해하고 있을 수도 있습니다.
dd를 사용하여 단일 파일을 복사하는 경우:
dd if=/home/user/rosbags/2021-10-25-12-22-33.bag bs=131K status=progress of=/media/upload_disk/2021-10-25-12-22-33.bag
동일한 설정에서 500-600MB/s 범위의 전송 속도를 얻습니다. 이 예에서는 rsync와 비슷한 블록 크기를 사용하여 최대한 유사한지 확인합니다.
진행 상황을 모니터링하면서 dd를 사용하여 모든 파일을 개별적으로 복사하는 스크립트를 만들 수도 있지만 더 똑똑한 방법이 있을까요?
rsync 또는 기타 표준 Linux 도구를 사용하십시오.
dd를 사용하여 sh 스크립트 작성을 시작했습니다.
#!/bin/sh
total_size=$(du -sb /home/agco/ros_bags/| cut -f1)
for i in /home/user/ros_bags/*.bag; do
echo $i
#filename=$(basename $i)
#echo $filename
dd if=$i status=progress bs=64M of=/media/upload_disk/$(basename $i)
done
제가 가진 주요 과제는 현재 전송된 비트 수를 추출해야 하는 전체 진행률을 계산하는 능력입니다. 나는 이것을 수행하는 영리한 방법이 있다고 다시 가정하고 있지만 지금까지 해결책을 찾지 못했습니다.