티스토리 뷰

IOT 기기와 같이 전원이 수시로 꺼질 수 있는 Linux 기기에서 설정 파일을 관리할 때에는 특히 주의를 기울여야 한다. 물론 이는 임베디드 기기만의 문제는 아니다. 

설정 파일 등 기존에 있는 파일을 수정할 때 비정상 종료 시에도 안전하게 내용을 유지할 수 있는 방법을 정확히 알아야만 설정 파일이 잘못된 데이타로 채워지는 문제를 막을 수 있다. 이같은 파일이 checksum이 있거나 JSON과 같이 brace(‘}’) 짝으로 오류 검출이 가능한 경우는 그나마 다행이지만 INI 형식의 파일인 경우 손상된 경우 손상되었는지를 판단하는 것이 쉽지 않다. 설정 파일에 의존하여 동작하는 구조라면 이같이 손상된 파일로 인하여 비정상적인 동작을 하거나, 아예 동작이 안되는 심각한 문제를 만들수도 있다. 


파일 저장의 기본적인 원칙은 기존 파일을 re-open 하여 수정하지 말고, 새로 파일을 써야 한다는 것이다. 그리고, POSIX 스펙에서 atomic 동작을 보장하는 rename을 사용하여 기존 파일로 rename 하여야 한다. Linux의 경우 다양한 file system을 지원하고, 오래된 버전의 경우 버그를 가지고 있는 경우도 있기 때문에 사용하려는 파일시스템 관련 문서를 참조하는 것이 좋다. 


예를 들어 NAND 용 UBIFS의 경우에도 아래 링크를 보면 관련 내용을 참고할 수 있다. 

How do I change a file atomically?

Write-back Support

Synchronization exceptions for buggy applications


예를 들어 conf.ini 파일을 저장하려는 경우 아래와 같이 하면 좋을 것 같다.

1) new conf.tmp and write data 

2) close conf.tmp

3) sync

4) mv conf.ini to conf.bak (using the rename() libc function or the mv utility)

5) mv conf.tmp to conf.ini


그리고 매번 파일을 읽기 전에 아래와 같이 체크를 하면 안전할 것이다. 

1) if conf.tmp, then rm conf.tmp

2) if no confi.ini, then mv conf.bak to conf.ini 

3) read conf.ini


Backup 파일없이 간단하게 처리 하려면 위 링크에 있는 것처럼 해도 될 것이다.

1) new conf.tmp and write data 

2) close conf.tmp

3) sync

4) mv conf.tmp to conf.ini (overwrite)

저작자 표시
신고
댓글
댓글쓰기 폼