실수로 두 개의 ext4 파일 시스템 사이의 일부 파일에 대해 32개의 프로세스(가상 머신의 코어당 하나의 프로세스)를 시작했지만 mv
그 중 일부만 성공했습니다 mv
.
for i in `seq 1 32`; do
mv /path/to/ext4-1/pattern* /path/to/ext4-2/ &
done
여러 프로세스가 동일한 파일을 mv하려고 하면 정확히 무슨 일이 발생합니까?
답변1
mv
이는 동일한 파일 시스템 내의 모든 파일에 대해 원자적이지만 파일 시스템 내에서는 더 복잡한 작업입니다(일반 파일만 이동하고 대상이 처음에 존재하지 않는다고 가정).
- 대상 파일이 있으면 삭제합니다.
- 읽을 소스 파일을 엽니다. 일부 구현에서는 이전 단계 전에 이 작업을 수행할 수 있습니다.
- 대상 파일을 생성합니다. 현재 존재하는 경우 일부 구현에서는 이를 잘라낼 수 있습니다. 일부 구현에서는 이전 단계 전에 이 작업을 수행할 수 있습니다.
- 소스 파일에서 일부 데이터를 읽고 대상 파일에 씁니다.
- 소스 파일의 메타데이터를 대상 파일에 복사합니다. 일부 구현에서는 다음 단계 후에 작업의 일부 또는 전부를 수행할 수 있습니다.
- 소스 및 대상 파일을 닫습니다.
- 소스 파일을 삭제합니다.
대부분의 경우 두 mv
프로세스가 동시에 동일한 파일을 이동하려고 하면 둘 다 데이터를 복사합니다. 시작된 첫 번째 인스턴스는 파일을 생성하고 두 번째 인스턴스는 파일을 삭제하고 새 인스턴스를 생성합니다. 하지만,운이 좋지 않으면 데이터가 손실될 수 있습니다.. 예를 들어:
- 예제 1 복사를 수행하고 두 파일을 모두 닫습니다(1-6단계).
- 이 시점에서 인스턴스 2는 이 파일에 도달하여 대상을 삭제하지만(1단계) 소스 파일을 열기 전에 선점됩니다.
- 예 1 소스 파일을 계속 삭제합니다(7단계).
- 예제 2 2단계를 계속하지만 파일이 더 이상 존재하지 않습니다.
파일이 대상에 존재하면 올바른 내용이 있을 것이라고 생각합니다. 그러나 우리가 본 것처럼 파일은 사라질 수 있습니다.