시스템을 비정상종료하면 왜 파일시스템이 깨지는지?

sbkang의 이미지

시스템을 정상적으로 끝지 않고 running 상태에서 강제 종료하면 다시
부팅할 때 파일시스템이 깨지는데 어떤 이유에서 깨지는지 알고 싶습니다.
내부적으로 정보를 어떻게 가지고 있길래 깨지는지..궁금합니다.

글구 lost+found에 어떤 파일들이 들어가는지도 궁금합니다. 파일시스템이 깨지는 것과 관련이 있을것 같은데...

ihavnoid의 이미지

sbkang wrote:
시스템을 정상적으로 끝지 않고 running 상태에서 강제 종료하면 다시
부팅할 때 파일시스템이 깨지는데 어떤 이유에서 깨지는지 알고 싶습니다.
내부적으로 정보를 어떻게 가지고 있길래 깨지는지..궁금합니다.

글구 lost+found에 어떤 파일들이 들어가는지도 궁금합니다. 파일시스템이 깨지는 것과 관련이 있을것 같은데...

그건 파일시스템이 본래 어떤식으로 구성되는 것인지를 살펴보면 이해가 쉬울 듯 합니다.

파일시스템은 결국 어떤 주소에 어떤 데이터가 들어있는지를 기록해 놓는 부분이 있고, 데이터가 실제로 기록되는 부분이 있습니다. 예를 들어 'a라는 파일이 존재하는 위치' 를 기록해 놓은 데이터가 있고, '빈 공간의 목록'을 기록해 놓은 곳이 있다고 합시다. 이때, a라는 파일을 지운다면, 대충 간단히 설명하면, a가 존재하는 위치를 기록해 놓은 데이터를 삭제하고 나서 그 위치를 '빈공간 목록'에 추가시켜놓을 것입니다.

근데 만일 a의 위치를 기록해 놓은 곳을 삭제해 놓고 나서 빈공간 목록에 그곳의 위치를 추가시켜놓기 전에 전기가 나가버리면 어케될까요? 이런 종류의 작용들에 의해 파일시스템이 깨지게 됩니다. 즉, 처리해야 할 일들이 완수되지 못하고 정리가 되게 되는거죠. 마치 책을 쓴 사람이 내용상에는 하나의 단원을 새로 썼는데 목차에 그 단원을 새로 추가시켜놓지 못한 것처럼이죠.

lost+found 에 들어있는 데이터는 그런 이유로 '소실된' 데이터의 뭉치입니다. 이게 도대체 의미있는 데이터인지 의미없는 데이터인지, a라는 파일 것인지 b라는 파일 것인지 알 수 없는 경우죠. (정확히는 모르겠습니다. 아무튼 그런식으로 소속이 불분명한 데이터인 것으로 기억합니다.)

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24

charsyam의 이미지

캐쉬에 데이터가 있는데, 디스크에 쓰기 전에 전원이 꺼지는 것도 어떤 문제가 생길 수 있겠죠 ^^

=========================
CharSyam ^^ --- 고운 하루
=========================

mach의 이미지

비동기 파일시스템이기때문에 그렇습니다.
여기서 비동기 파일시스템이란, 프로그램에서 파일을 저장해도 실제로 파일에 저장이 되지 않는 것을 의미합니다. 저장이 되지 않는다면 이상하지요? 보다 정확한 말로는 나중에 저장된다(delayed write)고 해야겠지요. 보다 상세하게 보이기 위해 절차를 요약해보면 다음과 같습니다.
사용자프로그램 ----(저장)---> 운영체제(버퍼캐시관리자) ---->(자신의 버퍼캐시에 저장) ----> 운영체제디바이스드라이버(버퍼캐시 처리조건에 따라 저장) ---->디스크
버퍼캐시는 버퍼링+캐싱을 수행하는 자료구조라고 보면 되겠습니다만, 뒷부분에서 언급한 책을 참고하시길.

다음을 명심하시면 보다 이해가 쉬울지도.
1) 모든 블럭디바이스(디스크, 테이프등)는 버퍼캐시를 거쳐서만 실제 장치로 read/write가 완료된다.
2) 버퍼캐시는 운영체제의 일부이다.
3) 사용자는 운영체제가 디스크에 실제로 쓰거나 읽는 시점을 알수 없다.
4) 운영체제는 버퍼캐시 관리 알고리즘에 의해 디스크에 쓰거나 읽는다.
5) 사용자 프로그램이 write를 호출한 경우, 버퍼캐시에만 쓰면 운영체제는 리턴한다.(실제 디스크에 저장하지 않고도 리턴)**
6) 결론적으로 사용자프로그램과 디스크는 운영체제가 중간에 위치함으로써 분리된 구조이다. 이들사이(사용자-운영체제-디스크)에서 (사용자-디스크)사이의 IO는 운영체제 간섭에 의해 비동기적으로 이뤄진다. 마치 편지-우체국-수신자처럼......

만일 사용자 프로그램이 저장수행완료하고 전원을 끊다면, 파일이 손상될 수 있는데, 운영체제가 운영체제 내부에 있는 버퍼캐시(메모리)를 디스크와 동기화하기전에 전원이 꺼진다면 이는 파일시스템이 깨지는 원인이 됩니다.

