로컬 파일 시스템의 디렉터리에 주기적으로 백업하는 애플리케이션이 있습니다. 이 디렉터리에는 몇 가지 파일과 디렉터리가 더 있습니다.
백업 저장소에 복사할 수 있는 모든 파일의 "스냅샷"을 생성하고 싶습니다.
가장 중요한 것은 이 "스냅샷"을 원자적으로 생성하려면 어떻게 해야 합니까? 이러한 파일은 백업 데몬에 의해 수정되어 "스냅샷"이 일관되지 않을 수 있다는 점을 명심하세요.
편집하다:
아마도 시스템에 ext4
파일 시스템이 있다는 점을 언급해야 할 것 같습니다.
답변1
어떤 프로세스가 해당 디렉터리에 파일을 쓰고 있는지 알고 있다면 해당 파일을 동결하고 kill -SIGSTOP <pid>
백업을 만든 다음 복원 프로세스를 사용할 수 있습니다 kill -SIGCONT <pid>
.
답변2
내가 아는 한, ext4 자체는 데이터에 동시에 액세스하는 애플리케이션의 협력 없이는 그러한 트랜잭션의 원자성을 보장할 수 없습니다. 블록 장치 수준에서 일관된 상태를 얻으려면 기본적으로 파일 시스템을 마운트 해제(또는 최소한 -ro를 다시 마운트)해야 하기 때문에 기본 장치 매퍼에서 일부 스냅샷 메커니즘을 사용하는 것도 작동하지 않습니다.
애플리케이션의 동작에 대한 추가 지식이 없으면 이는 매우 복잡해질 것이라고 생각합니다. 따라서 가장 쉬운 방법은 어떤 방식으로든 애플리케이션을 수정하는 것입니다(예: 잠금 파일 도입). 그러나 이를 블랙박스로 처리해야 한다면 이에 대해 몇 가지 가정을 하겠습니다.
- 애플리케이션의 정기 백업은 실행 간격에 비해 짧은 시간 소요
- 백업이 완료되면 다음 백업이 실행될 때까지 모든 파일 핸들이 닫힙니다.
이러한 가정을 바탕으로 저는 낙관적인 접근 방식을 권장합니다. 즉, 디렉터리의 정규적이고 재귀적이며 비원자적인 복사본을 만든 다음 응용 프로그램이 파일을 건드렸는지 확인하십시오. 그렇다면 안타깝게도 귀하의 사본은 애플리케이션의 정기적인 자체 백업과 일치합니다. 이 경우 방금 만든 복사본을 삭제하고 다시 시도하세요. 잠시 물러서서 리소스를 소모하는 끝없는 루프를 피하세요.
프로세스 중에 복사할 파일을 모니터링하는 수단으로 Linux의 inotify 메커니즘을 사용하면 이를 달성할 수 있습니다. 간단한 쉘 스크립트를 원한다면 살펴보십시오.이노티파이 도구. 대부분의 배포판에 포함되어 있습니다. 파일이 이미 열려 있을 때 inotify가 어떻게 작동하는지 완전히 확신할 수 없으므로 가정 2를 참조하면 이를 사용하여 lsof
애플리케이션이 소스 디렉터리의 모든 항목에 대해 열린 파일 핸들이 없는지 확인할 수도 있습니다. 해뒤쪽에inotify watch를 설정했습니다.
그래서 이것이 내가 당신의 상황을 해결하는 방법입니다. 실제 구현 스케치를 생략해도 괜찮기를 바랍니다. 불분명한 점이 있으면 언제든지 문의해 주세요.
답변3
/sbin/fsfreeze --freeze /data
# do a backup
/sbin/fsfreeze --unfreeze /data
fsfreeze - 파일 시스템(Ext3/4, ReiserFS, JFS, XFS)에 대한 액세스를 일시 중지합니다.
추가 정보가 필요한 경우:https://manpages.ubuntu.com/manpages/focus/man8/fsfreeze.8.html