저는 임베디드 Linux 시스템용 업데이트 프로토콜을 연구하고 있지만 특히 알파/베타 릴리스의 경우 업데이트로 인해 시스템이 중단될 경우 업데이트를 롤백할 수 있는 옵션을 사용자에게 제공하고 싶습니다. 그래서 덮어쓴 파일을 자동으로 백업하는 cp 명령 옵션을 발견했습니다.
정말 좋아요! 하지만 자동 백업 파일을 사용하여 이러한 변경 사항을 쉽게 롤백할 수 있는 방법이 있어야 합니다. 그렇죠? 나는 사용자가 변경된 모든 파일의 백업을 스스로 찾도록 강요하고 싶지 않습니다.
당신의 도움에 미리 감사드립니다!
답변1
두 개의 병렬 파일 시스템 트리를 가질 공간이 있다면 /bin
및 와 같은 것이 있을 수 있습니다 /bin.old
. 모든 최상위 디렉터리에 대해 이 작업을 반복합니다.
/bin.new
설치는 라이브 시스템에서 생성, 복사, 새 파일 덮어쓰기, / bin` 등 /bin
으로 전환하는 경우가 됩니다 . 롤백은 다시 전환됩니다./bin.old
/bin.new to
# Prepare a new filesystem tree
#
rm -rf /*.new /*.old
for item in /*
do
cp -al "$item" "$item.new" # Links avoid using too much disk space
done
# Overlay. Because we linked in the previous step, we must remove
# (or rename) each file that we're going to change. Do not change
# or replace any file in situ
#
# If you have space for two full filesystem trees you could just copy
# instead of linking, which could simplify this update code section.
#
echo installation code goes here
# Switch over
#
OPATH="$PATH" PATH="/bin.old:/bin:/bin.new:$PATH"
for item in /*.new
do
live="${item%.new}"
mv -f "$live" "$live.old"
mv -f "$item" "$live"
done
# Post-installation steps (rebuild kernel links, etc.)
#
echo post-installation code goes here
잘못된 셸로 인해 롤백이 소실되지 않도록 업데이트할 수 없는 위치에 중요한 시스템 바이너리를 배치할 수 있습니다. 그러나 이는 닭고기와 달걀이 필요한 상황이므로 정의에 따라 이 코드를 업데이트할 수 없습니다. 교활한.