전체 장치 제품군에 대한 USB "max_sectors" 값 변경

전체 장치 제품군에 대한 USB "max_sectors" 값 변경

저는 한동안 Linux를 사용해 왔지만 "최근" 배포판(예: Debian이 아닌 모든 배포판)을 사용하기 시작한 이후로 대부분의 USB 장치에서 I/O 문제가 발생하기 시작했습니다. 기본적으로 대량의 데이터를 쓰려고 하면 연결이 끊어지거나 자동으로 다시 시작됩니다. 시스템 로그에서 다음과 같은 유형의 메시지를 발견했습니다.

kernel: usb 1-7: reset high speed USB device using ehci_hcd and address 2
kernel: usb 2-1: device descriptor read/64, error -71
kernel: usb 2-4: new high speed USB device using ehci_hcd and address 13

이는 "펜 드라이브"와 USB로 연결된 하드 드라이브 모두에서 발생합니다. 크기 외에 어떤 장치가 손상되거나 손상되지 않을지 감지하는 데 유용한 패턴을 찾을 수 없습니다. 1GB 또는 2GB 펜 드라이브에서 이러한 메시지가 손상된 적이 없습니다(그러나 다시 말하지만 사람들은 그렇지 않습니다). 더 이상 판매하지 마세요.)

이러한 오류가 발생하면 드라이브를 물리적으로 분리할 때까지 작업을 수행 중인 모든 프로그램과 함께 드라이브에 대한 보류 중인 읽기가 잠깁니다. 물론, 드라이브를 다시 연결한 후 파일이나 파티션이 손상되었음을 발견하여 많은 작업 비용이 발생하고 다른 작업을 수행할 수밖에 없었습니다.

연구를 통해 나는 다음과 같은 것을 발견했습니다.건축 위키피디아 또는 SUSE 포럼 또는 심지어이 커뮤니티범인을 나타내는 것은 USB 트리 속성의 기본값으로, max_sectors한 번에 USB 드라이브에 읽거나 쓸 수 있는 데이터의 양을 지정합니다. 드라이브가 지원하는 것 이상으로 장치가 재설정되거나 충돌합니다. 나는 240Linux()의 값이 확실히 이 문제로 고통받지 않는 이전 커널이나 Windows 설치(심지어)에 비해 너무 높다는 언급을 발견했습니다.12864

나는 "눈이 번쩍 뜨이는" 속도(대부분의 사람들이 그러기를 바랍니다!)보다 데이터 무결성을 더 중요하게 생각하기 때문에 어떻게든max_sectors"모든" USB 저장 장치의 값 변경여기서 "모두"는 사용자 지정 명령이나 규칙을 작성하지 않아도 될 정도로 충분하다는 의미입니다. 불행하게도 제가 시도한 곳에서는 USB 자동 일시 중단과 달리 이 값을 변경하는 구성 라인이나 커널 부팅 옵션을 찾을 수 없습니다.

내가 놓친 것은 무엇이며, 다음에 무엇을 할 수 있습니까? 나는 udev다음과 같이 system 을 사용하여 다음과 같은 것을 자동으로 작성할 수 있다는 것을 알고 있습니다.

SUBSYSTEMS=="usb", DRIVERS=="usb-storage", ATTRS{manufacturer}=="Some Company", ATTRS{serial}=="xxxxxxxxxx", ATTRS{max_sectors}=="240", ATTRS{max_sectors}="128"

그런 다음 서비스를 다시 로드하거나 다시 시작했지만 찾을 수 없습니다.일반적인가능한 한 많은 장치에 적합한 충분한 udev규칙입니다(USB 플러그를 통해 연결되어 있는 경우). 복원하거나 보관하려는 장치에 대해 더 구체적인 규칙을 작성할 수 있다는 것을 알고 있지만 max_sectors여기서는 일종의 와일드카드에만 관심이 있습니다.

일부 속성에서는 와일드카드를 사용해 보았지만 ATTRS{manufacturer}=="* "소용이 없었습니다.

udev가능한 한 많은 USB 연결 장치를 일치시킬 수 있는 일반적인 규칙은 무엇입니까? 이것이 소프트웨어를 통해 이 문제를 처리하는 "올바른" 방법입니까? (USB 2.0 모듈 제거 - 예: Ubuntu 포럼 제안 - 적어도 Fedora가 이를 커널에 통합한 것으로 보이기 때문에 옵션이 아닌 것 같습니다.)


편집하다:frostschutz가 제안한 대로 속성을 설정하기 위해 이것을 사용하고 RUN+=있으며 실제로 작동합니다( 를 사용하는 것과는 달리 ATTR=). 이것이 해결책의 절반입니다. 거의 모든 것에 일치하는 udev 규칙을 만들 수 있었지만 너무 많이 일치하는 것은 아닌지 걱정됩니다.

