하나의 USB 드라이브에서 다른 여러 드라이브로 파일을 복사하는 bash 스크립트를 만들고 있습니다.
Xubuntu만 실행하는 구형 시스템에서는 아무런 문제 없이 30개의 장치를 감지할 수 있습니다. USB 2.0 포트만 있습니다.
Linux Mint를 실행하는 또 다른 최신 컴퓨터는 한 번에 16개 이상의 드라이브를 감지할 수 없습니다. USB 3.0 포트만 있습니다. 16개가 넘는 드라이브를 연결하면 새 드라이브가 더 이상 lsblk에 표시되지 않습니다.
이유는 무엇입니까?
편집하다:
fduff가 지적했듯이 17번째 USB 드라이브를 연결한 후 dmesg를 확인했는데 다음과 같이 표시되었습니다.
[ 531.519845] usb 3-9.3.2.6: new high-speed USB device number 46 using xhci_hcd
[ 531.974582] usb 3-9.3.2.6: New USB device found, idVendor=abcd, idProduct=1234
[ 531.974585] usb 3-9.3.2.6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 531.974586] usb 3-9.3.2.6: Product: UDisk
[ 531.974587] usb 3-9.3.2.6: Manufacturer: General
[ 531.974588] usb 3-9.3.2.6: SerialNumber: Љ
[ 531.975337] usb 3-9.3.2.6: Not enough host controller resources for new device state.
[ 531.975340] usb 3-9.3.2.6: can't set config #1, error -12
이는 하드웨어 제한처럼 보일 수 있지만 허용되는 USB 장치 수는 일정하지 않습니다.
예를 들어, 이제 15개가 넘는 USB 드라이브를 연결할 수 없습니다(16번째 USB 드라이브에서 오류 -12). 이전에는 약 20개의 장치를 연결할 수 있었는데 모두 올바르게 검색되었습니다.
여러 USB 컨트롤러에 사용량을 분산시키기 위해 다른 USB 포트를 사용해 보았지만 성공하지 못했습니다.
내 하드웨어 사양:
MB: ASRock Z97 Extreme6
CPU: Intel Core i5-4690K
GPU: MSI GeForce GTX 960 2GB
RAM: HyperX Fury Black 8GB [2x4GB 1600MHz DDR3 CL10 DIMM]
PSU: Chieftec GPS-500A8 [500W]
Display: 2x AOC I2276VWM [IPS, 1920x1080]
HDD: WD Blue 3TB
또한 28포트 Manhattan USB 허브를 사용합니다. https://www.amazon.com/Manhattan-Port-USB-Hub-161718/dp/B0074024XU
LiveCD(USB 드라이브)에서 Xubuntu를 실행하는 저가형 PC는 29개의 장치(LiveCD 드라이브를 포함해 30개)를 감지하고 파일 전송을 수행할 수 있었습니다. 어느 시점에서 HDD에 Windows XP가 설치되어 있었지만 28포트 허브를 감지합니다. 해당 컴퓨터는 고장이 나서 지금 서비스를 받고 있습니다(PSU 또는 MB일 것으로 예상됩니다). 그래도 작동하지만 반짝이는 새 제품은 작동하지 않습니다.
답변1
이는 하드웨어 관련 문제일 수 있습니다. 나는 이것을 찾았다인텔 포럼:
8 시리즈 마더보드의 경우 최대 엔드포인트는 96개입니다. 각 USB 장치는 여러 엔드포인트를 지원할 수 있으며 지원 가능한 엔드포인트 수는 장치마다 다릅니다. 최대 엔드포인트에 도달하면 팝업 메시지가 표시됩니다. 제한은 지원되는 장치 수가 아니라 엔드포인트를 기준으로 합니다.
그리고
중요한 것은 장치 수가 아니라 해당 장치가 사용하는 엔드포인트 수입니다. USB 3.0 포트에 문제가 있다는 것은 USB 2.0 eHCI 컨트롤러가 아닌 xHCI 컨트롤러가 사용된다는 의미입니다. Intel xHCI 컨트롤러는 eHCI 컨트롤러보다 제한 사항이 낮습니다. xHCI 컨트롤러의 경우 96개의 엔드포인트가 있습니다. 이 끝점 한도에 도달한 것 같습니다. Microsoft의 USB 유틸리티 "USBVIEW"와 같은 도구를 사용하여 각 USB 장치에서 사용 중인 엔드포인트 수를 표시할 수 있습니다.
장치를 여러 USB 컨트롤러에 배포하는 것 외에는 할 수 있는 일이 많지 않습니다. 물론 이는 마더보드에 여러 개의 USB 컨트롤러가 있는지 여부와 어떤 물리적 USB 커넥터가 어떤 USB 컨트롤러로 라우팅되는지 확인할 수 있는지 여부에 따라 달라집니다(역시 USBVIEW가 유용할 수 있음).
포럼 게시물을 자세히 살펴보는 것은 흥미롭습니다.
다음 명령을 사용하여 나열된 엔드포인트 수를 확인할 수 있습니다.
lsusb -v | grep bEndpointAddress | wc -l
답변2
이 문제는 많은 장치를 처리할 수 없는 기본 USB 하드웨어 컨트롤러에서 발생합니다. Linux 소스 코드는 인터페이스를 구성하려고 할 때 xHC가 "리소스 오류" 코드를 반환했음을 보여줍니다. xHCI 표준의 4.4.6장에서는 이러한 상황을 설명합니다.
필수 리소스 변수는 사용 가능한 리소스 변수와 비교되며, 명령이 리소스를 초과 구독했다는 결과가 나타나면(예: 사용 가능한 리소스 - 필수 리소스가 0보다 작음) 명령이 실패하고 리소스 오류 완료 코드가 표시되어야 합니다. 명령 완료 이벤트 반환에서. xHC 리소스에 대한 자세한 내용은 섹션 4.14.1.1을 참조하세요.
내 해결 방법은 내부 USB 장치(예: 블루투스, Wi-Fi 등)와 USB 2.0 장치에만 연결된 USB 3.0 허브 등 필요하지 않은 모든 USB 장치를 제거하여 xHCI 리소스를 확보하는 것이었습니다.
다음과 같이 진행하세요:
- 실행해보고
lsusb
뭔가 작동하지 않는지 확인하세요. - sysfs를 사용하여 사용하지 않는 장치를 삭제하십시오
echo 1 > /sys/<path to device>/remove
.dmesg
장치와 각 하위 장치를 삭제하는 방법을 살펴보세요 . 이는 루팅된 장치에서 이 명령을 사용하여 전체 USB 트리를 삭제할 수 있음을 의미합니다. - 이제 더 많은 장치를 올바르게 연결할 수 있습니다(
dmesg
로그 참조).
재부팅 후에도 이 상태를 유지하려면 udev 규칙을 추가하여 장치를 제거하십시오.
SUBSYSTEM=="usb" <your conditions to match unused devices> RUN="sh -c 'echo 1 > /sys$DEVPATH/remove'"
답변3
나는 "평판"이 없기 때문에 논평할 수 없습니다. 하지만 대답하자면:
14개 + 1개의 USB 드라이브가 연결되어 있고(마우스, 키보드 및 2개의 허브가 연결되어 있음) 명령은 64개의 엔드포인트를 반환합니다. 다른 것을 삽입했는데 끝점이 66개였습니다. 13개의 USB 드라이브를 더 연결했지만 엔드포인트는 최대 76개에 불과합니다. lsblk는 아직 이를 감지하지 못했지만 여전히 장치당 엔드포인트 2개로 보고합니다. 별도의 쓰기 및 읽기를 위해 장치당 엔드포인트가 2개일까요?
각 장치에는 2개의 추가 엔드포인트(엔드포인트 0 입력 및 출력)가 필요합니다. 모든 장치에는 엔드포인트 0이 필요하므로 이러한 엔드포인트는 lsusb에 포함되지 않습니다. 또한 허브에는 보고된 엔드포인트 수보다 하나 더 많은 엔드포인트가 필요한 것 같습니다.