임베디드 리눅스를위한 손상 방지 SD 카드 파일 시스템?


36

최근 우리는 고객에게 다소 불쾌한 상황을 겪었습니다. 원격 감지 데이터를 표시하는 데 사용되는 Raspberry Pi 기반 "키오스크"(데이터 수집 서버에서 자체 업데이트 웹 페이지를 표시하는 키오스크 모드 브라우저보다 더 멋진 것은 없음) 파일 시스템 손상. Ext4, 수동 fsck 필요, 시스템은 내일의 중요한 프리젠 테이션의 일부이며, 즉시 서비스가 필요합니다. 물론 밤 동안 시스템을 끌 때 고객이 시스템을 멋지게 종료하도록 요구할 수는 없습니다. 시스템은 단순히 그러한 학대를 견뎌야합니다.

앞으로 그러한 상황을 피하고 싶습니다. OS를 파일 시스템으로 옮기고 싶습니다. MTD 장치를위한 파일 시스템이 많이 있는데, SD 카드 (표준 블록 장치)에서 실행하려면 심각한 후프 점핑이 필요합니다. 부패에 대한 좋은 저항을 자랑하는 다른 파일 시스템 (journalling 등)도 있습니다. 나는 여전히 그들의 장단점을 합리적으로 비교할 필요가있다.

Linux에서 사용할 수있는 파일 시스템은 예기치 않은 정전시 손상에 대한 최상의 저항을 제공 하며 SD에 설치하기 위해 yaffs2 와 같은 불가능한 후프를 뛰어 넘을 필요가 없습니다 .

웨어 밸런싱은 플러스이지만 요구 사항은 아닙니다. SD 카드는 일반적으로 시스템이 "플래시를 위해 부드럽게"(NTFS와 같은 시스템이 한 달 내에 SD 카드를 살해 할 수 있음) 완벽해야하지만 자체 메커니즘을 가지고 있습니다.


1
개인적으로, 나는 다른 길을 가고 전원을 껐을 때 안전한 셧다운을 위해 노력할 것입니다. 아마도 셧다운을 실행하기에 충분한 우퍼를 제공하기 위해 캡을 사용합니다.
Scott Seidman

경고에주의를 기울이고 실제로 종료하는 데 필요한 시스템 지원과 함께 시스템을 완전히 종료하기에 충분한 전력을 제공하는 모듈을 누군가가 설계하는 것을보고 싶습니다. Pi, BeagleBone 및 기타 작은 Linux 시스템의 합리적인 동반자 인 것처럼 보이지만 해당 시스템 사용자에게 표시된 제품으로는 존재하지 않는 것 같습니다.
RBerteig

@ScottSeidman : 이것은 RPi이며 전력이 많이 부족합니다. 15 초 동안 5V에서 800mA를 생각하십시오. 슈퍼 캡의 전체 배터리에 투자하지 않는 한 커패시터가 아닙니다.
SF.

@RBerteig : 충전식 배터리가있는 상자, 충전하기에 적합한 전자 장치, 출력 전압 안정화 (배터리 자체에서 승압 가능), 종료 신호 전송, 종료 후 출력 전력 차단, 입력 전원이 복원 될 때까지 자체 종료- 모든 것이 가능하지만 대량으로 제조하지 않으면 RPi 비용의 두 배가됩니다 (키오스크의 경우 TV 세트는 10 배 더 비쌉니다 ...)
SF.

1
@SF. -powerfail 파일 시스템에 대해 강력한 두 가지 문제가 있습니다. 첫 번째는 FS 자체가 견고하고, 두 번째는 기본 하드웨어가 데이터를 디스크로 플러시하지 않는 것입니다. 최근 몇 년 동안 회전하는 디스크가 성능을 향상시키기 위해 거짓말을했다는 것을 알고 있습니다. SD 카드가 같은 동작을하지 않는 것이 좋습니다.
Michael Kohne

답변:


17

단일 SD 카드의 손상에 대한 최상의 저항 은 RAID1 모드의 BTRFS에서 사전 정의 된 시간마다 자동 스크럽 실행을 제공합니다.

혜택:

  1. 파일 시스템에 RW 유지 기능
  2. 투명한 압축 및 스냅 샷과 같이 RPi에 매우 유용한 옵션을 갖춘 최신 기능을 갖춘 최신 파일 시스템
  3. 플래시 메모리를 염두에두고 설계

방법은 다음과 같습니다.

ArchARM Linux에서 RaspberryPi를 실행하고 내 카드가 SD 리더에 있으므로 다른 배포판 및 / dev 인터페이스에 맞게 해당 지침을 수정하십시오.

