2011-03-02 3 views
14

나는 alix 2d13을 사용하여 리눅스 기반 어플라이언스를 개발 중이다.Linux 기반 펌웨어, 업데이트하는 좋은 방법을 구현하는 방법?

이미지 파일 만들기, 파티션 만들기, 부트 로더 (syslinux), 커널 및 initrd 설치 및 루트 파일 시스템 파일을 올바른 파티션에 저장하는 스크립트를 개발했습니다. .

구성 파일은 tmpfs 파일 시스템에 있으며 시스템 시작시 자체 파티션에있는 XML 파일을 읽는 소프트웨어로 만들어집니다.

나는 파일 시스템을 업데이트 할 수있는 방법을 찾고 있어요 그리고 난이 개 솔루션을 고려했습니다

  • 펌웨어 업데이트이에, 커널, initrd를 및/또는 rootfs 파티션을 포함 할 수있는 압축 파일입니다 initrd는 rootfs 이미지를 올바른 파티션에 dd 처리합니다.
  • 펌웨어 업데이트는 두 개의 tar 아카이브 (부팅 용과 루트 파일 시스템 용)를 포함 할 수있는 압축 파일입니다. ; 파일 시스템 이미지 나 사용하지 않는 파일을 삭제하게됩니다하지만 많은 시간을 필요로하며 컴팩트 플래시 메모리를 fastly 죽일 것이다 - :

모든 솔루션은 자신의 장점을 가지고 - 아카이브가 작아서 업데이트하는 데 시간이 덜 필요하지만 짧은 시간에 루트 파일 시스템에 caos가 표시됩니다.

다른 해결책은 파일 목록을 넣고 사전/사후 업데이트 스크립트를 tar 아카이브에 넣는 것입니다. 따라서 파일 목록에 상주하지 않는 파일은 모두 삭제됩니다.

당신은 어떻게 생각하십니까?

답변

16

다음 접근 방식을 사용했습니다. 이는 다소 "Murphy와 호환되는 임베디드 리눅스 시스템 구축"문서 인 here을 기반으로 한 것입니다. cfgsh가 아닌 versions.conf에있는 내용을 사용했습니다.

  • "기본"루트 파일 시스템을 루프 백 마운트하는 작업을 수행하는 부트 커널을 사용하십시오. 최신 커널이 필요하다면 kexec을 루프 백 마운트 한 후에 바로 최신 커널에 넣으십시오. 나는 부팅 커널의 완전한 init을 initramfs에두고 busybox와 kexec (둘 다 정적으로 링크 됨)을 넣기로하고, init은 내가 작성한 간단한 쉘 스크립트였다.
  • 하나 이상의 "주 OS"루트 파일 시스템이 디스크 이미지 파일로 "OS 이미지"파일 시스템에 존재합니다. 부트 커널은 versions.conf 파일을 기반으로 이들 중 하나를 선택합니다. 나는 단지 두 개의 메인 OS 이미지 파일, 현재 및 폴백 파일을 유지 관리합니다. 현재 커널에 장애가 발생하면 (나중에 장애 감지에서 더 많이) 부트 커널이 폴백을 부팅합니다. 둘 다 실패하거나 폴백이 없다면 부트 커널은 쉘을 제공합니다.
  • 시스템 구성은 별도의 파티션에 있습니다. 일반적으로 업그레이드되지는 않지만 업그레이드 할 수없는 이유는 없습니다.
  • 부팅, OS 이미지, 구성 및 데이터의 총 4 개의 파티션이 있습니다. 데이터 파티션은 자주 쓰는 사용자 응용 프로그램 용입니다. 부팅은 읽기/쓰기로 마운트되지 않습니다. OS 이미지는 업그레이드 중에 읽기 전용으로 만 마운트됩니다. config는 config stuff가 바뀔 필요가있을 때 읽기만 가능합니다. 데이터는 항상 읽기/쓰기로 마운트됩니다.
  • 디스크 이미지 파일에는 커널, init 스크립트, 사용자 프로그램 (예 : busybox, 제품 응용 프로그램) 및 첫 번째 부팅시 구성 파티션에 복사되는 기본 구성을 포함하여 전체 Linux 시스템이 포함되어 있습니다. 파일은 모든 것을 맞추기 위해 필요한 크기입니다. 오랫동안 OS 이미지 파티션이 항상 3 개의 주요 OS 이미지 파일 (업그레이드 중에 새로운 이미지가 추출 될 때까지 이전 폴백을 삭제하지 않음)을 수용 할만큼 충분히 커지도록 성장할 수있는 충분한 공간을 허용했습니다. 주 OS 이미지가 필요에 따라 커질 수있게하십시오. 이 이미지 파일은 항상 (루프백) 읽기 전용으로 마운트됩니다. 이 파일을 사용하면 rootfs 내에서 개별 파일을 업그레이드하지 못하는 문제도 해결됩니다.
  • 업그레이드는 자동 추출 tarball을 tmpfs로 전송하여 수행됩니다. 이 스크립트의 시작은 OS 이미지를 읽기/쓰기로 다시 마운트 한 다음 OS 이미지 파일 시스템으로 새 기본 OS 이미지를 추출한 다음 "murphy"문서에 설명 된 이름 바꾸기 방법을 사용하여 versions.conf 파일을 업데이트합니다. 이 작업이 끝나면 업그레이드가 완료되었음을 나타내는 스탬프 파일을 건 다음 재부팅합니다.
  • 부트 커널이이 스탬프 파일을 찾습니다. 찾으면 다른 스탬프 파일로 옮긴 다음 새 기본 OS 이미지 파일을 부팅합니다. 주 OS 이미지 파일은 성공적으로 시작될 때 스탬프 파일을 제거해야합니다. 그렇지 않으면 워치 독이 재부팅을 시작하고 부트 커널이이를보고 오류를 감지합니다.
  • 업그레이드하는 동안 version.conf를 동기화하고 스탬프 파일을 터치/제거하는 경우 (세 인스턴스) 업그레이드 중에 몇 가지 오류 지점이 있음을 알 수 있습니다. 나는 이것을 더 줄이고 내가 원하는 모든 것을 성취 할 길을 찾을 수 없었다. 누구든지 더 좋은 제안이 있으면 듣고 싶습니다. OS 이미지를 쓰는 동안 파일 시스템 오류나 정전이 발생할 수도 있지만, ext3 파일 시스템이이 경우 생존 할 수있는 기회를 제공하기를 바랍니다.
