저는 Raspberry Pi용 Pi 커널 5.10.92(64비트) 기반의 사용자 지정 buildroot Linux 커널을 사용하고 있습니다. 저는 이 이미지를 두 개의 다른 제조업체의 마이크로 SD 카드에 플래시하고 맞춤형 Pi CM4 PCBA에 설치했습니다.
일부 SD 카드는 몇 주 사용 후 부팅할 수 없게 됩니다. SD 카드를 Linux 시스템에 삽입하고 실행하면 dmesg
다음이 표시됩니다.
sd 2:0:0:1: [sdd] 61069312 512-byte logical blocks: (31.3 GB/29.1 GiB)
sd 2:0:0:1: [sdd] Write Protect is on
sd 2:0:0:1: [sdd] Mode Sense: 23 00 80 00
sdd: sdd1 sdd2 sdd3 sdd4
참고 사항: 하드웨어 사용으로 인해 운영 체제는 12시간마다 자동으로 재부팅됩니다. U-boot는 이중 파티션(A/B) 장애 조치 시나리오를 활성화하는 pi 부트로더의 대상입니다. 환경( CONFIG_ENV_IS_IN_MMC=y
), CONFIG_ENV_SIZE=0x4000
, CONFIG_ENV_OFFSET=0x1000000
)을 확인하고 이미지 레이아웃은 다음과 같습니다. 처음 4MB는 u-boot의 환경 부팅 파티션(fat32)을 위해 예약되어 있습니다. Rootfs A(ext4) Rootfs B(ext4) 영구 데이터 파티션(ext4)
다른 Linux 시스템에서 각 파티션을 개별적으로 마운트하려고 하면 부팅 파티션( /dev/sdd1
)이 읽기 전용으로 마운트됩니다. 다른 세 개의 ext4
파티션 에 대해서는 dmesg
다음이 표시됩니다.
EXT4-fs (sdd2): INFO: recovery required on readonly filesystem
EXT4-fs (sdd2): write access unavailable, cannot proceed (try mounting with noload)
이 옵션을 사용하여 설치하더라도 noload
장치는 FAT32 부팅 파티션처럼 쓰기 금지 및 읽기 전용 마운트로 계속 보고됩니다.
전체 블록 장치가 읽기 전용이 되는 원인이 무엇인지 이해하려고 노력 중입니다. 현재 더 많은 SD 카드에서 이 문제를 재현할 수 있는 일관된 방법을 찾지 못했기 때문에 이 문제를 재현하기 위한 제안을 주시면 대단히 감사하겠습니다. 같은 시간 이상 문제 없이 사용된 다른 SD 카드도 있습니다.
답변1
SD 카드의 메모리 컨트롤러가 더 이상 미디어에 쓸 수 없도록 결정한 것 같습니다.
가장 가능성이 높은 원인은 마모 수준 블록이 부족하다는 것입니다.
플래시 메모리는 본질적으로 개별적으로 충전되지 않거나 충전된 상태로 둘 수 있는 대규모 커패시터 배열입니다. 커패시터에 전하가 저장되는지 여부는 저장된 비트를 나타냅니다.
커패시터를 "방전"하려면 더 높은 전압이 필요합니다.
SD 카드는 NAND형 플래시 메모리로 구성되어 있으며 블록 삭제 작업만 지원합니다. 그 결과 아래와 같이 단일 바이트에 대한 쓰기 작업이 수행됩니다(자세한 설명은여기):
- 이 바이트의 전체 블록을 SD 카드 내부 RAM으로 읽습니다.
- 전체 플래시 블록 삭제
- RAM의 블록 내의 바이트를 수정하고
- 결과를 Flash의 블록에 다시 쓰기
이제 문제는 이러한 지우기/쓰기 주기가 활발하게 수행된다는 것입니다.다운그레이드기억 세포. 동일한 셀에 대해 무한정 자주 이 작업을 수행할 수는 없습니다! 불행하게도 파일 시스템이 그런 일을 하는 경향이 있습니다. 내 파일 시스템에는 파일 이름, 날짜 및 속성이 저장되는 명시적 블록이 있으며 내 프로그램은 다른 프로그램보다 특정 파일 위치에 더 자주 쓸 수 있습니다. 플래시를 강조합니다!
이제 이를 수행하는 간단한 방법이 있습니다. 전체 블록을 어떻게 삭제하는지 아시겠습니까? 이 시점에서는 원래 블록을 재사용해도 실질적인 이점이 없습니다. 다른 지워진 블록도 마찬가지입니다. 따라서 우리는 자주 기록되지 않는 블록만 사용합니다. 그런 다음 논리 블록이 저장된 위치를 테이블에 표시합니다.
저것웨어 레벨링플래시 메모리 장치의 수명을 대폭 연장합니다. 그러나 한계가 있습니다. 로그, 백업, 데이터베이스(특히 스토리지의 작은 청크를 업데이트하는 데이터)와 같은 대량의 데이터를 정기적으로 작성하는 경우, 아무리 작더라도 캐시하지 않으면 전체 청크 업데이트입니다. 업데이트 수행 다중 작업 쓰기는 커패시터가 충분히 "누설"되게 만들고(판독 전압을 충분히 신뢰할 수 없게 됨) 저장된 데이터를 잃게 됩니다. SD 카드 컨트롤러는 이러한 문제를 방지하는 데 충분히 도움이 됩니다. 데이터를 쓰고 해당 데이터를 잃는 것은 저장할 수 없다는 것을 아는 것보다 더 나쁩니다.
새 SD 카드를 구입하고 싶을 수도 있습니다. 앞으로는 다음과 같은 몇 가지 작업을 수행할 수 있습니다.
- 쓰기 압력을 줄입니다
- 파일 시스템에 파일 액세스 시간 저장 비활성화
- 저장할 필요가 없는 로그는 작성하지 마세요.
- 무작위 덮어쓰기/안정적인 업데이트 저장소는 시스템 부팅 SD 카드가 아닌 USB를 통해 연결된 SSD에 속합니다.
- 나는 이것이 CM PCBA라고 말한 것을 완전히 알고 있습니다. 따라서 "단지 USB 장치를 추가하는 것"에는 약 30유로로 240GB 외부 SSD보다 더 많은 비용이 들 수 있습니다.
- 메모리 컨트롤러에 자유를 부여하세요
- nvme 또는 SATA를 통해 연결된 SSD인 경우 이를 사용하여
fstrim
ext4 파일 시스템에 여유 공간을 생성하는 작업 후 SD 카드의 어떤 블록이 사용되지 않은 것으로 간주될 수 있는지 플래시 컨트롤러에 알릴 수 있습니다. 이는 재사용 가능한 블록 힙으로 직접 이동됩니다.
- nvme 또는 SATA를 통해 연결된 SSD인 경우 이를 사용하여