나는 추가적인 initrd/initramfs/무엇이든 필요 없이 Linux 기반 임베디드 시스템을 위한 펌웨어 업데이트 메커니즘을 구상하려고 노력하고 있습니다. 읽기 전용으로 마운트된 루트가 있는 실행 중인 시스템에서 dd를 사용하여 새 루트 이미지(보조 데이터 파티션에 있음)를 복사했습니다.
문제는 절반의 시간이 손상된 루트 파일 시스템으로 끝난다는 것입니다. 파티션이 읽기 전용이라는 것을 알고 재부팅하기 전에 동기화했기 때문에 이런 일이 발생하는 이유를 이해할 수 없습니다(/proc/sysrq-trigger에 "b"를 써서 재부팅했습니다). 누군가 나에게 계몽해주세요.
답변1
이미 마운트된 파일 시스템을 덮어쓰고 있습니다. 파일 시스템 드라이버가 그 내용을 읽으려고 시도하자마자 문제가 발생하게 됩니다.
새 펌웨어를 작성한 후에는 다른 어떤 것도 해당 파티션을 읽거나 쓸 수 없는지 확인해야 합니다.
문제를 회피하기 위해 사람들이 일반적으로 하는 일은 부트로더를 사용하여 새 펌웨어를 플래시하는 것 같습니다. 일반적으로 RAM에 완전히 상주하므로 파티션에 액세스할 필요가 없습니다.
편집하다: 또 다른 접근 방식은 이미지 파일을 첫 번째 파티션에 플래시할 목적으로 두 번째 파티션에 또 다른 최소 시스템을 설치하는 것입니다. 업데이트가 만료되면 이미지를 올바른 위치에 복사하고 부트로더를 업데이트하고(두 번째 파티션에서 부팅) 재부팅하면 됩니다. 이미지를 작성한 후 부트로더를 재설정하고 다시 재부팅하세요.
답변2
일단 마운트되면 루트 파일 시스템이 읽기 전용이더라도 덮어쓸 수 없습니다.
너 뭐야할 수 있는당신이 하는 일은 루트 파일 시스템의 모든 파일을 포함하는 tmpfs를 마운트한 다음,ivot_root를 호출하여 tmpfs로 전환하고 이전 루트를 마운트 해제하는 것입니다.
이전 루트 파일 시스템을 마운트 해제하면 해당 시스템에서 실행 중인 모든 프로그램이 종료되거나 프로그램을 실행해야 하기 때문에 이미 부팅된 시스템에서는 이것이 불가능할 수 있습니다.
이 접근 방식을 사용하는 가장 실현 가능한 방법은 아마도 이 모든 작업을 수행한 다음 새로운 초기화를 수행하는 /sbin/tmpfs-init 프로그램을 갖는 것입니다. 심지어 이것도 하기가 어렵습니다.