Встановлення OpenWrt через TFTP
Повернутись до ←керівництва по встановленню
TFTP — це дуже простий протокол, настільки простий, що його можна реалізувати навіть у невеликих завантажувачах (bootloader). Основна ідея така:
- Роутер вмикається
- Завантажувач починає підготовку до запуску прошивки
- На кілька секунд ініціалізуються провідні LAN порти
- Це відбувається не миттєво, а протягом короткого часу під час старту
- Мережеві налаштування можуть відрізнятись від типових для OpenWrt
- Потім:
- Проводиться спроба підключення до TFTP-сервера на визначеній IP-адресі для завантаження прошивки, АБО
- Ведеться прослуховування запитів від TFTP-клієнтів для отримання нового образу прошивки
- Подальша поведінка залежить від завантажувача
- Детальніше: Функціональність завантажувача
Потрібно з’ясувати, чи має завантажувач вашого пристрою TFTP-клієнт чи TFTP-сервер, щоб обрати відповідний розділ нижче.
Зверніться до сторінки вашої конкретної моделі на Wiki OpenWrt, щоб дізнатися про необхідні налаштування, IP-адреси та підтримку TFTP.
Завантажувач містить TFTP-клієнт
Якщо ваш пристрій має завантажувач з TFTP-клієнтом, який у режимі відновлення намагається завантажити образ, ви повинні запустити TFTP-сервер, щоб надати прошивку.
Детальна інструкція: Налаштування TFTP-сервера для відновлення/встановлення
Mikrotik RouterBoards
Цей розділ слід перенести до tftpserver
RouterBoard мають TFTP- і DHCP-клієнти у завантажувачі RouterBoot. Детальніше: Загальні процедури для Mikrotik RouterBoard
Bash-скрипт для встановлення статичної IP-адреси, запуску DHCP- та TFTP-серверів (приклад для Mikrotik):
Не забудьте змінити USER, NETDEV, IP/діапазон DHCP та шлях до файлів під ваші потреби.
#/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
Приклад 1
Цей розділ слід перенести до tftpserver
У завантажувачі bootloader пристрою DIR-300 реалізовано TFTP-клієнт. Два кроки:
- Спочатку встановіть та запустіть TFTP-сервер на вашому ПК, і розмістіть образи прошивки в кореневій папці сервера (можливо, знадобляться root-права).
Можливі директорії:
- /var/lib/tftpboot
- /srv/tftp
- Пошук директорії:
sudo find / -type d -name '*tftp*'
Приклад: <code> sudo apt-get install tftpd-hpa tftp sudo cp ~/uboot/arch/arm/boot/uboot.img /var/lib/tftpboot</code>
- Перевірка сервера:
tftp localhost
tftp> get uboot.img
tftp> quit
cmp /var/lib/tftpboot/uboot.img uboot.img
# якщо немає виводу — все працює
- Підключіться до завантажувача та дайте йому команду завантажити образ (наприклад, DIR-300 підключається через telnet на порт 9000):
telnet 192.168.20.81 9000
Redboot> load uboot.img
Redboot> go
- Після успішного встановлення OpenWrt не забудьте вимкнути TFTP-сервер!
Приклад 2
Цей розділ слід перенести до tftpserver
У деяких випадках (як в “xxx”) крок 3 з прикладу 1 непридатний. Відсутня консоль для входу, і завантажувач автоматично пробує отримати прошивку через TFTP з попередньо визначеної IP-адреси під час кожного запуску.
TFTP-сервер на Mac OS X Lion
Цей розділ слід перенести до tftpserver
Примітка: TftpServer.app забезпечує зручний графічний інтерфейс поверх вбудованого tftpd у macOS. Опис використання TftpServer.app доступний за посиланням tftpserver. Якщо ж ви віддаєте перевагу командному рядку — читайте далі…
OS X Lion вже містить tftpd, але він вимкнений за замовчуванням. Як і більшість служб у macOS, tftpd керується за допомогою `launchctl`. Файл конфігурації служби знаходиться за адресою: /System/Library/LaunchDaemons/tftp.plist Ідентифікатор служби: com.apple.tftpd
Перед змінами у конфігурації виконайте:
sudo launchctl unload -F /System/Library/LaunchDaemons/tftp.plist
Потім для завантаження служби:
sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist
Щоб зупинити службу tftpd:
sudo launchctl stop com.apple.tftpd
Щоб запустити службу tftpd:
sudo launchctl start com.apple.tftpd
Нижче наведено приклад робочого конфігураційного файлу:
<?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>
Різниця від типового файлу конфігурації полягає в наступному: щоб увімкнути службу, потрібно видалити цей блок:
<key>Disabled</key> <true/>
Додайте наступний рядок до масиву `ProgramArguments`, щоб увімкнути логування у файл /var/log/syslog.log:
<string>-l</string>
Файл образу OpenWrt, який ви хочете передавати, потрібно розмістити в директорії:
**/private/tftpboot**
Зверніть увагу, що навіть після виконання команди:
launchctl start com.apple.tftpd
ви не побачите запущений процес `tftpd` при виконанні:
ps aux | grep tftpd
Це через особливості роботи `launchctl`: служба `tftpd` фактично не запущена, але вона буде автоматично активована, щойно до неї звернеться клієнт.
У деяких випадках, коли консоль виводить “сміття” (некоректні символи), можна діяти на віру і виконати наступні команди (вони працюють у більшості випадків):
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
TFTP-сервер у MacOS 10.4 "Tiger"
Цей розділ слід перенести до tftpserver
`tftpd` також працює “з коробки” в старій версії MacOS 10.4. Можливо, директорія `/private/tftpboot` ще не створена — але це просто потрібно зробити вручну. Отримайте root-доступ і виконайте наступні команди:
bash-4.2$ sudo bash Password: bash-4.2# mkdir -p /private/tftpboot/ bash-4.2# cp /шлях/до/openwrt-образу /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 ### тестування tftp> get openwrt-ar71xx-generic-hornet-ub-squashfs-sysupgrade.bin Received 7270950 bytes in 2.7 seconds tftp>
Завантажувач з TFTP-сервером
Базова процедура використання TFTP-клієнта для завантаження нової прошивки на ваш маршрутизатор:
- Вимкніть живлення вашого маршрутизатора
- Підключіть Ethernet-кабель від комп’ютера (який виступає як TFTP-клієнт) до LAN-порту маршрутизатора
Дивіться сторінку вашої моделі на Wiki OpenWrt, щоб дізнатися, який порт використовувати
- Запустіть TFTP-клієнт на вашому комп’ютері:
- Вкажіть IP-адресу маршрутизатора (залежить від моделі й завантажувача, див. Wiki вашого пристрою)
- Встановіть режим передачі: octet або binary
- Налаштуйте клієнт на повторну відправку файлу до успішного завершення
- Використайте команду `put` для передачі файлу
- Увімкніть маршрутизатор, залишивши TFTP-клієнт активним — він має постійно намагатися встановити з'єднання
- Після отримання підтвердження (ack) від завантажувача, клієнт почне передавати прошивку
Поради
Будьте терплячими — перепрошивка починається після завершення передачі прошивки. У більшості випадків маршрутизатор перезавантажується самостійно. У деяких моделей цього не відбувається — зачекайте принаймні 15 хвилин перед вимкненням живлення.
Завантажувач зазвичай не використовує IP або MAC-адресу, збережену в NVRAM. Замість цього використовується значення за замовчуванням. Див. документацію до вашої моделі.
Поставте мережевий концентратор (hub) або комутатор (switch) між комп’ютером і маршрутизатором — це забезпечить активність мережевого інтерфейсу до того, як завершиться `boot_wait`. Це важливо для комп’ютерів, де інтерфейс активується із запізненням.
- У маршрутизаторів з індикатором DMZ: під час завантаження OpenWrt цей індикатор світиться, і вимикається після завершення скриптів завантаження.
Команди TFTP залежать від реалізації. Нижче кілька прикладів:
Linux/BSD
Мережеве з’єднання повинно бути встановлено до моменту ввімкнення пристрою. Один зі способів гарантувати це — підключити комутатор (switch) або концентратор (hub) між комп’ютером і пристроєм.
Альтернатива — вимкнути Network Manager (або скористатися дистрибутивом/LiveCD без нього). Можливі команди (залежить від дистрибутива):
- `/etc/init.d/networking stop`
- `/etc/init.d/network stop`
- `/etc/init.d/NetworkManager stop`
- `service networking stop`
- `service network stop`
- `service NetworkManager stop`
- `systemctl stop NetworkManager`
Кроки підготовки
- Призначте статичну IP-адресу, сумісну з мережею завантажувача:
ip address add 192.168.x.y/24 dev eth0
- Попередньо створіть ARP-запис, щоб збільшити шанси «встигнути» у TFTP-вікно:
arp -s 192.168.x.1 02:aa:bb:cc:dd:20
- Перевірте сторінку вашого пристрою на Wiki для точних IP і MAC-адрес
Використання atftp
Використання tftp від netkit
Використання curl
Використання tftpd-hpa
macOS X
У macOS можна використовувати вбудований TFTP-клієнт у терміналі, як у прикладі з netkit вище.
У разі проблем можна скористатися MacTFTP Client:
- Завантажте, встановіть та відкрийте MacTFTP
- Виберіть Send
- Вкажіть IP-адресу завантажувача
- Виберіть файл прошивки (`openwrt-xxx-x.x-xxx.bin`)
- Натисніть Start, одночасно вмикаючи живлення маршрутизатора
На деяких Mac'ах Ethernet-інтерфейс вимикається після відключення живлення на маршрутизаторі, і його повторна активація може зайняти надто багато часу. Це може призвести до помилки `“Invalid Password”` під час передачі TFTP.
Багато користувачів рекомендують вручну налаштувати мережеву карту в macOS:
- Configure: Manual (Advanced)
- Speed: 10 BaseT/UTP
- Duplex: full-duplex
Альтернатива — використання концентратора або комутатора. Детальніше див. у розділі Усунення неполадок.
Windows
Існує кілька TFTP-клієнтів, які ви можете використовувати.
Запуск TFTP-клієнта за допомогою командного рядка (коротка інструкція)
- Відкрийте командний рядок (cmd.exe) від імені адміністратора
- Увімкніть вбудований клієнт TFTP у Windows:
Dism /online /Enable-Feature /FeatureName:TFTP /All
- Завантажте нову прошивку на маршрутизатор:
tftp -i <IP-адреса TFTP-сервера завантажувача> PUT OpenWrt-gs-code.bin
- Тепер увімкніть живлення маршрутизатора (якщо був увімкнений — вимкніть, потім знову увімкніть)
Зверніть увагу: деякі завантажувачі не відповідають на ICMP (ping).
- Під’єднайте ваш мережевий інтерфейс Windows до відповідного порту на пристрої, який ви будете прошивати
- Призначте статичну IP-адресу у тій самій підмережі, що і завантажувач
- Приклад: якщо IP завантажувача — 192.0.2.1, маска — 255.255.255.0, то ваша IP-адреса — 192.0.2.2/24
- Перевірте сторінку моделі вашого пристрою в Wiki OpenWrt для точних налаштувань
- Відкрийте підвищений командний рядок:
- Win 2000, XP, 2003: Пуск → Виконати → `cmd`
- Win Vista, 7, 2008+: Пуск → пошук `cmd` → Ctrl+Shift+Enter
Додайте запис ARP:
<code> arp -s <IP завантажувача> <MAC-адреса завантажувача> <ваш Windows IP></code>
* У Windows MAC-адреси записуються з дефісами, а не з двокрапками (наприклад: 00-00-00-00-00-00)
* У Windows 7 та подібних системах можливо знадобиться:
<code> netsh interface ipv4 add neighbors "Local Area Connection" <IP завантажувача> <MAC-адреса></code>
- Вимкніть визначення медіа (media sensing):
netsh interface ipv4 set global dhcpmediasense=disabled
netsh interface ipv6 set global dhcpmediasense=disabled
Вимкніть брандмауер Windows та інші фаєрволи(але більшість з них не блокують вихідний трафік)- Вимкніть маршрутизатор
- Запустіть обраний TFTP-клієнт
- Увімкніть маршрутизатор одразу після початку передачі файлу (TFTP має обмежене вікно)
- Перепрошивка займає кілька хвилин — дивіться документацію до вашого пристрою
- Після завершення бажано повернути початкові мережеві налаштування
TFTP-клієнти з графічним інтерфейсом
-
- У полі Server вкажіть IP-адресу TFTP-сервера (IP завантажувача)
- Пароль зазвичай не потрібен
- Оберіть файл прошивки
- Встановіть кількість повторів на 20 або більше
- Натисніть Upgrade — клієнт буде постійно намагатися передати файл
- У Windows 2000, XP та новіших вбудований TFTP-клієнт може бути використаний для прошивки OpenWrt
Усунення неполадок
Не забувайте про налаштування фаєрволу, якщо він активний. Найкраще спочатку виконати команду `put`, а потім одразу увімкнути живлення на маршрутизаторі — вікно TFTP дуже маленьке й відкривається на початку процесу завантаження.
| Помилка TFTP | Причина |
|---|---|
| Невірний формат прошивки | Образ прошивки призначений для іншої моделі пристрою |
| Invalid Password | Ви підключилися не до завантажувача, а до вбудованого TFTP-сервера вже запущеної прошивки |
| Timeout (тайм-аут) | Спробуйте ping для перевірки доступності пристрою. Змініть клієнт TFTP, деякі працюють некоректно |
| Timeout, але ping працює | У Linux може бути активний NetworkManager. Спробуйте вручну налаштувати мережу |
Деякі комп’ютери вимикають Ethernet-інтерфейс, коли маршрутизатор вимкнений, і повторно активують його лише через кілька секунд після увімкнення живлення. Якщо ви постійно бачите Invalid Password, підключіть комп’ютер і маршрутизатор через hub або switch — це дозволить зберегти з’єднання.
Замість DHCP вручну налаштуйте TCP/IP:
- IP: 192.168.1.10
- Маска: 255.255.255.0
- Шлюз: 192.168.1.1
Якщо після прошивки з’являється повідомлення “Boot program checksum is invalid” або “Invalid boot block on disk” — спробуйте інший клієнт, наприклад atftp. Це трапляється з деякими TFTP-клієнтами netkit та великими образами.
Приклад
Чи не краще було б перенести цей приклад на сторінки відповідних моделей?
Чи створити окрему сторінку зі списком моделей, які підтримують TFTP, та позначити ті, що потребують затискання кнопки Reset?
Для багатьох маршрутизаторів, зокрема Asus WL-500g Premium v1, процес такий:
- Вимкніть живлення
- Натисніть і утримуйте кнопку Reset
- Увімкніть живлення, не відпускаючи кнопку
- Через кілька секунд індикатор живлення почне блимати
- Відпустіть кнопку Reset — пристрій перейде в режим TFTP на адресі 192.168.1.1
Багато моделей TP-Link також підтримують цей метод, включаючи:
TL-WR740Nv4, TL-WDR4300v1, TL-WDR3600v1, TL-WR842NDv1, TL-WR841NDv8, TL-WR841Nv11, TL-WR841Nv12, TL-MR3020v1, TL-MR3220v2, TL-MR3420v2, TL-WR940Nv2, TL-WR941NDv5, TL-WR1042NDv1.
Огляд і експерименти: http://bkil.blogspot.com/2014/12/hidden-tftp-of-tp-link-routers.html
- Підключіться кабелем до порту LAN1-LAN4, не до WAN
- Налаштуйте комп’ютер на IP у підмережі 192.168.1.x, наприклад 192.168.1.42
- Маршрутизатор буде доступний на 192.168.1.1
$ tftp 192.168.1.1 tftp> trace tftp> binary tftp> put openwrt-brcm-2.4-squashfs.trx tftp> quit
Передача виглядатиме приблизно так:
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=4745, 0 bytes> received ACK <block=4745> Sent 2428928 bytes in 6.2 seconds
Зачекайте хвилину і перезапустіть маршрутизатор (відключивши й знову підключивши живлення). Деяка документація стверджує, що пристрій перезавантажується автоматично, але це не завжди так.
Права доступу до файлів
Перевірте, чи має ваш TFTP-сервер достатні права доступу до файлів або директорій.
У випадку U-Boot TFTP клієнта, ви можете отримати помилку:
## Error: 'Access violation' (2), starting again!