임베디드 Linux 장치의 워치독을 재설정하는 방법

임베디드 Linux 장치의 워치독을 재설정하는 방법

비슷한 명령어가 있나요?

vi > out
vi | out

이것을 사용하여 임베디드 Linux 장치의 감시 장치를 재설정할 수 있습니까?

답변1

시스템에 워치독이 있고 이를 사용하는 드라이버가 있는 /dev/watchdog경우 데이터를 공급하는 프로세스를 종료하기만 하면 됩니다. 이 프로세스가 없으면 이 touch /dev/watchdog프로세스를 한 번 켤 수 있습니다. 더 이상 만지지 마세요. 재설정됩니다.

"magic sysrq" 방법을 사용하여 장치를 재설정하는 데 관심이 있을 수도 있습니다. 커널이 CONFIG_MAGIC_SYSRQ이 기능으로 컴파일 된 경우 echo 1 > /proc/sys/kernel/sysrq이를 활성화하고 echo b > /proc/sysrq-trigger재부팅할 수 있습니다. 이렇게 하면 파일 시스템을 마운트 해제하거나 동기화할 필요 없이 즉시 재부팅됩니다.

답변2

워치독이 제대로 실행되고 있다고 생각하고 실제로 충돌한 시스템을 복구할 수 있는지 테스트하고 싶다면 "magic sysrq"를 사용하여 커널 패닉으로 시스템을 충돌시키는 방식으로 Shawn의 대답보다 더 나은 결과를 얻을 수 있습니다. 먼저 파일 시스템을 동기화하는 것이 좋으므로 루트로 다음을 수행하십시오.

sync; sleep 2; sync; echo c > /proc/sysrq-trigger

sysrq가 활성화되면 커널 패닉이 발생합니다. 그런 다음 약 60초(워치독 모듈의 일반적인 시간 초과)를 기다리면 머신이 재부팅되는 것을 볼 수 있습니다. 이는 "소프트독" 모듈이 아닌 하드웨어 감시에만 적용된다는 점에 유의하세요.

답변3

워치독 프로세스를 종료하는 것도 하나의 접근 방식이지만 이것이 완벽한 방법은 아닙니다. 동작은 특정 워치독 드라이버에 따라 다릅니다.커널 문서, 특히 "Magic Close" 및 CONFIG_WATCHDOG_NOWAYOUT커널 구성에 따라 답변이 sysrq오탐( CONFIG_PANIC_TIMEOUT)될 수도 있습니다.

가장 간단한 접근 방식은 간단하고 의도적으로 깨진 감시 장치를 직접 작성하는 것입니다. 커널에 포함된 예제를 기반으로 한 다음 프로그램이 저에게 효과적이었습니다.

// SPDX-License-Identifier: GPL-2.0
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

#include <sys/ioctl.h>
#include <linux/watchdog.h>

int main(void)
{
    int fd = open("/dev/watchdog", O_RDWR);
    if (fd == -1) {
        perror("watchdog");
        exit(EXIT_FAILURE);
    }
    int timeout;
    ioctl(fd, WDIOC_GETTIMEOUT, &timeout);
    printf("The timeout was %d seconds\n", timeout);
    timeout = 1;
    ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
    printf("The timeout is now %d seconds. The system should reset soon...\n", timeout);
    while (1) {
        printf("Still here...\n");
        sleep(1);
    }
}

gcc prog.c && sudo sync && sudo ./a.out예를 들어 다음과 같이 실행하십시오 .

답변4

처음 두 게시물의 한 줄에 다음을 입력하세요.

echo 1 | sudo tee -a /proc/sys/kernel/sysrq; sync; sleep 2; sync; echo c | sudo tee -a /proc/sysrq-trigger

관련 정보