2 minute read

aws arm 64 에서 opencv 사용하기 (2)

opencv 설치가 성공했지만, aws ec2 머신에는 카메라가 없어서 머신에 카메라를 설치할 수 있을지 찾아본 결과 다음과 같은 방법이 있었다:

  1. aws kinesis등 비디오 스트림 서비스를 사용하여 ec2에 전달 (정확히는 모름)
  2. usbip를 이용하여 pc의 웹캠을 ec2 인스턴스에 연결

usbip를 사용하여 가능하다면 굉장히 멋지고 유용한 기능이라고 생각되어서 시도해 보았는데 아직까지 실패했다.

알아본 결과를 정리해보았다.

usb-ip 진행상황 정리

usbip 프로젝트 페이지에서 확인해 보니, usbip는 원래 개별 라이브러리였는데, 리눅스 커널로 통합된 것으로 보인다. usbip를 사용하려면 서버와 클라이언트가 필요한데, 상세한 설명은 usbip 홈페이지 및 linux의 usbip 패키지 소스를 참조하면 된다.

여기서는 간략하게 적어놓는다.

usbip는 클라이언트가 usb장치를 가진 서버에 요청을 하여 클라이언트의 usb장치처럼 쓰게 하는 라이브러리다.

이를 쓰기 위해 양쪽에 usbip가 설치되어있어야 하고, 클라이언트측은 vhci-hcd 모듈이 설치되어 있어야 한다.

서버측은 pc가 windows였기 때문에, usbip-win git 패키지를 다운받아 설명대로 빌드하고, testsigning 설정을 해준 후, 장치도 설치하고 bind를 한 후 데몬을 실행했다. 하지만 여전히 ec2인스턴스에서 usbip list -r <ip>명령으로 접근할 수 없었는데, 네트워크 문제였다. 데몬은 0.0.0.0주소로부터 요청을 듣는 중이었으므로 포트포워딩으로 노출시킬 필요가 있다고 생각해서 게이트웨이에 접속하여 3204포트를 포트포워딩으로 열어주었다. 그리고 ipconfig에 외부아이피로 보이는 주소가 두 가지 있었는데 그 중 아래쪽 주소를 이용하여 접속해야했다. (docker 관련 작업을 하다보니 가상 아이피같은 게 생긴 것으로 추측된다.)

그러자 드디어 클라이언트에서 서버측의 usb장치를 list로 확인할 수 있었다. 그러나 attach로 장치를 연결시키려 하니 다음과 같은 에러가 떴다..

libusbip: error: udev_device_new_from_subsystem_sysname failed
usbip: error: open vhci_driver
usbip: error: query

다른 예제들을 확인한 결과 attach를 하기 전에 먼저 sudo modprobe vhci-hcd를 쓰는데, 그게 원인인가 하고 vhci라이브러리를 받아 makemake install로 설치했는데, sudo modprobe vhci-hcd를 해도 Fatal: ... not found라면서 모듈 로드가 실패했다. 더 찾아보니 설치하면 나오는 vhci-머시기.ko파일을 symbolic link로 /lib/modules/...에 연결시키길래 거기 나온대로 한 후, 파일 이름이 usb-vhci-hcd.ko라고 되어있어서 그걸 sudo modprobe usb-vhci-hcd이렇게 사용했다 (중간중간 재부팅 했음.). 그러자 에러없이 modprobe문장이 실행되긴 했다. 하지만 여전히 attach를 시도하자 똑같이 위에 나온 세줄짜리 에러가 났다. 심볼릭 링크 이름을 바꿔 저장하도록 해서 해봐도 결과는 똑같았다.

원인에 대해 찾아보다가, usbip 버전이 안맞을때 나는 에러라는 포스트도 있어서 서버와 클라이언트에서 각각 버전을 확인해보니, 클라이언트측 버전은 2.0.0이고, 서버측 버전은 0.2.0?정도였다. 확실히 그게 원인이 되었을 가능성도 있어보였다. 그리고 서버측에서 usbip list로 목록을 띄울 때에도 모든 장치가 unknown device라고 뜨는것도 이상했다. 그래서 windows용 2.0.0 지원하는것이 있는지 찾아보았지만 없어보였다. 또, wsl linux를 사용하는 방법도 찾았는데, 윈도우 insider버전을 사용해야 한다고 되어있었다. 그런데 그 버전에서는 usbip-win자체가 빌드가 실패했다.

결국 이걸 계속 파기에는 문제점이 너무 많아보인다..

현재 “추측”되는 원인:

  1. vhci 드라이버 설치할때 이름 설정이 잘못됨
  2. 클라이언트 usbip 설치가 잘못됨 (linux커널쪽 소스에 설명에서는 configure 스크립트 등 스텝이 더 많았다.)
  3. 서버측 버전이 안 맞음
  4. https://bugs.archlinux.org/task/56069#comment163073

현재 “추측”되는 해결법:

  1. vhci 드라이버를 설치할 때 이름 설정하는법 찾기
  2. 클라이언트 usbip를 다른 소스 기반으로 재설치
  3. 서버측에서 wsl 내에서 usbip 사용
    1. (이걸 하려면 windows insider버전으로 하고 리눅스 커널 빌드까지 해야한다고 되어있음. https://github.com/rpasek/usbip-wsl2-instructions)
  4. 윈도우에서 usbip 버전 2용 드라이버를 작성
  5. 포기하고 kinesis를 쓴다.
  6. 포기하고 ros 가상환경에서 돌린다.

생각해보니 ros2 사용에도 문제가 있었다. 그부분도 해결해야 하는데…

먼저 처음엔 usbip도 없었는데, 그걸 치면 나오는 안내 에러 메시지에 따라 라이브러리를 설치하니 usbip 커맨드는 설치가 되었다. 하지만 usbip client로

알고리즘 문제풀이 2019-12-28

boj 1916 - 최소비용 구하기

https://www.acmicpc.net/problem/1916

이전문제랑 똑같은거라 복붙함..

Comments