1

(7 odpowiedzi, napisanych Oprogramowanie / Software)

Agregacja portów (static bonding) w OpenWrt

Sprzęt

Router: Fujitsu Futro S920
CPU: GX-424CC (4×2.4 GHz)
RAM: 8 GB
System: OpenWrt

Switch: TP-Link TL-SG108E (Static LAG, brak LACP)

Internet: eth0 → router Orange 1 Gb/s

Karty sieciowe:

01:00.0 Intel 82571EB
01:00.1 Intel 82571EB
02:00.0 Realtek RTL8111

Schemat sieci:

        ROUTER (OpenWrt)
     ┌───────────────────┐
     │  eth1 ─────┐       │
     │             ├─ bond0 (agr)
     │  eth2 ─────┘       │
     └────────┬──────────┘
              ││   2×1Gb
      ====================
              ││
     ┌────────▼▼─────────┐
     │      SWITCH        │
     │   Static LAG       │
     │  port1 + port2     │
     └───────────────────┘

Instalacja pakietu
opkg update
opkg install kmod-bonding

/etc/config/network

config interface 'loopback'
    option device 'lo'
    option proto 'static'
    option ipaddr '127.0.0.1'
    option netmask '255.0.0.0'


config globals 'globals'
    option ula_prefix 'fdef:ba19:12aa::/48'
    option packet_steering '0'


config interface 'lan'
    option device 'br-lan'
    option proto 'static'
    option gateway '192.168.2.6'
    list ipaddr '192.168.2.1/24'
    list dns '194.204.159.1'
    list dns '8.8.8.8'
    list dns '1.1.1.1'


config device
    option name 'br-lan'
    option type 'bridge'
    option bridge_empty '1'
    option ipv6 '0'
    list ports 'agr'
    list ports 'eth0'


config device
    option type 'bonding'
    option name 'agr'
    list ports 'eth1'
    list ports 'eth2'
    option policy 'balance-xor'
    option mtu '1500'
    option ipv6 '0'


Restart sieci

/etc/init.d/network restart

Sprawdzenie statusu bondingu

cat /proc/net/bonding/agr

Testy wydajności – iperf3 dwóch klientów jednocześnie

Klient 1 – Raspberry Pi

iperf3 -c 192.168.2.1

Wynik:

Connecting to host 192.168.2.1, port 5201
[  5] local 192.168.2.2 port 38938 connected to 192.168.2.1 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   114 MBytes   959 Mbits/sec    0    274 KBytes
[  5]   1.00-2.00   sec   111 MBytes   934 Mbits/sec    0    269 KBytes
[  5]   2.00-3.00   sec   111 MBytes   933 Mbits/sec    0    272 KBytes
[  5]   3.00-4.00   sec   112 MBytes   944 Mbits/sec    0    269 KBytes
[  5]   4.00-5.00   sec   112 MBytes   938 Mbits/sec    0    266 KBytes
[  5]   5.00-6.00   sec   112 MBytes   943 Mbits/sec    0    269 KBytes
[  5]   6.00-7.00   sec   112 MBytes   935 Mbits/sec    0    272 KBytes
[  5]   7.00-8.00   sec   113 MBytes   946 Mbits/sec    0    274 KBytes
[  5]   8.00-9.00   sec   112 MBytes   940 Mbits/sec    0    272 KBytes
[  5]   9.00-10.00  sec   113 MBytes   944 Mbits/sec    0   5.66 KBytes
-----------------------------------------------------------
[  5]   0.00-10.00  sec  1.10 GBytes   943 Mbits/sec    0   sender
[  5]   0.00-10.00  sec  1.10 GBytes   941 Mbits/sec        receiver

Klient 2 – PC

iperf3 -c 192.168.2.1

Wynik:

