추상적인

추상적인

추상적인

때때로 Linux 커널은 외부 USB 저장 장치 드라이브의 쓰기 캐시를 인식하지 못합니다. 이 경우 이러한 장치를 분리하기 전에 이러한 캐시를 명시적으로 플러시해야 합니까?

WD Elements 외장 USB 하드 드라이브를 사용하고 있는데 다음과 hdparm -I같습니다.

...
Commands/features:
    Enabled Supported:
       ...
       *    Write cache
...

그리고 hdparm -W:

...
 write-caching =  1 (on)

반면에 드라이브를 연결하면 다음과 같은 커널 메시지가 나타납니다.

... No Caching mode page found
... Assuming drive cache: write through

~에 따르면이 답변Kyle Jones 작성 이러한 커널 메시지는 커널이 쓰기 작업이 플래터로 직접 이동한다고 가정함을 나타냅니다.

파일의 "write_cache (RW)" 섹션문서/블록/queue-sysfs.txt커널이 쓰기 캐시 모드를 가정한다는 것이 의미하는 바는 Linux 커널 문서에 설명되어 있습니다(감사합니다.웨인 콘래드):

... "write-through", ... 또한 커널에서 실행된 캐시 플러시를 제거합니다.

질문

지금까지 Linux 시스템에서 외부 USB 저장 장치를 분리하는 표준 방법은 탑재된 파티션을 모두 마운트 해제하고 드라이브의 LED가 깜박임을 멈출 때까지 기다린 다음 USB 커넥터가 꺼지지 않으면 물리적으로 USB 커넥터를 분리하는 것이었습니다. USB 저장 장치 전원 공급 장치(일부는 별도의 전원 공급 장치가 있음)는 명시적으로 전원을 끄는 장치입니다.

이 접근 방식은 안전합니까, 아니면 특히 캐시가 커널에 알려지지 않은 경우 드라이브의 쓰기 캐시에서 플러시되지 않은 데이터가 손실될 위험이 있음을 의미합니까?

후자의 경우 SCSI 동기화 명령을 보내 마운트 해제한 후 드라이브의 쓰기 캐시를 명시적으로 플러시하는 것이 좋습니다. 예를 들어, sg_syncsg3-utils와 함께 제공되는 명령을 사용하여 이 작업을 수행할 수 있습니다.

sg_sync <device>

이것으로 문제가 해결될까요? 아니면 장치에 SCSI 중지 명령을 실행하여 이를 보완해야 합니까?

후자를 사용할 수 있습니다(다시 sg3-utils와 함께):

sg_start 0 -r <device>

sg_sync이 목적에 적합한 도구 입니까 sg_start, 아니면 아래 관련 방법 섹션에서 언급한 도구 및 방법 중 하나를 사용하거나 문제를 처리하기 위해 다른 단계를 수행하는 것이 더 낫습니까?

이 질문의 관련성을 지적하려면 다음을 참조하세요.이 댓글합격 확인.

참고: 저는 주로 소프트웨어를 통해 하드 드라이브의 속도를 줄이거나 전원을 끄는 방법을 찾고 있지 않습니다. 이 점에서 드라이브의 플러그를 뽑고 전원 스위치를 사용하는 것이 꽤 안정적인 것으로 입증되었습니다. 대신 드라이브에 캐시된 데이터를 포함하여 드라이브가 종료되기 전에 기록된 모든 데이터가 비휘발성 저장소에 기록되었는지 확인하는 방법을 찾고 있습니다.

관련 방법

아래에서는 드라이브 캐시 플러시 또는 보다 일반적으로 이동식 저장 장치의 "안전한 삭제"와 관련하여 찾은 방법에 대한 몇 가지 설명을 제공합니다. 한 가지 측면은 기존 Linux 시스템과 관련된 도구의 가용성입니다. 누락된 소프트웨어를 단순히 설치하는 것이 항상 가능한 것은 아니기 때문에 이는 중요합니다.

데스크탑 환경:일부 데스크탑 환경에서는 외부 USB 저장 장치의 "안전한 제거"를 위한 위젯을 제공합니다. 예를 들어 다음 질문을 참조하세요.

그리고 관련 포스팅.

