저는 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를 얻을 수 있다면 완벽한 내장 파일 시스템 구성을 갖게 될 것입니다.
어떤 아이디어라도 대단히 감사하겠습니다!