Subscribed unsubscribe Subscribe Subscribe

CentOS 5で蟹NICのr8168を動かす方法

PC

あほなことばっかり書いてないで、たまには役に立つエントリでも書こうかなと思いました。

b:id:naoya経由。
http://d.hatena.ne.jp/aki1770/20080204/1202127949

r8168チップが載ったハードでRealtek製ドライバ(8.0003)をビルドして使っています。カーネルはCentOS 5純正の2.6.18-8.1.15.el5で、nommconfをつけています。

$ uname -r
2.6.18-8.1.15.el5
$ cat /proc/cmdline 
ro root=LABEL=/1 pci=nommconf
$ lspci | grep -i ether
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
$ rpm -qa | grep r8168
kmod-r8168-2.6.18-8.1.15.el5-8.003.00-2.hatena

以下長いですが、SPECファイルとMakefileにあてるパッチです。パッチと、公式ドライバをRPMのビルドディレクトリのSOURCES以下に配置して、rpmbuild -ba /path/to/r8168.specするとRPMとSRPMができます。

注意点としては

  • ドライバのバージョンによってMakefileがちょこちょこ修正されるので、それに併せてパッチを修正する
  • ドライバのバージョンにあわせてSPECファイルのVersionも書き換える。
  • このパッケージはインストール時にinitrdを書き換えるので、それを嫌う場合はバックアップを取っておく

です。どうぞご利用ください。

このテーマだとコメントが読みづらい。

r8168.spec

# -------------------------------------------------------------------------------------------
#
# How to build for normal kernel
#
#  rpmbuild -ba --target i686   --define 'kernel 2.6.18-8.1.1.el5' 3w-9xxx.spec
#  rpmbuild -ba --target x86_64 --define 'kernel 2.6.18-8.1.1.el5' 3w-9xxx.spec
#
# How to build for normal kernel and XEN kernel
#
#  rpmbuild -ba --target i686   --define 'kernel 2.6.18-8.1.1.el5' --define 'buildxen 1' 3w-9xxx.spec
#  rpmbuild -ba --target x86_64 --define 'kernel 2.6.18-8.1.1.el5' --define 'buildxen 1' 3w-9xxx.spec
#
# How to build for normal kernel and PAE kernel
#
#  rpmbuild -ba --target i686   --define 'kernel 2.6.18-8.1.1.el5' --define 'buildPAE 1' 3w-9xxx.spec
#  rpmbuild -ba --target x86_64 --define 'kernel 2.6.18-8.1.1.el5' --define 'buildPAE 1' 3w-9xxx.spec
#
# How to build for all kernel (normal, xen, PAE)
#
#  rpmbuild -ba --target i686   --define 'kernel 2.6.18-8.1.1.el5' --define 'buildall 1' 3w-9xxx.spec
#  rpmbuild -ba --target x86_64 --define 'kernel 2.6.18-8.1.1.el5' --define 'buildall 1' 3w-9xxx.spec
#
#
# How to build for the running kernel:
#
#  rpmbuild -ba --target i686   3w-9xxx.spec
#  rpmbuild -ba --target x86_64 3w-9xxx.spec
#
# -------------------------------------------------------------------------------------------

%{!?buildxen:%define buildxen 0}
%{!?buildPAE:%define buildPAE 0}

%{?buildall:%define buildxen 1}
%{?buildall:%define buildPAE 1}

%ifarch x86_64
%define buildPAE 0
%endif

%{?!kernel:%define kernel %(rpm -q kernel-devel | tail -1 | sed -e 's|kernel-devel-||')}

%define kversion %(echo "%{kernel}" | sed -e 's|-.*||')
%define krelease %(echo "%{kernel}" | sed -e 's|.*-||')

%define kernel_moduledir /lib/modules/%{kernel}
%define kernel_xen_moduledir /lib/modules/%{kernel}xen
%define kernel_PAE_moduledir /lib/modules/%{kernel}PAE

%define kernel_src_path %{kernel_moduledir}/source
%define kernel_xen_src_path %{kernel_xen_moduledir}/source
%define kernel_PAE_src_path %{kernel_PAE_moduledir}/source

%{!?kdir: %{expand: %%define kdir /lib/modules/%(uname -r)/build}}

%define pkg_name r8168
%define kmdl_name kmod-%{pkg_name}-%{kernel}

Summary:        Kernel driver for r8169 NIC
Name:           %{pkg_name}
Version:        8.003.00
Release:        2.hatena
Epoch:          0
Packager:       Mitsutoshi Aoe <maoe@example.com>
License:        GPL
Group:          System Environment/Kernel
Source:         %{name}-%{version}.tar.bz2
Patch1:         %{name}-8.003.00-Makefile-pwd.patch
Vendor:         Realtek
ExclusiveOS: linux
Requires:       kernel, %{name} = %{version}, /sbin/depmod
Provides:       %{name}
URL: http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PNid=13&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false
BuildRoot: %{_tmppath}/%{name}-%{version}-root
%if %{buildxen}
BuildRequires:  kernel-xen-devel = %{kernel}
%endif
%if %{buildPAE}
BuildRequires:  kernel-PAE-devel = %{kernel}
%endif

