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

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

저는 du복제 중인 USB 드라이브에 기록된 데이터의 양을 지속적으로 모니터링하는 데 사용하고 있습니다.

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

문제는 du시스템 캐시에 여전히 많은 데이터가 있고 드라이브의 LED가 깜박이며 드라이브를 제거할 준비가 되어 있지 않음에도 불구하고 대상 드라이브에 100% 데이터가 있다고 보고한다는 것입니다.

나는 를 실행 rsync하고 사용자가 대상 드라이브를 제거하도록 하기 전에 데이터가 실제로 있는지 확인합니다. 그러나 진행 상황 을 모니터링할 수는 없습니다 . 따라서 드라이브가 실제로 동기화되기 오래 전에 사용자는 100%를 보게 됩니다.syncumountsync

나는 "실제" 복사 진행 상황을 모니터링할 수 있기를 원합니다. 이것이 정말 중요하기 때문입니다. 25초 안에 1GB 파일이 완전히 복사되는 것을 보는 것은 아무 소용이 없습니다. 반면 에 플러시하는 rsync동안 5분을 더 기다려야 합니다. sync운전합니다(과장했지만 이해가 되실 겁니다).

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)"

$PROGRESS0과 1 사이의 부동 소수점으로, 소스 드라이브 사용량과 대상 드라이브 사용량 간의 비율을 나타냅니다.

시스템 캐시에서 기다리는 것이 아니라 이미 드라이브에 동기화된 데이터만 고려하도록 이를 수정하려면 어떻게 해야 합니까?

편집하다:

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

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

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

find, mkdir및 의 조합을 사용하여 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 \;

이렇게 하면 파일 수정 시간, 소유권 및 기타 속성이 보존되지 않지만 나에게는 괜찮습니다.

관련 정보