SSD 드라이브의 ext3 파티션에서 갑작스런 전원 손실 파일 시스템 손상이 "예상 동작"입니까?


13

우리 회사는 내장 SSD 드라이브의 ext3 파티션에서 부팅하는 내장 Debian Linux 장치를 만듭니다. 장치는 내장 된 "블랙 박스"이므로 일반적으로 외부 스위치를 통해 장치의 전원을 차단하여 무례한 방식으로 종료됩니다.

일반적으로 ext3의 저널링은 일을 순서대로 유지하므로 로그 파일의 일부가 손실되는 경우를 제외하고는 일이 잘 진행됩니다.

그러나 최근 우리는 여러 하드 사이클 후 ext3 파티션이 구조적 문제를 일으키기 시작하는 여러 단위를 보았습니다. 특히 ext3 파티션에서 e2fsck를 실행하면 이와 같은 여러 가지 문제가 발견됩니다. 이 질문의 맨 아래에있는 출력 목록에 표시됩니다. 오류보고가 중지되거나 파티션을 다시 포맷 할 때까지 e2fsck를 실행하면 문제가 해결됩니다.

내 질문은 ... 갑작 스럽거나 예기치 않은 종료가 많이 발생한 ext3 / SSD 시스템에서 이와 같은 문제를 발견하면 어떤 영향을 미칩니 까?

내 생각은 (버그 또는 하드웨어 문제를 제외하고) ext3의 저널링 기능이 이러한 종류의 파일 시스템 무결성 오류를 방지한다고 가정하기 때문에 시스템에서 소프트웨어 또는 하드웨어 문제의 징후 일 수 있습니다. (참고 : 사용자 데이터가 저널링되지 않았기 때문에 munged / missing / truncated user-file이 발생할 수 있음을 이해합니다. 특히 아래에 표시된 것과 같은 파일 시스템 메타 데이터 오류에 대해 이야기하고 있습니다)

반면, 저의 동료는 SSD 컨트롤러가 때때로 쓰기 명령의 순서를 바꾸고 ext3 저널이 혼동 될 수 있기 때문에 이것이 알려진 / 예상 된 동작이라고 말합니다. 특히, ext3 저널은 정상적으로 작동하는 하드웨어 및 버그가없는 소프트웨어라고하더라도 파일 시스템이 손상 될 가능성이 적고 불가능하지 않다고 믿기 때문에 때때로 이와 같은 문제를보고 놀랄 필요는 없습니다.

우리 중 어느 것이 옳습니까?

Embedded-PC-failsafe:~# ls
Embedded-PC-failsafe:~# umount /mnt/unionfs
Embedded-PC-failsafe:~# e2fsck /dev/sda3
e2fsck 1.41.3 (12-Oct-2008)
embeddedrootwrite contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Invalid inode number for '.' in directory inode 46948.
Fix<y>? yes

Directory inode 46948, block 0, offset 12: directory corrupted
Salvage<y>? yes

Entry 'status_2012-11-26_14h13m41.csv' in /var/log/status_logs (46956) has deleted/unused inode 47075.  Clear<y>? yes
Entry 'status_2012-11-26_10h42m58.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47076.  Clear<y>? yes
Entry 'status_2012-11-26_11h29m41.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47080.  Clear<y>? yes
Entry 'status_2012-11-26_11h42m13.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47081.  Clear<y>? yes
Entry 'status_2012-11-26_12h07m17.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47083.  Clear<y>? yes
Entry 'status_2012-11-26_12h14m53.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47085.  Clear<y>? yes
Entry 'status_2012-11-26_15h06m49.csv' in /var/log/status_logs (46956) has deleted/unused inode 47088.  Clear<y>? yes
Entry 'status_2012-11-20_14h50m09.csv' in /var/log/status_logs (46956) has deleted/unused inode 47073.  Clear<y>? yes
Entry 'status_2012-11-20_14h55m32.csv' in /var/log/status_logs (46956) has deleted/unused inode 47074.  Clear<y>? yes
Entry 'status_2012-11-26_11h04m36.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47078.  Clear<y>? yes
Entry 'status_2012-11-26_11h54m45.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47082.  Clear<y>? yes
Entry 'status_2012-11-26_12h12m20.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47084.  Clear<y>? yes
Entry 'status_2012-11-26_12h33m52.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47086.  Clear<y>? yes
Entry 'status_2012-11-26_10h51m59.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47077.  Clear<y>? yes
Entry 'status_2012-11-26_11h17m09.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47079.  Clear<y>? yes
Entry 'status_2012-11-26_12h54m11.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47087.  Clear<y>? yes