%description
Kernel driver for KANI(r8169) NIC ;)

%package -n     %{kmdl_name}
Summary:                kernel modules for %{name}.
Group:                  System Environment/Kernel
License:        GPL
Provides:       kmod-%{pkg_name} = %{epoch}:%{version}-%{release}

%description -n %{kmdl_name}
Kernel modules for %{name}.

%if %{buildxen}
%package -n     %{kmdl_name}xen
Summary:        xen kernel modules for %{name}.
Group:          System Environment/Kernel
License:        GPL
Provides:       kmod-%{pkg_name} = %{epoch}:%{version}-%{release}

%description -n %{kmdl_name}xen
XEN kernel modules for %{name}.
%endif

%if %{buildPAE}
%package -n     %{kmdl_name}PAE
Summary:        PAE kernel modules for %{name}.
Group:          System Environment/Kernel
License:        GPL
Provides:       kmod-%{pkg_name} = %{epoch}:%{version}-%{release}

%description -n %{kmdl_name}PAE
PAE kernel modules for %{name}.
%endif

%prep
%setup
%patch1 -p1
test -d %{kdir}/.

%build
echo -e "\nDriver version: %{version}\nKernel version: %{kernel}\n"
### kernel
[ -n $RPM_BUILD_ROOT -a "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
mkdir -p %{buildroot}
make PREFIX=%{buildroot} KVER=%{kernel}

### XEN kernel
%if %{buildxen}
make PREFIX=%{buildroot} KVER=%{kernel}xen
%endif

### PAE kernel
%if %{buildPAE}
make PREFIX=%{buildroot} KVER=%{kernel}PAE
%endif


%install
#make install PREFIX=%{buildroot}

%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT

%postun -n %{kmdl_name}
depmod -a %{kernel} >/dev/null 2>&1 || :

%post -n %{kmdl_name}
depmod -a %{kernel} >/dev/null 2>&1 || :
new-kernel-pkg --package kernel --mkinitrd --depmod --install %{kernel}

%if %{buildxen}
%postun -n %{kmdl_name}xen
depmod -a %{kernel}xen >/dev/null 2>&1 || :

%post -n %{kmdl_name}xen
depmod -a %{kernel}xen >/dev/null 2>&1 || :
new-kernel-pkg --package kernel-xen --mkinitrd --depmod --install --multiboot=/boot/xen.gz-%{kernel} %{kernel}
%endif

%if %{buildPAE}
%postun -n %{kmdl_name}PAE
depmod -a %{kernel}PAE >/dev/null 2>&1 || :

%post -n %{kmdl_name}PAE
depmod -a %{kernel}PAE >/dev/null 2>&1 || :
new-kernel-pkg --package kernel-PAE --mkinitrd --depmod --install %{kernel}
%endif


%files -n %{kmdl_name}
%defattr(744,root,root)
/lib/modules/%{kernel}/kernel/drivers/net

%if %{buildxen}
%files -n %{kmdl_name}xen
%defattr(744,root,root)
/lib/modules/%{kernel}xen/kernel/drivers/net
%endif

%if %{buildPAE}
%files -n %{kmdl_name}PAE
%defattr(744,root,root)
/lib/modules/%{kernel}PAE/kernel/drivers/net
%endif

%postun
depmod -a -F /boot/System.map-%{kversion} %{kversion} > /dev/null 2>&1 || true

%changelog
* Fri Oct 16 2007 Mitsutoshi Aoe <maoe@example.com>
- kmod-r8168 (8.003.00)
 * update
 * add Xen support
* Tue Jun 4 2007 Mitsutoshi Aoe <maoe@example.com>
- kmod-r8168 (8.001.00)
 * Initial revision.

r8168-8.003.00-Makefile-pwd.patch

--- r8168-8.003.00/src/Makefile 2007-08-17 17:35:33.000000000 +0900
+++ r8168-8.003.00/src/Makefile.new     2007-10-26 16:48:33.000000000 +0900
@@ -23,7 +23,7 @@
 
 KVER           := $(shell uname -r)
 KDIR           := /lib/modules/$(KVER)/build
-KMISC          := /lib/modules/$(KVER)/kernel/drivers/net/
+KMISC          := $(PREFIX)/lib/modules/$(KVER)/kernel/drivers/net/
 KEXT           := $(shell echo $(KVER) | sed -ne 's/^2\.[567]\..*/k/p')o
 KFLAG          := 2$(shell echo $(KVER) | sed -ne 's/^2\.[4]\..*/4/p')x
 
@@ -41,7 +41,8 @@
 
 
 install:
-       install -m 644 -c r8168.$(KEXT) $(KMISC)
+       mkdir -p $(KMISC)
+       install -D -m 644 -c r8168.$(KEXT) $(KMISC)
 
 ifeq ($(RTL_IOCTL),y)
 r8168-objs :=  r8168_n.o rtl_ioctl.o

まったく、もう少しまともなMakefileを書いてほしいものです。