구현에 따라 이러한 위젯은 장치의 전원을 끄는 것처럼 보이지만 특히 커널이 외부 드라이브 캐시를 인식하지 못하는 경우 장치가 캐시를 조기에 플러시하는지 여부를 명확히 하는 참조를 찾지 못했습니다.

또한 많은 Linux 시스템(예: 순수 서버)에는 데스크톱 환경이 설치되어 있지 않습니다. 따라서 이 방법을 항상 사용할 수 있는 것은 아닙니다.

USB 플래시 드라이브:~에 따르면이 답변지미에 의해,udisksFreedesktop.org에서 제공명령줄에서 외부 USB 저장 장치 안전하게 제거를 사용할 수 있습니다.

udisks --unmount /dev/sda1
udisks --detach /dev/sda

이것좋은 대답Totor는 이 udisks --detach명령이 수행하는 작업을 설명합니다.

  • SCSI 동기화 캐시 명령 보내기,
  • SCSI 중지 명령을 보냅니다.
  • USB 저장소 커널 드라이버 바인딩을 해제합니다.
  • USB 장치 일시 중지(전원),
  • USB 포트에서 논리적으로 비활성화/제거합니다.

따라서 드라이브의 캐싱을 명시적으로 처리합니다. 그러나 udisks이는 내가 다루어야 하는 Linux 시스템의 약 절반에서만 작동합니다.

유디스크텔:최신 버전의 udisks는 위에 표시된 명령 udisksctl대신 이 프로그램을 제공합니다. udisks이는 다시 한 번 근거로 삼은 것입니다.지미의 대답:

udisksctl unmount -b <partition>
udisksctl power-off -b <device>

power-off동일한 답변은 명령의 설명도 인용합니다.udisksctl(1) 매뉴얼 페이지:

전원을 끄세요

드라이브를 안전하게 제거하고 전원을 끄도록 조치하십시오. 운영 체제 측에서는 드라이브를 사용하는 프로세스가 없는지 확인한 다음 실행 중인 버퍼와 캐시가 안정적인 저장소에 커밋되도록 요청하는 작업이 포함됩니다.

안타깝게도 이는 "실행 중인 버퍼 및 캐시"에 커널이 알지 못하는 외부 드라이브의 캐시가 포함되는지 여부를 지정하지 않습니다. 그러나 이 점에서는 udisksctl전작을 따를 가능성이 높습니다 .udisks

