Realtek R8168 드라이버 설치

대부분의 데스크탑 네트워크 칩셋은 Realtek 을 사용한다. 그런데, 이것을 리눅스에서 사용할때에는 가끔 문제를 발생시킨다. 검색을 해보니까 상당히 많은 사례가 있다. 나의 경우에는 Oracle Linux 10.1 배포판에 UEK 커널을 사용할 경우에 문제가 생겼다.

문제

문제의 증상은 네트워크가 다운된다는데 있다. 다운이 되지 않는다고 하더라도 속도가 제대로 나지 않는 경우가 많았다. 이러한 경우에 무엇이 문제인지 찾기가 매우 어렵다. 네트워크가 아예 안되면 문제원인이 명확하지만, 아예 되지 않는 건 아니고 속도가 느리거나 간할적으로 끊겼다가 다시 연결되는 등의 문제가 반복된다면 원인찾기가 쉽지가 않다.

Realtek 랜카드

사용하는 Realtek 랜카드는 ASRock AB350 Pro4 에 내장된 것이다. 리눅스에서는 다음과 같이 보인다.

Oracle 10.1 UEK 커널 드라이버는 r8169 로 잡힌다. 결론은 이게 문제다.

로그

원인을 파악하기 위해서 리눅스 서버의 각종 로그를 살펴봤는데, 커널 부팅 메시지에 다음과 같은 메시지가 출력되었다.

보면 뭐가 뭔지 보이지 않는다. AI 에 질의한 결과는 다음과 같았다.

  1. 로그 분석: 무엇이 문제인가요?
    – 발생 지점 (rtl8169_poll): 메인보드(ASRock AB350 Pro4)에 내장된 리얼텍 꽃게칩 랜카드 드라이버(r8169)가 작동하는 과정입니다.
    – 오류 원인 (timerqueue_add): 리얼텍 드라이버가 네트워크 패키지를 처리(NAPI)하면서 타이머(hrtimer)를 시작하려는데, 이미 큐에 등록된 타이머를 중복 등록하거나 타이머 메모리가 오염되면서 커널 경고(WARNING)가 발생했습니다.
    – 결과: 이 에러가 발생하면 리눅스 커널은 시스템 붕괴를 막기 위해 네트워크 드라이버(r8169)를 강제로 일시 정지(Freeze)시키거나 먹통으로 만듭니다. 재부팅하면 타이머가 초기화되어 잠시 작동하다가, 트래픽이 발생하여 이 버그를 다시 건드리는 순간 네트워크가 차단되는 것입니다.

드라이버가 문제가 된다는게 결론이다.

r8168 드라이버 설치

이 문제를 해결하는 가장 쉬운 방법은 최신의 드라이버를 설치하면 된다. 최신 드라이버는 Realtek 홈페이지에서 다운로드 가능하다. 홈페이지에가면 종류별로 있는데, r8168 로 표기된 것을 다운로드 하면 된다.

  • GBE Ethernet LINUX driver r8168 for kernel up to 7.1

한가지 고려해야 하는 것이, Oracle 10.1 UEK 커널은 6.x 이다. 홈페이지에는 7.1 이라고 되어 있는데도 6.x 에서도 설치가 가능하다.

또, 한가지 더 있는데 드라이버 설치는 dkms 으로 해야 한다. 문제는 Oracle 10.1 에는 dkms 명령어가 존재하지 않는다. 이를 해결하기 위해서 epel-release 저장소를 설치하고 dnf 명령어를 이용하면 손쉽게 설치할 수 있다. 또, 컴파일을 하기 위해 컴파일러와 의존성 패키지를 함께 설치해 준다.

커널 모듈을 설치하기 위해서는 kernel-headers, kernel-devel 를 함께 설치해 준다.

uek 커널의 경우에 devel 패키지명이 다르다는 걸 명심해야 한다.

압축해제

다운로드 받은 최신 드라이버를 /usr/src 디렉토리에 압축 해제해 준다.

dkms.conf

이제 dkms 커널 모듈 컴파일을 하기 위해서 dkms.conf 파일을 다음과 같이 작성해 준다.

이제 컴파일을 해야 하는데, 쉘 환경변수를 다음과 같이 등록해준다.

이제 dkms 를 이용한 모듈 컴파일 설치 해준다.

r8169 블랙리스트 작성

이제 r8169 모듈을 부팅시 로딩하지 못하도록 블랙리스트를 작성한다.

initramfs 재빌드

이제 initramfs 를 재빌드 해준다.

성공하면 reboot 을 해준다.

확인

재부팅을 하고 난 후에 제대로 r8168모듈이 올라왔는지를 확인해야 한다.

위 세가지 방법으로 확인이 가능하다. ethtool 을 이용한 방법으로 확인해본 결과는 다음과 같다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다