+1

에 대한 귀하의 솔루션을 많이, 결국 내가 아주 비슷한 일을했지만 부팅 실패 감지하지 않았지만 내가 비슷한 구현합니다 생각 : - 직접 io 및 동기화 작업을 사용하여 부트 실패 감지 기록을위한 섹터를 예약합니다. - 부트 커널은 타임 스탬프가있는 부트 시도를보고하고 os 이미지를 마운트하는 initrd를 시작합니다. - 부팅 프로세스, 새로운 initrd는 타임 스탬프와 함께 단계별로 단계별로보고 할 것이며 문제를 확인하기 위해 부트 단계는 - 결국 부팅 실패 감지 섹터에서 "모두 완료" –

+0

으로보고합니다. 업그레이드를 위해 tarball을 다운로드하는 것을 선호합니다. 데이터 파티션과 재부팅시 첫 번째 initrd가 업그레이드 tarball을 감지하면 tarball을 처리합니다 (u seful은 삭제할 파일을 식별하고 업그레이드 스크립트를 실행하기 위해 두 개의 특수 파일을 추가합니다. 업그레이드 후 첫 번째 initrd가 새 커널을 kexec하여 부팅을 업그레이드로보고합니다 (tarball을 삭제할 수 있도록). tarball은 보안상의 이유로 개인 키로 서명해야합니다. 이전 디스크 섹터 (부팅 실패 감지)를 사용할 수있는 오류를보고하려면 문제를 피하려면 동기화 쓰기 만 수행하면됩니다. –

+0

"상태 섹터"아이디어를 좋아합니다. 최소한 장애 지점 중 일부는 단일 디스크 위치로 옮기고 섹터에 장애가 발생하면 여유 섹터가 생겨 복구를 시도하거나 적어도 복구 모드를 제공 할 수 있습니다." – Patrick

0

tar 파일을 추출하기 전에 파티션을 빨리 포맷 할 수 있습니다. 또는 이미지 솔루션과 함께 가면서 가능한 가장 작은 이미지를 사용하고 dd 후에 파일 시스템 크기를 조정하십시오 (읽기 전용 저장소에는 필요하지 않지만).

+0

mmm 내가 dd 할 경우 파일 시스템이 크기를 알기 때문에 실제로 크기를 조정할 필요가 없습니다 ... 정말로 필요한 것은 mbr의 파티션 크기를 조정하는 것입니다. 어쨌든 나는 더 큰 파티션을 수행하는 것을 피할 수있다. (실제로는 30MB가 필요하므로 64MB 파티션이 좋을 것이다.) 나는 타르 + 사전/게시물 업데이트 스크립트 + 파일 목록 솔루션 아마도 –

2

업데이트 용으로 별도의 파티션을 가질 수 있습니다 (Side1/Side2라고 말함). 기존 커널 인 rootfs가 Side1에 있고, Side2에 업데이트를 넣고 스위치를 둡니다. 이렇게하면웨어 레벨링을 줄이고 수명을 늘릴 수 있지만 장치가 더 비싸집니다.

관련 문제