파일시스템이 가끔 깨지는데요...ㅡㅜ

cibangbird의 이미지

임베디드로 프로그램을 짜고있습니다...
거기에서 sd카드로 사진을 계속 저장하고 어떤땐 지우고를 계속 반복하는데요.
가끔 sd카드의 파일시스템이 깨져버립니다....
그래서 포맷을 하면 되지 않을까 했는데 지금 사용중인 시스템에
mkfs.ext2 mkfs.ext3 mkfs.minix 이렇게 있는데 이건 안된다고 하더라구요.
vfat로 포맷하지 않는다고 하시더라구요..

파일시스템이 깨진 sd카드를 윈도우의 디스크검사 오류자동수정체크를 해서 검사를 한후
다시 보드에 넣어서 사용하면 그다음부턴 정상적으로 동작을 하기에 파일시스템이 깨지면
디스크 검사를 할려구요...

그래서 그냥 디스크검사식으로 체크를 해서 수정이 가능하다면 그렇게 하고싶은데
거기에 관한 어떤 함수나 명령어가 있다면 좀 알려주세요....

아래와 같이 마운트 되어있다면 vfat가 맞는거죠?? ^^;;;
/dev/mmcblk0p1 on /Qtopia/mmc type vfat (rw,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1)

조언을 좀 부탁드립니다...

rexos33의 이미지

계속 Read/Write를 반복적으로 하려면 파일 시스템을 YAFFS2로 사용하셔야 할 겁니다.
(NAND 플래쉬는 특정 블럭에 100만번 쓰기를 보장합니다. 그 이상 쓰면 어떻게 될지 모릅니다. 물론 지금 깨지는 것은 파일 시스템이 깨지는 것으로 물리적인 오류는 아닐 것 같네요.)

다만 YAFFS2는 MS-Windows에서 직접 읽을 수가 없을 겁니다. 관련해서는 YAFFS2로 검색하면 많은 자료가 나올 겁니다.

그리고 시스템 파일들(OS + 사용자 프로그램)은 쓰기가 불필요하므로 특정 파티션으로 밀어 넣고 파일 시스템은 JFFS2 파일 시스템을 사용할 것을 권장합니다.

나머지 사진 데이터는 YAFFS2로 사용하시면 조금 더 안정적으로 되겠지요.

즉, HDD 처럼 "파티션을 적절하게 나눠서 돌려라" 입니다.

모두들 행복하세요~

bushi의 이미지

mtd 처럼 사용할 순 있어도 NAND flash 로 사용할 순 없습니다.
설령 그럴 수 있다해도... 그냥 ext3 쓰고 말지, 뭐하러 그런 짓을.

rexos33의 이미지

> "mtd 처럼 사용할 순 있어도 NAND flash 로 사용할 순 없습니다."
무슨 의미인지...??
SD 메모리 카드도 "NAND Flash 메모리 (IC)"를 사용합니다.

> "설령 그럴 수 있다해도... 그냥 ext3 쓰고 말지, 뭐하러 그런 짓을."
"설령 EXT3를 쓸 수 있다해도 JFFS2나 YAFFS2를 사용하고 말지, 뭐하러 그런 짓을."라고 말하고 싶네요. 대부분 임베디드 시스템에서 NAND 파일 시스템을 JFFS2나 YAFFS2를 사용하는 이유가 있는 겁니다.

PS. 최근 안드로이드 진영에서 EXT4를 탑재한 듯한데... 파일 시스템(EXT4)를 NAND에 맞게 수정한 것인지는 모르겠지만, 개인적으로 우선은 안정성이 우려됩니다.

모두들 행복하세요~

bushi의 이미지

여쭙겠습니다.
기분나빠하시지 말고 대답해주셨으면 좋겠는데...
혹시 장난삼아 낚시하는 글을 올리는 데 취미가 있는 분이신가요 ?
아니면... 농담 한 번 던졌는데 제가 진지한 반응을 해서 재밌는 김에 한 번 더 던지신 건가요 ?

rexos33의 이미지

> "혹시 장난삼아 낚시하는 글을 올리는 데 취미가 있는 분이신가요?"
> "아니면... 농담 한 번 던졌는데 제가 진지한 반응을 해서 재밌는 김에 한 번 더 던지신 건가요"

위 처럼 올리는 것은 좀 아닌지 싶네요.
다시 읽어보니 직전에 제가 올린 글에 다소 "비아냥 어조"가 있긴 있네요. 이점은 사과합니다.

그리고 전 (이런일에) 기분 나쁠정도로 엄청난 "실력자"라 자부하지도 않습니다.

모두들 행복하세요~

bluecafe의 이미지

음.. 제가 알기로는 SD 카드의 경우 YAFFS를 사용하지 않아도 될 것 같습니다.
SD Card 내부에 있는 NAND Controller가 이미 wear leveling을 수행 하고 있기 때문에 따로 S/W에서 해 줄 필요는 없을 것 같습니다.
단지 File Close등을 적절하게 수행 하지 않으면 FAT Filesystem의 경우 파일이 깨져 나가기 시작 합니다.

