2008-11-13 6 views
9

임베디드 리눅스 기반 장치는 종종 응용 프로그램 및 시스템 파일을 업데이트하는 메커니즘이 필요합니다. 예를 들어 USB 포트가있는 (네트워크에 연결되지 않은) 실험 장비는 USB 스틱에서 소프트웨어 업데이트를받을 수 있습니다.임베디드 리눅스를 안전하게 업데이트하기위한 권장 기술

스크립트를 실행하여 파일을 장치의 내부 플래시 메모리의 특정 위치에 복사하는 것은 간단합니다. 그러나 장치가 업데이트 도중 전력을 잃어 버리고 벽돌로 끝날 위험이 있습니다.

응용 프로그램 디렉토리를 복제하고 복사본을 한 개 업데이트하고 이전 및 새 디렉토리를 신속하게 교체하여 장애 창을 최소화 할 수있는 공간이 있기 때문에 응용 프로그램 파일의 상황이 조금 쉽습니다.

커널과 시스템 파일이 파일 시스템 전체에 퍼져 있기 때문에 상황이 더 복잡합니다.

중요한 파일을 식별하기 위해 파일 시스템에서 하드 링크와 소프트 링크를 사용했습니다. 우리는 파일 및 아카이브에 대한 해시를 사용하여 파일 무결성을 확인합니다. 업데이트 된 파일 시스템에서 시작하는 것이 실패하면 커널에서 긴급 ramfs를 사용하여 폴백을 고려했습니다.

이 요구 사항에 대한 접근 방식은 무엇입니까?

+0

이 질문에 대한 내 대답을 참조하십시오 : http://stackoverflow.com/questions/5167226/linux-based-firmware-how-to-implement-a-good-way- 업데이트를 하시겠습니까? lq = 1 – Patrick

답변

1

응용 프로그램 파일과 동일한 접근 방식을 사용합니다. 중요한 파일을 만들고 자신의 파티션을 완성하고, 링크를 만들고, 파티션을 복제합니다. 모든 init에서 링크가 모두 동일한 파티션에 표시되는지 확인하고 그렇지 않은 경우 링크를 특정 파일의 최신 날짜가있는 파티션으로 재설정해야합니다. 새로운 파티션으로 모든 것을 복사하고, 모든 것이 잘되면 (crcs ok) 파일을 반복하고 각 파일 시스템마다 다른 링크를 설정합니다.

이렇게하면 중요한 파일은 항상 정상 상태 여야합니다.

시나리오 : 링크 이전 작업들에 여전히 보여 있기 때문에 새 파티션

에 아무 문제 파일을 복사하지 않습니다 동안

  1. 업데이트가 실패합니다.

    모든 새로운 파일이 (다른 다시 연결 단계가 시작이 wouldnt가) 유효하고 이미 복사하기 때문에 문제 없음이

2

안정성을 보장해야하는 경우 두 개의 플래시 파티션 (또는 칩)을 사용할 수 있습니다. 하나는 현재 작동하는 구성이고 다른 하나는 새로운 구성입니다. 그런 다음 장치를 재설정하고 활성 부팅 플래시 파티션을 "마지막으로 성공한"구성으로 전환하는 하드웨어 워치 독을 사용하십시오.

+0

그건 좋은 제안이지만, 하드웨어가 하나의 플래시 장치와 워치 독없이 동결된다는 토론을 위해 ;-) 가정합시다. –

2

적어도 두 개의 파티션이 올바른 설치 확인을 연결하는 동안

  • 업데이트 실패 .나는 대체 부팅 4

    • 부팅

    • 대체 부트

    • 프로그램 데이터 백업

    • 프로그램 휘발성 데이터

    사용 애벌레 대체 부팅을 건의 할 것 부팅이 실패하면.

    따라서 업데이트가 실패하면 대체 작품이 작동합니다.

    부트 로더를 절대로 업데이트하지 마십시오.

    데이터 파티션을 토스트 한 경우 백업 데이터 파티션을 다시 포맷하고 복사하십시오.

    이제 플래시 디스크가 죽지 않으면 실패 할 수 없습니다. COTS 하드웨어를 사용하고 있고 주 디스크가 Compact Flash라고 말한 경우 작은 USB 키와 같이 물리적으로 고립 된 백업을 가질 수 있습니다.

  • 0

    IMHO 원자가 아닌 모든 업데이트는 시스템을 손상 시키거나 일관성 검사가 매우 어려울 수 있습니다. 부트 로더 업데이트는 전원을 끄지 않아도되므로 반드시 피해야한다는 것에 동의합니다. 일반적으로 제조업체는 커널 및/또는 하나의 파일이 업데이트되었을 때 펌웨어 x.x.x에서 버전 y.y.y로 업데이트하려고합니다. 고객의 하드웨어에서 무엇이 실행되고 있는지 이해하기가 어렵 기 때문에 단일 파일을 업데이트하면 서비스에 악몽이 될 수 있습니다. 어쩌면 당신은 이중 복사 접근법 (응용이 중복 됨)을 단일 사본 접근법과 혼합하는 것일 수 있습니다. 시스템의 무결성이 체인의 약한 구성 요소에 의해 수행되기 때문에 이것이 많은 도움이되지 않는다고 생각합니다. 루트 파일 시스템의 갱신이 실패하면, 어플리케이션이 복제되는 것이 중요하지 않습니다.

    이중 복사 방식은 필요한 경우 서비스를 중단하지 않고도 업데이트를 보장 할 수 있습니다. 그러나 모든 구성 요소가 복제되어야하기 때문에 많은 리소스가 필요합니다. 개인적으로, 나는 주 응용 프로그램이 실패하거나 마지막 업데이트가 성공적이지 않은 경우 RAM의 작은 rootfs가 시작되는 대체 접근법을 사용합니다. 이 폴백 시스템은 부트 로더에 의해 자동으로 시작되어 문제가 발생하면 USB 펜 (로컬 업데이트가 필요한 경우)에서 시스템을 업데이트합니다.

    나는이 문제에 대한 OSS 프로젝트를 발견 한 적이 없으며 이전 경험을 토대로 최근에 새 프로젝트를 시작했습니다. 여러 제품을 실행하고 고객이 만족합니다.

    어쩌면 당신은 그것을 볼 수 있습니다. "swupdate"(프로젝트 이름) 소스는 github.com/sbabic/swupdate에 있습니다.

    스테파노는

    0

    은 당신이 업데이트 프로세스의 자성 여기에 달성하는 것입니다 시도하고있는 무슨 생각합니다. 원자력은 임베디드 장치에있어서 중요합니다. 강조 표시된 이유 중 하나는 전력 손실입니다. 그러나 하드웨어/네트워크 문제와 같은 다른 것들이있을 수 있습니다.내가 업데이트의 맥락에서 자성을 위해 사용하십시오 정의는 다음 업데이트는 항상 하나 완전히 완료, 또는 전혀

  • 업데이터 외에 어떤 소프트웨어 구성 요소 이제까지 반 업데이 트를
  • 을 설치 볼 수 없습니다