절대로 손상되지 않는 파일 시스템(데이터 손실은 허용됨)

절대로 손상되지 않는 파일 시스템(데이터 손실은 허용됨)

이 문제를 둘러싼 여러 가지 기존 주제가 있지만 제가 찾고 있는 것은 약간 다릅니다. 임베디드 Linux에 SD 카드가 있는데 전원이 꺼집니다. 어느 시점에서는 하드웨어를 수정하거나 적절하게 종료할 수도 있습니다. 하지만 지금은 정전이 되어도 살아남을 수 있는 파일 시스템을 찾고 싶습니다. 데이터 손실은 허용됩니다. 현재 쓰고 있는 파일보다 더 많은 것을 잃고 싶지는 않지만 "마운트할 수 없음", "fsck를 위해 10분 동안 기다리십시오" 또는 "새 파일을 생성할 수 없습니다"라는 오류가 발생하는 것보다는 모든 파일을 잃는 편이 낫습니다. "이로 인해 inode에 문제가 발생했습니다." 계획은 계속되어야 한다!

그걸 확실히 하기 위해 많은 노력을 기울이고 있어요. 나는 산업용 등급 구성 요소를 사용하고, 하드웨어 감시 장치, 소프트웨어 감시 장치, 내부, 외부, init 재시작 프로그램, 지속적으로 메모리를 확인하는 데몬, 파일 설명자 등을 갖고 있고, 감시 장치를 모니터링하는 감시 장치가 있고, 다른 감시 장치가 차례로 내 감시 장치를 감시합니다. ...하지만 SD 카드가 마운트되고 실행되는지 보장할 수 없는 것 같나요?

지금 가장 좋은 옵션은 SD 카드에서 JFS를 사용하고 설치에 fsck 및 fsck.jfs를 포함하는 것입니다. (600kb+를 추가하면 RAM과 플래시가 소모됩니다. 좋지 않습니다.) 그리고 부팅할 때마다 fsck를 실행합니다(아마도 부팅 시간이 엄청나게 늘어납니다. 좀 나쁩니다.). 그런데 좀 아쉬운 것 같습니다.

더 나은 방법이나 더 나은 파일 시스템을 아는 사람이 있습니까?

업데이트: e2fsprogs-libs(jfsutils에 대한 종속성)는 내 배포판에서 컴파일하기가 매우 어려운 것 같습니다. ZFS를 조사해 보겠습니다. (비록 내 배포판에 고유한 것은 아니지만, 필요하지 않은 작업을 많이 수행하는 것 같습니다.)

업데이트 2: 내 시스템 및 테스트에 대한 추가 정보: SD 카드 저장소는 보조 옵션 저장소입니다. SD 카드는 2Gb-8Gb 산업용 등급 microSD입니다. SD 카드는 mount -t 명령을 사용하여 내 rc를 통해 마운트되었습니다. 옵션 "noatime"이지만 "sync"는 아닙니다. 내 배포판은 3.10 커널과 1.21 비지박스를 갖춘 맞춤형 아날로그 장치 스타일 uClinux입니다. 내 주요 저장소는 jffs2를 사용하는 spi 플래시입니다. 나는 이것에 대해 어떤 문제도 겪은 적이 없습니다. fsck.jffs2가 사용 가능한지조차 모르겠습니다. 반면에 Nand 플래시는...하지만 그것은 다른 이야기입니다. SD 카드의 목적은 측정 데이터를 저장하는 것입니다. "모니터" 프로그램은 전략적 동기화 위치가 있는 파일에 결과를 추가합니다. 파일이 지정된 크기를 초과하면 새 파일이 생성됩니다. 지정된 파일 수에 도달하면 가장 오래된 파일이 삭제됩니다. 정전으로 인해 현재 측정 파일이 손실되어도 문제가 없습니다. 파일은 일반적으로 50-100kb이고 결과 1개는 일반적으로 1kb입니다. 이것은 단지 초기 개발 단계일 뿐입니다. 아무것도 고쳐지지 않았습니다. 임베디드 시스템에서 비플래시 파일 시스템을 다루는 것은 이번이 처음입니다. (내 x86 서버에는 ext4가 있습니다.)

나는 vfat로 시작했습니다. 기본 파일 시스템. (공장에서 선택한 데에는 이유가 있었을 것 같습니다. 문제가 해결되면 별로 상관하지 않습니다.) 내장된 vfat 장치에서 정전 문제를 본 적이 없습니다. 그러나 WinCE에서는 FAT에 문제가 발생했습니다. 그러나 내 "모니터" 프로그램이 100-200개의 파일에 도달하면 더 이상의 파일 생성을 거부합니다. FAT는 루트 디렉터리에 특별한 파일 제한 문제가 있고 하위 디렉터리에 약간 더 큰 파일 제한 문제가 있는 것 같습니다. 하나의 디렉토리에 500-1000개의 파일을 생성할 수 있어야 합니다. 그래서 vfat는 작동하지 않습니다.