* 강제로 버퍼캐시와 디스크를 동기화 시키는 명령이 있는데 sync라는 명령이다.
* sync를 치고 전원을 꺼도 파일이 깨지는 경우가 있을 수 있는데, 이때는 다른 서버프로세스 또는 데몬프로세스가 디스크내용을 액세스한 경우라고 볼 수 있다. 그러므로, sync했을경우 안전하게 저장된것은 sync명령을 수행하기 직전에 저장했던 내용에 대해서만이라고 보는것이 맞다.

Quote:
"모든 길은 로마로 통한다"

모든 길은 버퍼캐시를 거쳐야만 한다. 물론 특정 캐릭터디바이스에 해당하는 장치는 제외되지만, 대부분의 IO장치들은 버퍼캐시를 거치지 않고는 목적지로 갈수없다는것이 정설입니다. 최근 보안파일시스템등에서는 이 버퍼캐시를 바이패스(우회)하는 방식으로 암복호화를 수행하는 경우도 있긴 합니다만, 일반적인 경우는 모든 길은 버퍼캐시로 통한다가 맞습니다.

그러면, 왜 버퍼캐시를 거치는가? 라는 의문도 있으실텐데, 이는 Bach의 The Design of the Unix operation system 1986년판을 보시면 아주 잘나와 있습니다. 리눅스도 당근 이 구조입니다. 글구 번역판은 "유닉스 내부구조"라는 이름으로 유통되고 있는것으로 알고 있습니다.

에궁, 쓰다보니 존칭이 있다가 없다가 두서가 없어졌네요. 아무쪼록 읽어주셔서 감사.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

zeshai의 이미지

레드햇 8.0 인가... 그 쯤부터 ext2가 ext3를 파일 시스템으로 쓸수가 있었죠.

그게 뭔지 찾아보다가 알았습니다.

요즘엔 Reiser File system - 흔히 저널링 파일시스템이라고 해서

복구를 중요시 하는 것들을 쓴다고 하는군요.

다음을 참고 하세요.

http://www.linuxlab.co.kr/docs/01-05-3.htm

===================================
바로 잡습니다.
reiserfs는 저널링의 일종, 그러니까 ext3, xfs, 뭐 그런 것과 동류지 저널링 자체의 다른 이름이 아닙니다.
===================================

preisner의 이미지

mach님이 잘 설명해 주셨는데,
조금 보충 설명 해드릴께요.
일반적인 파일 시스템은(ext2, FAT32..)
mach님이 설명하신대로 바로 실제 파일 시스템 슈퍼블럭에 저장하지 않고,
OS의 버퍼/캐쉬에 inode의 변동 사항을 저장합니다.
(버퍼/캐쉬는 메모리에 있습니다.
그리고 inode에는 해당 파일의 퍼미션, 수정 시간, 엑세스 시간, 해당 장치 어느
블럭을 사용중인지 등등의 정보가 들어 있습니다.)

이것을 리눅스에서는 bdflush라는 커널쓰레드가 일정한 시간을
간격으로 디스크에 한번에 밀어 써넣습니다.(sync)

문제가 생기는 부분은 bdflush가 자료를 동기화 시키기 전에 시스템 전원이나가거나
하면 inode의 데이타가 실제 데이타와 맞지 않는 문제가 생깁니다.
bdflush가 inode의 정보를 동기화 시키지 못했으니까요..
이렇게 되면 파일 시스템이 깨지거나 fsck가 복구를 하려 시도합니다.

이런 문제가 있어서 나온게 저널링 파일시스템입니다.(ext3, Reiser, XFS, JFS, NTFS등등..)
저널링 파일시스템은 동기화 되기 전의 자료에 대한 로그
(어떤 파일에 데이터가 새로 써졌다는 정보, 다시 말해 파일의 inode정보 변동 사항)를
해당 파일시스템에 남겨 놓아서 정상적인 종료가 되지 않았다면,
이 로그를 바탕으로 복구를 시도합니다.

저널링 파일 시스템은 일반적인 파일 시스템보다 안정적이지만,
벤치마크 자료를 보면 퍼포먼스가 많이 떨어 집니다.
아무래도 I/O마다 로그를 남겨야 하니까 그렇지요.
(ext2와 FAT32는 반대로 안정성을 감수하고 속도를 올린 경우라 하겠네요.)

fsck도 웬만한 문제는 거의 복구 하더군요.
하지만 I/O가 많은 서버는 반드시 저널링을 쓰시는게 좋겠습니다.
RAID 시스템을 도입해서 퍼포먼스 문제를 해결 하고요..
하지만 돈들죠.. :lol:

mushim의 이미지

buffer cache 를 디스크에 쓰는 작업은

bdflush 와 kupdated 커널쓰레드가 담당하고 있죠.

bdflush 의 경우,
1) free memory 가 모자르거나,
2) dirty buffer 가 특정 비율이상 될때.
(* 그 비율은 /proc/sys/vm/bdflush 의 첫번째 항목, 저의 경우는 30% 이네요.)

kupdated 는
1) 주기적으로 활동합니다. (* 주기는 /proc/sys/vm/bdflush 의 다섯번째 항목, 저의 경우는 5 초입니다.)
2) signal 이 왔을때,

*) 참고로 위의 값은 커널 2.4.20 일때입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.