USB 허브 스위치 연결하면 컴퓨터가 멈추는 문제 해결 (Ubuntu, NEXTU USB 3.0 Switch Selector)

USB KVM 스위치를 사용하는 분들이라면 이런 경험이 한 번쯤 있을 것입니다. 두 대의 컴퓨터에서 마우스와 키보드를 공유하려고 USB 스위치를 연결했는데, 전환 버튼을 누르는 순간 컴퓨터가 통째로 멈춰버리는 현상입니다.

 

마우스 커서가 움직이지 않고, 키보드도 먹통이고, 화면은 그대로 떠 있는데 아무것도 되지 않는 상태입니다. 결국 전원 버튼을 길게 눌러 강제 재부팅하는 수밖에 없었습니다.

 

한두 번이면 그러려니 하겠지만, 전환할 때마다 랜덤으로 이 증상이 발생하니 도저히 쓸 수가 없었습니다. 비싼 돈 주고 산 NEXTU USB 3.0 스위치인데 대체 뭐가 문제인가 싶었습니다.

 

결론부터 말씀드리면, USB autosuspend 설정을 끄니까 해결됐습니다. 스위치 자체의 불량이 아니라 리눅스 커널의 USB 전원 관리 기능이 문제였습니다.

 

증상

환경은 다음과 같습니다.

  • OS: Ubuntu 20.04 (커널 5.15)
  • 메인보드: MSI B660 (MS-7D96)
  • USB 스위치: NEXTU USB 3.0 Switch Selector (VIA Labs 칩셋)
  • 연결 장치: 무선 마우스(Logitech), 무선 키보드(Compx 동글), USB SD카드 리더

증상은 단순합니다. USB 스위치 전환 버튼을 누르면 높은 확률로 시스템이 완전히 멈춥니다. 화면은 떠 있지만 입력이 전혀 먹지 않는 상태입니다. 매번 그런 것은 아니고 3~4번에 한 번 정도 발생하는데, 한번 걸리면 강제 재부팅 외에는 방법이 없습니다.

처음에는 USB 3.0 포트의 호환성 문제인가 싶어서 USB 2.0 포트로 옮겨 꽂아봤는데, 빈도가 다소 줄긴 했지만 여전히 발생했습니다.

 

원인 — dmesg 로그에 답이 있었습니다

재부팅 후에 이전 부팅 로그를 확인해봤습니다.

journalctl -b -1 --no-pager -p err | grep -i usb

 

다음과 같은 로그가 쏟아져 나왔습니다.

usb 1-2-port4: cannot reset (err = -71)
usb 1-2-port4: cannot reset (err = -71)
usb 1-2-port4: Cannot enable. Maybe the USB cable is bad?
usb 1-2-port4: cannot disable (err = -71)
usb 1-2-port4: unable to enumerate USB device
hub 1-2:1.0: hub_ext_port_status failed (err = -71)
usb 1-2: Failed to suspend device, error -71

error -71이 핵심입니다. 리눅스 커널에서 USB 프로토콜 에러를 뜻하는 코드이며, USB 장치와 호스트 컨트롤러(xhci) 사이의 통신이 꼬였을 때 발생합니다.

내부적으로 벌어지는 일을 정리하면 다음과 같습니다.

  1. USB 스위치 전환 버튼을 누릅니다
  2. 스위치가 PC A에서 장치를 disconnect하고 PC B에 reconnect합니다
  3. 이 과정에서 리눅스 커널이 USB 포트를 reset하려고 시도합니다
  4. 그런데 VIA Labs 칩셋 허브가 절전(suspend) 상태에 빠져 있으면 reset 명령이 제대로 처리되지 않습니다
  5. 커널이 reset을 반복 시도하다가 결국 USB 허브 전체가 먹통이 됩니다
  6. 허브에 물려 있는 마우스, 키보드가 전부 응답 불가 상태가 되면서 시스템이 멈춘 것처럼 보입니다

실제로는 시스템 자체가 멈춘 것이 아니라 입력 장치가 전부 죽은 것입니다. SSH로 원격 접속해보면 멀쩡히 살아 있습니다. 다만 모니터 앞에서는 강제 재부팅 외에 할 수 있는 것이 없으므로 결과적으로 같은 상황입니다.

 

해결 — USB autosuspend 끄기

원인을 알았으니 해결은 간단합니다. USB 스위치(VIA Labs 허브)가 절전 모드로 들어가지 않도록 막으면 됩니다.

