Так случилось, что в поставленных в нашу школу после капитального ремонта компьютерах интегрированный сетевой адаптер — на Realtek 8168. При установке Ubuntu 11.10 сперва создалось впечатление, что всё работает. Но довольно быстро обнаружилось, что сеть действует как-то странно: то связь есть, то она пропадает напрочь. Поиск в Интернете дал множество ссылок на обсуждения подобных проблем с данной сетевой картой… и множество рецептов, нередко, совершенно шаманских.
В итоге — спасибо англоязычным товарищам — было найдено следующее (imho наиболее разумное) решение: драйвер Realtek 8169, установленный в Ubuntu и включающийся там и для 8168, заменяем на взятый с сайта производителя драйвер, рассчитанный именно на нашу карту. Для этого:
1. Идем на сайт Realtek и загружаем свежий LINUX driver (r8168-x.y.z.tar.bz2 — вместо x, y и z будут числа, указывающие версию драйвера).
2. Разворачиваем загруженный архив. Из Терминала это можно сделать такой командой:
[bash]tar -jxf r8168-x.y.z.tar.bz2[/bash]
(здесь можно обойтись и без командной строки, но дальше она всё равно потребуется)
*. Если не установлены пакеты, необходимые для сборки модуля ядра из исходников, устанавливаем их:
[bash]apt-get install build-essential linux-headers-`uname -r`[/bash]
3. Переходим в каталог с исходниками и собираем модуль:
[bash]cd r8168-x.y.z make clean modules && make install[/bash]
Итогом этого будет файл r8168.ko (он появится в каталоге src) — модуль, собранный для активного в данный момент ядра.
4. Переходим в каталог src, копируем собранный модуль ядра в соответствующую папку, а ненужный теперь r8169.ko на всякий случай переименовываем:
[bash]cd src sudo cp r8168.ko /lib/modules/`uname -r`/kernel/drivers/net/ sudo mv /lib/modules/`uname -r`/kernel/drivers/net/r8169.ko /lib/modules/`uname -r`/kernel/drivers/net/r8169.ko.old[/bash]
5. Выгружаем ненужный модуль:
[bash]sudo rmmod r8169[/bash]
6. Перестраиваем список зависимостей модулей ядра:
[bash]sudo depmod -a[/bash]
7. Подгружаем наш новый модуль:
[bash]sudo modprobe r8168[/bash]
8. Обновляем initramfs:
[bash]sudo update-initramfs -u[/bash]
После этого сеть должна заработать нормально.
9. Отправим r8169 в блэклист:
[bash]sudo echo "blacklist r8169" >> /etc/modprobe.d/blacklist.conf[/bash]
…и, на всякий случай, укажем на обязательную загрузку модуля r8168:
[bash]sudo echo "r8168" >> /etc/modules[/bash]
(хотя, вроде бы, должно работать и без этого)
10. Перезагружаем компьютер, убеждаемся, что всё работает и после перезагрузки.
*. Если у сетевого интерфейса теперь имя eth1 вместо eth0, нужно удалить из файла
/etc/udev/rules.d/70-persistent-net.rules
две строки, заканчивающиеся на NAME=”eth0″ и NAME=”eth1″
Внимание! После обновления ядра сборку и установку модуля придется повторять!
Полезные команды:
lsmod — посмотреть, какие модули подгружены; в нашем случае полезно давать в виде:
lsmod | grep r81
lspci — посмотреть, какие устройства подключены через шину PCI, в данном случае:
lspci | grep Eth
lspci с ключом -v показывает подробную информацию об устройствах, включая используемые драйверы:
lspci -v