파티션 레이아웃 예는 다음과 같습니다.

/dev/mmcblk0p1: fat32 boot partition
/dev/mmcblk0p2: to be used as btrfs partition
/dev/mmcblk0p3: to be used as btrfs partition (mirrored with the above)
/dev/mmcblk0p4 (optional): swap

btrfs를 RAID1로 가져 오려면 다음과 같이 파일 시스템을 만듭니다.

mkfs.btrfs -m raid1 -d raid1 /dev/mmcblk0p2 /dev/mmcblk0p3

그런 다음 rsync -aAXv이전에 백업 한 시스템으로 이동하십시오.

raid1의 BTRFS에서 부팅하려면 initramfs를 수정해야합니다 . 따라서 시스템이 이전 파일 시스템에서 계속 실행되는 동안 다음을 수행해야합니다.

라즈베리는 일반적으로 mkinitcpio를 사용하지 않으므로 설치해야합니다. 그런 다음 mkinitcpio.conf의 MODULES 배열에“btrfs”를 추가하고 다음을 사용하여 initramfs를 다시 작성해야합니다.

mkinitcpio -g /boot/initrd -k YOUR_KERNEL_VERSION

YOUR_KERNEL_VERSION 대신 무엇을 입력해야하는지 알려면

ls /lib/modules

커널을 업데이트하는 경우 재부팅하기 전에 initramfs를 다시 작성해야합니다.

그런 다음 RPi의 부팅 파일을 수정해야합니다.

cmdline.txt에는 다음이 있어야합니다.

root=/dev/mmcblk0p2 initrd=0x01f00000 rootfstype=btrfs

config.txt에서 추가해야합니다.

initramfs initrd 0x01f00000

모든 작업을 완료하고 btrfs RAID1 시스템으로 성공적으로 부팅 한 후 시스템 타이머 (선호) 또는 cron (dcron)을 사용하여 주기적 스크럽 (3-7 일마다)을 설정해야합니다.

btrfs scrub start /

파일 시스템에서 모든 파일의 체크섬을 비교하고 손상이 발견되면 수정 (올바른 사본으로 교체)합니다.

BTRFS RAID1, 단일 매체 및 Raspberry Pi의 조합은 이례적인 것입니다. 모든 조각을 모으는 데 시간과 노력이 필요했지만 여기에 있습니다.


부팅 할 때마다 'scrub'를 추가해야합니까?
SF.

@SF. 아니요, 필요하지 않습니다. X 일마다 정기적으로 스크럽하면 충분합니다. 바람직하게는 사용 시간이 가장 적은 시간 동안.
lockheed

죄송합니다. 이해가되지 않습니다. 만약 뚱뚱한 /boot파티션을 유지하더라도 여전히 initramfs를 수정해야합니까?
Bex

벡스 fat / boot 파티션이 아닌 btrfs의 raid1 기능과 관련이 있습니다.
lockheed

@@@ 업데이트 : @@@ 현재 RAID1 대신 dup-mode를 사용하려고 시도 할 수 있습니다. "mkfs.btrfs --data dup --metadata dup"하지만 RAID1만큼 탄력적이지는 않습니다. 단일 드라이브에서.
lockheed

10

플래시 스토리지는 여러 가지 이유로 마그네틱 스토리지보다 더 바람직하지만이 응용 프로그램에서는 주로 움직이는 부품이 없기 때문에 말할 것입니다. 즉, 거기에는 '손상 방지'파일 시스템이 없다고 생각하지만 강력한 파일 시스템 (ext4가 하나임)과 손상을 완화시키는 데 도움이되는 전술이 있습니다.

램 디스크

RPi의 이미지 를 변경할 필요 가없고 변경되지 않은 것처럼 들리거나 디스크에 쓰려고 시도하거나 시도하지 않으면 RAM에 압축을 푼 루트 파일 시스템을 사용해보십시오 . 여기서 아이디어는 부팅시 RAM에 압축이 풀린 압축 된 루트 파일 시스템이 있다는 것입니다. RAM 디스크에 대한 모든 변경 사항이 발생하므로 SD 카드에 쓰기가 사실상없고 부팅시 읽기만 가능합니다. 이것은 드라이브의 읽기 / 쓰기를 줄여서 드라이브 수명을 보존해야합니다. 이것은 CD에서 리눅스부팅 할 때하는 것과 비슷하며 , 리눅스가 부팅 할 때 가장 먼저 일어나는 일 중 하나입니다 .


10

다른 방법으로 가서 읽기 전용 파일 시스템을 사용합니다. sdcard에서 읽기-쓰기 루트 파일 시스템을 사용할 때 라즈베리 파이를 충분히 안정적으로 만들 수 없습니다. 커널 cmdline (ro)을 통해 루트를 부팅하거나 전체 시스템을 포함한 피기 백과 함께 initramfs를 사용할 수 있습니다.