1단계: 현재 설정 확인

먼저 VIA Labs 허브의 전원 관리 상태를 확인합니다.

for f in /sys/bus/usb/devices/*/manufacturer; do
  dev=$(dirname "$f")
  mfr=$(cat "$f" 2>/dev/null)
  if echo "$mfr" | grep -qi 'VIA'; then
    echo "$(basename $dev): autosuspend=$(cat $dev/power/autosuspend 2>/dev/null) control=$(cat $dev/power/control 2>/dev/null)"
  fi
done

제 환경에서는 다음과 같이 출력됐습니다.

1-3.1: autosuspend=0 control=auto
2-2.1: autosuspend=0 control=auto

autosuspend=0이면 사용하지 않을 때 즉시 절전으로 진입한다는 뜻이고, control=auto이면 커널이 자동으로 절전을 관리한다는 뜻입니다. 이 설정이 문제의 원인이었습니다.

 

2단계: 즉시 적용

echo -1 | sudo tee /sys/bus/usb/devices/1-3.1/power/autosuspend
echo on | sudo tee /sys/bus/usb/devices/1-3.1/power/control
echo on | sudo tee /sys/bus/usb/devices/2-2.1/power/control

autosuspend=-1은 절전 비활성화를 의미하고, control=on은 장치를 항상 켜둔다는 뜻입니다.

여기서 1-3.1, 2-2.1 경로는 환경마다 다릅니다. 위의 확인 명령에서 출력된 경로를 그대로 사용하면 됩니다.

 

3단계: 재부팅 후에도 유지되도록 udev 룰 추가

위에서 적용한 내용은 현재 세션에서만 유효합니다. 재부팅하면 원래 설정으로 돌아가기 때문에, udev 룰을 만들어 영구 적용해야 합니다.

sudo bash -c 'echo "ACTION==\"add\", ATTR{idVendor}==\"2109\", ATTR{idProduct}==\"2817\", ATTR{power/autosuspend}=\"-1\", ATTR{power/control}=\"on\"" > /etc/udev/rules.d/99-usb-no-suspend.rules'

2109:2817은 VIA Labs USB 2.0 Hub의 Vendor:Product ID입니다. 다른 USB 스위치를 사용하고 있다면 lsusb 명령으로 본인 스위치의 ID를 확인한 뒤 변경하면 됩니다.

 

적용 후 확인

재부팅 후 USB 스위치를 여러 차례 전환해봤습니다. dmesg 로그를 확인한 결과는 다음과 같습니다.

dmesg | grep -i 'usb' | grep -i 'error\|fail\|cannot'

적용 전에는 전환할 때마다 error -71이 줄줄이 쏟아졌는데, 적용 후에는 전환 시 에러가 0건이었습니다.

부팅 초기에 USB Storage(SD카드 리더)가 인식되는 과정에서 error -71이 몇 건 출력되긴 하지만, 이 부분은 스위치 전환과 무관하므로 무시해도 됩니다.

전환 로그를 확인하면 깔끔하게 disconnect → reconnect가 이루어지는 것을 볼 수 있습니다.

usb 1-3.1: USB disconnect, device number 21
usb 1-3.1.2: USB disconnect, device number 22  (키보드)
usb 1-3.1.3: USB disconnect, device number 23  (마우스)
usb 1-3.1: New USB device found, idVendor=2109  (허브 재연결)
usb 1-3.1.2: New USB device found, idVendor=3554 (키보드 재연결)
usb 1-3.1.3: New USB device found, idVendor=046d (마우스 재연결)

에러 없이 정상적으로 전환됩니다.

 

정리

USB 스위치를 전환할 때 컴퓨터가 멈추는 문제의 원인은 스위치 불량이 아니라 리눅스 USB 절전(autosuspend) 기능이었습니다. USB 허브가 절전 상태에서 갑자기 전환 신호를 받으면 포트 reset이 실패하면서 허브 전체가 먹통이 되는 구조입니다.

해결 방법은 해당 USB 허브의 autosuspend를 끄는 것뿐입니다. udev 룰로 영구 적용하면 재부팅 후에도 유지됩니다.

비슷한 증상으로 고생하고 계신 분이라면 dmesg | grep 'error -71'부터 실행해보시길 권합니다. 이 에러가 확인된다면 높은 확률로 같은 원인입니다.

Top