Estou tentando instalar e executar uma estação flash em um Raspberry Pi usando o Raspbian Jessie (última versão estável, Kernel Version 4.4).
No entanto, eu quero fazer uso das quatro portas USB e, para fazer isso, usarei Ethernet via USB (já que o u-boot usa Ethernet para verificar o servidor tftp).
Pré-requisitos e configuração
Aqui estão as coisas que eu instalei no Raspberry Pi:
Eu configurei vários arquivos:
/etc/dhcp/dhcpd.conf
log-facility local7;
ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.2.0 netmask 255.255.255.0
{
range dynamic-bootp 192.168.2.2 192.168.2.100;
if substring (option vendor-class-identifier, 0, 10) = "AM335x ROM"
{
filename "u-boot-spl-restore.bin";
}
elsif substring (option vendor-class-identifier, 0, 17) = "AM335x U-Boot SPL"
{
filename "u-boot-restore.img";
}
else
{
filename "zImage";
}
range 192.168.2.101 192.168.2.199;
}
As quatro primeiras linhas estão lá por padrão.
/etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
}
Este arquivo não existia, então eu tive que criá-lo. Está incluído como outros serviços por /etc/xinetd.conf
.
/tftpboot/
Criei esta pasta, executei estes comandos nela:
-
sudo cp /path/to/boot/files/* /tftpboot/
-
sudo chmod -R 777 /tftpboot/
-
sudo chown -R nobody:nogroup /tftpboot
/etc/default/isc-dhcp-server
Adicionou usb0
à lista de interfaces:
INTERFACES="usb0"
/etc/network/interfaces
Criado uma interface para usb0
:
allow-hotplug usb0
iface usb0 inet static
address 192.168.2.1
network 192.168.2.0
netmask 255.255.255.0
broadcast 192.168.2.255
up /etc/network/if-up.d/usb-interfaces
/etc/network/if-up.d/usb-interfaces
Criado o script a seguir, referenciado por /etc/network/interfaces
:
#!/bin/sh
if [ "$IFACE" = usb0 ]; then
sudo service isc-dhcp-server restart
fi
Reinicie todos os serviços!
sudo /etc/init.d/tftp-hpa restart
sudo /etc/init.d/xinetd restart
Testes e resultados
Vamos chamar o Raspberry Pi de host e o Linux eu quero mostrar o target .
Então, para isso, eu tinha todos os logs no host e tinha um console serial no destino (o que significa que eu posso acessar os logs de inicialização do kernel).
O que acontece basicamente:
- Do PoV do alvo: nada em particular é exibido no log serial. Apenas bloqueia um pouco e inicializa normalmente.
- Do PoV do host: aqui está o log completo. Ele pára depois que a interface
usb0
desaparece, quando o O sistema Linux inicia a inicialização. Como você pode ver, há um BOOTREQUEST
seguido imediatamente por um BOOTREPLY
. Nesse ponto, o destino sabe o nome do arquivo que deve obter do tftp
server (especificado no arquivo /etc/dhcp/dhcpd.conf
), portanto, uma solicitação tftp
deve seguir ... Mas nada acontece.
Eu testei o servidor tftp
em execução no Raspberry Pi do destino e do meu computador e, em ambos os casos, posso obter os arquivos corretamente. Eu também tentei com arquivos diferentes, e pude confirmar que os arquivos usados (dentro da minha pasta /tftpboot/
) estão corretos e funcionais.
O que eu pensei e testei:
-
A energia fornecida pelas portas USB do Raspberry Pi não é suficiente. Testado através de um hub USB 2.0 alimentado de forma independente, os resultados foram exatamente os mesmos.
Qualquer ajuda seria muito apreciada.