SUBSYSTEMS=="usb", DRIVERS=="usb-storage",  \
 RUN+="/bin/sh -c 'echo 64 > /sys/block/%k/device/max_sectors'"

이 규칙의 문제점은 max_sectors64 미만의 값을 가진 장치를 포함하여 모든 것에 대해 설정한다는 것입니다. 나는 그것을 좀 더 구체적으로 만들려고 노력합니다:

SUBSYSTEMS=="usb", DRIVERS=="usb-storage", ATTRS{max_sectors}=="240", \
 RUN+="/bin/sh -c 'echo 64 > /sys/block/%k/device/max_sectors'"

그러나 이것은 작동하지 않습니다. 나는 udev 규칙의 올바른 범위를 사용하고 있다고 생각합니다(트리의 일부를 사용하고하나아버지). 내가 뭘 잘못했나요?

편집 2: 아래 답변을 수락하세요. 이렇게 하면 RUN+=문제가 해결되지만 ATTRS{…}=어떤 이유로 사용하면 문제가 해결되지 않는 것으로 나타났습니다 . 또한 일반적인 규칙을 작동시키지 못한 이유는 udev 맨페이지를 오해했기 때문입니다. 규칙이 있어야 해최대속성은 다음에서 제공됩니다.하나상위 - 이는 두 부분을 사용하려면 두 번째 부분이 실제 장치여야 함을 의미합니다. 이 두 가지는 기본적으로 완벽하게 작동합니다.

SUBSYSTEM=="scsi", ATTRS{max_sectors}=="240", \
 RUN+="/bin/sh -c 'echo 64 > /sys/block/%k/device/max_sectors'"

(속성의 개수가 단수라는 점에 유의하세요. 첫 번째 속성은실제USB 장치와 두 번째 장치하나의장치 트리 조상)

SUBSYSTEMS=="usb", DRIVERS=="usb-storage", ATTRS{max_sectors}=="240", \
 RUN+="/bin/sh -c 'echo 64 > /sys/block/%k/device/max_sectors'"

(이것은동일한장치 트리 조상)

다음을 수행할 수도 있습니다.(확인에는 ==를 사용하고 할당에는 =를 사용하십시오):

하위 시스템 == "scsi", ATTRS{max_sectors} == "240", ATTRS{max_sectors} == "64"

내 시스템(Mageia 4, 3.14.24 코어 i7)에서는 Kingston DT101 G2 16GB의 쓰기 속도(2MB/초)가 극도로 느려서 반대 작업을 수행해야 했습니다. vi /usr/lib/udev/rules.d/ 81-udisks_maxsect .rules 및 추가:

하위 시스템 == "scsi", ATTR {max_sectors} == "240", ATTR {max_sectors} = "32678"

그리고 dd 쓰기는 3배 더 빨랐습니다. :-) mc cp는 아마도 10-20배 더 빨랐을 것입니다(첫 번째 파티션 @8192번째 섹터를 시작하고 64k 정렬 클러스터로 다시 포맷한 후). mkfs.vfat /dev/sdh1 -n KINGSTON16G -s 128 -R 4592 그리고 사용 fsck.vfat -v /dev/sdh1 기본 mas_sectors(240)와의 정렬을 확인하면 일부 값싼 새 드라이브에서 높은 쓰기 증폭이 발생하는 것 같습니다. 그러나 이렇게 높은 설정을 사용할 때는 매우 주의해야 합니다. 2048개 섹터에서도 비슷한 효과를 얻을 수 있습니다.

하위 시스템 == "scsi", ATTR{max_sectors} == "240", ATTR {max_sectors} == "2048"

기존 USB 장치를 모두 테스트해 보세요. 여전히 잘 작동합니다. 보다 구체적으로 지정하려면 규칙 파일의 공급업체/모델 속성을 사용하세요.

답변1

해결해야 할 하드웨어 문제인 것 같습니다. 전원 공급 USB 허브(전원 관련 문제인 경우), 다른 USB 케이블, 전면 패널 없음, 다른 USB 컨트롤러(추가 카드),...

여전히 신뢰할 수 없는 경우 syncUSB 미디어를 사용하여 설치 옵션을 선택할 수 있습니다. 이렇게 하면 캐싱이 발생하지 않지만 결과적으로 성능에 큰 영향을 미칠 수 있습니다. 또한 (플래시 드라이브의 경우) 추가 쓰기가 가능합니다(예: 파일을 생성하고 즉시 삭제하는 경우 비동기를 사용하면 파일이 먼저 기록되지 않지만 동기화를 사용하면 모든 것이 항상 즉시 기록됩니다).

관련 정보