불행하게도 udisksctl기존 시스템의 가용성이 다소 낮다는 점에서는 이전 버전을 따릅니다(예를 들어 .umount

주입:~에 따르면맨페이지eject, 소프트웨어 제어 하에 이동식 미디어를 꺼내는 데 사용할 수 있는 명령줄 도구입니다 . 영향을 받은 파티션은 필요에 따라 조기에 마운트 해제됩니다.

이 도구는 이동식 미디어의 "안전한 제거"에 대한 여러 토론에 등장하지만 예제를 참조하세요.이 문제작성자: LGenzelis 및이 문제k.Cyborg는 이와 관련하여 제거 이상의 기능을 수행한다고 제안할 수 있는 것이 없다고 말합니다.

또한 이 도구는 장치보다 미디어 및 미디어 트레이에 더 중점을 두는 것 같습니다. 이것이 오류 메시지와 함께 죽는 이유일 수 있습니다.

eject: unable to eject

WD Elements USB 드라이브에 적용했을 때 위의 소개 예에서 언급했습니다. 그러나 일부 USB 스틱에서는 작동합니다.

그럼에도 불구하고 이 도구는 linux-utils의 일부로 가용성이 높습니다.

sg3-utils:이러한 절차는 위에서 논의 sg_sync되었습니다 sg_start.

이 댓글Ubuntu 버그 보고서에 따르면 udiskssg3-utils는 내부적으로 SCSI 동기화 및 중지 명령을 장치에 보내는 데 사용됩니다.

제 생각에는 sg3-utils가 udisk보다 사용성이 더 넓습니다. 하지만 이는 막연한 개인적인 감상일 뿐이다.

sdparm: 이 페이지작성자: Yan Li가 "Linux에서 USB 하드 드라이브를 안전하게 제거"하는 과정에 대해 설명합니다. 이를 위해 권장됩니다.대본원칙적으로 다음 sdparm명령을 사용하여 드라이브의 캐시를 플러시하고 USB HDD를 중지(회전?)하십시오.

sdparm --command=sync <device>
sdparm --command=stop <device>

이는 위에서 설명한 sg_sync및 명령과 동등한 것으로 보이며 sg_start후자에 대한 대안으로 사용할 수 있습니다.

hdparm:ATA 드라이브를 관리하기 위한 도구인 hdparmUSB 드라이브는 어떤 의미에서는 USB 드라이브에 대한 이물질입니다. USB 드라이브는 주로 Linux에서 SCSI 장치로 간주되기 때문입니다. WD Elements의 예와 같은 경우에는 SCSI-ATA 변환 계층(SAT 계층) 뒤에 ATA HDD가 있습니다. 바라보다이 답변저자: Mikko Rantalainen 자세히 알아보기. SAT 구현에 따라 hdparm이러한 드라이브는 제한된 기능으로 조작될 수 있습니다.

지원되는 경우 다음 명령을 사용할 수 있습니다.

hdparm -F <device>
hdparm -Y <device>

드라이브의 캐시를 플러시하고 드라이브를 중지합니다. 이것이 가능하지 않은 경우 다음을 사용하는 것이 좋습니다.

hdparm -W0 <device>

캐시를 새로 고치는 해결 방법. 하지만 주의하세요. 이 명령은 실제로 드라이브의 쓰기 캐싱을 끄도록 설계되었습니다. 따라서 단순히 지금까지 쌓인 캐시 내용을 삭제하기보다는 실제로 새로고침이 되는지 확인해야 합니다.

WD Elements 드라이브의 경우 이러한 명령 중 어느 것도 효과가 없습니다. 대신 bad/missing sense data.

시스템 파일 시스템:외부 USB 드라이브를 드라이버에서 바인딩 해제하거나, 시스템에서 드라이브 등록을 해제하거나, sysfs에서 Linux 커널에 의해 노출된 장치 속성을 조작하여 드라이브를 종료하는 방법이 웹에 흩어져 있습니다.

이것은 예이다이 게시물데비안 포럼의 bash를 통해:

echo "auto" > "/sys/bus/usb/devices/usb1/1-5/power/level"
echo "1-5:1.0" > /sys/bus/usb/devices/1-5\:1.0/driver/unbind

그리고

echo "1" > "/sys/bus/usb/devices/usb1/1-5/remove"

또는에서이 답변저자: 토니 조지

echo 'offline' > /sys/block/sdb/device/state
echo '1' > /sys/block/sdb/device/delete

나는 이러한 코드 조각을 판단하기 위해 이러한 속성을 사용하는 것과 관련하여 커널 개발자의 생각에 있는 개념에 대해 충분히 알지 못합니다. 그러나 커널이 알지 못하는 드라이브의 쓰기 캐시를 플러시하는 데 도움이 되는지 의심스럽습니다.

또한 이러한 조리법 중 적어도 일부는 오래된 것으로 보입니다. 이 점에 대해서는 "를 참조하십시오.시스템 파일 시스템 규칙2019년 1월 25일자 커널 문서에서:

커널에서 내보낸 sysfs는 내부 커널 구현 세부 정보를 내보내고 내부 커널 구조 및 레이아웃에 의존합니다. 커널 개발자는 Linux 커널이 안정적인 내부 API를 제공하지 않는다는 데 동의합니다. 따라서 sysfs 인터페이스의 일부 측면은 커널 버전에 따라 불안정할 수 있습니다.

제거하고 기다립니다.이것은 위의 질문에서 언급한 방법입니다. 마운트를 해제한 후 드라이브의 쓰기 활동이 최종적으로 멈출 때까지 기다리는 것이 포함됩니다. 다음이자 마지막 단계는 프로세스 중에 드라이브의 쓰기 캐시를 플러시하는 것입니다.

이 질문의 요점은 이것이 (데이터에 대한) 안전한 접근 방식인지 여부를 명확히 하는 것입니다.

어쨌든, 이 접근 방식의 가장 큰 장점 중 하나는 간단하고, 내가 아는 모든 Linux 시스템에서 작동하며, 명령 구문이 umount수십 년 동안 변경되지 않았다는 것입니다.

추가 읽기

USB 또는 기타 외부 저장 장치의 "꺼내기" 및 "안전한 제거"에 대한 일반적인 논의는 다음 질문과 관련하여 찾을 수 있습니다.

또한 루이스 알바라도(Luis Alvarado)는이 답변Ubuntu 데스크탑 환경에서 제공되는 마운트 해제, 꺼내기 및 드라이브 안전하게 제거 옵션, 특히 드라이브 안전하게 제거 간의 차이점은 단순한 제거 이상의 것입니다. 후자에 대해서는 다음을 참조하십시오.

많은 사람들이 외부 저장 장치가 마운트 해제되면 "안전하게 삭제"될 수 있다고 주장합니다. 여기 몇 가지 예가 있어요.

오프로드 외에도 일부 기여는 외장 HDD의 회전 속도를 줄이는 데 중점을 둡니다. 예시 보기이 문제Wincheden Springs를 통해. 존재하다이 댓글, sourcejedi는 USB 드라이브 속도를 늦추면 기계적 간섭에 대한 취약성을 줄일 수 있다고 지적합니다.

다른 사람들은 USB 드라이브를 끄는 것을 목표로 합니다.

다음 글에서는 저장 장치의 "안전한 제거"와 관련하여 드라이브의 캐시가 명시적으로 언급되어 있습니다.

후자는 외부 드라이브의 쓰기 캐싱에 대한 커널의 잘못된 가정으로 인해 발생할 수 있는 피해를 지적하는 유일한 기여입니다. 이것이 바로 이 질문에 관한 것입니다. 이 리뷰에 따르면 단순히 드라이브를 제거하는 것만으로는 이러한 손상을 방지할 수 없습니다. 자세한 내용과 가능한 올바른 접근 방식을 높이 평가하겠습니다.

답변1

우선, 이것은 훌륭하고 잘 쓰여진 질문입니다. OP에 엄지척! 안타깝게도 포인트가 부족하여 이 질문에 투표할 수 없습니다.

다음은 공식 SD 표준에 대해 제가 알고 있는 내용을 바탕으로 microSD 카드가 어떻게 작동하는지에 대한 간략한 요약입니다. 물론 이는 USB 저장 장치에서는 작동하지 않지만 잠재적인 문제에 대한 좋은 통찰력을 제공할 수 있습니다.

즉, microSD 카드에 제거 준비를 지시할 수 있지만 카드가 "제거 준비"라고 응답한 후에도 완전히 플러시되지 않을 수 있는 "보이지 않는" 내부 쓰기 캐시가 여전히 있을 수 있습니다. 주문하다. SD 표준에서는 이러한 동작을 카드 제조업체의 재량에 맡깁니다. 따라서 일반적으로 microSD 카드는 제거되기 전에 "보이지 않는" 쓰기 캐시를 플러시하는 불특정 기간을 가져야 합니다. 결론은 약 20초 정도 기다리는 것입니다.

또 다른 예는 Intel이 PCI Express 확장 카드 형태의 일부 엔터프라이즈급 SSD에 대해 공식적으로 말하는 것입니다. 시스템 전원을 켠 후 약 30분(정확한 시간은 잊어버린 1분) 동안 시스템을 다시 켜지 마십시오. 아래에. SSD는 온보드 커패시터를 전원으로 사용하여 자체적으로 일부 내부 유지 관리를 수행할 수 있으며, 이는 호스트 시스템의 전원을 켜고 SSD에 특정 작업을 수행하도록 요청해도 중단될 수 없습니다.

이 모든 점을 염두에 두고 umount(8)USB 저장 장치를 실행하고 사용한 후 잠시 기다렸다가 USB 저장 장치를 분리하는 것이 가장 좋습니다 eject(1). 달리는 것만으로도 충분했지만 그게 내가 한 일이다 eject(1). 특정 USB 저장 장치에서 쓰기 캐시 플러시(표시 또는 보이지 않음)가 어떻게 작동하는지에 대한 공식 저수준 설명을 찾을 수 있더라도 다른 USB 저장 장치는 내부적으로 최소한 약간 다른 방식으로 작동할 것이 거의 확실합니다. 이 중 어느 것도 보편적으로 사용할 수 없습니다.

실행하여 eject -v실제로 수행되는 작업을 확인할 수 있습니다.

답변2

이것은 실제로 더 큰 문제이며 이미 해결책이 있습니다. 이러한 디스크 쓰기 캐시로 인해 더 빠르게 수행되는 데이터베이스는 조정되지 않은 방식으로 사라질 때 제어할 수 없습니다. 즉, 커널: 일반적인 시스템에서는 디스크 쓰기 캐시가 누락될 때 데이터베이스가 루프에 있지 않습니다. 중요 행사들.

데이터베이스 시스템은 이러한 이벤트(패닉, 머신 검사, BIOS 예외 등) 중 대부분이 발생할 때 실행되는 NMI에 핸들러를 구현하여 개방형 시스템에 대한 책임과 제어 사이의 격차를 해소하려고 시도합니다. 인터럽트는 마스크할 수 없습니다. . ). 100% 실패를 다루지 않고, 그보다 더 나쁜 것은 절대 완벽한 것이 좋은 것의 적이 되도록 놔두지 마세요.

