정전시 ext4 / Linux 드라이브의 데이터 손상 방지


9

리눅스가 OS 인 American Megatrends bios를 실행하는 임베디드 보드가 있습니다. 내가 가진 문제는 산업용 플래시 IDE의 전원 손실로 인해 손상 될 수 있다는 것입니다. 나는 그것들을 ext4로 포맷했다. 이런 일이 생길 때마다 일반적으로 fsck로 플래시를 고칠 수 있지만 배포 환경에서는 불가능합니다. 쓰기 캐싱을 비활성화하면 도움이된다고 들었지만 어떻게해야하는지 알 수 없습니다. 또한 내가해야 할 일이 있습니까?

더 많은 정보

드라이브는 4GB IDE 플래시 모듈입니다. ext4 인 파티션이 하나 있습니다. 해당 파티션에 OS가 설치되어 있고 grub이 내 부트 로더입니다.

fdisk -l은 / dev / sda를 플래시 모듈로 표시하고 / dev / sda1을 기본 파티션으로 표시합니다.

정전 후 나는 보통 부팅 초기화 스크립트를 통해 그것을 완전히 만들 수 없습니다.

다른 PC에 드라이브를 마운트하면 fsck / dev / sda1을 실행합니다. 항상 다음과 같은 메시지를 표시합니다

"zero datetime on node 1553 ... fix (y)?"

나는 그들을 고정하고 다음 전원 손실까지 잘 부팅됩니다.

내일 사무실에 도착하면 fdisk -l의 실제 출력을 게시합니다

이것이 시스템 작동 방식에 대해 내가 아는 전부입니다. 나는 시스템 전문가가 아니며, 자신의 직무를 벗어난 곤경에 빠지는 습관을 가진 소프트웨어 엔지니어입니다. 드라이브 포맷, 부트 로더 설치, 소프트웨어 작성 및 운영 체제 해킹 방법을 알고 있습니다.

다음은 dumpe2fs의 출력입니다.

#sudo dumpe2fs /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   VideoServer
Last mounted on:          /
Filesystem UUID:          9cba62b0-8038-4913-be30-8eb211b23d78
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              245760
Block count:              977949
Reserved block count:     48896
Free blocks:              158584
Free inodes:              102920
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      239
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Fri Feb  4 15:12:00 2011
Last mount time:          Sun Oct  2 23:48:37 2011
Last write time:          Mon Oct  3 16:34:01 2011
Mount count:              2
Maximum mount count:      26
Last checked:             Tue Oct  4 07:44:50 2011
Check interval:           15552000 (6 months)
Next check after:         Sun Apr  1 07:44:50 2012
Lifetime writes:          21 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Default directory hash:   half_md4
Directory Hash Seed:      249d2b79-1e20-49a3-b324-6cb631294a63
Journal backup:           inode blocks

답변:


6

쓰기 캐시는 일반적으로 BIOS와 관련이 없으며 대부분 디스크 캐시 설정을 전환 할 수있는 옵션이 없습니다. 리눅스에서는 hdparm -W 0도움이 필요합니다.

설정은 영구적이므로 프로덕션 시스템에서 hdparm을 사용하지 않는 경우 다른 시스템에서 디스크 쓰기 캐시를 비활성화하고 디스크를 다시 연결해야합니다.

BTW : 쓰기 불가능한 루트 파일 시스템에 대한 아이디어는 두 번째입니다 (따라서 시스템은 일종의 "복구 모드"로 부팅 할 수 있으며 쓰기 가능한 파일 시스템을 어떤 이유로 든 마운트 할 수없는 경우에도 원격 액세스를 허용 할 수 있습니다). 하드웨어 디자인을 변경할 수 있다면 jffs2 와 같은 플래시 인식 파일 시스템을 가진 IDE / SATA 디스크 대신 mtd 장치를 사용하는 것이 좋습니다 . 우리는 몇 년 동안 여러 임베디드 장치 (주로 현장의 VPN 라우터 솔루션)와 함께이 조합을 사용해 왔으며 좋은 결과를 얻었습니다.

업데이트 : 문제의 근원은 저널링이 비활성화 has_journal된 상태에서 ext4 파일 시스템을 실행하는 것 같습니다 Filesystem features. 목록 에서 누락되었습니다 . 그냥 아무것도 여전히 사용하여 열려있는 파일이 있는지 확인 모든 서비스를 종료 lsof +f -- /, 루트 파티션과 읽기 전용으로 다시 마운트 mount -o remount,ro /와 저널을 가능하게 tune2fs -O has_journal /dev/sda1하고 설정 한 기본 사용 마운트 옵션으로 저널 모드를 "주문" tune2fs -o journal_data_ordered /dev/sda1당신이 재해야합니다 - 이 작업 후에 fsck를 실행하고 (권장 구조 시스템에서) 루트 / 재부트를 다시 마운트하십시오.

이러한 설정을 사용하면 갑작스러운 정전시에도 메타 데이터를 저널에서 복구 할 수 있습니다. 실제 데이터는 디스크에 지속적으로 기록되지만 부팅시 정전이 발생하기 몇 초 전에 데이터가 표시 될 수 있습니다. 이것이 허용되지 않는 경우 tune2fs -o journal_data /dev/sda1파일 시스템에 mount 옵션을 사용하는 것을 고려할 수 있습니다. 여기에는 저널에 디스크에 기록 된 모든 데이터가 포함됩니다. 이는 분명히 데이터 일관성은 향상 시키지만 성능 저하와 마모 수준은 높아집니다. SSD에.