( 어떤 메이커의 SD Card를 사용하느냐에 따라서 깨질 수도 있긴 합니다만 이는 Controller의 문제가 아닐까요??)

rexos33의 이미지

"SD 카드"를 사용해 개발 시스템에 적용한적이 없다보니 다소 무식한 답변을 했네요.

초보적인 질문일 수도 있겠지만... "SD 카드"를 사용하면 물리적인 BAD로 인한 것은 대부분 무시하는 건가요?
(FAT 파일 시스템은 BAD 관리를 안하는 것으로 알고 있습니다만... 그래도 많이 쓰니 대책이 있을 법도 한데요...?)

참고로 제가 개발한 제품(연간 20만대 물량) 중, (물리적으로) NAND가 깨져 CS 접수되는 비율이 전체 고장에 차지하는 비율(약 30% 정도)이 꾀 되다보니 민감했네요.

모두들 행복하세요~

tj의 이미지

SD카드라서 그런게 아니라 FTL이 있는 장치들은 그냥 블럭 디바이스로 사용하면 되고 (그렇게 사용할 수 밖에 없기도 하구요), 배드 블럭, 웨어 레벨링, 가비지 컬랙션 같은 것들은 FTL이 알아서 해요. 오에스가 보기엔 그냥 하드디스크처럼 블럭 디바이스. 하드디스크도 배드 블럭 관리같은 건 알아서 하는 걸요. 여전히 화일시스템들에 배드블럭 관리하는 기능이 있지만 요즘들어서 그다지 의미는 없어요. 근데 fat처럼 오래된 fs에 배드블럭 마킹이 없을리가;;;

rexos33의 이미지

비용과 기타 이유로 여전히 FTL(Flash Translation Layer) 내장 NAND I/F 콘트롤러의 지원을 받지 않고 사용하는 시스템들이 많습니다. 물론 요즘엔 메인 프로세서들이 NAND I/F를 기본적으로 제공해주는 추세라 이제는 더 싸게되었지만 말입니다.

지금껏 CPLD(또는 EPLD)에 직접 간단한 NAND I/F를 구현하여 사용하다보니 FTL(Wear leveling, Garbage Collection, etc)에 해당하는 기능은 전적으로 소프트웨어적으로 의존할 수 밖에 없었습니다. 그러니 MTD 블럭 장치들의 파일 시스템은 당연히 JFFS2나 YAFF2 같은 파일 시스템이 탑재되어야 한다고 생각했었지요.

사족입니다만...
요즘엔 32 MB 시절과는 달리... 16GB 이상 용량을 지원해야 하니 SD 메모리 카드나 USB 이동식 디스크 제품들은 FTL 같은 스펙이 기본적으로 탑재해야 할 것 같네요...

그리고 (전적으로 사견입니다만) BAD 관리는...
일반 ATA 대용량 HDD에서 직접 관리하고 있는 BAD 블럭 관리 시스템은 그다지 믿을게 못됩니다. 대용량/고속 멀티미디어 파일 시스템을 만들어 본 결과 HDD는 그냥 HDD이고 모든건 소프트웨어가 제어하는것이 가장 믿을 만합니다. 가령 HDD에 BAD가 마킹되기전에 이미 징후들이 포착이됩니다. 가령 write나 read 시점에 HDD가 I/O를 잡고선 한참 후에 리턴해줍니다. (물론 비동기로 하면 이런것도 어떻게 해볼 수 있는 여지는 있습니다만 개발 스펙이 기본적으로 동기된 I/O입니다. 갑자기 전원이 나가도 거의(?) 직전에 쓴건 보장을 해야 하는 시스템이라서요...) 이럴 경우 미리 BAD로 인식하게 하는 것이 좋습니다. 그리고 BAD도 그 섹터만 마킹하면 안되고 인접된 블럭들이 연속으로 앞뒤로 BAD로 마킹하는 것이 좋습니다. 이건 경험상 알게된 것이지만 HDD 제조사 관계자들(시게이트, 히타치, 삼성, 웨스턴 디지털)도 동의 해줬던 사항입니다. (반드시 하라는 의미는 아닙니다) 물론 이런 경우 문제의 HDD를 제조사로 보내서 조사 시켜봐야 의미없습니다. 레포팅 툴에서는 항상 정상으로 나옵니다. 한참 나중(6개월 1년후)엔 그곳이 BAD로 마킹되는 경우가 간혹 있기도 하지만 우리의 기억속에선 이미 흐릿한 옛일이 된 경우겠지요...

마지막으로 IDE(ATA) Flash 디스크는 이런 문제가 없었으면 좋겠습니다. ^_^

모두들 행복하세요~

bushi의 이미지

Android 처럼, mount 하기 전에 dosfsck 돌리고...
Windows 처럼, mount 할 때 sync 옵션 주세요.
어떻게 하는지 감이 잡히지 않는다면, 주변 다른 개발자에게 물어보시고요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.