초기화, syslog 및 표준 출력/표준 오류

초기화, syslog 및 표준 출력/표준 오류

저는 리눅스로 임베디드 시스템을 구축하려고 합니다. (비지박스 외에는 리소스가 거의 없다는 의미입니다.) 모든 것이 syslog에 기록되는지 확인하고 싶습니다. 저는 init 및 syslogd가 내장된 최신 버전의 busybox(v.1.21.1)를 사용하고 있습니다.

그러나 여전히 몇 가지 문제가 있습니다. 첫 번째는 초기화 탭입니다.

....
null::sysinit:/bin/sh /etc/rc
null::sysinit:/bin/touch /var/log/messages
null::respawn:/sbin/syslogd -n -S -s 12 -b 8
null::respawn:/sbin/klogd -n
....

rc 스크립트는 syslog 이전에 실행됩니다. 이는 rc의 모든 유용한 정보가 손실됨을 의미합니다. (그런데 touch 명령이 무엇인지 잘 모르겠습니다.) rc (null::sysinit:/sbin/syslogd...) 전에 syslog를 시작할 수 있지만 이렇게 하면 매우 중요한 "재생"이 제거됩니다.

또한 타사 데몬이 시작되면 다음과 같이 보일 수 있습니다.

...
null::respawn:/bin/modbus
...

데몬이 syslog를 지원하지 않거나 일부 오류(예: stderr로 인쇄)가 발생하면 이 정보가 손실됩니다. 출력을 syslog로 리디렉션할 수 없는 것 같습니다. 예를 들어.

...
console::respawn:/bin/modbus|logger 2>1
...

나는 다양한 조합을 시도했다. 아무것도 잘 작동하지 않는 것 같습니다. 물론 모든 데몬을 편집하여 syslog를 지원하도록 만들 수도 있습니다. (하지만 뭔가 미끄러지면 어떨까요?) 다음과 같이 쓰면 해결됩니다.

log::respawn:/bin/modbus

실제로 /dev/log가 있습니다. 하지만 소켓이므로 일반적인 리디렉션이 작동하지 않습니다. ...그래서 사용자 정의 커널 모듈을 통해 작동하게 할 수 있습니다. 예를 들어. /dev/syslog_link를 생성하고 모든 것을 printk에 기록하는 모듈을 생성할 수 있습니다. 문제는 syslog가 해당 로그의 모든 메시지를 "커널"로 표시한다는 것입니다. 아주 틀렸어요.

이제 /dev/log에 쓰는 커널 모듈을 만들 수 있다고 생각했습니다. https://stackoverflow.com/questions/1184274/how-to-read-write-files-within-a-linux-kernel-module https://www.cs.drexel.edu/~jjohnson/2012-13/fall/cs543/project/reading/kernel_fileio.pdf

이것이 가능한지 모르겠습니다. 커널 공간에서 파일을 작성하면 옳고 그름에 대한 연약한 감각이 손상될 것입니다.

어떤 아이디어가 있나요?

답변1

rc 스크립트는 syslog보다 먼저 실행됩니다.

/var/log예를 들어, 여기가 rw를 포함하는 파일 시스템이 다시 마운트되는 곳 이기 때문입니다 . 그렇지 않은 경우 먼저 syslog를 시작할 수 있습니다.

나는 다양한 조합을 시도했다. 아무것도 잘 작동하지 않는 것 같습니다.

나는 몇 년 동안 inittab을 많이 사용하지 않았습니다. 예 /bin/modbus|logger 2>1를 들어 짧은 스크립트에 넣고 대신 사용해 보셨나요 respawn?

물론 모든 데몬을 편집하여 syslog를 지원하도록 만들 수도 있습니다.

가능하다면 아마 그렇게 해야 할 것입니다. 또는 파일에 직접 쓰도록 할 수도 있습니다.

/dev/log가 있습니다. 하지만 소켓이므로 일반적인 리디렉션이 작동하지 않습니다. ...그래서 사용자 정의 커널 모듈을 통해 작동하게 할 수 있습니다.

이것은 너무 멀리 가는 것 같습니다. 사용자 공간 데몬을 사용하여 먼저 시작하는 것이 더 쉽습니다. FIFO에서 무엇이든 읽고 쓸 수 있습니다. 물론, 이미 syslog :/fifo 가 있다는 점을 고려하면 약간 중복될 수 있습니다. 판독기가 사용하는 요령은 read()0이 반환될 때 파이프를 다시 여는 것입니다. 하지만 다시 한번 말씀드리지만 저는 syslog를 먼저 작동시키려고 노력합니다. 표준을 유지하는 것이 더 간단해 보입니다.

답변2

초기 부팅 메시지에 대해 /dev/kmsg를 고려할 수 있습니다. 이는 파일 시스템이 쓰기 가능해지고 디스크 검사가 실행된 후 사용자 공간(거의 모든 배포판)이 시스템 로그에 덤프할 때까지 커널의 순환 버퍼에 보관됩니다. 이는 커널 버퍼가 로거가 시작되기 전에 발생한 메시지의 크기보다 큰 한 작동합니다. 커널 로그 버퍼의 크기는 컴파일 타임에 구성될 수 있습니다. 일반적인 쉘 스크립트를 사용하여 콘텐츠를 /dev/kmsg로 리디렉션할 수 있어야 합니다.

임의 프로그램의 stdout을 syslog로 리디렉션하는 경우 STDIN을 읽고 이를 syslog로 리디렉션한 다음 데몬의 출력을 유틸리티로 파이프하는 유틸리티가 있습니다. 내가 유용하다고 생각한 것은 다음과 같습니다.http://b0llix.net/perp/site.cgi?page=sissylog.8

그렇긴 하지만, 로깅을 사용하여 많은 현명한 일을 하는 사람들이 많이 있습니다. 이 주제에 관심이 있으실 것 같으니 "시스템 로그 설계가 처음부터 결함이 있었습니다" 섹션을 읽어보시는 것도 좋을 것 같습니다.http://www.skarnet.org/software/s6/s6-log.html

관련 정보