오버레이 파일 시스템을 설치하고 rsync를 사용하여 변경 사항을 동기화하는 것이 작동하지 않습니다

오버레이 파일 시스템을 설치하고 rsync를 사용하여 변경 사항을 동기화하는 것이 작동하지 않습니다

저는 DietPi OS를 실행하는 Raspberry Pi CM4를 사용하여 임베디드 애플리케이션을 개발 중입니다. 가능한 한 가장 긴 수명을 달성하기 위해 MMC 플래시에 대한 쓰기 횟수를 최대한 줄이고 싶습니다. 내 설치에는 전체 /var 디렉토리(/var/log 및 /var/tmp의 일반적인 위반자뿐만 아니라)에 데이터를 자주 쓰는 몇 가지 응용 프로그램이 있습니다. /var에 있는 이 새 데이터는 업무상 중요하지 않으므로 모든 /var을 overlayfs로 마운트한 다음 종료 스크립트를 사용하여 변경 사항을 디스크에 한 번 동기화하려고 합니다. 내 오버레이 부분이 잘 작동합니다. 이것은 내 시작 스크립트입니다.

#!/bin/bash
#Startup script to mount /var as an overlay to minimize eMMC writes

if mount | grep "overlay on /var type overlay"; then
  echo Mount Point at /var already exists, exiting.
  exit 1
else
  if [ ! -d "/var.tmpfs" ]
  then
     mkdir -p /var.tmpfs
  fi
  mount -t tmpfs -o rw,nosuid,nodev,noexec,relatime,size=256m,mode=0775 tmpfs /var.tmpfs
  mkdir -p /var.tmpfs/upper
  mkdir -p /var.tmpfs/work
  chown -R root:root /var.tmpfs
  chmod -R u=rwX,g=rwX,o=rX /var.tmpfs
  if [ ! -d "/tmp/realvar" ]
  then
   mkdir -p /tmp/realvar
  fi
  mount --bind /var /tmp/realvar
  sudo mount -t overlay -o rw,lowerdir=/tmp/realvar,upperdir=/var.tmpfs/upper,workdir=/var.tmpfs/work overlay /var
fi
exit 0

이로 인해 /var에 기록된 모든 항목에 대해 MMC 쓰기가 발생하지 않지만 overlayfs를 통해 기록된 데이터는 계속 사용할 수 있습니다. 가장 어려운 부분은 잘 작동하는 것입니다. 이제 계획된 다시 시작/종료 이벤트가 지속되도록 상위 디렉터리의 업데이트를 디스크에 동기화하고 싶습니다. 정전이 발생하면 upperdir에 있는 모든 데이터가 손실된다는 것을 알고 있지만 괜찮습니다.

동기화 스크립트:

#!/bin/bash
#Shutdown script to sync the contents of the temporary overlay to actual /var on disk

if [ -d "/tmp/realvar" ]
  then
    rsync -vaz --delete /var/ /tmp/realvar
fi
exit 0

위의 내용 중 대부분은 매우 관련성이 높지만 오래된 스레드에서 LeonidMew와 Tobby Fox가 작성한 것입니다./var/logs를 tmpfs로 마운트하고 때로는 overlayfs를 사용하여 변경 사항을 저장합니다.

문제는 rsync가 작동하지 않고 그 이유를 이해할 수 없다는 것입니다. 테스트를 위해 오버레이를 설정한 후 /var/lib에 파일을 생성했습니다. 그런 다음 예상대로 실행되는 것으로 보이는 rsync 명령 문자열을 실행합니다. 재부팅했는데 테스트 파일이 사라졌습니다. 즉, upperdir의 내용이 내가 원하는 방식으로 디스크에 기록되지 않습니다.

흥미로운 관찰: /var/lib에 테스트 파일을 생성한 후 /var.tmpfs/upper/lib 및 /tmp/realvar/lib에 즉시 존재합니다. 나는 그것이 오버레이의 "하위" 디렉토리인 /tmp/realvar/lib에 있는 것을 원하지 않습니다. 이것이 관련이 있는지는 확실하지 않지만 이상한 일이라는 것을 알았습니다.

다음 명령을 사용하여 내 모든 응용 프로그램이 /var 오버레이를 읽고 쓰는 것을 관찰하여 내 오버레이가 실제로 작동하는지 확인하고 이 명령의 결과가 변경되지 않는지 확인했습니다.

cat /sys/fs/ext4/mmcblk0p2/lifetime_write_kbytes

내 rsync 기능이 작동하지 않기 때문에 재부팅 후 /var의 모든 변경 사항이 손실됩니다. /var에 오버레이를 적용하고 DietPi를 사용하여 최소 설치를 수행한 경우 MMC는 부팅 후 0을 기록하지만 /etc에서 설정을 변경하거나 /usr에 포함된 응용 프로그램을 변경하면 즉시 기록되고 재부팅 후에도 유지됩니다. /var 오버레이와 함께 작동하도록 rsync를 얻을 수 있다면 완벽한 내장 파일 시스템 구성을 갖게 될 것입니다.

어떤 아이디어라도 대단히 감사하겠습니다!

관련 정보