Pass 3: Checking directory connectivity
'..' in /etc/network/run (46948) is <The NULL inode> (0), should be /etc/network (46953).
Fix<y>? yes

Couldn't fix parent of inode 46948: Couldn't find parent directory entry

Pass 4: Checking reference counts
Unattached inode 46945
Connect to /lost+found<y>? yes

Inode 46945 ref count is 2, should be 1.  Fix<y>? yes
Inode 46953 ref count is 5, should be 4.  Fix<y>? yes

Pass 5: Checking group summary information
Block bitmap differences:  -(208264--208266) -(210062--210068) -(211343--211491) -(213241--213250) -(213344--213393) -213397 -(213457--213463) -(213516--213521) -(213628--213655) -(213683--213688) -(213709--213728) -(215265--215300) -(215346--215365) -(221541--221551) -(221696--221704) -227517
Fix<y>? yes

Free blocks count wrong for group #6 (17247, counted=17611).
Fix<y>? yes

Free blocks count wrong (161691, counted=162055).
Fix<y>? yes

Inode bitmap differences:  +(47089--47090) +47093 +47095 +(47097--47099) +(47101--47104) -(47219--47220) -47222 -47224 -47228 -47231 -(47347--47348) -47350 -47352 -47356 -47359 -(47457--47488) -47985 -47996 -(47999--48000) -48017 -(48027--48028) -(48030--48032) -48049 -(48059--48060) -(48062--48064) -48081 -(48091--48092) -(48094--48096)
Fix<y>? yes

Free inodes count wrong for group #6 (7608, counted=7624).
Fix<y>? yes

Free inodes count wrong (61919, counted=61935).
Fix<y>? yes


embeddedrootwrite: ***** FILE SYSTEM WAS MODIFIED *****

embeddedrootwrite: ********** WARNING: Filesystem still has errors **********

embeddedrootwrite: 657/62592 files (24.4% non-contiguous), 87882/249937 blocks

Embedded-PC-failsafe:~# 
Embedded-PC-failsafe:~# e2fsck /dev/sda3
e2fsck 1.41.3 (12-Oct-2008)
embeddedrootwrite contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Directory entry for '.' in ... (46948) is big.
Split<y>? yes

Missing '..' in directory inode 46948.
Fix<y>? yes

Setting filetype for entry '..' in ... (46948) to 2.
Pass 3: Checking directory connectivity
'..' in /etc/network/run (46948) is <The NULL inode> (0), should be /etc/network (46953).
Fix<y>? yes

Pass 4: Checking reference counts
Inode 2 ref count is 12, should be 13.  Fix<y>? yes

Pass 5: Checking group summary information

embeddedrootwrite: ***** FILE SYSTEM WAS MODIFIED *****
embeddedrootwrite: 657/62592 files (24.4% non-contiguous), 87882/249937 blocks
Embedded-PC-failsafe:~# 
Embedded-PC-failsafe:~# e2fsck /dev/sda3
e2fsck 1.41.3 (12-Oct-2008)
embeddedrootwrite: clean, 657/62592 files, 87882/249937 blocks

모두 ext4 또는 ZFS로 변경하려고 생각 했습니까?
— mdpc December

적어도 ext4로 변경하는 것에 대해 생각했습니다.이 문제를 해결하는 데 도움이됩니까? ZFS가 여전히 더 나을까요?
— Jeremy Friesner

1
어느 옵션도이 문제를 해결하지 못합니다. 우리는 여전히 ZFS에서 수퍼 커패시터가있는 장치를 사용하며 서버 응용 프로그램의 ext4에는 배터리 또는 플래시 보호 캐시가 권장됩니다.
— ewwhite

답변:


11

둘 다 잘못되었을 수도 있습니다 (아마?) ... ext3은 기본 저장소를 갑자기 제거하여 최대한 최선을 다하고 있습니다.

