복사 cp
명령 이 실행되는 동안 Ctrl+ C를 입력하여 복사 명령을 종료하면 ext4 파일 시스템의 결과는 무엇입니까 ?
파일 시스템이 손상 되었습니까? 불완전한 복사 된 파일이 차지한 파티션의 공간을 삭제 한 후에도 여전히 사용할 수 있습니까?
그리고 가장 중요한 cp
것은 프로세스를 종료하는 것이 안전한 일입니까?
복사 cp
명령 이 실행되는 동안 Ctrl+ C를 입력하여 복사 명령을 종료하면 ext4 파일 시스템의 결과는 무엇입니까 ?
파일 시스템이 손상 되었습니까? 불완전한 복사 된 파일이 차지한 파티션의 공간을 삭제 한 후에도 여전히 사용할 수 있습니까?
그리고 가장 중요한 cp
것은 프로세스를 종료하는 것이 안전한 일입니까?
답변:
이 작업은 안전하지만 당연히 사본을 완료하지 않았을 수 있습니다.
하면 cp
명령이 실행, 파일의 복사본을 만들 커널을 지시 콜을합니다. syscall은 디스크에서 데이터를 읽거나 쓰는 등 커널에서 서비스를 요청하는 응용 프로그램이 호출 할 수있는 기능입니다. 사용자 공간 프로세스는 단순히 syscall이 끝나기를 기다립니다. 통화를 추적하려면 다음과 같이 표시됩니다.
open("/home/user/hello.txt", O_RDONLY) = 3
open("/mnt/hello.txt", O_CREAT|O_WRONLY, 0644) = 4
read(3, "Hello, world!\n", 131072) = 14
write(4, "Hello, world!\n", 14) = 14
close(3) = 0
close(4) = 0
이것은 복사 될 각 파일에 대해 반복됩니다. 이러한 syscall이 작동하는 방식으로 인해 손상이 발생하지 않습니다. 이와 같은 syscall이 입력되면 치명적인 신호는 syscall 이 실행 된 후가 아니라 syscall이 완료된 후에 만 적용 됩니다. 이 때문에 프로세스를 강제 종료하면 현재 실행중인 syscall이 완료된 후에 만 프로세스가 종료됩니다. 이는 파일 시스템 드라이버가있는 커널이 파일 시스템을 정상 상태로 만들기 위해 완료해야하는 작업을 자유롭게 완료 할 수 있음을 의미합니다. 이러한 종류의 I / O는 작업 도중에 종료되지 않으므로 원자 작업이됩니다.
흥미롭게도, 이와 같은 명령 cp
이 죽었을 때 즉시 종료되지 않을 수 있습니다. 매우 큰 파일을 복사하여 SIGKILL을 사용하여 종료하더라도 현재 시스템 호출이 완료 될 때까지 프로세스가 계속 실행됩니다. 파일이 크면 프로세스가 중단 불가능한 상태가되기 때문에 시간이 걸릴 수 있습니다.
cp
. 내부적으로 값으로 사용하는 다양한 파일 액세스 기능이 있습니다.
cp
큰 파일을 처리하는 동안에도 SIGKILLing 후 종료가 지연된다는 것을 결코 알지 못했습니다 . 아마도 프로세스의 중단없는 원자 작업의 지속 시간이 너무 짧습니다. 킬링 dd
및 기타 디스크 읽기 / 쓰기 프로세스에 대해 동일한 설명이 작동 합니까?
dd
은 설정 한 내용에 따라 다릅니다 bs
. 512 (기본값) 인 경우 빨리 종료해야합니다. 더 크면 시간이 조금 더 걸릴 수 있습니다.
cp
사용자 공간 명령 이므로 파일 시스템 무결성에 영향을 미치지 않습니다.
실행중인 cp
프로그램을 종료 할 경우 적어도 하나의 파일이 완전히 복사되지 않도록 준비해야합니다 .
CAP_SYS_RAWIO
파일 시스템의 기본 장치 (예 sudo dd if=/dev/urandom of=/dev/sda1
:)에 직접 액세스 할 수있는 높은 권한 (예 : Linux 또는 기타 OS의 경우)으로 실행되는 사용자 공간 프로그램 은 모든 종류의 혼란을 초래할 수 있습니다.
cp
cp