Connecting to host 192.168.2.1, port 5201
[  5] local 192.168.2.3 port 45194 connected to 192.168.2.1 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   114 MBytes   958 Mbits/sec    0    297 KBytes
[  5]   1.00-2.00   sec   111 MBytes   934 Mbits/sec    0    291 KBytes
[  5]   2.00-3.00   sec   112 MBytes   941 Mbits/sec    0    272 KBytes
[  5]   3.00-4.00   sec   113 MBytes   949 Mbits/sec    0    274 KBytes
[  5]   4.00-5.00   sec   112 MBytes   938 Mbits/sec    0    288 KBytes
[  5]   5.00-6.00   sec   112 MBytes   940 Mbits/sec    0    277 KBytes
[  5]   6.00-7.00   sec   112 MBytes   943 Mbits/sec    0    283 KBytes
[  5]   7.00-8.00   sec   112 MBytes   940 Mbits/sec    0    280 KBytes
[  5]   8.00-9.00   sec   112 MBytes   940 Mbits/sec    0    274 KBytes
[  5]   9.00-10.00  sec   113 MBytes   948 Mbits/sec    0   5.66 KBytes
-----------------------------------------------------------
[  5]   0.00-10.00  sec  1.10 GBytes   944 Mbits/sec    0   sender
[  5]   0.00-10.00  sec  1.10 GBytes   941 Mbits/sec        receiver

Wynik końcowy

Dwa równoległe połączenia:

~940 Mbps + ~940 Mbps
Łącznie ~1.9 Gbps

2

(7 odpowiedzi, napisanych Oprogramowanie / Software)

Wieczorem machnę co i jak zrobić. Zastanawiam się tylko jak machnąć iperf3

3

(7 odpowiedzi, napisanych Oprogramowanie / Software)

Znalazłem winowajcę

option bond_mode '802.3ad' powinno być 'balance-xor'

4

(7 odpowiedzi, napisanych Oprogramowanie / Software)

Jak używam dwóch switchy i zestawiam LAG to działa, jeśli zamiast switcha dam router transfer umiera, chociaż ustawiam na interfejsach bounding 802.3ad.

Cos takiego chce osiągnąć:
+---------+              +---------+              +---------+
| Router  |=====LAG======| Switch 1|=====LAG======| Switch 2|
| OpenWrt |     (1)      |         |     (2)      |         |
+---------+              +---------+              +---------+

Cześć, czy orientuje się ktoś czy działa agregacja portów pomiędzy X86 OpenWRT a zarządzanym switch'em TPlink?

Komputer który pracuje jako router ma 3 porty gigabitowe: dwa z nich przeznaczone zostały na bounding, 2,5 Gbit na WAN. Switch ma skonfigurowany LAG, i działa on poprawnie pomiędzy dwoma switch'ami, jednak gdy zamiast drugiego switch'a podepnę router, transfer umiera. com może być nie tak?



___________                                  ______________
|                  | - - - - - - - - - - - - - - |                        |
| Router x86 |          LAG                  |     SWITCH       |
|__________| - - - - - - - - - - - - - -  |_____________|

Bez przeróbek zadziałał na debianie 13

Cześć! W wolnej chwili, korzystając zarówno ze swojej wiedzy, jak i wsparcia AI, przygotowałem skrypt do wyłączania rdzeni procesora. Testuję go na terminalu x86 Futro S920 z 4-rdzeniowym GX424CC, używanym jako router z SQM pod światłowód 1Gb/s.

Skrypt sprawdza średnie obciążenie systemu i jeśli obciążenie jest za duże ( LOAD_UPPER )  to włącza kolejny rdzeń, jeśli się nudzi ( LOAD_LOWER ) zdejmuje. Oczywiście progi można ustawić w skrypcie.

Udało się zmniejszyć pobór energii o około 10W w trybie bezczynności – średnio urządzenie zużywa 16W przy włączonych wszystkich rdzeniach, a przy selektywnym wyłączaniu rdzeni spada do 5–6W. Oczywiście mówimy tu tylko o CPU.
Oczywiście spadły też temperatury

Może komuś się przyda

sensors
radeon-pci-0008
Adapter: PCI adapter
temp1:        +56.0°C  (crit = +120.0°C, hyst = +90.0°C)

fam15h_power-pci-00c4
Adapter: PCI adapter
power1:       16.88 W  (interval =   0.01 s, crit =  25.03 W)

k10temp-pci-00c3
Adapter: PCI adapter
temp1:        +56.2°C  (high = +70.0°C)
                       (crit = +100.0°C, hyst = +99.0°C)

bez parkowania rdzeni

sensors
radeon-pci-0008
Adapter: PCI adapter
temp1:        +56.0°C  (crit = +120.0°C, hyst = +90.0°C)

fam15h_power-pci-00c4
Adapter: PCI adapter
power1:        5.53 W  (interval =   0.01 s, crit =  25.03 W)