이 핸들러는 먼저 모든 디스크 캐시를 플러시한 다음 안정화 시간이 지난 후 로컬 멀티캐스트를 통해 클러스터의 파트너 노드에 "I'm Dying" 메시지를 보내 이러한 노드에서 몇 초의 시간 초과를 제거합니다. 시스템은 노드가 실제로 작동하는지 여부에 대해 다시 합의에 도달해야 합니다(암호화는 노드의 사망 소식을 절대적으로 신뢰할 수 있게 만듭니다). 네트워크 오류로 인해 멀티캐스트 메시지가 포착되면 여전히 하트비트가 필요합니다.

결과적으로 클러스터의 해당 노드 손실로부터의 분산 복구는 몇 밀리초(대부분의 경우) 내에 적용될 수 있으며 해당 노드의 디스크는 손실 복구 측면에서 거의 아무것도 수행할 필요가 없습니다. 디스크 캐시.

시간은 중요합니다.

       Availability = MTBF/(MTBF + MTTR)

[MTBF == 고장 전 평균 시간, MTTR == 수리까지의 평균 시간. ]

MTTR이 0에 가까워지면 가용성은 1에 가까워지고 무수히 많은 잠재적 실패 원인이 모두 배제됩니다. 따라서 MTTR이 해결해야 할 첫 번째 문제입니다.

