rsync를 사용하여 tar에서 파일 복구

rsync를 사용하여 tar에서 파일 복구

임베디드 장치에 대한 소프트웨어 업그레이드 기능을 작성 중입니다. 현재 루트 파일 시스템을 업그레이드하는 방법은 새 rootfs.tar.gz 파일을 구해 루트 파일 시스템에 추출하는 것입니다(기존 파일을 덮어쓰고 새 파일을 추가). 그러나 새 패키지에 존재하지 않는 파일은 삭제되지 않습니다.

이제 모든 기존 파일을 rm -rf로 실행한 다음 새 rootfs tar 파일을 추출해야 합니다. 이것은 큰 작업처럼 보이고 시간도 많이 걸립니다. 아마도 변경된 유일한 것은 구성 파일일 것입니다.

대신 .tar.gz 파일의 내용을 디렉터리에 동기화할 수 있기를 원합니다. 일종의 중개자를 통하지 않고 이것이 가능합니까(즉, 임시 디렉토리에 tar를 추출한 다음 rsync를 수행하지 않고)?

답변1

직접적으로 원하는 것을 할 수있는 방법이 없습니다. 댓글에서 언급했듯이,아카이브 마운트옵션일 수도 있지만 고유한 제한 사항이 있습니다(그 중 하나는 커널을 빌드할 때 활성화된 특정 구성 옵션에 의존하는 것입니다).

그러나 두 가지 대안이 떠오릅니다.

  1. 사용스쿼시 FSgzip으로 압축된 tar 파일 대신 이미지. 이는 커널에 의해 직접 설치될 수 있으며 많은 경우 실제로 동등한 압축 tar 파일보다 작습니다. 그런 다음 설치된 SquashFS 이미지에서 rsync를 사용할 수 있습니다. Buildroot를 사용하여 실제로 루트 파일 시스템을 빌드하는 경우 해당 이미지를 직접 빌드하도록 선택할 수 있습니다.

  2. 루트 파티션을 하나만 사용하지 말고 두 개를 사용하십시오. 초기 설치를 수행할 때 두 파티션 모두에 모든 데이터를 쓰고 파티션 중 하나에서만 부팅하도록 부트로더를 설정하십시오. 시스템을 업그레이드할 때 다른 파티션을 확인하고 거기에서 루트 아카이브를 추출한 다음 해당 파티션에서 부팅하도록 부트로더를 업데이트하고 재부팅하십시오. 제안한 대로 업데이트를 실행하는 것보다 시간이 오래 걸리지만 다음과 같은 몇 가지 상당한 이점이 있습니다.

    • 특정 기능을 중단시키는 업그레이드를 거의 즉시 롤백할 수 있습니다. 이전 펌웨어를 다시 설치할 필요가 없으며 다른 루트 파티션에서 부팅하도록 부트로더를 업데이트하고 재부팅하기만 하면 됩니다.
    • 이는 시스템을 매우 어렵게 만듭니다. 업데이트가 완료된 후에만 부트로더를 업데이트하므로 업데이트 프로세스 중 전원 손실로 인해 부분 루트 파일 시스템으로 부팅하지 않는 것이 보장됩니다.
    • RAID 없이 스토리지 하드웨어의 정적 데이터 손상을 복구할 수 있습니다(그러나 안정적인 장치가 필요한 경우 RAID를 심각하게 고려해야 합니다). 현재 버전이 "불량"하다는 것을 알고 있다면 임시로 이전 버전으로 롤백하고 새 버전을 다시 설치하세요.
    • 가동 중지 시간이 줄어듭니다. 전략을 세우려면 장치가 기능적으로 오프라인인 동안 거의 모든 작업을 완료해야 합니다. 그렇지 않으면 업데이트 프로세스 중에 알 수 없는 결함이 발생할 위험이 있습니다. 이 방법을 사용하면 업데이트에 필요한 가동 중지 시간을 장치 재부팅에 필요한 시간으로 줄일 수 있습니다.

관련 정보