나는 Linux에서 명령의 사용법 sync
과 작동 방식에 대해 읽었습니다. 그런데 언제 실제로 파일에 사용해야 하는지 이해할 수 없고, 실용적인 예도 찾지 못했습니다.
예를 들어 이 명령은 sync --data file.txt
파일 데이터를 이 명령과 동기화하지만 언제 사용해야 하는지, 명령이 어떻게 작동하는지에 대한 유용한 예를 찾지 못했습니다.
어쩌면 이러한 변경 사항을 모니터링할 수 있는 도구가 있을 수 있습니다. 아니면 이 명령의 효과를 확인하려면 어떻게 해야 합니까?
답변1
sync
맨페이지 에서 :
커널은 (상대적으로 느린) 디스크 읽기 및 쓰기를 방지하기 위해 데이터를 메모리에 유지합니다. 이렇게 하면 성능이 향상될 수 있지만 컴퓨터가 충돌하면 데이터가 손실되거나 파일 시스템이 손상될 수 있습니다.
sync
메모리의 모든 내용이 디스크에 기록되었는지 확인하세요.
sync
볼륨 마운트 해제, 재부팅 또는 시스템 종료 전에 자동으로 호출됩니다.
귀하의 질문에 대답하려면: sync
데이터가 디스크에 기록되었는지 확인하고 싶을 때마다 이것을 호출할 수 있습니다. 일반적으로 로컬 드라이브에 대해 명시적으로 이 작업을 수행할 필요는 없지만 그렇게 해도 문제가 되지 않습니다.
답변2
Linux의 I/O는 VFS(가상 파일 시스템)를 통해 수행됩니다. VFS는 다양한 유형의 파일 시스템(ext?/XFS/BTFS, NFS, COW, FUSE 등)의 데이터 구조를 캐시합니다. 이는 모든 프로세스 I/O가 공통 인터페이스를 사용할 수 있음을 의미합니다. 파일 시스템 구조를 메모리에 저장하면 매번 디스크를 검색하는 것보다 디렉터리 및 inode 검색이 훨씬 빨라집니다. 데이터를 검색하는 동안 읽기는 여전히 일시 중지될 수 있지만 쓰기는 단순히 데이터를 버퍼로 이동하고 VFS를 업데이트한 후 반환됩니다. 수정된 데이터가 포함된 버퍼를 "더티" 버퍼라고 하며 시스템이 선택할 때 시스템에 의해 생성됩니다. "클린" 버퍼에는 디스크 복사본과 동일한 정보 캐시가 포함되어 있으므로 언제든지 삭제할 수 있습니다.
사용은 sync
시스템이 더티 버퍼를 기록하고 시스템 밖으로 안전하게 이동할 때까지 반환하지 않도록 강제합니다. "dr_"이 언급했듯이 이 작업은 분리하기 전에 수행되어야 합니다. 더티 버퍼가 기록되면 시스템이 다른 목적으로 더 많은 메모리를 요구할 때까지 메모리에 클린 버퍼로 남아 있습니다.
그러나 한 가지 명심해야 할 점은 모든 외부 캐시는 시스템에 알려지지 않았으므로 sync
완전히 안전하지 않을 수 있다는 것입니다. NFS는 데이터가 원격 시스템으로 전송되면 로컬 컴퓨터가 버퍼를 해제하는 전형적인 예입니다. 원격 시스템이 아직 데이터를 디스크에 쓰지 않았을 수 있으므로 별도로 처리해야 합니다. 또 다른 시나리오는 외부 RAID 컨트롤러를 사용하는 것입니다. 다시 말하면, sync
이는 데이터가 RAID 컨트롤러에 도달했음을 보장하지만 RAID 컨트롤러가 실제로 데이터를 디스크에 썼다는 것을 알 수 있는 방법은 없습니다.
간단히 말해서 최신 시스템에서는 일반적으로 ing 을 사용할 필요가 없습니다 sync
. 그러나 파일 시스템의 일부를 사용할 수 없게 될 수 있다고 판단되는 경우 sync
ing 을 사용하는 것이 합리적인 예방 조치입니다. 예를 들어, LVM을 변경하기 전에 sync
오류가 발생할 경우를 대비하는 것이 좋습니다 . 다시 한번 말씀드리지만, sync
시스템을 이동하거나 전원 공급 장치에 어떤 작업을 하기 전과 마찬가지로 (NFS 등이 있는 경우) 이전에 네트워크를 조정하는 것이 좋습니다.
O_SYNC 또는 유사한 명령을 사용하여 파일을 열지 않는 한.
답변3
한 시스템에 작은 덩어리(예: 문자 단위 또는 한 줄 단위)로 첨부한 다음 다른 시스템에서 읽을 수 있는 파일이 NFS에 있다고 가정해 보십시오.
한쪽의 프로그램이 파일에 쓴 다음 다른 컴퓨터에서 변경되었는지 확인합니다. 변경 사항이 버퍼링되므로 변경되지 않습니다. 아직 서버에 도달하지 않았을 뿐입니다. 시스템이 실제로 언제 전송하기로 결정했는지는 아무도 모릅니다.
sync를 호출하면 버퍼를 즉시 플러시하도록 강제합니다.