Linux를 종료하기 전에 sync (8)의 실행이 여전히 필요합니까? 코드를 찾지 않고

나는 아직도 사람들이 sync; sync; sync; sleep 30; halt리눅스를 셧다운하거나 재부팅하는 것에 대해 이야기 할 때 주문을 사용하는 것이 좋습니다 .

필자는 리눅스를 처음 시작한 이후로 운영해 왔으며 이것이 BSD 4.2 / 4.3 및 SunOS 4 일에서 권장되는 절차 였지만 적어도 지난 10 년 동안 그렇게해야한다는 것을 기억할 수 없습니다. 아마 리눅스의 셧다운 / 재부팅을 통해 수천 번을 겪었습니다.

커널이 단일 사용자 모드 (예 : / tmp)에서도 필요한 루트 파일 시스템 및 기타 중요한 파일 시스템을 마운트 해제하고 동기화 할 수 없었기 때문에 이것이 비동기 일로 의심되므로 플러시하도록 명시 적으로 지시해야했습니다 디스크에 가능한 한 많은 데이터.

요즘 커널 소스에서 관련 코드를 찾지 않고 ( http://lxr.linux.no 및 google을 통해 파고 들어 ) 커널이 루트 파일 시스템조차 깨끗하게 마운트 해제 할 수있을만큼 똑똑하고 파일 시스템이 충분히 똑똑하다고 생각합니다 정상 shutdown/ reboot/ 동안 자체 마운트를 해제하기 전에 sync (2)를 효과적으로 수행합니다 poweorff.

"sync; sync; sync"파일 시스템 (예 : 부하가 너무없는 마운트 해제 깨끗하게 (예 : 물리 디스크 오류) 또는 시스템 만 직접 재부팅 (8)을 강제하는 것은 그 동결의 그것을 밖으로 얻을 것이다 상태입니다 곳 극단적 인 경우에만 필요 종료 명령을 예약하도록하려면 high).

또한 sync이동식 장치를 마운트 해제하기 전에 절차를 수행하지 않으며 문제가 발생하지 않습니다.

또 다른 예-Xen은 DomU가 shutdownDom0에서 명령을 전송하도록 허용합니다. 이는 누군가가 sync; sync; sync먼저 마법을 입력하고 입력하지 않아도 “완전 종료”로 간주됩니다 .

수천 건의 시스템 종료로 인해 맞습니까?



답변

사람들이 sync; sync이전에 실행 하는 halt이유는 halt명령이 이전 Linux에서 시스템을 완전히 종료하지 않기 때문 입니다. SYSVr4 시스템에서이를 수행하는 올바른 방법은 항상 다른 실행 레벨로 이동하도록 초기화하는 것입니다.

BSD와 SunOS 4는 SYSVr4 운영 체제가 아니기 때문에 서로 다릅니다. Solaris (SunOS 5)는 SYSVr4이며 Linux는 사용하려는 SYSVr4 표준의 비트를 선택합니다.

중단을 사용하는 것은 실제로 프로세스 중지 및 디스크 마운트 해제와 같은 작업을 수행하기 위해 init 스크립트를 실행하지 않기 때문에 대부분의 UNIX (Linux는 예외 중 하나임)에서 수행하는 매우 나쁜 방법입니다.

절대로 리눅스가 아닌 다른 종류의 UNIX 시스템을 사용 하지 않을 것이라고 확신 할 수 있다면 계속 사용할 수 halt있습니다. 다른 UNIX를 사용할 가능성이 있다면 init _runlevel_or 를 사용하는 습관을들이는 것이 좋습니다. shutdown.

shutdown명령은 실제로 init프로세스에 실행 레벨 실행 레벨 을 변경하도록 지시합니다 . 그렇게하면 init는 각 K * init 스크립트 및 해당 실행 레벨과 연관된 S * init 스크립트를 실행합니다. 실행 레벨 0의 스크립트 중 하나가 파일 시스템 마운트 해제를 수행합니다.

Linux에서 실행 레벨이 이미 0 (종료) 또는 6 (재부팅)이 아니면 halt명령 은 명령을 호출 합니다 . 손실이 없습니다.shutdown

파일 시스템을 사용하여 마운트를 해제 umount하면 데이터가 마운트 해제되기 전에 디스크에 동기화됩니다.

sync; sync; haltLinux 에서 실행 하고 있다면 개발자가 올바른 작업 을 halt수행 했으므로 파일 시스템 상태에 문제가 없을 것입니다. 그러나 사용하는 것이 더 정확합니다.shutdown now


답변

여러 sync호출을 사용하면 OS 및 디스크가 쓰기 큐를 플러시 할 수 있습니다. "sync; sync; sync"그 유용한 것으로 간주되지 않았다; "sync<cr> sync<cr> sync<cr"ASR-33에서 캐리지 리턴 / 라인이 충분한 지연을 제공하는 동안 한 가지 지연과 지연. 정지는 항상 통화 동기화를 수행했습니다. 문제는 전원을 제거하기 전에 대기열을 비울 수있는 시간이 충분한 지 여부였습니다.

원래 포스터 sync; sleep 30는 의도 한 것과 더 잘 어울립니다.


답변

왜 여러 번 발행해야하는지에 대해서만 말할 수 있습니다 sync. 이 명령은 디스크에 플러시를 예약하지만 실제 플러시가 완료되기 전에 반환됩니다. 후속 sync명령은 다른 플러시를 예약하고 종료하기 전에 미해결 플러시가 진행될 때까지 차단됩니다. 따라서 sync; sync동기 플러시를 보장합니다. 두 번 이상 할 필요가 없으며 sleep믹스를 가져올 필요가 없습니다 .


답변

“sync; sync; sync”는 당신의 나이를 밝힐 목적이 없다고 우리 모두에게 말합니다.

좋은 시절로 돌아가서 유닉스가 십대들을위한 것이되기 전에는 스트리밍 / 백업 요구에 TAPE를 사용해야했습니다. 종종 테이프 기반 파일 시스템을 마운트하여 백업 등을 스트리밍하는 경우도있었습니다. 이 길고 얇은 마그네틱 플라스틱 테이프는 파일을 저장하기 위해 우리 모두가 가지고 있던 ..

‘sync; sync; sync’명령은이 오래된 테이프 시스템이 종료 전까지 끝까지 되감도록 지시 할 수있는 방법이었습니다. 모든 파일 시스템과 마찬가지로 sync cmd를 수신하는 펌웨어가 내장되어 있습니다. 동기화 버퍼 명령이 거의 즉시 뒤 따르면 테이프 드라이브 자체가 “테이프 되감기 및 마운트 해제”를 의미하는 것으로 해석합니다. 이 방법을 넘어서 테이프 드라이브를 되 감으라고 할 수있는 방법이 없었습니다. ) 우리의 근육 기억. 테이프가 덜 보편적이고 하드 드라이브가 더 많이 사용 가능 해지 자마자 민속적인 지위를 얻었지만 테이프 드라이브를 사용하는 사람들에게는 여전히 유용합니다.