임베디드에서 /var/log를 tmpfs로 — 언제 쓰나?

읽기전용 루트·플래시 수명을 위해 /var/log를 tmpfs(RAM)에 올리는 선택이 있습니다. 로그는 런타임에만 쌓이고 재부팅하면 비워집니다. 이 글은 fstab 예시 · 재부팅 후 로그 · journald와 같이 쓸 때만 다룹니다. 보드별 벤치·제휴·C++ 예제는 없습니다.

근거는 fstab(5)의 파일시스템 테이블 문법, tmpfs의 인메모리 마운트 특성, journald.conf(5)의 Storage=(volatile / persistent / auto / none)입니다.

fstab 예시는?

한 줄 답: /etc/fstab에 tmpfs /var/log tmpfs … size=…,mode=0755 한 줄을 넣고, 부팅 직후 필요한 하위 디렉터리는 tmpfiles.d로 다시 만듭니다.

전형적인 골격(크기·옵션은 배포·관측 사용량에 맞게 조정):

# /etc/fstab — /var/log 를 RAM(tmpfs)에
# size= 는 상한(lazy 할당). 관측한 사용량에 여유를 두고 정합니다.
tmpfs  /var/log  tmpfs  defaults,nosuid,nodev,noexec,mode=0755,size=50M  0  0

포인트:

  1. 파일시스템 타입과 소스 모두 tmpfs 입니다. 장치 UUID가 아닙니다.
  2. size= 는 상한입니다. tmpfs는 쓴 만큼만 RAM을 쓰지만, 상한에 닿으면 쓰기가 실패할 수 있습니다. 임의 보드 숫자가 아니라 현장 사용량으로 잡습니다.
  3. mode=0755 가 흔합니다. /tmp용 1777을 /var/log에 그대로 쓰지 않는 편이 안전합니다.
  4. nosuid,nodev,noexec 는 로그 트리에 실행·장치 노드를 두지 않으려는 관례적 harden입니다(필요에 따라 조정).
  5. 마운트 직후 /var/log는 거의 빈 디렉터리입니다. nginx·httpd처럼 자기 로그 디렉터리가 있어야만 기동하는 데몬은 실패할 수 있습니다.

하위 경로 복구는 tmpfiles.d(5)가 맞습니다. rc.local에서 mkdir 하는 것보다 early boot에 가깝습니다.

# /etc/tmpfiles.d/var-log-dirs.conf 예시 골격
d /var/log/nginx   0750 root adm -
d /var/log/journal 2755 root systemd-journal -
# 배포에 실제로 필요한 경로만 추가

적용 확인:

findmnt /var/log
# TARGET   SOURCE  FSTYPE  OPTIONS
# /var/log tmpfs   tmpfs   …
df -h /var/log

재부팅 후 로그는?

한 줄 답: tmpfs 위의 파일·하위 디렉터리는 전원 사이클·재부팅과 함께 사라집니다. “플래시에 안 쓴다”는 이득과 사후 분석용 이력이 없다는 비용이 한 세트입니다.

실무에서 꼭 짚을 점:

항목의미
재부팅 전/var/log 아래 텍스트·저널(그 경로에 둔 경우)은 RAM에만 있음
재부팅 후마운트가 새로 만들어지며 이전 내용 없음
크래시/정전디스크에 sync 되지 않은 구간은 복구 불가가 기본
디버그 전환현장 장애 시 fstab 줄을 주석 처리하거나 크기·경로를 바꿔 영속 로그로 되돌리는 절차를 미리 적어 둡니다

텍스트 로그(*.log)뿐 아니라, /var/log 아래에 만든 모든 것이 대상입니다. logrotate 상태 파일·앱이 기대하는 빈 디렉터리도 같이 날아가므로, 위 tmpfiles 목록을 패키지·서비스 목록과 함께 관리합니다.

원격으로 남기고 싶다면 tmpfs와는 별도로 syslog/journal remote·시리얼 콘솔·외부 수집을 설계합니다. 이 글은 그 파이프라인 전체가 아니라 로컬 /var/log를 RAM에 둘 때의 기본 동작만 다룹니다.

팁: “플래시 수명”만 보고 /var/log를 통째로 tmpfs에 올린 뒤, 부팅마다 데몬이 로그 경로 없다고 실패하는 경우가 많습니다. 마운트 → tmpfiles → 서비스 순서를 한 세트로 검증합니다.

journald와 같이 쓸 때는?