쓰기 캐시가 내 문제 또는 다른 것입니까?
Jonathan Henson

글쎄, 어떻게 알 수 있니, 그것은 결국 당신의 시스템입니다 :-) 사용 된 파일 시스템 마운트 옵션 (범위를 활성화 했습니까? 어떤 종류의 데이터 / 저널 모드?)과 부패의 종류에 대한 세부 정보를 제공해야합니다 더 자세한 분석을 위해서는 (fsck 출력이 가장 좋습니다).
the-wabbit

알았어 고마워. 나는 당신이 아는 무력한 소프트웨어 엔지니어입니다 :). 자세한 내용을 알려 드리겠습니다. 몇 분 안에 세부 정보를 추가하고 있습니다.
조나단 헨슨

익스텐트가 무엇인지 모르고 저널 모드가 무엇인지 잘 모르겠습니다.
Jonathan Henson

아, 알겠습니다 출력의 첫 줄 dumpe2fs /dev/sda1(또는이 시스템의 장치 / 파티션 이름)을 게시하면 모든 관련 정보가 포함되어야합니다. / etc / fstab의 루트 파일 시스템에 대한 마운트 옵션도 도움이됩니다.
the-wabbit

5

쓰기 캐시 제안은 좋은 시작이지만 건축 설계 결함처럼 들립니다. 임베디드 시스템의 경우, 드문 경우를 제외하고 내부 플래시를 R / W에 마운트하지 않아야합니다. 실제로 메모리 파일 시스템에서 대부분의 작업을 수행하고 일부 사용자 명령이나 정기적 인 간격으로 변경 사항을 RW 플래시로 다시 동기화해야합니다. 임베디드 시스템이 일반 작업 중에 rw 모드에서 일반 파일 시스템 (ext4와 같은)을 사용하는 것은 일반적이지 않습니다. 많은 저장 공간이 필요한 응용 프로그램 요구 사항이있는 경우 시스템 파티션을 다르게 설정하고 데이터 파티션을 시작의 일부로 fsck 할 수 있도록 설계해야합니다.

시작점이 필요한 경우 사람들이 디스크없는 Linux 시스템을 설정하는 방법을 살펴 보겠습니다.

http://frank.harvard.edu/~coldwell/diskless/

거기서부터 시작합니다. 일반적인 아이디어는 파일 시스템이 손상되지 않도록 시스템 바이너리 및 데이터를 읽기 전용으로 마운트 할 수 있다는 것입니다. 그러나 특정 영역에 쓸 수 있어야하므로 일반적으로 메모리 파일 시스템 / tmp, / var / tmp에 무언가가 필요합니다. 쓰기 가능한 특정 항목이 있더라도 파티션을 r + w로 마운트하고 변경 사항을 커밋 한 다음 읽기 전용으로 돌아가는 스크립트를 작성하면됩니다.

이것의 좋은 예는 Cyclades 하드웨어, 임베디드 리눅스이며 구성을 변경할 때마다 실제로 구성을 다시 묶어서 플래시에 쓰는 저장 스크립트를 실행해야합니다.


/ etc / networks 및 호스트 이름 파일뿐만 아니라 응용 프로그램에서 편집해야하는 구성 파일이 있습니다. 권장 사항을 알려 주시겠습니까? 예를 들어, 그러한 유형의 파티션과 다른 유형의 구성 파일 등에 대한 파티션이 필요합니까? 나는 이것에 대해 전혀 모른다. 저는 소프트웨어를 작성하며 마술로 (* nix 소프트웨어를 작성하기에 충분하지는 않지만, 전담 시스템 전문가 만큼은 잘 모릅니다) 내 고용주가 하드웨어를 어떻게 사용해야하는지 정확히 알고 있어야합니다.
Jonathan Henson

물론 더 많은 정보를 포함하도록 답변을 업데이트했습니다. 이것은 많은 리눅스 내부를 다루기 때문에 하나의 질문으로 다루기에는 꽤 복잡한 주제입니다. 응용 프로그램 요구 사항을 이해하고 신뢰할 수있는 솔루션을 설계하기 전에 디스크없는 / pxe / 내장 시스템을 수행 한 사람을 시도하고 계약 할 수 있습니다.
다항식

최악의 경우 시스템 파티션 (쓰기 불가능)과 두 개의 구성 파티션을 사용할 수 있습니다. 1 차 파티션을 읽을 수 없거나 불완전한 경우 2 차 파티션으로 부팅하고 1 차 파티션을 재 포맷 한 후 2 차 파티션을 복사하십시오. 겹치지 않는 작업에서 기본 및 보조를 업데이트하십시오.
David Schwartz

좋아, 나는 대답을 업데이트했다. 아마 당신의 조언을 받아 내 대학원 프로그램에서 내 오래된 교수에게 가져갈 것입니다. 그동안 프라이팬에 내 엉덩이를 포함시키지 않는 더 좋은 자세로 나를 데려다주는 빠르고 더러운가 있습니까?
Jonathan Henson

쓰기 캐싱을 끄거나 정기적으로 '동기화'를 실행하면 단기적으로 도움이 될 것입니다.
다항식
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.