SSD에는 아마도 온보드 캐시가 있습니다. 사용중인 SSD의 제조업체 / 모델에 대해서는 언급하지 않았지만 이는 소비자 수준 SSD와 엔터프라이즈 또는 산업 등급 모델 과 비슷합니다 .

어느 쪽이든, 캐시는 드라이브의 쓰기를 통합하고 수명을 연장시키는 데 사용됩니다. 전송 중에 쓰기가있는 경우 갑작스런 전원 손실이 분명히 손상의 원인입니다. 진정한 엔터프라이즈 및 산업용 SSD에는 배터리 지원 및 플래시 지원 RAID 컨트롤러 캐시 작동 방식과 매우 유사한 방식으로 데이터를 캐시에서 비 휘발성 스토리지로 이동하기에 충분한 전력을 유지하는 슈퍼 커패시터 가 있습니다 .

드라이브에 수퍼캡이 없으면 기내 트랜잭션이 손실되어 파일 시스템이 손상됩니다. ext3은 모든 것이 안정적인 스토리지에 있다고 말하고 있지만 이는 캐시의 기능 일뿐입니다.


당신과이 문제를 제기 한 모든 사람에게 죄송하지만, 당신은 틀 렸습니다. 진행중인 쓰기 손실을 처리하는 것은 저널을위한 것입니다. 드라이브가 쓰기 캐시가 있는지 여부를 올바르게보고하고 플러시하는 명령을 준수하는 한 저널은 메타 데이터가 일치하지 않도록 보장합니다. 수퍼캡 또는 배터리 지원 RAID 캐시 만 있으면 장벽을 활성화하지 않고도 쓰기 캐시를 활성화 할 수 있으므로 데이터 정확성을 유지하기 위해 일부 성능이 저하됩니다.
— psusi

@psusi 사용중인 SSD가 캐시를 명시 적으로 활성화했거나 OS_level 설정에 관계없이 내부 버퍼를 사용합니다. 해당 캐시의 데이터는 수퍼 커패시터 지원 SSD 가 보호하는 것입니다.
— ewwhite

IO 장벽을 활성화하면 캐시의 데이터를 보호 할 필요가 없습니다. 대부분의 소비자 유형 드라이브는 기본적으로 쓰기 캐싱이 비활성화되어 제공되며 OS가주의하지 않으면 손상 문제가 발생하기 때문에 원하는 경우 활성화해야합니다.
— psusi

2
@pusi Old, 지금 당신은 이것에 대해 언급합니다 : as long as the drive correctly reports whether it has a write cache and obeys commands to flush it, the journal guarantees that the metadata will not be inconsistent.그것은 오래된 디스크를 가정하는 경향이있는 스토리지 컨트롤러 때문에 SSD 는 때때로 데이터가 플러시되는지 에 대한 거짓말 을합니다. 그 슈퍼 캡이 필요합니다.
— Joel Coel

2

당신이 옳고 동료가 틀 렸습니다. 저널에 문제가 발생하지 않으면 fs 메타 데이터가 일치하지 않습니다. hdparm드라이브의 쓰기 캐시가 활성화되어 있는지 확인할 수 있습니다 . 켜져 있고 IO 장벽을 활성화하지 않은 경우 (ext3에서는 기본적으로 꺼져 있고 ext4에서는 기본적으로 켜져 있음) 이것이 문제의 원인 일 수 있습니다.

일관성을 유지하기 위해 올바른 시간에 드라이브 쓰기 캐시를 강제로 플러시하기 위해서는 장애가 필요하지만 일부 드라이브는 제대로 작동하지 않으며 쓰기 캐시가 비활성화 된 경우 쓰기 캐시가 비활성화되었다고보고하거나 flush 명령을 자동으로 무시합니다. 이는 저널이 작업을 수행하지 못하게합니다.


독해에 대한 -1 ...
— ewwhite

@ewwhite, 어쩌면 당신은 읽기를 시도해야하고, 실제로 대신 유치 모욕의 유용한 답변을 작성.
— psusi December

+1이 답변은 다른 품질 관리의 다른 답변과 마찬가지로 개선 될 수 있습니다. 그러나 최소한 약간의 힌트와 힌트를 제공합니다. @downvoters : 답변을 개선하거나 가능한 흐름에 대해 의견을 제시하지만 적절한 근거없이이 답변을 내리는 것은 역겨운 일입니다!
— Alberto
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.