한 줄 답: journald의 Storage= 로 어디에 쓸지를 고릅니다. volatile은 /run/log/journal(이미 휘발), persistent는 /var/log/journal 입니다. /var/log 자체가 tmpfs면 persistent라고 써도 재부팅 후 로컬 저널은 남지 않습니다.

journald.conf(5) Storage= 요약:

값저장 위치(문서)
volatile메모리만 — /run/log/journal (필요 시 생성)
persistent가능하면 /var/log/journal (필요 시 생성), 초기·비기록 시 /run/log/journal 폴백
auto/var/log/journal 디렉터리가 있으면 persistent처럼, 없으면 volatile처럼
none저장 안 함(포워딩 등은 별도)

임베디드에서 흔한 조합:

  1. /var/log tmpfs + Storage=volatile
    저널은 /run 쪽, 전통 로그는 /var/log tmpfs. 둘 다 재부팅 시 소실. 의도가 “로컬에 남기지 않음”이면 명확합니다. 런타임 상한은 RuntimeMaxUse= 등(같은 man)으로 조입니다.

  2. /var/log tmpfs + Storage=persistent / auto(디렉터리 존재)
    저널 파일이 /var/log/journal에 생겨도 부모 마운트가 tmpfs이면 재부팅 후 사라집니다. “persistent” 이름만 보고 플래시 영속을 기대하면 안 됩니다.

  3. 플래시에 저널만 남기고 텍스트 로그는 RAM
    /var/log 전체를 tmpfs로 덮지 않고, 필요한 하위만 나누거나, 저널은 영속 파티션·Storage=persistent, 앱 텍스트 로그만 tmpfs/별도 정책으로 가는 식이 더 맞을 수 있습니다. 이 글의 “통째 tmpfs” 전제와는 다른 설계입니다.

# /etc/systemd/journald.conf.d/volatile.conf 예시
[Journal]
Storage=volatile
# RuntimeMaxUse= 등은 관측 후 조정 (보드 벤치 숫자 아님)
# 확인
systemd-analyze cat-config systemd/journald.conf
journalctl --header   # 파일 경로가 /run 인지 /var 인지
findmnt /run /var/log

문서 메모: Storage=를 volatile로 바꿔도 이미 있던 persistent 파일을 자동 삭제하지는 않습니다. 반대 방향(volatile→persistent)은 journalctl --flush 등이 관여합니다. 부팅 초에는 volatile로 시작했다가 flush로 persistent로 넘어가는 흐름도 man에 설명되어 있습니다.

주의: Storage=auto는 /var/log/journal 디렉터리 존재 여부로 모드가 갈립니다. tmpfs /var/log + tmpfiles로 그 디렉터리를 매 부팅 만들면, auto가 persistent 쪽 동작을 선택할 수 있습니다. 그래도 부모는 RAM이라 재부팅 영속은 아닙니다.

자주 묻는 질문

size=를 크게 잡으면 RAM을 그만큼 빼 가나?
상한만 큽니다. 실제 사용량만큼 소비하는 것이 보통이지만, 상한에 닿기 전에 다른 워크로드와 경합합니다. 관측 후 정합니다.

mode=1777로 하면 데몬이 편하지 않나?
디렉터리 생성 실패를 숨길 수는 있어도, 로그 트리 world-writable은 부담이 큽니다. tmpfiles로 필요한 경로만 만드는 쪽이 일반적입니다.

journal만 volatile이면 /var/log tmpfs는 필요 없나?
저널과 전통 텍스트 로그·앱 자체 파일은 별개입니다. rsyslog/nginx 등이 /var/log/...에 쓰면 journald 설정만으로는 플래시 쓰기가 남습니다.

읽기전용 루트와 같이 쓰나?
자주 같이 씁니다. 루트가 RO여도 로그·런타임 쓰기는 tmpfs·별도 rw 파티션으로 빠집니다. 이 글은 /var/log tmpfs 한 조각만 다룹니다.

정리

임베디드에서 /var/log tmpfs는 플래시·RO 루트를 위한 로컬 로그 휘발화입니다. fstab에 tmpfs 줄, 재부팅 후 내용 없음, 하위 경로는 tmpfiles.d, journald는 Storage=volatile(/run) vs persistent(/var/log/journal) — 그리고 /var/log가 tmpfs면 persistent도 재부팅 영속이 아님을 같이 봅니다. 근거: fstab(5), tmpfs, journald.conf(5), tmpfiles.d(5). 제휴 없음.

공식 문서는 어디인가?