, последнее обновление:

Via Rhine Nightmare

Данный гайд был написан в начале 2010х, когда я использовал Debian 7 без systemd, и может не отражать текущую ситуацию с Via Rhine!

Мой старый домашний сервер - это не только файлопомойка, сайтики и всякие прочие сервачки, но еще и раздаватель интернета. Wifi раздается с помощью DLINK’овской внутренней карточки на AR922X, а ethernet - с помощью опять же DLINK’овской карточки, но на via rhine. Я могу со всей уверенностью, цинизмом и крепкостью сказать, что via-rhine - убогий чип. И вот почему.

Раз в некоторое количество времени (которое абсолютно рандомно), ядро “теряет” карточку из-за вываливания модуля в Kernel Panic. Причем сетевуха продолжает работать, но больше 137 кбайт/с не выдаст, как бы мы не хотели. rmmod via-rhine && modprobe via-rhine дает лишь временное облегчение, и то на 20% сетевухи (10 Мбит, полный дуплекс). Немного погуглив, я нашел, что это проблема ядер до 3.3.2, вследствие чего я начал искать способ, как же установить ядро посвежее в свой Debian 7.

В backports было найдено ядро 3.9.0, но оно хотело утянуть с собой initramfs-tools и заменить его на dracut (попутно установив некоторые зависимости вроде mdadm, которые сейчас мне вообще ни к чему). Поэтому я пошел другим путем, а именно - путем полной диагностики.

Для начала, после перегрузки модуля, я обнаружил, что:

root@pztrn:~# mii-tool
eth0: negotiated 100baseTx-FD, link ok
eth1: negotiated 10baseT-FD flow-control, link ok

Ок, eth0 (интернет) работает на 100baseTx-FD (100 мбит с полным дуплексом), а eth1 (локалка) работает на 10baseT-FD (10 мбит с полным дуплексом). Это не дело, конечно же, но была найдена команда, которая форсит 100baseTx-FD:

mii-tool -A 100baseTx-FD eth1

Таким нехитрым способом, мы получили опять наши 100 Мбит/с в локалке. Для упрощения я накатал такой вот скрипт:

#!/bin/sh
# Perform full restart of Via Rhine card
 
iface="eth1"
 
stop() {
    echo "Deconfiguring $iface..."
    ifdown $iface
    rmmod via-rhine
}
 
start() {
    echo "Reconfiguring $iface..."
    modprobe via-rhine
    ifdown $iface
    ifup $iface
    # Force 100Mbps Full-Duplex
    echo "Forcing 100Mbps Full-Duplex mode..."
    mii-tool -A 100baseTx-FD $iface
}
 
restart() {
    stop
    start
}
 
help() {
    echo "Via Rhine restarter."
    echo "Usage: via-restart.sh {start|stop|restart}"
}
 
case $1 in
    start)
        start
    ;;
    restart)
        restart
    ;;
    stop)
        stop
    ;;
    *)
        help
    ;;
esac

Поменяйте iface на свой, и можете использовать :) Скрипт успешно отрабатывает на моем сервере, поэтому нет причин, чтобы он не отработал на вашем.