언제든지 전원이 꺼질 때 SD 카드를 안전하게 사용하십시오


10

우리는 OS 및 응용 프로그램 (250-500Meg)을위한 작은 내부 NAND 장치와 데이터를위한 8Gb SDHC SD 카드가있는 SD 카드가있는 소형 임베디드 Linux 시스템 (2.6.35-ish)을 연구하고 있습니다.

장치의 전원은 언제든지 차단 될 수 있습니다.

시스템은 데이터를 SD 카드에 저장해야합니다. 이 데이터는 매우 중요합니다 ... 시스템의 전체적인 목적입니다. 시스템은 일반적으로 원격 위치의 모든 네트워크에서 완전히 연결 해제되며 4-8 주마다 스니커 넷을 통해 데이터를 검색합니다.

현재 SD 카드에 VFAT가 있습니다. 그것은 주로 첫 번째 테스트 클라이언트가 데이터를 수동으로 Win7 랩톱에 쉽게 복사 할 수 있도록하는 것이 었습니다.

그러나 이제는 잘못된 시간에 정전으로 인해 데이터가 손실 될 때까지는 시간 문제 일뿐입니다.

데이터 손실을 방지하기 위해 이러한 시스템을 구성하는 가장 좋은 방법은 무엇입니까? JFFS2는 데이터를 쓰는 방법 (그리고 성능 요구가 전혀 높지 않음) 측면에서 원하는 것처럼 들리지만 block2mtd 등을 사용하는 것은 상당히 어리석은 소리입니다. 또한 카드의웨어 레벨링이 어떻게 상호 작용하는지 잘 모르겠습니다. 그것으로.

가장 좋은 방법은 무엇입니까?

편집하다

이제 파일 시스템 VFAT를 그대로두고 0xFF로 채워진 하루 크기의 파일을 한 번에 할당하여 전원 사이클 오류에 대한 노출을 크게 제한하려고합니다. 그런 다음 미리 작성된 블록 내에서만 레코드를 추가 할 수 있었고 SD 카드가 너무 어리석지 않아 0xFF 영역에 쓰기 / 쓰기 수준의 쓰기가 이루어지기를 바랍니다.

noatime을 사용할 수 있지만 수정 된 시간 필드에 쓰지 못하도록하는 VFAT nomtime이 있습니까? 새로운 날의 파일이 생성 될 때까지 메타 데이터 업데이트를 전혀 막을 수있는 방법이 필요합니다.

편집 2

전자 스택 교환의 누군가가 NAND에 ECC 데이터가 있다는 것을 상기시켜 주므로 삭제를 막을 방법이 없습니다.

그렇다면이 상황에서 block2mtd를 통한 JFFS2가 적합합니까?

편집 3

생각보다 나빠요 내가 가지고있는 SD 카드는 동일한 내용을 디스크에 쓰더라도 데이터 블록을 지 웁니다. 지우기 블록은 64KB이며 쓰기를 완전히 지연 시키기에는 너무 큽니다. 나는 일종의 저널에 NAND 플래시 (쓰기 동작을 제어 할 수 있음)에 최대 128KB의 데이터를 저장 한 다음 SD 카드의 VFAT 파티션에있는 128KB 정렬 파일에 128KB 블록을 쓴다. 다른 SD 카드에는 128KB 지우기 블록이 있습니다).


1
"다행히 SD 카드는 그렇게 어리석지 않다…"<--- ROFLOL. 아마!
derobert

문제에 대한 완전한 해결책을 찾을 때까지 syncSD 카드에 쓸 때마다 명령을 사용하십시오 . 이는 RAM에 저장하지 않고 비트를 변경 / 생성 한 후에 비트를 불필요하게 기록하므로 변경 사항이 카드에 거의 적용되지 않습니다 전력 손실에 의해 사라지지 않을 것입니다.
Hanan N.

sync메타 데이터가 중간 업데이트되는 시간의 비율이 증가하기 때문에 문제가 더 악화 될 수 있습니다.
Ben Voigt

답변:


5

글쎄, 당신이 이것을 고칠 수있는 방법은 "언제든지 힘을 삭감 할 수있다"문제를 고치는 것입니다. 1 분의 배터리 전원을 추가 할 수 없습니까?

또는 두 개의 SD 카드를 사용할 수 있습니다. 한 카드에 데이터를 쓰고 동기화하고 다른 카드에 씁니다. 데이터의 각 블록에는 체크섬과 블록 번호가 필요하지만 불행히도 정전이 발생하더라도 카드 중 하나가 맞아야합니다.

