MOD Duo USB Ethernet

From MOD Wiki
Jump to: navigation, search

Este tutorial apresenta como configurar o MOD-Shield-ICNovaA20 (versão protótipo de desenvolvimento do MOD Duo) pra automaticamente durante o boot:

  • carregar o g_ether: módulo de kernel com suporte a Ethernet via "USB Gadget"
  • setar um IP fixo padrão (192.168.128.2) na interface de rede usb0
  • subir um servidor DHCP que aloca dinamicamente IPs numa faixa livre de 192.168.128.10 a 192.168.128.20

Eu percebi que demora um pouco pro daemon dhcpd de fato alocar e entregar um IP. Some-se a isso o tempo de boot do device. Essas são coisas que vamos ter que pensar sobre como lidar.

A configuração abaixo me permite acessar o MOD por meio de: $ ssh [email protected]

TUTORIAL - USB-ETHERNET

Pra fazer essas configurações tudo utilizamos os mecanismos do systemd. Segue abaixo uma descrição do procedimento geral:

Ajuste nas configurações do Kernel

No commit 61fdb39 foi feito um ajuste dos parâmetros do arquivo script.fex/script.bin pra habilitar as portas USB com uma delas configurada como USB-OTG. Então para o módulo g_ether funcionar será necessário fazer o checkout do kernel:

$ git clone https://github.com/portalmod/linux-sunxi.git
$ git checkout mod-sunxi-3.4-fsanches

E compilar:

$  make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage modules

Inserir um cartão SD, montá-lo manualmente e rodar o script de deploy:

$ sh ./deploy.sh

E depois bootar a placa usando esse cartão SD pra continuar o procedimento de configuração.

Para carregar o driver de Ethernet-USB automaticamente no boot

$ nano /etc/modules-load.d/usb_ethernet.conf

g_ether

Para setar um IP fixo na interface de rede usb0 automaticamente no boot

$ nano /etc/conf.d/net-conf-usb0

address=192.168.128.2
netmask=24
broadcast=192.168.128.255

$ nano /etc/systemd/system/[email protected]

[Unit]
Description=Network connectivity (%i)
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/conf.d/net-conf-%i
ExecStart=/usr/local/bin/net-up.sh %i
ExecStop=/usr/local/bin/net-down.sh %i
[Install]
WantedBy=multi-user.target

$ nano /usr/local/bin/net-up.sh

#!/bin/bash
ip link set dev "$1" up
ip addr add ${address}/${netmask} broadcast ${broadcast} dev "$1"
[[ -z ${gateway} ]] || {
  ip route add default via ${gateway}
}

$ nano /usr/local/bin/net-down.sh

#!/bin/bash
ip addr flush dev "$1"
ip route flush dev "$1"
ip link set dev "$1" down


$ chmod +x /usr/local/bin/net-{up,down}.sh

$ systemctl enable network@usb0

Para subir um servidor DHCP automaticamente durante o boot

$ pacman -S dhcp $ cp /etc/dhcpd.conf{,.backup} $ nano /etc/dhcpd.conf

option routers 192.168.128.2;
subnet 192.168.128.0 netmask 255.255.255.0 {
    range 192.168.128.10 192.168.128.20;
}

E no arquivo /usr/lib/systemd/system/dhcpd4.service eu tive que editar a linha do ExecStart pra ficar assim:

[Unit]
Description=IPv4 DHCP server
After=network.target
[Service]
Type=forking
PIDFile=/run/dhcpd4.pid
ExecStart=/usr/bin/dhcpd -4 -q usb0 -pf /run/dhcpd4.pid
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target

$ systemctl enable dhcpd4