저는 Yocto를 사용하여 SystemD 버전 241이 설치된 소형 임베디드 Linux 시스템용 사용자 정의 이미지를 생성하고 있습니다. 루트 파일 시스템은 읽기 전용입니다. 나는 /var/log/journal 디렉토리가 별도의 읽기/쓰기 파티션에 존재하도록 하기 위해 바인드 마운트와 overlayfs를 사용했습니다. systemd-journald가 "기억상실"을 겪고 이전 시작 저널이 영구 읽기/쓰기 파일 시스템에 있음에도 불구하고 기억하지 못하는 문제에 직면했습니다. 이는 로그 파일이 존재하고 파일 시스템에 유효한 경우에도 로그가 이전 시작의 오래된 로그 파일에 액세스하거나 지울 수 없음을 의미합니다.
# Setup overlayfs binds for various RW files
VOLATILE_BINDS_append = " \
/persistent-storage/var/log /var/log\n\
"
/var/log 경로가 존재합니다:
root@me:/var/log# cd /var/log/
root@me:/var/log# ls -lrt
total 9
drwxr-xr-x 2 root root 1024 Jun 3 01:50 nginx
-rw-r--r-- 1 root root 5260 Jun 9 17:56 messages
drwxr-sr-x 5 root systemd-journal 1024 Jun 9 18:00 journal
root@me:/var/log# ls -lrt journal/
total 3
drwxr-sr-x 2 root systemd-journal 1024 Jun 9 17:56 5f6085cd81114e8688cf23b3bb91933e
drwxr-sr-x 2 root systemd-journal 1024 Jun 9 17:57 de59603d1ea24e7582ed7d7ed3ac8fb0
drwxr-sr-x 2 root systemd-journal 1024 Jun 9 18:00 0c34cc794e6c4241a75774bbb8324102
/lib/systemd/journald.conf.d/10-pertant-journal.conf에 다음과 같은 로그 구성 파일 조각이 있습니다.
# By default the maximum use limit (SystemMaxUse) is 10% of the filesystem, and the minimum
# free space (SystemKeepFree) value is 15% - though they are both capped at 4G.
# The journals should be rotated automatically when they reach the SystemMaxFileSize value,
# and the number of journals is controlled by SystemMaxFiles. If you prefer time based
# rotation you can set a MaxFileSec to set the maximum time entries are stored in a single journal.
[Journal]
Storage=persistent
SystemMaxFileSize=128M
SystemMaxFiles=10
SystemMaxUse=256M
SystemKeepFree=256M
SyncIntervalSec=30
문제는 몇 번 재부팅해도 저널드가 성공적으로 로그를 찾아 /var/log/journal에 기록하지만 이전 로그는 찾지 못하고 이전 시작 로그에 대해서는 전혀 모른다는 것입니다. 이는 로그가 파티션의 50%를 여유 공간으로 유지해야 함에도 불구하고 이전 로그를 정리할 수 없으며 파티션에 공간이 부족하다는 것을 의미합니다.
root@me:/# journalctl --list-boots
0 82fef865e29e481aae27bd247c10e591 Tue 2020-06-09 18:00:12 UTC—Tue 2020-06-09
18:15:23 UTC
하지만:
root@me:/# ls -lrt /var/log/journal/
total 3
drwxr-sr-x 2 root systemd-journal 1024 Jun 9 17:56 5f6085cd81114e8688cf23b3bb91933e
drwxr-sr-x 2 root systemd-journal 1024 Jun 9 17:57 de59603d1ea24e7582ed7d7ed3ac8fb0
drwxr-sr-x 2 root systemd-journal 1024 Jun 9 18:00 0c34cc794e6c4241a75774bbb8324102
또한 다음 명령도 유효합니다.
root@me:/# journalctl -b 0
<information>
root@me:/# journalctl -b 1
<information>
root@me:/# journalctl -b 2
Data from the specified boot (+2) is not available: No such boot ID in journal
나는 이 기사를 읽었습니다:/가 아닌 파일 시스템의 로그 경로가 될 수 있나요?. 다음 마운트 파일을 시도했지만 정확히 동일한 동작이 나타납니다.
[Unit]
Description=Persistent Journal Storage Bind
[Mount]
What=/anotherfs/journal
Where=/var/log/journal
Type=none
Options=bind
[Install]
WantedBy=local-fs.target
내가 무엇을 잘못하고 있으며 바인드 마운트 시스템에서 영구 로그를 사용하도록 로그를 얻으려면 어떻게 해야 합니까?
답변1
나는 한동안 같은 문제로 어려움을 겪고 있습니다. 읽기 전용 rootfs와 휘발성 바인딩을 사용하여 다른 파티션에 마운트된 /var/log 폴더가 있는 Yocto 기반 배포판이 있습니다. 로깅을 새 파티션으로 이동시키면 동일한 것을 발견했습니다. journalctl --list-boots
이전 부팅이 아닌 현재 부팅만 표시됩니다. 뒤쪽에많은몇 번의 시행착오 끝에 마침내 그 이유를 알아냈습니다.
지적한 대로 /var/log/journal
3개의 폴더가 표시됩니다.
root@mir-edb-intel-gen1:~# ls -lrt /var/log/journal/
total 24
drwxr-sr-x+ 2 root systemd-journal 4096 Mar 5 09:24 7f7f3d516b554d718d688a0b0fa9648e
drwxr-sr-x+ 2 root systemd-journal 4096 Mar 5 09:25 93eb74229e9244a4b7f60c90acacc12f
drwxr-sr-x+ 2 root systemd-journal 4096 Mar 5 10:57 4a9652b4b33a4a099bdc6be8c6fb2b1a
항목 journalctl --list-boots
이 1개만 표시됩니다.
0 6cb4f9f236954f69937be217f36c1ce2 Fri 2021-03-05 10:57:48 UTC—Fri 2021-03-05 11:01:22 UTC
그러나 3개의 실행을 모두 실행하면 journalctl -D /var/log/journal --list-boots
예상대로 표시됩니다.
root@mir-edb-intel-gen1:~# journalctl -D /var/log/journal --list-boots
-2 9ab6d00dea9d41da9c76bf2a3f64895c Fri 2021-03-05 09:24:20 UTC—Fri 2021-03-05 09:25:03 UTC
-1 00509584245d44d599d88db8dccd4177 Fri 2021-03-05 09:25:37 UTC—Fri 2021-03-05 10:14:42 UTC
0 6cb4f9f236954f69937be217f36c1ce2 Fri 2021-03-05 10:57:48 UTC—Fri 2021-03-05 11:01:22 UTC
systemd에 대해 잘 모르지만 로그를 플러시하고 있기 때문에 문제가 발생한다고 생각합니다./실행/로그/로그도착하다/var/로그/로그시작할 때마다 기존 로그인에 더 많은 내용을 쓰는 대신/var/로그/로그. 그런 다음 호출하면 journalctl
최신 폴더만 보므로 전체 폴더를 보라고 구체적으로 지시하지 않는 한 이전 실행을 찾을 수 없습니다./var/로그/로그.
편집하다: @JapJoris빈스행동에 대한 좋은 설명이 있는 것 같습니다.이 답변
편집 2:
우리의 경우 /etc/machine-id
파일은 아래 설명과 같이 빈 파일입니다 poky/meta/classes/rootfs-postcommands.bbclass
.
#
# A hook function to support read-only-rootfs IMAGE_FEATURES
#
read_only_rootfs_hook () {
[...]
if ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "true", "false", d)}; then
# Create machine-id
# 20:12 < mezcalero> koen: you have three options: a) run systemd-machine-id-setup at install time, b) have / read-only and an empty file there (for stateless) and c) boot with / writable
touch ${IMAGE_ROOTFS}${sysconfdir}/machine-id
fi
}
답변2
시스템 저널mount
시스템 시작 초기 단계에서 ( ) 을 시작하는 것은 /var/log
서비스가 시작된 후에 발생할 수 있습니다 /var/log
. RW 파티션을 마운트하는 방법에 대한 자세한 내용이 필요합니다.
jounrald
시스템이 시작된 후 서비스를 다시 시작해 볼 수 있습니다 .
Storage=
로그 데이터가 저장되는 위치를 제어합니다. "휘발성", "지속적", "자동" 및 "없음" 중 하나입니다. "휘발성"인 경우 저널 로그 데이터는 메모리, 즉 /run/log/journal 계층 구조(필요한 경우 생성됨)에만 저장됩니다. "지속적"인 경우 데이터는 먼저 디스크에 저장됩니다. 즉, /var/log/journal 계층 구조(필요한 경우 생성됨) 아래에 저장되고 /run/log/journal(필요한 경우 생성됨)로 대체되며 조기 시작 디스크는 쓸 수 없습니다. "자동"은 "영구"와 비슷하지만 필요한 경우 /var/log/journal 디렉터리가 생성되지 않으므로 이 디렉터리의 존재 여부가 로그 데이터가 이동하는 위치를 제어합니다. "none"은 모든 저장소를 끄고 수신된 모든 로그 데이터가 삭제됩니다. 그러나 다른 대상(예: 콘솔, 커널 로그 버퍼 또는 syslog 소켓)으로의 전달은 계속 작동합니다. 기본 로그 네임스페이스에서는 기본값이 "auto"이고 다른 모든 네임스페이스에서는 "percious"입니다.
답변3
가능한 해결책은 /var/log/journal에서 다른 파티션으로의 심볼릭 링크입니다.
내 읽기 전용 rootfs Yocto 시스템에서는 애플리케이션을 시작하는 시스템 서비스 중 하나에 이 심볼릭 링크가 설정되어 있습니다. 모든 로그는 심볼릭 링크가 제자리에 있을 때까지 RAM에 저장되었다가 심볼릭 링크 파티션으로 플러시됩니다.
mkdir -p /data/log/journal
systemd-tmpfiles --create --prefix /data/log/journal
ln -s /data/log/journal /var/log/journal
journalctl --flush
답변4
로그가 /run/log/journal/
생성된 후에도 계속 기록됩니까? /var/log/journal/
그렇다면 휘발성 디렉토리에서 계속 읽을 수 있습니다 /run/
.
# journalctl --list-boots
running 과 사이에 다른 매개변수를 변경했습니까 # journalctl -b 1
? 출력 결과가 존재하지 않는 파일에서 읽는 것처럼 보이기 때문입니다. 어떤 구성으로 실행하더라도 # journalctl -b 1
지속성은 유지되는 것 같습니다 .
죄송합니다. 답변보다 댓글로 더 적합하다고 생각하지만 아직 댓글을 달 수 있는 평판이 충분하지 않습니다.