기본적인 문제는 SD 카드의웨어 레벨링입니다. AFAIK는 카드 공급 업체에 따라 다릅니다. 정전을 올바르게 처리하지 못할 수 있습니다. 그리고 그것이 무엇을하는지에 따라, 그것은 당신이 쓰고있는 블록을 손상시키는 것을 의미하지 않을 수도 있습니다.

  1. 아주 작은 카드 인 3 (플래시) 블록을 가정하십시오. 블록 1은 2 또는 3보다 많은 쓰기를 수신했습니다. 물리적 블록을 숫자로, 논리적 블록 A, B, C를 문자로 호출합니다. 현재 A = 1, B = 2, C = 3입니다.
  2. A 블록에 쓰기를 실행합니다. SD 카드는 아하와 같습니다! 여기서는 마모 레벨링이 필요합니다. 그렇지 않으면 블록 1이 2와 3 이전에 마모됩니다. 블록 1과 2를 교체하기로 결정합니다.
  3. 블록 1을 RAM 위치 i (시스템 RAM이 아닌 SD 카드)로 읽습니다. 변경하려는 부분을 업데이트합니다.
  4. 블록 2를 RAM 위치 ii로 읽습니다.
  5. 블록 1을 지 웁니다.
  6. RAM 위치 ii를 블록 1에 씁니다.
  7. B = 1이라고 매핑 테이블을 업데이트합니다.
  8. 블록 2를 지 웁니다.
  9. RAM 위치 i를 블록 2에 기록합니다.
  10. A = 2라고 매핑 테이블을 업데이트합니다.

물론 "매핑 테이블 업데이트"가 항상 쉬운 것은 아닙니다. 그리고 5-10의 순서는 다를 수 있습니다 (모두 완료되면 중요하지 않습니다. 물론 지우기는 쓰기 전에 이루어져야합니다). 그러나 정전이 발생하면 A가 손상된 것뿐만 아니라 B도 손상 될 수 있습니다. 또는 매핑 업데이트 중에 정전이 발생하면 누가 어떤 종류의 손상이 발생하는지 알고 있습니다.


1
이 장치는 수년 동안 비교적 열악한 환경에서 생활해야하며 설치시 배터리를 사용할 필요가없는 여러 국가로 배송됩니다. 배터리를 사용하기 전에 MMC / SD를 삭제하고 자체 NAND 플래시 솔루션을 구축했을 것입니다.
darron

글쎄, 우리의 경우 " '언제든지 전력을 차단할 수있다'는 해결책은 트럭 운전사가 운전대에서 잠들지 않고 우리의 장치로 운전하는 것을 막기위한 것입니다." "트럭이 추락했다"는 것은 실제로 가장 일반적인 고장 모드에 관한 것입니다.
SF.

1
1 분의 배터리 전원이 필요하지 않습니다. SD 카드를 안전하게 마운트 해제하는 데 필요한 전력량은 커패시터가 저장할 수있는 범위 내에 있어야합니다.
Ben Voigt

4

electronics.stackexchange.com에서 비슷한 내용이 논의되었습니다. 예기치 않은 정전으로부터 SD 카드를 어떻게 보호합니까?

작품 옆으로 대답 탠덤 (이 소프트웨어 솔루션과 하드웨어 보는 것입니다 이것에 대해 ESE에 대한 질문도했지만, 지금은 그것을 찾을 수 없습니다, 그것은 엄격하게 SD 카드에 대한 아니었다, 단지 장치가 전력 손실에 대해 이를 감지하고 조치를 취하는 방법).

간단히 말해 : 배터리 전원이 없을 수도 있지만 전원 공급 장치에는 전원 공급 장치를 원활하게하기 위해 꽤 큰 커패시터가 있습니다. 기본적으로 전원은 꺼지지 않습니다. 전압 테이퍼가 꺼져 있습니다. 전압이 특정 지점 아래로 떨어질 때 내장 시스템에 RESET 신호를 발생시키는 브라운 아웃 보호 IC / 회로가있을 수 있습니다. PC 마더 보드에도 이러한 기능이 있으며 PSU의 'POWEROK'신호에 응답합니다. 즉, 전원이 꺼지면 전압이 안전 수준 아래로 떨어지기 전에 컴퓨터가 몇 밀리 초 동안 강제로 중지됩니다. 이 기간 동안 SD 카드와 같은 주변 장치의 전원은 계속 켜져 있지만 컴퓨터에서 더 이상 트랜잭션이 발생하지 않습니다.