두 가지 모두 내 수제 빌드 시스템 OpenADK로 만들 수 있습니다. ( http://www.openadk.org )


RO 파일 시스템은 도움이되지만 문제를 완전히 해결하지는 않습니다.
Piskvor

7

여기서 겪고있는 문제는 ext *와 같은 "현대"파일 시스템을 사용하면 SD 카드가 마모 될 가능성이 있다는 것입니다. 내 경험에서 1 년 이내에 발생하거나 내년에 더 높은 엔드를 취하면.

문제는 최신 파일 시스템이 항상 데이터 조각화를 방지하기 위해 블록을 이동한다는 것입니다. 디스크를 회전시킬 때 좋은 점은 캐시에 데이터를로드 할 때 모든 데이터를 대조하는 것입니다. 단점은 I / O가 많지 않을 때 정리 작업을 처리 할 때 캐시 할 수없는 더 많은 쓰기를 수행한다는 것입니다.

임베디드 장치를 디버깅 할 때 수행 할 수있는 많은 로깅을 처리 할 때도 발생합니다. 로깅 쓰기는 최악의 쓰기입니다. 정기적으로 발생하는 작은 쓰기가 많기 때문에 조각화가 많이 발생하기 때문입니다.

시스템이 센서의 데이터도 처리한다고 말하면 플래시가 올 때 플래시에 저장할 가능성이 높습니다. 로그 데이터만큼 나쁩니다.

나는 당신이 겪고있는 것과 같은 문제에 빠졌으며 여기에 내 결론이 있습니다. "더 강력한"것으로 판매 될 SD 카드, 즉 다른 것보다 더 많은 쓰기를 처리 할 수있는 SD 카드를 찾으려고했지만 SSD에 대한 벤치 마크와 달리, 그에 초점을 둔 시장에 대한 벤치 마크는 찾지 못했습니다. 속도에만 중점을두기 때문에 메모리 블록 당 쓰기 수와 SDCard에 사용 된 기술을 알 수 없습니다.

그러나 "산업"등급의 산 디스크는 더 이상 수명이 더 이상없는 것으로 나타났습니다. 더 많은 비용을 지불하면 더 많은 것을 얻는다는 것은 놀라운 일이 아닙니다.

그러나 결국 집중적 인 로깅이 활성화 된 상태에서 2 년 이상 지속되는 SD 카드는 없었으며 1 년 동안 가장 많은 사망이 발생했습니다.

내가 생각해 낸 솔루션은 @BigHomie 및 @wbx 솔루션입니다. 읽기 전용 extX 파일 시스템을 사용하십시오 (저널링이 더 이상 필요하지 않으므로 이전 ext2로 대체 할 수도 있습니다). 세션 내에서 로그를 유지하거나 임시 파일을 작성하려는 경우 언제든지 RAMDISK를 사용할 수 있습니다.

읽기 전용 파트 내에서 램 디스크에 데이터를 채워 세션에 맞게 편집 할 수 있도록 해주는 튜토리얼과 스크립트 만 있습니다.

NB : 제 경험은 비글 본에서 Angstrom Linux를 사용하여 20 대의 센서 장치를 시험 사용했습니다. 그 시스템의 로깅은 systemd의 저널 시스템을 사용하여 매우 장황했습니다.


4

리눅스는 많은 파일 시스템을 제공합니다. ext4 는 제가 더 확신하는 것입니다. 의심스러운 경우, ext4는 읽기-쓰기로 마운트 될 파티션에 사용해야합니다.

의 ext2 파일 시스템은 훨씬 더 취약하다. 읽기 전용으로 마운트하거나 올바르게 마운트 해제 할 수있는 시스템에 매우 적합한 파일 시스템입니다. 그러나 ext2 의 정전으로 인해 손상이 발생할 가능성이 큽니다 .

일부 Linux 버전에서는 jfs 파일 시스템이 신뢰할 수 없지만 다른 옵션은 jfs를 고려할 수 있습니다 . ext4 보다 jfs에서 손상이 적습니다 . Jfs 는 빠른 마운트 시간과 파일 시스템 검사 시간도 있습니다.


2
예, ext4는 훌륭하며 대부분의 서버에 사용합니다. 그러나이 질문은 sd 카드의 루트 시스템 용 파일 시스템에 관한 것 입니다. 이것은 다른 환경입니다. 당신의 조언은 일반적인 것입니까, 아니면 ext4 카드 사용에 대한 조언입니까?
guettli
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.