k10temp-pci-00c3
Adapter: PCI adapter
temp1:        +55.9°C  (high = +70.0°C)
                       (crit = +100.0°C, hyst = +99.0°C)

z parkowaniem

#!/bin/sh

# -------------------------------
# CONFIGURATION CONSTANTS
# -------------------------------
MIN_CORES=1        # Minimal number of cores to keep active
SLEEP_INTERVAL=0   # Seconds to wait between loop iterations
LOAD_UPPER=60      # CPU load % to activate next core
LOAD_LOWER=40      # CPU load % to deactivate highest core
# -------------------------------

# Function to log messages both to terminal and syslog
log_msg() {
    msg="$(date '+%H:%M:%S') - $1"
    echo "$msg"
    logger -t dynamic_cpu "$msg"
}

# Function to validate integer numbers in a range
validate_int_range() {
    value="$1"
    min="$2"
    max="$3"
    name="$4"
    echo "$value" | grep -qE '^[0-9]+$' || { log_msg "ERROR: $name is not a number"; exit 1; }
    if [ "$value" -lt "$min" ] || [ "$value" -gt "$max" ]; then
        log_msg "ERROR: $name ($value) is out of range [$min-$max]"
        exit 1
    fi
}

# Count total CPU cores
TOTAL_CORES=0
for core_path in /sys/devices/system/cpu/cpu[0-9]*; do
    TOTAL_CORES=$((TOTAL_CORES + 1))
done

# Validate parameters
validate_int_range "$MIN_CORES" 1 "$TOTAL_CORES" "MIN_CORES"
validate_int_range "$SLEEP_INTERVAL" 0 3600 "SLEEP_INTERVAL"
validate_int_range "$LOAD_LOWER" 1 99 "LOAD_LOWER"
validate_int_range "$LOAD_UPPER" 1 99 "LOAD_UPPER"

# Ensure upper is greater than lower
if [ "$LOAD_UPPER" -le "$LOAD_LOWER" ]; then
    log_msg "ERROR: LOAD_UPPER ($LOAD_UPPER) must be greater than LOAD_LOWER ($LOAD_LOWER)"
    exit 1
fi

# Function returning average CPU load as integer
average_cpu_load() {
    read cpu user nice system idle iowait irq softirq steal guest guest_nice < /proc/stat
    total1=$((user + nice + system + idle + iowait + irq + softirq + steal))
    idle1=$((idle + iowait))

    sleep 1

    read cpu user nice system idle iowait irq softirq steal guest guest_nice < /proc/stat
    total2=$((user + nice + system + idle + iowait + irq + softirq + steal))
    idle2=$((idle + iowait))

    total_diff=$((total2 - total1))
    idle_diff=$((idle2 - idle1))

    usage=$(( (100 * (total_diff - idle_diff)) / total_diff ))
    echo "$usage"
}

# Enable core
enable_core() {
    core="$1"
    online_file="/sys/devices/system/cpu/$core/online"
    if [ -f "$online_file" ]; then
        echo 1 > "$online_file"
        log_msg "Activating core $core"
    fi
}

# Disable core
disable_core() {
    core="$1"
    online_file="/sys/devices/system/cpu/$core/online"
    if [ -f "$online_file" ]; then
        echo 0 > "$online_file"
        log_msg "Deactivating core $core"
    fi
}