SD 카드 의 전원이 꺼지기 전에 웨어 레벨링을 포함하여 보류중인 트랜잭션을 완료하기에 충분한 시간이있을 가능성이 큽니다 . 충분히 큰 커패시터로 전원 공급 장치를 개선하거나 SD 카드 근처에서 전원 공급 장치를 사용하면이를 보장하는 데 도움이 될 수 있지만 항상 플랫폼을 그대로 실험 해 볼 수 있습니다. 충분한 시간 동안 힘을 유지 할 가능성이 큽니다.

문제의 하드웨어 측면이 문제가 아닌 경우 소프트웨어 전용 문제를 해결할 수 있습니다. 중복성을 위해 두 개의 카드를 사용하는 derobert아이디어 는 나쁘지 않으며 VFAT와 같은 표준 파일 시스템을 사용하면 카드의웨어 레벨링 알고리즘을 혼동 할 위험이 줄어 듭니다.

어쨌든, 그다지 큰 문제가 없을 수도 있습니다. 카드의 블록이 100 번의 쓰기 작업을 유지한다고 가정하면 (보수적이지만 좋은 품질의 카드를 얻으려고 노력하십시오!) 8GB 카드를 사용하면 첫 번째 블록이 죽을 때까지 (통계적으로 말하면) 800GB를 기록하게됩니다.


전원 끄기 이벤트에서 이미 SD 카드가 크게 손상되어 문제가 시작되었습니다. 실제로는 자주 발생합니다. 20 개의 정전 이벤트 중 1 개는 치명적일 수 있으며, 4 개 중 1 개는 최소한 약간의 손상을 입었을 수 있습니다. 결국 내부 NAND 플래시에 하루 분량의 데이터를 저장하고 자정 (1 초 정도의 작업)에 SD에 복사하는 것으로 변경되었습니다. 나는 미래에 상황을 개선하기 위해 노력하고 있습니다. 나는 이미 레일에 400uF 상당의 캡을 가지고 있습니다. 충분하지 않은 것 같습니다. 아마도 브라운 아웃이 제대로 처리되지 않을 것입니다.
darron

그것은 꽤 높은 발생률입니다! 오실로스코프 프로브를 가져와야합니다. 소프트웨어로 문제를 해결할 수는 있지만 전력 소비 측면에서 가장 좋은 방법은 하드웨어 결함이 없는지 확인하는 것입니다. 아마 당신은 내기를 헤지하고 electronics.stackexchange.com에 요청할 수 있습니까?
Alexios

@darron, SD 카드 저장 문제에 대한 어떤 해결책을 찾았습니까? 아직도 NANDFlash에 쓰고 다음날 한 번 이상 복사하고 있습니까? SD 카드를 기본 RFS (별도 NANDFlash 없음)로 설계했으며 갑작스런 정전 조건의 유무에 관계없이 데이터 손상 문제가 발생합니다.
프레드 바셋

4

SD에 문제가 발생했습니다. 예기치 않은 정전으로 ext2 루트 파일 시스템이 손상되었습니다. 우선, 시스템을 읽기 전용 루트 마운트로 실행합니다. 쓰기 가능한 스토리지가 필요했지만 (데이터 로깅이 아님) 쓰기 가능한 두 번째 파티션을 설정했습니다. 예기치 않은 정전시 FS 손상을 최소화하기 위해 카드에 물리적 쓰기가 최소 두 배 이상 발생하더라도 ext3 파티션으로 만들었습니다. 이 조합 (그러나 두 번째 파티션 쓰기는 데이터 로거와 비교할 때가 드물다는 것을 인정합니다)은 문제없이 실행되는 것으로 보입니다. 지금까지. (전문 시설에서 약 30 개월간 설치 한 시스템)


3

전력 차단 및 전체 데이터 보안이 가능한 환경에서 데이터 보안을 위해서는 더 많은 포인트를 고려해야합니다.

저장을 위해 MLC 셀을 사용하지 마십시오. SLC만으로는 충분한 데이터 보존 시간이 있습니다. 그런 다음 해당 SLC 카드에는 스마트 펌웨어가있을 수 있으며 일부는 전원 손실로 인해 손상 될 수 없습니다. 마지막 블록이 완전히 작성되었는지 측정하여 전원 차단을 인식합니다.

이 카드는 MLC 셀보다 비싸고 약간 느립니다. 카드 용 swissbit과 같은 공급 업체를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.