그런 다음 ext2로 전환했습니다. 그러나 시작 시 fsck를 삽입하지 않았습니다. (이 작업을 수행해야 하는지 몰랐습니다.) 하루 만에 "inode something" 오류로 인해 내 "모니터" 프로그램이 더 이상 파일을 생성할 수 없었습니다. 재해!

내 현재 솔루션은 시작 시 ext2에 "e2fsck -y"를 사용하는 것입니다. 지금까지는 이것이 유망해 보인다. 그러나 e2fsck와 "부팅 시 fsck"의 전체 개념은 항상 나를 괴롭혔습니다. e2fsck 자체는 내 메인 플래시와 메모리 중 350kb 이상을 차지합니다. (실행되지 않을 때.) 이것은 이것이 나의 가장 큰 프로그램이라는 것을 의미합니다. 비지박스보다 더 큽니다. 내 핵심과 거의 비슷합니다.

ext3에 대해 생각해 봤습니다. 그것은 해를 끼치 지 않는 메타 데이터를 기록합니다. 나는 그것이 많은 도움이 될 것이라고 의심한다. 작은 파일과 제어된 동기화를 사용하면 보호받을 수 있을까요? 순서대로 쓰는 순서가 있습니다. 이는 데이터도 어느 정도 기록된다는 의미입니다. 그러나 이로 인해 비결정적 지연이 발생할 수 있습니다. 이건 나에게 짜증나. (이것은 문제가 되지 않을 수 있습니다.) 또한 예약된 동기화 기능도 있습니다. 예를 들어. 5초마다 제출하세요. 내 생각엔 이것이 내 동기화를 방해할 것 같아요. 과도한 쓰기는 SD 카드에 좋지 않습니다. 산업용으로도 말이죠. 이 기능을 비활성화하는 방법에 대한 문서를 찾을 수 없습니다. 그리고 ext3아직부팅할 때마다 fsck를 실행해야 합니다! 그러나 ext3은 여전히 ​​가능합니다.

확장 4. 많은 ext3 성능 문제를 해결합니다. 하지만 꼭 공연을 할 필요는 없어요. 내 배포판에는 mkfs.ext4 및 fsck.ext4가 내장되어 있지 않은 것 같습니다. 아마도 이것은 문제가 아닐 수도 있습니다. 하지만 가능합니다. 예를 들어. e2progs-libs(jfsutils에 대한 종속성)에는 컴파일 문제가 많은 것 같습니다.

JFS, XFS, BRFSS. 이 모든 것이 내 커널에서 지원됩니다. 현재 내 사용자 공간 도구 상자에는 포함되어 있지 않습니다. 모든 것이 상당히 크고 복잡한 시스템인 것 같습니다. 부팅 시 모두 "fsck"에 해당하는 명령이 필요한 것 같나요?

나는 또한 내 자신의 파일 시스템을 버리는 것을 고려했습니다. 항상 파일 테이블의 2개 복사본에 쓰는 것입니다. 순회할 때 올바른 CRC와 최신 시퀀스 번호를 가진 것을 선택하십시오. 2단계 쓰기 시퀀스를 수행합니다. 임시로 할당되고 커밋 시 수정되었습니다. fsck가 필요하지 않습니다. 하지만 그건 좀 순진한 생각일 수도 있겠다는 생각이 듭니다.

업데이트 3: 그런데 임베디드 시스템(적어도 이 시스템)의 특성은 자율적이고 무인이며 원격이며 수년 동안 실행되어야 한다는 것입니다. fsck와 같은 프로그램가능한인간 상호 작용의 필요성이 나를 두렵게 만듭니다.

답변1

귀하의 이야기는 약간 일관성이 없거나 적어도 모호합니다.

나는 "설치할 수 없습니다", "fsck를 위해 10분 동안 기다리십시오"라는 직면보다 모든 것을 잃는 것이 낫습니다.

실제로 말하지는 않더라도 이것이 실제로 문제가 있다는 것을 암시합니다. 하지만:

e2fsprogs-libs(jfsutils에 대한 종속성)는 내 배포판에서 컴파일하기가 매우 어려운 것 같습니다.

중요성넌 fsck가 전혀 없어, 제공되는 e2fsprogs-libs종속성 도 마찬가지입니다 . 그렇다면 아직 계획 단계에 있고 예를 들어 시스템을 테스트하지도 않았지만 JFS로 시작해야 한다고 결론을 내린 것일까요? 이에 대한 특별한 이유가 있나요?e2fsprogse2fsckext4

