시스템 캐시를 무시하고 물리적(동기) 디스크 사용량을 얻는 방법은 무엇입니까?

시스템 캐시를 무시하고 물리적(동기) 디스크 사용량을 얻는 방법은 무엇입니까?

du복사된 USB 드라이브에 기록되는 데이터의 양을 지속적으로 모니터링하는 데 사용합니다 .

원본 드라이브와 대상 드라이브의 디스크 사용량을 비교하고 사용자에게 복사 진행 상황을 표시합니다.

문제는 du시스템 캐시에 여전히 많은 데이터가 있고 드라이브의 LED가 깜박이며 드라이브가 준비되지 않은 것을 확인했는데도 대상 드라이브에 데이터가 100% 존재한다고 보고한다는 것입니다. 제거됨.

나는 를 실행한 다음 rsync사용자 가 대상 드라이브를 삭제하도록 하기 전에 데이터가 실제로 존재하는지 확인했습니다. 하지만 진행 상황을 모니터링할 수는 없습니다. 따라서 사용자는 드라이브가 실제로 동기화될 때까지 상황을 100% 볼 수 있습니다.syncumountsync

저는 "실제" 복사 진행 상황을 모니터링할 수 있기를 원합니다. 그것이 정말 중요하기 때문입니다. rsync1GB 파일이 25초 안에 완전히 복사되는 것을 보는 것은 아무 소용이 없으며 sync드라이브에 새로 고쳐질 때까지 5분을 더 기다려야 합니다( 나는 약간 과장했지만 무슨 뜻인지 알 것입니다.)

다음은 rsync각 드라이브의 진행 상황을 모니터링하기 위해 반복하는 방법입니다.

PROGRESS="$(echo "$(du -s "/MEDIA/TARGET" 2>/dev/null  | cut -f 1) / $(du -s "/MEDIA/SOURCE" 2>/dev/null | cut -f 1) " | bc -l)"

$PROGRESS소스 드라이브 사용량과 대상 드라이브 사용량 간의 비율을 나타내는 0과 1 사이의 부동 소수점 숫자입니다.

시스템 캐시에서 대기하는 것이 아니라 이미 드라이브에 동기화된 데이터만 고려하도록 이를 어떻게 수정할 수 있습니까?

편집하다:

dd시스템 캐시를 생략한 쓰기를 수행하는 것이 가능하다는 것을 알았습니다 . 테스트를 수행했고 실제로 이 방법으로 파일을 복사하면 du실제 값이 보고되고 진행률 표시가 정확해졌습니다.

dd if=/media/SOURCE/file of=/media/TARGET/file bs=4M oflag=direct

이는 읽기 캐시를 사용하지만 쓰기 캐시를 비활성화하므로 너무 많은 읽기를 수행하지 않고도 프로세스를 더 쉽게 추적할 수 있습니다. 문제는 dd대신 사용하려면 rsync디렉터리 구조를 수동으로 다시 만들어야 한다는 것입니다. 파일 속성이나 수정 날짜에 신경 쓸 필요가 없습니다.

findmkdir, 의 조합을 사용하여 dd먼저 디렉토리 트리를 다시 만든 다음 파일을 하나씩 복사할 수 있다고 생각했습니다 . 궁금합니다. 이 접근 방식에 단점이 있나요?

답변1

이 문제를 해결하는 가장 좋은 방법은 다음을 사용하는 것 같습니다.직접 파일 출력. 이렇게 하면 du더 정확한 판독값을 얻을 수 있습니다.

불행히도 dd이것만 허용되므로 두 가지 문제를 해결해야 합니다.

  1. dd디렉토리로 무엇을 해야할지 모르겠습니다
  2. dd한 번에 하나의 파일만 복사할 수 있습니다.

먼저 입력 및 출력 디렉터리를 정의합니다.

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

이제 보고서가 쉽게 조작할 수 있는 상대 디렉터리가 cd되도록 소스 디렉터리로 이동해 보겠습니다 .find

cd "$SOURCE"

디렉토리 트리를 에서 로 복사하세요 $SOURCE.$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

$SOURCE쓰기 캐시를 무시하기 위한 파일 복제 $TARGET(그러나 읽기 캐시 활용!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

이는 파일 수정 시간, 소유권 및 기타 속성을 보존하지 않지만 나에게는 중요하지 않습니다.

관련 정보