얼마 전, Open vSwitch(이하 OVS)를 UNIX 도메인 소켓으로 OpenFlow 컨트롤러에 붙이려다 꽤 고생을 했습니다.
어디서부터 잘못된 걸까, 로그도 안 나오고, is_connected: false만 덜렁… 결국 원인을 파헤치고 나니 해결책은 의외로 단순했는데요. 저처럼 같은 문제로 헤매시는 분들을 위해 과정을 그대로 공유합니다.
🚀 문제 상황
- 자체 epoll 기반 컨트롤러를 UNIX 소켓(/var/run/openflow_controller.sock)으로 리슨
- OVS 브리지(br0, br1) 설정도 똑같이
- ovs-vsctl set-controller br0 unix:/var/run/openflow_controller.sock ovs-vsctl set-controller br1 unix:/var/run/openflow_controller.sock
- 연결 상태 확인해 보면
- $ ovs-vsctl get Controller br0 is_connected false
- journalctl -fu ovs-vswitchd에도 아무런 connect 로그가 없고, strace로 살펴봐도 connect() 호출이 전혀 찍히지 않음.
“아예 시도조차 안 하는 건가?”
“아무리 해도 이유를 알 수가 없네…”
이런 의문만 쌓이는 상황이었습니다.
🔍 원인 분석
조금 더 찾아보니, OVS는 보안을 위해 런디렉토리(기본 /var/run/openvswitch) 외부에 있는 UNIX 소켓 파일에 대해
connect() 호출을 스킵 할 수 있다는 사실을 알게 됐습니다.
즉, /var/run/openflow_controller.sock 같은 경로에 소켓을 두면, OVS가 “내 영역이 아니야!” 하고는
아예 시도조차 안 한 거죠.
🛠️ 간단한 해결 방법
- 소켓 위치를 OVS 런디렉토리 하위로 옮기기
- // 기존 #define UNIX_SOCKET_PATH "/var/run/openflow_controller.sock" // 수정 #define UNIX_SOCKET_PATH "/var/run/openvswitch/openflow_controller.sock"
- OVS 설정에도 경로 반영
- sudo ovs-vsctl set-controller br0 \ unix:/var/run/openvswitch/openflow_controller.sock sudo ovs-vsctl set-controller br1 \ unix:/var/run/openvswitch/openflow_controller.sock
- 퍼미션·소유권 확인
- sudo chown root:root /var/run/openvswitch/openflow_controller.sock sudo chmod 0666 /var/run/openvswitch/openflow_controller.sock
- OVS 데몬 재시작 or 강제 재연결
- # systemd 환경 sudo systemctl restart ovs-vswitchd # 또는 브리지별로 sudo ovs-appctl -t ovs-vswitchd bridge/reconnect br0
이제 다시 확인해 보면…
$ ovs-vsctl get Controller br0 is_connected
true
아울러 로그에도 깔끔하게 connect 성공 메시지가 뜹니다.
🎉 마무리
- 교훈: UNIX 도메인 소켓 연결 시, 경로 정책부터 먼저 의심하자!
- OVS는 반드시 /var/run/openvswitch 하위에서만 unix: 스킴을 통해 connect()를 시도합니다.
- 삽질을 줄이고 싶다면, 초기 설계 단계에서 경로 룰을 확실히 이해하세요.
이 포스트가 같은 문제로 고민하는 분들께 도움이 되길 바랍니다!
궁금한 점이나 다른 해결법이 있으면 댓글로 알려주세요.
'Tech > Trouble Shooting' 카테고리의 다른 글
| CMake에서 소스 파일 추가·삭제가 자동으로 반영되지 않을 때, 이렇게 해결하세요! (0) | 2025.04.29 |
|---|