수백 기가를 옮기는 중에 얼마나 남았는지 알 수 없으면 판단이 어렵다. cp 에는 진행률 표시가 없으므로 다른 도구를 쓰거나 우회한다.
cp -av /mnt/temp/ /media/sdb/
-v 는 처리한 파일 이름만 찍는다. 바이트 진행률이나 속도는 나오지 않는다. 파일이 여러 개라면 이것만으로도 어디까지 왔는지 가늠할 수 있다.
GNU coreutils 9.0 부터 cp --debug 로 복사 방식(sparse, reflink 등)을 볼 수 있으나 진행률은 아니다. 일부 배포판이 --progress 패치를 얹은 적이 있으나 표준 기능이 아니다.
돌고 있는 cp 의 진척을 밖에서 엿보려면 /proc 를 본다.
PID=$(pgrep -o -x cp)
cat /proc/${PID}/io | grep write_bytes
watch -n2 "grep write_bytes /proc/${PID}/io"
가장 무난하다. 진행률과 속도, 남은 시간을 보여 주고 중단된 지점부터 다시 이어 갈 수 있다.
rsync -ah --info=progress2 /mnt/temp/ /media/sdb/
| 옵션 | 뜻 |
|---|---|
-a |
권한·소유자·타임스탬프·심볼릭 링크 보존 |
-h |
사람이 읽기 쉬운 단위 |
--info=progress2 |
파일별이 아니라 전체 진행률 |
--partial |
중단된 파일의 받은 부분을 남긴다 |
--delete |
원본에 없는 것을 대상에서 지운다 |
경로 끝의 / 가 의미를 바꾼다. /mnt/temp/ 는 그 안의 내용을, /mnt/temp 는 디렉터리 자체를 대상 아래에 만든다.
--info=progress2 로 나오는 전체 퍼센트는 그 시점까지 훑은 파일 목록을 기준으로 계산한다. 파일이 아주 많으면 초반 수치가 실제보다 앞서 나간다.
파이프를 지나는 바이트를 세어 보여 준다. 단일 파일이나 스트림에 적합하다.
sudo dnf install -y pv # EPEL
pv source.img > /media/sdb/source.img
# 디렉터리 전체
tar cf - /mnt/temp | pv -s "$(du -sb /mnt/temp | awk '{print $1}')" | tar xf - -C /media/sdb
블록 장치를 통째로 옮길 때 쓴다.
sudo dd if=/dev/sdb of=/backup/disk.img bs=64M status=progress conv=fsync
status=progress 는 coreutils 8.24 이상에서 쓸 수 있다. 그 이전 버전이면 다른 터미널에서 신호를 보내 현황을 찍게 한다.
sudo kill -USR1 $(pgrep -x dd)
dd 는 of= 를 잘못 적으면 그 장치를 즉시 덮어쓴다. 실행 전에 lsblk 로 장치 이름을 확인한다.
같은 로컬 디스크 사이에서 한 번만 옮긴다면 속도는 거의 같다. 둘 다 결국 같은 커널 호출을 쓰고 디스크가 병목이다. 오히려 rsync 는 파일 목록을 만들고 체크섬을 다루는 만큼 약간의 부하가 더 있다.
차이는 반복할 때 난다. rsync 는 크기와 타임스탬프를 비교해 바뀐 것만 보내므로 두 번째 실행부터 훨씬 빠르다. 중단 후 재개, 원격 전송, 삭제 동기화가 필요하면 rsync 를 쓴다. 한 번 복사하고 끝이면 cp 로 충분하다.