나는 Raspberry Pi 스왑(Raspberry Pi의 기본 저장소도 SD 카드임)에서 대부분(나 자신을 포함)이 이 질문에 직면한 적이 없음에도 불구하고 꽤 많은 사용자가 이와 같은 문제로 인해 매우 좌절감을 느끼는 것으로 나타났습니다. 모두. 처음에는 이 사람들이 시스템을 깔끔하게 종료해야 한다는 사실을 모르고 있는 줄 알았는데, 누군가 설명하고 신고하면 이해하기 어려운 문제는 아니었습니다.시스템이 제대로 종료되었더라도.

이미 가동 중단을 허용하려면 이것이 필요하다고 말씀하셨지만(충분히 공평합니다), 이것이 의미가 있기 때문에 이것을 언급합니다.일부pis 또는 일부 SD 카드 또는 이 둘의 조합은 플러그를 뽑거나 다시 꽂을 때 주기적으로 발생하는 일부 이벤트(서지?)로 인해 파일 시스템을 쉽게 손상시킬 수 있습니다. 또한 사람들이 btrfs나 jfs 등으로 전환했다고 말하는 보고도 본 적이 없습니다. 이제 문제는 해결되었으며 많은 사람들이 시도해 볼 시간이 충분했습니다.

또 하나 미스터리한 점은사람들이 전원 코드를 잡아당기더라도 파일 시스템을 사용할 수 없게 되는 경우는 많지 않습니다. 물론, 나는 pi를 사용하여 이 작업을 여러 번 수행했으며 일반 Linux 상자를 사용하여 수백 번 수행했습니다(전원이 차단되고 시스템이 응답하지 않으며 지치고 화가 났습니다 등). 사소한 데이터 손실은 있었지만 빠른 fsck 이후 사용할 수 없을 정도로 파일 시스템이 손상된 경우는 본 적이 없습니다.

다시 말하지만, 이러한 보고서가 모두 사실이라고 가정하면(많은 사람들이 이에 대해 거짓말을 하는 이유를 이해할 수 없습니다) 완전한 제거가 아닌 것보다 더 많은 일이 진행되고 있지만 이는 소수의 사용자에게만 영향을 미치는 것으로 보이며 다시 한 번 뭔가를 제안합니다. 일반적인 하드웨어 결함.

Pi에서는 다음 시작 시 자동으로 실행되어 필요 여부에 관계없이 모든 문제를 해결하도록 시작 스크립트를 작성 -y했습니다 /forcefsck. 700Mhz 단일 코어에서는 약 4GB의 데이터가 포함된 12GB 파일 시스템의 경우 약 10초가 소요됩니다. 따라서 "10분"은 매우 긴 시간처럼 들립니다. 특히 이미 "이것은"이라고 말씀하셨기 때문에 더욱 그렇습니다.쓰기를 위한 작은 파일 시스템! ".

sync정기적으로 전화 통화를 하는 것도 고려할 수 있습니다 .

마지막으로, 문제에 대한 보다 현실적이고 구체적인 세부정보로 질문을 업데이트해야 합니다.실제로 접해보셨나요?그리고 덜 과장하세요. 그렇지 않으면 너무 성급해 보입니다.XY 문제, 광범위한 경험과 잠재적인 조언을 가진 사람이 이 단계를 빠르게 건너뛸 수 있습니다.

답변2

계획은 계속되어야 한다!

이는 일반적인 요구 사항이며 안정적인 시스템을 선택할 때 Linux 시스템이 최선의 선택입니다.

당신의 노력도 올바른 방향으로 가고 있는 것 같지 않습니다. 하지만 안정적인 시스템을 얻으려면 어떻게 해야 할까요?

첫 번째 수준에서는 파일 시스템을 개선할 수 있습니다.

  • 를 사용하여 생성하거나 수정할 때 yournal_data_ordered파일 시스템에서 사용됩니다 .ext3/ext4tune2fs
  • 검사 시 함께 사용됩니다 JFS.--replay_journal_only
  • FSCKFIX=yesinitscript에서 설정하여 자동 복구를 활성화합니다.

이것이 충분하지 않다면 문제가 있는 디스크를 마운트하지 않고도 시스템을 부팅할 수 있습니다. 대신 ramdisk문제가 있는 디스크를 수동으로 확인하고 복구하는 동안 새 디스크를 생성할 수 있습니다. 이는 스크립트를 통해 자동화될 수도 있습니다.

다음 레벨에서는 임베디드 시스템을 떠나 다음과 같은 몇 가지 주제를 읽어야 합니다.고가용성

관련 정보