물론, 데이터베이스에 뛰어난 로그 복구 기능(예: 무료 PostgreSQL 등)이 있고 백업에만 의존하지 않고 따라서 데이터베이스 상태와 일관되게 복구하지 못하는 경우 매우 낮은 MTTR을 제공할 수 있습니다. 실패와 초저 MTTR. 충돌 일관성이 있는 데이터베이스의 고가용성.

답변3

USB를 통해 연결된 외장 드라이브의 쓰기 캐시와 관련된 부팅 오류에 대한 답변을 인터넷에서 찾아보았습니다. 첫 번째 질문에 대답하려면 a) 예, USB를 분리하기 전에 버퍼/캐시를 플러시하는 것이 매우 중요합니다. 원하든 원하지 않든, 운영 체제가 모든 것이 하드 드라이브에 기록되도록 보장할 수 있도록 외부 USB 드라이브를 마운트 해제해야 한다고 제안합니다. b) 내가 읽은 모든 것을 읽고 바로 내 앞에서 답을 찾으십시오. "연속 쓰기를 가정할 때 캐시 페이지 코드를 찾을 수 없다는 오류가 발생한다고 생각합니다"(journalctl -b 명령을 사용할 때 발견됨)는 USB를 통해 연결된 외부 하드 드라이브에서 시스템을 부팅하는 데 내재되어 있습니다. 이것은 좋은 디자인 질문입니다! USB 장치는 언제든지 분리할 수 있습니다. 운영 체제에 대한 인식이 없거나 준비할 시간이 충분하지 않으면 데이터가 손상될 수 있습니다! 따라서 Journalctl에 의해 기록된 오류는 디자인의 일부이므로 무시됩니다. 나에게 있어 이러한 오류를 피하는 유일한 방법은 /etc/fstab을 통해 마운트하지 않고 플러그인에서 자동으로 마운트하도록 하는 것입니다.

관련 정보