TFTP ile OpenWrt Yükleme

OpenWrt Yükleme'ye geri dön.

TFTP çok sade bir protokoldur; küçük önyükleyicilere uygulanabilecek kadar sade. Basit fikir şu şekildedir:

  1. Yönlendiriciye güç verilir
  2. Önyükleyici bellenim kodunun başlatılmasını hazırlar
  3. Birkaç saniye boyunca kablolu lan geçitlerini tetikler
    • Bu anlık değil başlama/önyükleme sırasında kısa bir süre gerçekleşir
    • Ağ ayarları OpenWrt'nin öntanımlılarıyla her zaman aynı değildir
  4. Çakma imajı aktarımı için TFTP isteklerini dinler
  5. ya;
    1. Çakılacak bir imajı alıp çakar
    2. veya TFTP iletişimi zaman aşımı gerçekleşirse cihazı önyüklemeye devam eder
      • Halen yüklenmiş bellenimi geçerli kabul ederek
      • Eğer geçerli değilse davranış önyükleyiciye göre değişiklik gösterir. Bazısı tftp ile bir çakma beklerken diğerleri sadece bir hata tespit ışığı gösterip tekrar önyüklenmeyi beklerler.
      • Önyükleyiciyle ilgili daha çok detay için Önyükleyici işlevselliği'ni gör.

Warning!
This section describes actions that might damage your device or firmware. Proceed with care!

Cihazınızın önyükleyicisinin TFTP istemcisi mi yoksa sunucusu mu olduğunu tespit etmek zorundasınız. Gerekli ayarlamalar ve varsa sunulan TFTP türü üzerine detaylar için belirli model'inizin OpenWrt Wiki cihaz sayfasına başvurun.

Bu dokümantasyon RFC5737'ye göre örnek IP adresleri kullanacak. Cihazınıza özgü gerçek IP adresleri için lütfen modelinizin wiki dokümantasyonuna başvurun.


FIXME Cleanup IP addresses as 192.168.1.x is common, but not universal. Use of RFC5737 might be more appropriate or just italic ipv4.x.y.z indicators.

Öyleyse TFTP sunucusu koşturmak zorundasınız. Detaylı yönerge TFTP Kurtarma/Yükleme için TFTP sunucu kurulumu wiki sayfası'nda.

YönlendiriciKartların, YönlendiriciÖnyükleme önyükleyicilerinde koşan TFTP ve DHCP istemcileri var. Detaylar için : Common Procedures for Mikrotik RouterBoard'i görün.

Duruk IP adresi ayarlamak, DHCP sunucusu koşturmak ve TFTP sunucusu koşturmak için Bash betiği (Mikrotik için örnek).

Not: İhtiyaçlarınız için USER, NETDEV, IP/DHCP IP-aralığı ve dosya adı/klasör yolu değiştirmeyi unutma.

#/bin/bash
USER=user
NETDEV=enp1s0
ip address flush dev $NETDEV
ip address add 10.1.1.10/24 dev $NETDEV
dnsmasq -i $NETDEV --dhcp-range=10.1.1.50,10.1.1.100 \
--dhcp-boot=openwrt-ar71xx-mikrotik-vmlinux-initramfs.elf \
--enable-tftp --tftp-root=/home/$USER/openwrt -d -u $USER -p0 -K --log-dhcp --bootp-dynamic

