백업 매개변수를 사용하여 복사된 파일로 자동 롤백

백업 매개변수를 사용하여 복사된 파일로 자동 롤백

저는 임베디드 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

잘못된 셸로 인해 롤백이 소실되지 않도록 업데이트할 수 없는 위치에 중요한 시스템 바이너리를 배치할 수 있습니다. 그러나 이는 닭고기와 달걀이 필요한 상황이므로 정의에 따라 이 코드를 업데이트할 수 없습니다. 교활한.

관련 정보