# Main loop
while true; do
    usage=$(average_cpu_load)
    max_core=0
    active_count=0

    # Check all cores and count active ones
    for core_path in /sys/devices/system/cpu/cpu[0-9]*; do
        core=$(basename "$core_path")
        core_num=${core#cpu}
        online=$(cat "$core_path/online" 2>/dev/null || echo 1)
        if [ "$online" -eq 1 ]; then
            active_count=$((active_count + 1))
            if [ "$core_num" -gt "$max_core" ]; then
                max_core=$core_num
            fi
        fi
    done

    # Activate next core if usage > LOAD_UPPER
    if [ "$usage" -gt "$LOAD_UPPER" ]; then
        for core_path in /sys/devices/system/cpu/cpu[0-9]*; do
            core=$(basename "$core_path")
            core_num=${core#cpu}
            online=$(cat "$core_path/online" 2>/dev/null || echo 1)
            if [ "$core_num" -ne 0 ] && [ "$online" -eq 0 ]; then
                enable_core "$core"
                active_count=$((active_count + 1))
                break
            fi
        done
    fi

    # Deactivate highest core if usage < LOAD_LOWER and more than MIN_CORES active
    if [ "$usage" -lt "$LOAD_LOWER" ] && [ "$active_count" -gt "$MIN_CORES" ] && [ "$max_core" -gt 0 ]; then
        disable_core "cpu$max_core"
    fi

    sleep "$SLEEP_INTERVAL"
done

8

(1 odpowiedzi, napisanych Oprogramowanie / Software)

Cześć,
czy istnieje możliwość wycięcia całego ruchu IPv6 przechodzącego poprzez Brigde pomiędzy dwoma interfejsami eth0 i eth1?

9

(12 odpowiedzi, napisanych Oprogramowanie / Software)

wszystko co mogłoby zamontowane został już zamontowane wiec skrypt pominął, włóż pendrive/kartę pamięci/dysk usb.
skrypt montuje partycje, nie urządzenia blokowe.

10

(12 odpowiedzi, napisanych Oprogramowanie / Software)

proszę wpisz polecenie mount, lsblk i odpisz co wyrzuca na ekran

11

(12 odpowiedzi, napisanych Oprogramowanie / Software)

sprawdź co masz w logach systemowych:
tak powinno wyglądać:

Fri Feb 21 10:14:51 2025 user.info automount: Partition /dev/sdd1 (UUID: 405A88F95A88ECCA) successfully mounted at /mnt/devices/sdd1.

12

(12 odpowiedzi, napisanych Oprogramowanie / Software)

plik ze skryptem trzeba umieścić w /etc/init.d i nadać mu atrybuty wykonywalności
potrzeba też doinstalować pakiet mount-utils

13

(12 odpowiedzi, napisanych Oprogramowanie / Software)

Prawda, ale chciałem aby montowane były w dowolnym katalogu, bez przerabiania oryginalnego skryptu.

Napisałem skrypt do automatycznego montowania partycji nowo podłączanych urządzeń, działający jako usługa Openwrt.
Przy montowaniu pomijane są partycje montowane poprzez fstab. Może komuś się przyda

#!/bin/sh /etc/rc.common

# Skrypt startowy dla OpenWRT
START=99
STOP=10

# Katalog, w którym będą montowane partycje
MOUNT_DIR="/mnt/devices"

# Logowanie do syslog
log_to_syslog() {
    local level=$1
    local message=$2
    logger -t "automount" -p "user.$level" "$message"
}

# Funkcja startowa
start() {
    log_to_syslog "info" "Starting automount service..."

    # Tworzenie katalogu montowania, jeśli nie istnieje
    mkdir -p "$MOUNT_DIR"

    # Uruchomienie głównej pętli w tle
    (
        while true; do
            # Pobierz listę wszystkich partycji
            PARTITIONS=$(lsblk -lnpo NAME,TYPE | grep -E 'part$' | awk '{print $1}') || {
                log_to_syslog "err" "Failed to list partitions using lsblk."
                sleep 10
                continue
            }

            # Iteruj przez wszystkie partycje
            for PARTITION in $PARTITIONS; do
                # Pomijaj partycje wymienione w /etc/fstab
                if grep -q "^$PARTITION" /etc/fstab; then
                    continue
                fi

                # Pobierz typ systemu plików i UUID
                FSTYPE=$(blkid -o value -s TYPE "$PARTITION") || {
                    log_to_syslog "err" "Failed to get filesystem type for $PARTITION."
                    continue
                }
                UUID=$(blkid -o value -s UUID "$PARTITION") || {
                    log_to_syslog "err" "Failed to get UUID for $PARTITION."
                    continue
                }

                # Pomijaj partycje bez systemu plików lub typu swap
                if [ -z "$FSTYPE" ] || [ "$FSTYPE" = "swap" ]; then
                    continue
                fi

                # Sprawdź, czy partycja jest już zamontowana
                if ! findmnt -rno UUID | grep -q "^$UUID$"; then
                    # Utwórz katalog montowania
                    MOUNT_POINT="$MOUNT_DIR/$(basename $PARTITION)"
                    mkdir -p "$MOUNT_POINT"

                    # Spróbuj zamontować partycję
                    /bin/mount "$PARTITION" "$MOUNT_POINT" || {
                        log_to_syslog "err" "Failed to mount $PARTITION at $MOUNT_POINT."
                        rmdir "$MOUNT_POINT"
                        continue
                    }

                    log_to_syslog "info" "Partition $PARTITION (UUID: $UUID) successfully mounted at $MOUNT_POINT."
                fi
            done

            # Sprawdź katalogi w /mnt/devices/ i usuń te bez zamontowanej partycji
            for MOUNT_POINT in "$MOUNT_DIR"/*; do
                if [ -d "$MOUNT_POINT" ]; then
                    MOUNTED_UUID=$(findmnt -rn -o UUID "$MOUNT_POINT")
                    if [ -z "$MOUNTED_UUID" ]; then
                        rmdir "$MOUNT_POINT"
                    fi
                fi
            done

            # Odczekaj 10 sekund przed kolejnym sprawdzeniem
            sleep 10
        done
    ) &
}

# Funkcja stopowa
stop() {
    log_to_syslog "info" "Stopping automount service..."
    killall $(basename $0) 2>/dev/null
}

# Funkcja restart
restart() {
    stop
    start
}

15

(4 odpowiedzi, napisanych Oprogramowanie / Software)

spróbuję ... zobaczę jak wyjdzie

16

(4 odpowiedzi, napisanych Oprogramowanie / Software)

Cały dostęp do Internetu odbywa się przez ETH0 gdzie po vlan 7 wchodzi wan od orange, jest routowany i wychodzi po vlan0, dalej do switcha zarządzanego i na resztę sieci. eth1 na razie nie jest skonfigurowany, bo chciałbym aby bym podłączony osobnym przewodem do switcha, a na nim tylko usługa smb.

17

(4 odpowiedzi, napisanych Oprogramowanie / Software)

Witam, posiadam NanoPi R4S, komputer jest wyposażony w dwa interfejsy 1Gb/s. Posiadam światłowód Orange 600/100. Podczas wysycenia łącza internetowego spada znacz transfer po SMB. Połączyłem sobie wan i lan po eth0, jako vlan0 i vlan 7, tu pojawia się problem, jaki adres dać eth1 i jaką strefę firewall, aby smb działał tylko przez eth1 i adres zasobu był widoczny w całym lan. Jaką adresacje w lan zastosować?

18

(17 odpowiedzi, napisanych Sprzęt / Hardware)

ambrozy5 napisał/a:

jak można by zmierzyć realną wydajność sqm na routerze? jak najbardziej zbliżoną do realnego użytkowania ? ostatni qos jaki robiłem to na mietku fast queues i to działało genialnie .

Uruchomiłem kontener openspeedtest/latest na serwerze podpiętym pod port wan a następnie w pętli test na 6 komputerach klienckich. Transfer rozłożył się mniej więcej po równo. Nie wiem czy ta metoda jest miarodajna.

19

(17 odpowiedzi, napisanych Sprzęt / Hardware)

W wolnej chwili postaram się zrobić pełen opis. Jakieś propozycje testów wydajnościowych?

20

(17 odpowiedzi, napisanych Sprzęt / Hardware)

Sprzęty doszły, wstępnie przy SQM piece of cake wychodzi:
Pi 4  - 840Mbps
NanoPI R4S - 970 Mbps

sprawdziłem też dwa terminale

Fujitsu Futro s720 - 560 Mbps
Fujitsu Futro s920 - pełny gigabit

21

(17 odpowiedzi, napisanych Sprzęt / Hardware)

Na początek spróbuję Raspberry Pi 4 którego mam, NanoPI R4S w drodze.
Dziękuję

22

(17 odpowiedzi, napisanych Sprzęt / Hardware)

Dzień dobry,

szukam sprzętu do domu na łącze 600Mb/s z obsługą QOS SQM który wyrobi się przy takim łączu.
Czy może ktoś coś polecić?

General Settings -> WAN Mode -> Advanced

Pytania odnośnie oryginalnego softu, to trochę nie to forum

24

(3 odpowiedzi, napisanych Sprzęt / Hardware)

Dziękuję,
niestety podejrzewam, że karta z Archera będzie zdecydowanie za szeroka.
poszukam Qualcomm/Atheros

25

(3 odpowiedzi, napisanych Sprzęt / Hardware)

Dzień dobry,
jaką kartę sieciową wifi polecilibyście do routera na bazie x86 ze złączem miniPcie, która jest obsługiwana przez OpenWRT w trybie AP?