Örneğin DIR-300 için bootloader uyarlaması redboot bir TFTP istemcisi içerir. İki adım:

  1. Önce makinanda Bir TFTP sunucusu (veya daemon) yükleyip çalıştır ve çakılacak imaj(lar)ı bu yazılımın <kök dizin>'ine yerleştir (bunu root olarak yapman gerekebilir). Örnek:
    sudo apt-get install tftp-hpa tftp
    sudo cp ~/uboot/arch/arm/boot/uboot.img /var/lib/tftpboot
  2. Sunucuyu sına:
      tftp localhost
    tftp> get uboot.img
    tftp quit
      cmp /var/lib/tftpboot/uboot.img uboot.img
      # no output other then a prompt means it worked correctly
  3. önyükleyicine bağlan ve harddiskindeki imajları TFTP instemcisiyle almasını söyle (DIR-300 durumunda bağlantıyı telnet ile varsayılan olmayan 9000 geçitiyle elde edersin. Örnek:
    telnet 192.168.20.81 9000
    Redboot> load uboot.img
    go
  4. başarılı OpenWrt kurulumundan sonra TFTP sunucusunu tekrar çalışmasını çalışmaz kılmayı unutma.

xxx durumnda yukarıdaki Örnek 1'de Adım 3 geçerli değildir. Oturum açılacak bir uçbirim yoktur, önyükleyici her önyüklemede kendiliğinden, ön-tanımlı bir IP adresinden, TFTP ile bir bellenim edinmeyi deneyecektir.

FIXME TODO

Note: TftpServer.app places a pleasing GUI on top of the native OSX tftpd. There's a writeup of using TftpServer.app at tftpserver. If you prefer to use the command-line, read on…

OS X Lion comes with a tftpd but its disabled by default. Like most services in OS X, tftpd is controlled by launchctl. The configuration with which the daemon is lauched is in /System/Library/LaunchDaemons/tftp.plist and the the identifier is com.apple.tftpd

before you make changes to the config run:

sudo launchctl unload -F /System/Library/LaunchDaemons/tftp.plist

then:

sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist

to stop tftpd run:

sudo launchctl stop com.apple.tftpd

to start tftpd run:

sudo launchctl start com.apple.tftpd

Here is an example config file that will work:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.apple.tftpd</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/libexec/tftpd</string>
		<string>-l</string>
		<string>-s</string>
		<string>/private/tftpboot</string>
	</array>
	<key>inetdCompatibility</key>
	<dict>
		<key>Wait</key>
		<true/>
	</dict>
	<key>InitGroups</key>
	<true/>
	<key>Sockets</key>
	<dict>
		<key>Listeners</key>
		<dict>
			<key>SockServiceName</key>
			<string>tftp</string>
			<key>SockType</key>
			<string>dgram</string>
		</dict>
	</dict>
</dict>
</plist>

Differences from the default include removing this, to enable the service:

<key>Disabled</key>
<true/>

Add this to the ProgramArguments array to make it log to /var/log/syslog.log

<string>-l</string>

Place the openwrt image file you want to serve in:

/private/tftpboot

Notice that even after running launchctl start com.apple.tftpd you will not see tftpd running when executing ps aux | grep tftpd because of the way launchctl works. tftpd is in fact not running but launchctl will launch it as soon as it is required.

In some cases, when the output on the serial console is grabbled you can still act on faith and executer the following commands, which will work in most cases:

setenv ipaddr 192.168.1.1

setenv serverip 192.168.1.100

tftpboot 0x80000000 openwrt-xxx-generic-xxx-squashfs-factory.bin
erase 0x9f020000 +0x332004
cp.b 0x80000000 0x9f020000 0x332004
boot.m 0x9f020000

tftpd on MacOS 10.4 "Tiger"

tftpd works out-of-the-box also on the old 10.4. Maybe the tftp dir is not yet created but this is just a mkdir. Get a root shell and issue these commands:

bash-4.2$ sudo bash
Password:
bash-4.2# mkdir -p /private/tftpboot/
bash-4.2# cp /path/to/openwrt-image /private/tftpboot/
bash-4.2# launchctl load -F /System/Library/LaunchDaemons/tftp.plist 
bash-4.2# ps axu|grep ftp
root     23494   0.0  0.0    27696    152  ??  Ss    4:34PM   0:00.00 launchctl load -F /System/Library/LaunchDaemons/tftp.plist
root     23496   0.0  0.0    38604      4  p3  R+    4:34PM   0:00.00 grep ftp
bash-4.2# launchctl start com.apple.tftpd
bash-4.2# ps axu|grep ftp
root     23494   0.0  0.0    27696    152  ??  Ss    4:34PM   0:00.00 launchctl load -F /System/Library/LaunchDaemons/tftp.plist
root     23498   0.0  0.0    27244    464  ??  Ss    4:34PM   0:00.01 /usr/libexec/launchproxy /usr/libexec/tftpd -i /private/tftpboot
root     23500   0.0  0.0    38604      4  p3  R+    4:34PM   0:00.00 grep ftp
bash-4.2# tftp 192.168.100.72   ### just testing
tftp> get openwrt-ar71xx-generic-hornet-ub-squashfs-sysupgrade.bin
Received 7270950 bytes in 2.7 seconds
tftp>

Yönlendiricine yeni bir bellenim yüklemek için için temel tftp istemcisi kullanma muamelesi:

  1. Yönlendiricinin gücünü kes
  2. TFTP istemcisi olarak davranan bilgisayarından modelindeki bir LAN geçitine bir ethernet bağantısı tak. Detaylar için cihaz modelinin OpenWrt viki cihazsayfasına bak.
  3. Bilgisayarında tftp sunucunu başlat
  4. Yönlendiricine uygun adresi ver, (model ve önyükleyiciye özgü adresi görmek için modelinin viki sayfasına bak.)
  5. Kipi 'octet/binary' olarak ayarla
  6. İstemciye başarılı olana kadar dosyayı tekrar göndermesini söyle
  7. Dosyayı “koy”
  8. tftp istemcisi koştururken ve sürekli bağlantı sondalarken yönlendiricini güce tak.
  9. TFTP istemcisi önyükleyiciden bir ack (alındı) sinyalı alacak ve bellenimi göndermeye başlayacaktır
  • :!: Lütfen sabırlı ol, yeniden çakma bellenim aktarıldıktan sonra gerçekleşir. Çoğu dudrumda yönlendirici kendiliğinden yeniden-önyüklenecektir. Bazı modeller yeniden başlamaz, kapatıp-açmadan önce en az 15 dakika bekle.
  • :!: Önyükleyici genellikle nvram'de kayıtlı MAC adresini ve IP adresini kullanmaz, bunun yerine önyükleyicinin varsayılanına geri döner. Ayrıntılar için modelinin viki belgelendirmesini gör.
  • :!: Yönlendirici ve bilgisayar arasına bir hub veya switch koy, bu boot_wait süreci geçmeden önce yerel bilgisayar bağlantısının açık olmasını sağlar. Bu yerel bağlantının çok geç sağlandığı bilgisayarda TFTP'nin çalışması için gerekliliktir ve genellikle bağlantıyı açık tutmak için zorlamaktan daha basittir.
  • DMZ LED'li yönlendiricilerde, OpenWrt önyüklerken DMZ LED'i yakar, önyükleme betikleri bittikten sonra DMZ LED'i kapatır.

TFTP comutları farklı uyarlamalarda değişiklik gösterir. İşte bazı örnekler:

Şebeke bağlantısı güç verme sırasında çalışır ve kurulmuş olmalıdır. Bunun olmasından emin olmanın bir yolu bilgisayarınla çakım yapılacak cihaz arasında, cihazın gücünü kapattığında bağlantıyı kurulu tutacak bir 'switch' veya 'hub' kullanmaktır.

Başka bir seçenek Linux'ta şebeke yöneticisini devredışı bırakmak veya buna sahip olmayan bir dağıtım/CanlıCD kullanmaktır. Bunu devredışı bırakacak bazı komutlar (kullanılan Linux dağıtımına bağlı):

  • /etc/init.d/networking stop
  • /etc/init.d/network stop
  • /etc/init.d/NetworkManager stop
  • service networking stop
  • service network stop
  • service NetworkManager stop
Hazırlık Adımları
  1. *önyükleyicinin* şebekesiyle uyuşacak bir sabit IP yapılandır
    • ifconfig eth0 ipv4.x.y.z netmask 255.255.255.0
    • Özgül ayarlar için cihazının OpenWrt wiki sayfasını gör
  2. Bazen önyapılandırılmış bir arp girdisinin tftp zamanını yakılama şansını arttırmaya yardımı olur
    • arp -s ipv4.x.y.1 20:aa:bb:cc:dd:00
      • Cihaz modelinin OpenWrt viki sayfasını doğru IP ve MAC adresleri için kontrol et
atftp Kullanmak

Tek bir komut-satırı olarak:

atftp --trace --option "timeout 1" --option "mode octet" --put --local-file openwrt-xxx-x.x-xxx.bin IPv4.x.y.z

Adım adım:

atftp
connect IPv4.x.y.z
mode octet
trace
timeout 1
put openwrt-xxx-x.x-xxx.bin
netkit's tftp Kullanmak

Tek bir komut-satırı olarak:

echo -e "binary\nrexmt 1\ntimeout 60\ntrace\nput openwrt-xxx-x.x-xxx.bin\n" | tftp IPv4.x.y.z

Adım adım:

tftp IPv4.x.y.z
binary
rexmt 1
timeout 60
trace
Packet tracing on.
tftp> put openwrt-xxx-x.x-xxx.bin

“rexmt 1” ayarlamak tftp istemcisinin dosyayı verili aadrese göndermeyi sürekli tekrar denemesine neden olur. Yukarıda önerildiği üzere, kutunuzu, komutları yazdıktan sonra takın, ve ön yükleyici dinlemeye başlar başlamaz, istemcin başarıyla bağlanıp bellenimi gönderecektir.

Bununla birlikte bazı cihazlar pinge cevap verir, bazıları vermezken.

Not: CFE önyükleyicinin bazı sürümleri için, son satırın “put openwrt-xxx-x.x-xxx.bin code.bin” olması gerekebilir. Eğer bu çalışmaz ise code.bin yerine başka çeşitleri dene - örnek olarak openwrt-g-code.bin veya openwrt-gs-code.bin.

Bir CFE sürümü sadece '….bin' dosyasını 'code.bin' olarak adlandırdıktan sonra çalışırdı. Linux Ubuntu'dan, daha sonra 'tftp -m binary 192.168.1.1 -c put code.bin' komutunu kullandım ve aktarım süreci hayata geldi.

curl Kullanmak
curl -T openwrt-xxx-x.x-xxx.bin tftp://IPv4.x.y.z
tftpd-hpa kullanmak

On Mac OS X, you should be able to flash the router with the command line tftp client, which behaves identically to netkit's tftp above.

Some people have had problems with the command line tftp client, however, and recommend using MacTFTP Client instead:

  • Download, install, and open MacTFTP
  • Choose Send
  • Address: Your bootloaders IP address
  • Choose the openwrt-xxx-x.x-xxx.bin file
  • Click on start while applying power to the WRT54G

Many Macs will disable the Ethernet card when the router is powered off and will take too long to re-enable the card, causing the TFTP transfer to fail with an “Invalid Password” error. Many people have had success if they manually configure their network card (in the “Ethernet” tab of “Built-in Ethernet” in System Preferences' Network panel) to:

  • Configure: Manual (Advanced)
  • Speed: 10 BaseT/UTP
  • Duplex: full-duplex

Alternatively, you can connect the router to the Mac via a hub or switch; see the troubleshooting section for more information.

There are multiple tftp clients that you can choose from.

GUI TFTP clients

    1. Server is the IP address of your bootloader tftp server
    2. Password is typically blank
    3. Select the firmware file
    4. Set retries to 20 or more (most of the time you get it in 3)
    5. Click on Upgrade and it will constantly retry until it gets it
  • Windows 2000 and Windows XP have a built-in TFTP client and it can be used to flash with OpenWrt firmware.
  • tftpd32 (use client mode!)

TFTP command line client short Instructions

  1. Open a command window (cmd.exe)
  2. tftp -i <bootloader IP tftp server address> PUT OpenWrt-gs-code.bin
  3. Now you may plug in the router (unplug it first if it was plugged).

Note that some bootloaders do not respond to ping.

  1. Plug in your Windows network interface into the appropriate port on the device you will be flashing
  2. Static IP your wired Ethernet interface to an appropriate IP address on the same network as your bootloaders network
    • Example: Your bootloader has an IP of 192.0.2.1 (netmask of 255.255.255.0) so your Windows network configuration would use 192.0.2.2/24
    • See your device's OpenWrt wiki devicepage for specific settings
  3. Open an elevated command prompt
    • Start, Run, “cmd” on Windows 2000,XP,2003
    • Start, search on “cmd”, ctrl+shift+enter on Vista, 7, 2008, etc.
  4. arp -s <bootloaders ip address> <bootloaders mac address> <your Windows static IP address>
    • Assists in avoiding delay in reaching tftp server on device
    • Windows MAC addresses use dashes instead of colons (ex: 00-00-00-00-00-00)
    • Windows 7 and other similar versions may require
      • netsh interface ipv4 add neighbors “Local Area Connection” <bootloaders ip address> <bootloaders mac address>
  5. Disable Windows media sensing (shouldn't be necessary if you have a switch in the middle)
    • netsh interface ipv4 set global dhcpmediasense=disabled
    • netsh interface ipv6 set global dhcpmediasense=disabled
  6. Disable Windows firewall and any other firewalls on your client machine
  7. Unplug your router
  8. Run your tftp program (chosen above)
  9. Plug in router immediately after tftp program begins put attempts
  10. Flash usually takes a few minutes. See your device's OpenWrt wiki devicepage for specifics
  11. You will probably want to re-enable Windows media sensing and revert your other network changes

Eğer kullanıyorsan ateş-duvarı yapılandırmanı hatırla. En iyisi “put” komutunu koşturmak ve ardından hemen yönlendiriciye güç vermektir, karşıya yükleme aralığı fazlasıyla kısa olduğundan ve önyüklemede çok erken olduğundan.

TFTP Hatası İllet
Code pattern is incorrect (Kod yapısı yanlış) Yüklediğin bellenim imajı başka bir modele yöneliktir.
Invalid Password (Geçersiz parola) Bellenim ön yüklendi ve önyükleyicinin tftp sunucusu yerine, bellenim içinde barınan parola korumalı bir tftp sunucusuna bağlandın.
Timeout (zamanaşımı) Yönlendiricinin hatta olduğunu doğrulamak için pingle
Başka bir tftp istemcisi dene (bazısının düzgün çalışmadığı bilinir)
Timeout (zamanaşımı) Yönlendiricinin çalıştığını doğrulamak için pingle
NetworkManager (Linux) hala çalışıyor, otomatık tanımaya sebep oluyor olabilir. Elişi yapılandırmayla tekrar dene.

Bazı makineler, yönlendiricinin gücü kapalıyken eterneti devredışı bırakacaktır ve yönlendirici birkaç saniyeliğine güce bağlı olana kadar yeniden devreye almaz. Eğer sürekli “Invalid Password” başarısızlığı alıyorsan bilgisayarını ve yönlendiriciyi bir hub veya switch'e bağla. Böyle yapmak bağlantıyı ayakta tutacak ve yönlendirici kapalıyken bilgisayarı, arayüzünü devredışı bırakmaktan alıkoyacaktır.

Bağlantıyı canlı tutmak için bir hub aramaya gitmeden önce, TCP/IP yapılandırmanı DHCP yerine bir sabit IP (192.168.1.10; 255.255.255.0; 192.168.1.1 [gateway]) yöntemini dene.

:!: Eğer yönlendiricini çakabilirsen ve seri uçbirimde “Boot program checksum is invalid” veya “Invalid boot block on disk” diyorsa bir başka tftp istemcisi dene - atftp iyi çalışır. Bu bazı netkit tftp paketlerinde ve büyük bellenimlerde gerçekleşir.

Example

FIXME bunun sadece özgül modelin viki sayfasında olması daha mı iyi olurdu?

FIXME tftp destekleyen modelleri listelemek için, hangilerinin reset dügmesiyle tetiklenmeye ihtiyacı olduğu notuyla bir sayfa oluşturmalı mıyız?

Benim kullandığım Asus WL-500g Premium v1 de dahil, pek çok yönlendiricide gücü kesip, reset düğmesine basılı tutarak gücü yeniden bağlayarak imaj çakarsınız. Birkaç saniye bekleyince PWR LED yanıp sönmeye başlar. Reset düğmesini bırakırsın. Cihazın artık 192.168.1.1 üzerinde çalışan bir TFTP sunucusu olacaktır.

Pek çok TP-Link modelinin aynı numarayı desteklediğini dikkate al. TL-WR740Nv4, TL-WDR4300v1, TL-WDR3600v1, TL-WR842NDv1, TL-WR841NDv8, WR841NDv11, WR841NDv12, TL-MR3020v1, TL-MR3220v2, TL-MR3420v2, TL-WR940Nv2, TL-WR941NDv5, TL-WR1042NDv1 ve muhtemelen yakın zamanda üreticiden bellenim güncellemesi almış olan diğer TP-Link modelleri. Bir özet ve süren deneyler için: http://bkil.blogspot.com/2014/12/hidden-tftp-of-tp-link-routers.html

Bu noktada bir eternet kablosu kullanman gerekecek. WAN'a değil LAN1-LAN4'e bağla. Yerel makinanı 192.168.1.x/24 şebekesinde, örneğin 192.168.1.42 olarak yapılandır. Yönlendirici 192.168.1.1 kullanacak.

$ tftp 192.168.1.1
tftp> trace
Packet tracing on.
tftp> binary
tftp> put openwrt-brcm-2.4-squashfs.trx
sent WRQ <file=openwrt-brcm-2.4-squashfs.trx, mode=octet>
received ACK <block=0>
sent DATA <block=1, 512 bytes>
received ACK <block=1>
sent DATA <block=2, 512 bytes>
received ACK <block=2>
sent DATA <block=3, 512 bytes>
received ACK <block=3>
sent DATA <block=4, 512 bytes>
...
received ACK <block=4742>
sent DATA <block=4743, 512 bytes>
received ACK <block=4743>
sent DATA <block=4744, 512 bytes>
received ACK <block=4744>
sent DATA <block=4745, 0 bytes>
received ACK <block=4745>
Sent 2428928 bytes in 6.2 seconds
tftp> quit
$

Bir dakika bekle ve gücü kesip yeniden bağlayarak kutuyu yeniden başlat. Bazı belgelendirme cihazın kendisini yeniden başlatması gerektiği iddiasında olabilir ama ne kadar beklersem bekleyeyim, ben bunun gerçekleştiğini hiç görmedim.

TFTP sunucunun dosyalara ve dizinlere yeterli erişim izinlerine sahip olduğunu kontrol et. U-Boot TFTP istemcisi / tftpboot yakınabilir:

## Error: 'Access violation' (2), starting again!
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2022/04/24 19:27
  • by sorcun