리눅스 커널의 시스템 셧다운은 내부적으로 어떻게 작동합니까?


28

어떻게 든 시스템 종료시 사용자 공간과 init-system (클래식 init sysV / upstart / systemd)이 작동하는 방식에 대한 대략적인 아이디어가 있습니다. (실제로 "정지!", "정말로 중지하십시오", "정지하기 위해 프로세스를 종료해야합니다"및 대기 중 ...

어쨌든 커널에서 시스템 종료가 어떻게 작동하는지 잘 모르고 있습니다 (확실히해야 할 일이 많이 있습니다)?

나는 커널 문서 https://www.kernel.org/doc/htmldocs/ 를 보려고 시도 했으며 심지어 NSA의 친구 검색 도구 를 사용하여 어떻게 작동하는지 알아볼 수있었습니다.

또한 나는 SE U + L을 검색했지만 아무것도 발견하지 못했습니다 (간과 했습니까?)

어쨌든이 질문은 조금 어려울 수 있지만이 Q & A 네트워크에서 더 많은 사람들이 종료시 Linux 커널에서 발생하는 일에 대한 스케치를 얻는 데 관심이 있다고 가정 할 때 대답 할 가치가 있습니다.

잠재적으로 좀 더 자세한 설명과 연결되도록 변경되었습니다.

어떤 시스템 호출과 어떤 커널 신호가 사용됩니까?

https://github.com/torvalds/linux/blob/b3a3a9c441e2c8f6b6760de9331023a7906a4ac6/arch/x86/kernel/reboot.c 는 재부팅과 관련된 x86 사용 파일 인 것 같습니다 (이미 종료에 근접 했습니까?)

아마 여기 http://lxr.free-electrons.com/source/kernel/reboot.c#L176에 있는 스 니펫 이 설명을 제공하는 데 사용될 수 있습니다

176 지혜
177 {
178 (주) 에스엠
179 주식회사
180 pm_power_off_prepare ();
181 (주) 에이 앤티
182 * syscore_shutdown ();
183 pr_emerg ( "전원 끄기 \ n");
184 kmsg_dump (KMSG_DUMP_POWEROFF);
185 (주) 에스엠
186}
187 EXPORT_SYMBOL_GPL (커널 _ 파워 _ 오프);

8
유니콘이 당신과 함께 할 수 있습니다
Kiwy

1
@Kiwy 제안에 감사드립니다. 잠재적 인 더 나은 답변이 나오기까지 시간이 지나면 동의합니다. 그러나 적어도 일부 답변이 있습니다.
humanandANDpeace

감사합니다, 유니콘 감사합니다!
Kiwy

A /이었다가 있음을주의 창 밖으로 점프 하는 옵션 shutdown(8)(가), 즉 사용되지 않는 -n 나는 하나의 생각 읽는 데 사용 된 유닉스 설명서의 " 시스템 종료 자신! - 핵심 장치가 ON FIRE입니다 "효과적으로 지저분한 시스템 킬 스위치하는 바닥에 흩어져있는 비트 (또는 적어도 파일 시스템이 손상된 상태)를 남길 수 있습니다-누군가가 방금 냉각 팬에 손을 넣은 메인 프레임 유형 시스템에 사용될 것이라고 생각합니다. 🕱
SlySven

답변:


26

Linux 커널 작동 방식을 이해하기위한 주요 리소스는 다음과 같습니다.

  1. 설명서 .
  2. 리눅스 주간 뉴스 기사 .
  3. 소스. 이것은 Linux 교차 참조 인 LXR을 통해 이해하기가 조금 더 복잡한 짐승입니다 . lxr.linux.no에서 실행되는 LXR 변형 은 다른 것보다 좋지만 종종 다운됩니다.

이 경우 문서 또는 LWN에서 중심적으로 관련된 것을 찾을 수 없으므로 LXR과 관련이 있습니다.

userland 코드가하는 마지막 일은 reboot시스템 콜을 호출하는 것 입니다. 4 개의 인수가 필요하므로 SYSCALL_DEFINE4(rebootLXR을 검색하십시오 kernel/reboot.c. : 발신자의 특권과 인수를 확인한 후 콜 진입 점은 여러 가지 기능 중 하나를 호출 kernel_restart재부팅하려면 kernel_halt, 꽉 루프 중단 kernel_poweroff, 시스템의 전원을 끄고 kernel_kexec하는 새로운 커널을 교체 (컴파일 된 경우), 또는 hibernate전원을 끄기 전에 메모리를 디스크에 저장하십시오.

kernel_restart, kernel_halt과는 kernel_power_off상당히 유사하다 :

  1. 를 통해 이동 reboot_notifier_list커널 구성 요소가 있습니다 후크의 목록 인 등록 파워 다운에서 코드를 실행하는가. 이 단계에서는 대부분 워치 독과 같은 몇 명의 드라이버 만 코드를 실행하면됩니다.
  2. system_state변수를 설정하십시오 .
  3. 더 이상 사용자 코드가 시작되지 않도록 usermode-helper를 비활성화하십시오 . 이 단계에는 기존 프로세스가 여전히있을 수 있습니다.
  4. device_shutdown시스템의 모든 장치를 해제하거나 전원을 끄려면 호출 하십시오. 이 단계에는 많은 운전자들이 참여합니다.
    이 시점에서 여전히 마운트 된 파일 시스템은 강제로 마운트 해제됩니다. 시스템 호출의 발신자는 모든 마운트 해제를 책임집니다.
  5. 전원 끄기의 경우에만 ACPI가 구성된 경우 코드를 실행 하여 ACPI 상태 S5 (소프트 전원 끄기)가 되도록 준비하십시오 .
  6. 다중 CPU 시스템에서 코드는 시스템 호출을 호출 한 CPU에서 실행될 수 있습니다. migrate_to_reboot_cpu하나의 특정 CPU로 전환하고 스케줄러가 다른 CPU에서 코드를 디스패치하지 않도록주의합니다. 이 시점 이후에는 단일 CPU 만 실행됩니다.
  7. syscore_shutdown등록 된 syscore 작업shutdown메서드를 호출합니다 . 나는 이것이 인터럽트 비활성화에 관한 것이라고 생각한다. 몇 가지 후크에는 방법이 있습니다.shutdown
  8. 백조의 노래 인 정보 메시지를 기록합니다.
  9. 마지막으로 machine_restart, machine_halt또는 을 호출하여 기계에 따라 휴식을 취하십시오 machine_power_off.

최대 절전 모드 코드는 다음과 같이 진행됩니다

  1. 전원 관리 후크를 반복합니다 .
  2. 파일 시스템을 동기화하십시오.
  3. 모든 사용자 코드를 고정하십시오 .
  4. 장치 핫 플러그 ​​방지 .
  5. 시스템 상태를 스왑 공간에 덤프하십시오.
  6. 모든 것이 성공 하면 하드웨어를 최대 절전 모드로 전환하십시오 . 여기에는 kernel_restart, kernel_halt또는 kernel_power_off, 또는 플랫폼 별 최대 절전 모드를 호출하는 것이 포함될 수 있습니다 .

시스템을 종료하는 다른 방법은 machine_emergency_restart입니다. 이것은 매직 SysRq 키에B 의해 호출됩니다 . O키는 다르게 작동합니다 : 그것은 호출합니다kernel_power_off .

시스템은 패닉으로 종료 될 수도 있습니다 ( 예 : 복구 할 수없는 오류). Panicking은 메시지를 기록한 다음 시스템을 재부팅합니다 (하드웨어 감시 또는 긴급 재시작).


+1 감사합니다! @Gilles 마지막 단계로 머신의 RAM을 지우거나 살균하는 코드를 구현하려면 syscore 작업을 등록해야합니다 syscore_shutdown(즉, 다른 질문 unix.stackexchange.com/q/122540/24394 ) . 단계 (1)과 단계 (7)은 모두 종료시 실행될 항목을 등록 할 수있게합니다. 무엇이 무엇인지는 확실하지 않습니다. 나는 당신이 언급 한 문서를 할 것입니다. 그러나 당신이 알고 있다면! 감사!
humanandANDpeace

나는이 질문에 놀랐고 대답에는 더 많은 투표가 없습니다.

2

이것은 부분적인 답변 일 뿐이며 다른 답변을 초대합니다. 더 철저하고 명확 할 수 있습니다.

이 답변의 내용은 3.13 리눅스 커널 kernel/reboot.c파일 에서 가져온 것입니다.

어쨌든 우리는 기본적으로 시스템을 종료하는 과정을 스케치하는 세 가지 기능을 가지고 있습니다

  • void kernel_halt(void) // 정지 상태의 시스템으로 끝나는
  • void kernel_power_off(void) // 시스템 전원이 꺼진 상태
  • void kernel_restart(char *cmd) // 시스템을 종료하고 다시 시작합니다.

이러한 기능은 매우 간단하므로 여기에 붙여 넣을 수 있습니다. 그들의 코드는 커널에서 종료하는 과정에서 어떤 단계가 수행되는지를 가장 잘 보여줍니다. (의견은 저에 의한 것이며 100 % 이상적이고 정확하지 않을 수 있습니다. 확신을 가지려면 스스로 확인하십시오. 간단한 시도입니다.

void kernel_halt(void)

void kernel_halt (void)
{
    // 1 단계 :
    // a) 재부팅 / 종료시 실행되도록 호출 함수 / 콜백 등록
    // b) system_sate를 SYSTEM_HALT로 설정
    // c) userspacetool 상호 작용을 중지
    // d) device_shutdown () 함수 호출
    kernel_shutdown_prepare (SYSTEM_HALT);

    // 2 단계 : 이것이 멀티 CPU 시스템에 필수적이라고 생각합니다
    migrate_to_reboot_cpu ();

    // 3 단계 :
    // syscore_shutdown-등록 된 모든 시스템 코어 종료 콜백을 실행합니다. 
    syscore_shutdown ();

    // 4 번째 메시지
    pr_emerg ( "시스템 정지 \ n");
    kmsg_dump (KMSG_DUMP_HALT);

    // 5 번째 콜 아치 별 CPU-halt-code
    machine_halt ();
}

sys_reboot시스템 호출로 모든 것이 시작됩니다. 시스템 호출은 재부팅뿐만 아니라 종료를 고려할 때 종료 프로세스와 직접 연결되는 것이 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.