잘못된 "rm"을 입력한 후 컴퓨터를 종료하면 파일이 저장되는 이유는 무엇입니까?

잘못된 "rm"을 입력한 후 컴퓨터를 종료하면 파일이 저장되는 이유는 무엇입니까?

전형적인 시나리오: 실행이 잘못됐는데 rm잘못된 파일을 삭제했다는 것을 즉시 깨닫게 됩니다. (중요한 것은 없으며 최근 백업이 있지만 여전히 짜증납니다.)

그러한 도구를 사용하여 파일을 복구 하고 싶다면 추가 디스크 활동이 나의 적이라는 것을 알았고 즉시 물리적으로 시스템 전원을 껐습니다(즉 , 그러한 명령을 extundelete사용하는 대신 전원 버튼을 사용함 ). halt중요한 작업을 실행하지 않거나 아무 것도 열지 않는 노트북이므로 허용되는 작업입니다. (그런데, 나는 이 상황에서 가장 먼저 해야 할 일은 먼저 프로세스에서 누락된 파일을 열 수 있는지 여부를 추정하는 것임을 배웠습니다.https://unix.stackexchange.com/a/101247-- 그렇다면 머신을 종료하는 대신 이 방법으로 복원해야 합니다. )

그래도 일단 기계의 전원이 꺼지면 잠시 생각해 본 결과 적절한 법의학을 위해 라이브 시스템을 부팅하는 데 시간을 투자할 가치가 없다고 판단했습니다. 그래서 기계를 다시 시작했습니다. 그러다가 내 파일이 여전히 디스크에 있다는 것을 발견했습니다. rm전원을 끄기 전에는 파일이 디스크에 전파되지 않았습니다. 나는 약간의 춤을 추고 예상치 못한 용서에 대해 시스템 관리자 신들에게 감사했습니다.

이제 내 질문은 이것이 어떻게 달성되고 rm실제로 디스크에 전파되기 전에 일반적인 지연이 무엇인지 이해하는 것입니다.디스크 IO가 즉시 플러시되지 않고 잠시 동안 메모리에 유지된다는 것을 알고 있지만 보류 중인 작업이 완전히 손실되지 않도록 디스크 로그를 빠르게 확인할 수 있을 것이라고 생각했습니다.https://unix.stackexchange.com/a/78766더티 페이지 플러시와 로그 작업 플러시를 위한 별도의 메커니즘을 암시하는 것처럼 보이지만 로그가 플러시 작업에 참여하는 방식 rm이나 플러시 작업 전 예상되는 지연에 대한 세부 정보를 충분히 제공하지 않습니다.

자세한 내용: 데이터는 LUKS 볼륨 내부의 ext4 파티션에 있으며 머신 백업을 시작하면 다음 항목이 표시됩니다 syslog.

Sep 24 10:24:58 gamma kernel: [   11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [   11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [   11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)

하지만 이것이 rm.

또 다른 질문은 머신의 전원을 끄지 않고 보류 중인 디스크 작업을 수행하지 않고 대신 어딘가에 덤프하도록 커널에 지시하는 방법이 있는지 여부입니다. (물론 정지된 작업을 수행하지 않는 것이 위험하게 들리지만, 이는 기계를 종료할 때 발생하는 일이며 어떤 경우에는 절약할 수 있습니다.) 물론 "더 깔끔"하며 많은 즐거움을 주기도 합니다. 예를 들어, 원격 서버의 전원을 물리적으로 끄는 것은 쉬운 옵션이 아닙니다.

답변1

무슨 일이 일어나고 있는지 꽤 잘 알고 있는 것 같습니다.

예, 변경 사항을 디스크에 커밋하기 전에 시스템을 강제 종료하기 때문에 재부팅해도 해당 내용이 그대로 유지됩니다.

시스템은 모든 쓰기를 디스크에 플러시하기 전에 캐시합니다. 이 동작을 제어할 수 있는 여러 옵션이 있으며 모두 /proc/sys/vm/dirty_* [커널 문서] . 애플리케이션이 [ 를 통해 명시적으로 새로 고침을 수행 하지 않는 한fsync() 사람 2 fsync] , 데이터가 충분히 오래되었거나 쓰기 캐시가 가득 차면 데이터가 커밋됩니다.
위에서 사용된 "데이터"의 정의에는 파일을 삭제하기 위한 디렉토리 항목 수정이 포함됩니다.

저널에 관한 한 이것은 저널의 목적에 대한 일반적인 오해 중 하나입니다. 로그의 목적은 변경 사항이 재생되거나 데이터가 손실되지 않도록 하는 것이 아닙니다. 저널의 목적은 파일 시스템 내부의 파일이 아닌 파일 시스템 자체의 손상을 방지하는 것입니다. 로그에는 변경 사항에 대한 정보만 포함되며 일반적으로 변경 사항 자체에 대한 전체 데이터는 포함되지 않습니다. 정확한 세부사항은 파일 시스템 및 저널링 모드에 따라 다릅니다. ext3/4의 경우 data의 마운트 옵션을 참조하세요 man 8 mount.


추가 질문에 답하려면 재부팅하지 않고 보류 중인 쓰기를 방지하는 방법이 있습니까?

커널 소스 코드를 빠르게 읽어보면 마법의 sysrq u명령 ([위키피디아],[커널 문서]) 긴급 재설치 읽기 전용 작업을 수행합니다. 모든 볼륨을 읽기 전용으로 즉시 다시 마운트하는 것으로 보입니다.아니요동기 작업.

사용하려면 Alt+ SysRq+ 를 누르세요 u.

답변2

에서:https://www.kernel.org/doc/Documentation/filesystems/ext4.txt

commit=nrsec (*) Ext4는 "nrsec"초마다 모든 데이터와 메타데이터를 동기화하도록 지시받을 수 있습니다. 기본값은 5초입니다. 즉, 전원이 꺼지면 마지막 5초의 작업이 손실됩니다(단, 저널링 기능으로 인해 파일 시스템이 손상되지는 않습니다). 이 기본값(또는 낮은 값)은 성능을 저하시키지만 데이터 보안에는 좋습니다. 0으로 설정하면 기본값(5초)을 그대로 두는 것과 동일한 효과가 있습니다. 이 값을 매우 큰 값으로 설정하면 성능이 향상됩니다.

플러시 방법에 대한 자세한 내용은 여기를 참조하세요.Linux 시스템에서 버퍼와 캐시를 지우는 방법은 무엇입니까?

위 링크에서 인용했습니다.

참고: 메모리에서 불필요한 항목을 정리합니다(Kernerl 2.6.16 이상). 유용한 콘텐츠를 디스크에 플러시하려면 항상 동기화를 먼저 실행하세요!

To free pagecache:

$ echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

$ echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

$ echo 3 > /proc/sys/vm/drop_caches

관련 정보