вторник, 10 сентября 2013 г.

ftp и web сервер на осове openwrt и dir320

ftp и web сервер на осове openwrt и dir320

Эта статья родилась как следствие моих экспериментов с прошивкой и настройкой dir320. По сути она является компиляцией документации с различных источников и не претендует на первичность и эксклюзивность описанных тут знаний :)
Итак, у нас есть само устройство dir320.
Вот его краткие характеристики:

  • Процессор: Broadcom BCM5354 240Мгц.
  • Оперативная память: 32Мб.
  • ПЗУ: 4Мб.
  • Порт USB 2.0
  • Интерфейс WAN 10/100BASE-TX Ethernet
  • Интерфейс LAN 4 х 10/100BASE-TX Ethernet
Именно наличие USB 2.0 лично для меня сыграло основную роль в выборе сего девайса...

Внимание

Устанавливая не фирменную прошивку, Вы:

  • Нарушаете гарантийные условия и теряете гарантию на устройство.
  • Можете полностью "убить" ваше устройство.
  • Вам потребуются знания и понимание принципов работы операционной системы Linux.
Данное руководство НЕ является официальным. К моменту прочтения данного руководства оно уже могло устареть. Автор не несет никакой моральной, финансовой или физической ответственности за описанные здесь методы прошивки устройства. Применяйте описанные здесь методы на свой страх и риск.
Пожалуйста, прежде чем приступить к прошивке устройства дважды подумайте: А надо ли оно вам?

Начало

Для начала определимся, какую прошивку будем устанавливать. В околоорбитных интернетах было найдено http://www.dd-wrt.com/ иhttp://openwrt.org/. openwrt лично мне понравился больше, хотя бы потому, что процесс сборки и кастомайзинга прошивки лучше документирован, и по сути проходит с использованием всего нескольких команд.

Собираем свою прошивку

Вся сборка будет проходить на Linux машине. В моем случае это была старенькая Gentoo.
Для начала получим последние стабильные исходники прошивки (на данный момент это бранч backfire)
svn co svn://svn.openwrt.org/openwrt/branches/backfire dir320
Рекомендуется также обновить дерево дополнительных скриптов
./scripts/feeds update -a && ./scripts/feeds install -a
Эти скрипты отвечают за установку дополнительного программного обеспечения, такого как vsftpd, iptraf и т.д. Кстати, если вы не планируете использовать дополнительное ПО, этот шаг можно невозбранно пропустить.
Теперь самое время приступить к конфигурированию прошивки.
Мой первый эксперимент с конфигурянием прошивки с нуля и ее установкой завершился неудачно. И пришлось восстанавливать девайс через recovery console.
Посему, я взял конфиг от уже собранных сборок:
Теперь мы готовы начать настройку нашей прошивки:
make menuconfig

Процесс очень похож на процесс сборки ядра linux.
    Есть одно незначительное отличие:
  • Пакеты отмеченные как * -- будут собраны и установлены в прошивку.
  • Пакеты отмеченные как M -- будут собраны и окутано сложенны в каталог packages.
  • Пакеты не отмеченные, не будут собраны вообще (Что не сомненно логично).
Позднее, пакеты собранные в каталог packages можно будет невозбранно установить используя встроенный пакетный менеджер opkg.
Рекомендую сразу отключить опцию:
Global build settings -> Select all packages be default
С одной стороны, если эта опция будет отмечена, у вас будут собраны все доступные пакеты дополнительные пакеты (с опцией M). С другой стороны, это займет ОЧЕНЬ много времени и 99% этих пакетовы вы вряд ли будете использовать... Выбор за вами, не забудьте после изменения это опции, выйти, сохранив конфиг, и опять запустить make menuconfig
Так же прошу обратить внимание, dir320 имеет всего 4Мб (На самом деле доступный объем ~3.6Mb) ПЗУ, поэтому не стоит отмечать все пакеты как *, а наоборот, лучше сделать образ прошивки как можно меньшим. Впрочем, не переживайте, мы собираемся позднее перенести корневую файловую систему на внешний накопитель, что позволит вам по желанию расширять набор установленных пакетов.
Если вы собираетесь подключать внешние носители к устройству -- обязательно включите модули:

kmod-usb-coreKernel support for USB
kmod-usb-ohciKernel support for USB OHCI controllers. Alternative to uhci
kmod-usb-uhciKernel support for USB UHCI controllers. Alternative to ohci
kmod-usb2Kernel support for USB2 (EHCI) controllers
usbutilsUSB devices listing utilities: lsusb, …
kmod-usb-storageKernel support for USB Mass Storage devices
kmod-usb-storage-extrasoptional Kernel support for some more drivers, such as for SmartMedia card readers
block-mountoptional Scripts used to mount and check block devices (filesystems and swap)
block-hotplugoptional Scripts used to automatically check and mount filesystem and/or swap
kmod-fs-ext3Kernel module for ext3 filesystem support
Я собираюсь использовать файловую систему ext3. Вы можете использовать любую другую по вашему желанию, не забывайте включить нужные модули в ядро :)
Рекомендую в настройках busybox выключить сборку usage messages, a также собрать busybox утилиты для управления Login/Passwd. В довесок в мой набор входили пакеты, отмеченные как [M]: openssh, vsftpd, lighttpd, screen, sudo, iptraf, mc, irssi, rtorrent :)
Если вы готовы начинать сборку:
make
Теперь можно пойти выпить чашечку кофе или съездить на рыбалку, зависит от мощности вашего компьютера и количества выбранных пакетов.
По окончании сборки создастся имадж прошивки: bin/brcm47xx/openwrt-brcm47xx-squashfs.trx
И ipk пакеты собранные в bin/brcm47xx/packages

Установка прошивки

Установка прошивки на dir320 происходит в несколько этапов:
1. Устанавливаем на свой компьютер пакет atftp
2. Устанавливаем на свой компьютер ip адресс 192.168.0.1/24
3. Соединяем патч-кордом компьютер и dir320 (используем lan 1 порт)
4. Делаем reset для dir320 (для этого надо стилусом или спичкой удерживать reset 5-10 секунд)
5. Выключаем питание
6. Включаем питание :)
6. Как только загорится индикатор lan1 -- выполняем команду:
atftp --trace --option "timeout 1" --option "mode octet" \
 --put --local-file bin/brcm47xx/openwrt-brcm47xx-squashfs.tx 192.168.0.1
В идеале, должна начаться передача файла прошивки. Заметьте, что dir320 подымает tftp на этапе загрузки всего на несколько секунд. Если вы не поймали нужный момент -- попробуйте повторить процедуру с 4-ого шага.
Будем наедятся, что у вас все получилось. И прошивка успешно залилась на устройство. После заливки прошивки будет запущен процесс.... прошивки :) который займет до 10 минут. НЕ выключайте и НЕ делайте Reset девайса в это время!
Спустя некоторое время, будем наедятся, что ваш девайс начнет пинговатся и вы сможете зайти на него через telnet:
telnet 192.168.0.1

Базовая настройка

Сразу смените пароль root аккаунта и отключите telnet:
passwd && /etc/init.d/telnet disable
Теперь можно выйти и зайти через ssh.

Подключение внешнего usb носителя

Надеюсь у вас все получилось и вы успешно перепрошили свой девайс и имеете к нему доступ через ssh :) Приступим к более интересным вещам...
Подключите ваше(и) накопительные устройства к dir320.
У меня в хламе был найден старенький кардридер, a так же неиспользуемые 2Gb MMC и 512Mb MemoryStick карточки.
Вот как выглядел мой dmesg после подключения кардридера:
usb-storage: device found at 2
usb-storage: waiting for device to settle before scanning
scsi 0:0:0:0: Direct-Access     Generic  USB SD Reader    1.00 PQ: 0 ANSI: 0
scsi 0:0:0:1: Direct-Access     Generic  USB CF Reader    1.01 PQ: 0 ANSI: 0
scsi 0:0:0:2: Direct-Access     Generic  USB SM Reader    1.02 PQ: 0 ANSI: 0
sd 0:0:0:1: [sdb] Attached SCSI removable disk
sd 0:0:0:2: [sdc] Attached SCSI removable disk
sd 0:0:0:0: [sda] 4062208 512-byte logical blocks: (2.07 GB/1.93 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 03 00 00 00
sd 0:0:0:0: [sda] Assuming drive cache: write through
scsi 0:0:0:3: Direct-Access     Generic  USB MS Reader    1.03 PQ: 0 ANSI: 0
sd 0:0:0:3: [sdd] 982016 512-byte logical blocks: (502 MB/479 MiB)
sd 0:0:0:3: [sdd] Write Protect is off
sd 0:0:0:3: [sdd] Mode Sense: 03 00 00 00
sd 0:0:0:3: [sdd] Assuming drive cache: write through
sd 0:0:0:0: [sda] Assuming drive cache: write through
sda: sda1
usb-storage: device scan complete
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] Attached SCSI removable disk
sd 0:0:0:3: [sdd] Assuming drive cache: write through
sdd: sdd1
sd 0:0:0:3: [sdd] Assuming drive cache: write through
sd 0:0:0:3: [sdd] Attached SCSI removable disk
Если ваше накопительное устройство опознано -- отлично! Если нет, проверьте, установлены ли у вас описанные ранее kmod-usb модули, и загружены ли они: lsmod

Установка rootfs на внешний носитель

Отсоединяем его от dir320 и подключаем в компьютеру для разметки и форматирования.
Для себя я решил разбить устройства следующим образом:
Disk /dev/sdd: 502 MB, 502792192 bytes
32 heads, 32 sectors/track, 959 cylinders
Units = cylinders of 1024 * 512 = 524288 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System /dev/sdd1 3 514 262144 83 Linux /dev/sdd2 515 959 227840 82 Linux swap / Solaris
Disk /dev/sda: 2079 MB, 2079850496 bytes 47 heads, 28 sectors/track, 3086 cylinders Units = cylinders of 1316 * 512 = 673792 bytes Disk identifier: 0x00000000
Device Boot Start End Blocks Id System /dev/sda1 2 3087 2030080 83 Linux
512Mb MemoryStick были разбиты на два раздела по ~256 каждый. Первый будет отдан для roofs, а второй под swap раздел.
2Gb MMC создан только один раздел. В последствии он станет /home
Разбиваем диски по собственному желанию используя fdisk
Форматируем разделы используя mkfs.ext3 для ext3 разделов и mkswap для swap (К.О. где-то рядом).
Теперь опять подключаем накопительные устройства к dir320. Монтируем раздел для rootfs и копируем roofs с dir320 на новый раздел:
mount -t ext3 /dev/sda2 /mnt
cp /rom/* /mnt -a
umount /mnt
Надеюсь, что вы не забыли установить пакет block-extroot (если нет то установите его используя opkg)
Настраиваем /etc/config/fstab:
root@OpenWrt:~$ cat /etc/config/fstab
config global automount
   option from_fstab 1
   option anon_mount 1
   
config global autoswap
   option from_fstab 1
   option anon_swap 0
   
config mount
   option target    /
   option uuid      b87e2a54-1f90-468f-8d54-48b45ac2db64
   option fstype    ext3
   option options    rw,sync
   option enabled    1
   option enabled_fsck 1
   option is_rootfs 1
Обратите внимание, что вместо имени устройства я использую uuid. Это позволит в будующем избежать проблемм пр подключении дополнительных внешних носителей.
Получить uuid устройств можо командочкой blkid:
root@OpenWrt:~$:~# blkid /dev/sdd1
/dev/sdd2: UUID="5a24d7bc-cda4-4436-abbb-dae39519e00b"
/dev/sdd1: UUID="b87e2a54-1f90-468f-8d54-48b45ac2db64"
/dev/sda1: UUID="af3628b1-d771-4614-be4b-745c608a90d8"
Делаем reboot. Не пугайтесь если после ребута вас не пустит по ssh :) Все настройки сброшены, поэтому повторяем: telnet, passwd, отключаем сервер telnet, логинимся по ssh
Настраиваем /etc/config/fstab: (Но теперь для /home и swap разделов)
root@OpenWrt:~$ cat /etc/config/fstab
config global automount
   option from_fstab 1
   option anon_mount 1
   
config global autoswap
   option from_fstab 1
   option anon_swap 0
   
config mount
   option target    /home
   option uuid      af3628b1-d771-4614-be4b-745c608a90d8
   option fstype    ext3
   option options    rw,sync
   option enabled    1
   option enabled_fsck 1
config swap option uuid 5a24d7bc-cda4-4436-abbb-dae39519e00b option enabled 1
Создаем /home и делаем reboot. После перезагрузки в mount можно увидеть:
root@OpenWrt:~$ mount
rootfs on / type rootfs (rw)
/dev/root on /rom type squashfs (ro,relatime)
none on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,relatime)
tmpfs on /dev type tmpfs (rw,relatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
/dev/sdd1 on /overlay type ext3 (rw,sync,relatime,errors=continue,data=writeback)
mini_fo:/overlay on / type mini_fo (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
/dev/sda1 on /home type ext3 (rw,sync,relatime,errors=continue,data=writeback)
none on /proc/bus/usb type usbfs (rw,relatime)
Заметье, что /dev/sdd1 примонтирован в /overlay, а уж потом mini_fo:/overlay смонтирован в /

Настройка системы

Поскольку я собирал себе минимальный образ, без web-морды для настройки девайса, всю настройку пришлось делать вручную, что впрочем не так трудно (а некоторые аспекты возможно сделать только через правку конфигов)
Настраиваем hostname в /etc/config/system
config system
   option hostname    hellion
Настраиваем ip адреса в /etc/config/network
root@hellion:~$ cat /etc/config/network
#### VLAN configuration
config switch eth0
   option enable   1
config switch_vlan eth0_0 option device "eth0" option vlan 0 option ports "1 2 3 4 5"
config switch_vlan eth0_1 option device "eth0" option vlan 1 option ports "0 5"
#### Loopback configuration config interface loopback option ifname "lo" option proto static option ipaddr 127.0.0.1 option netmask 255.0.0.0
#### LAN configuration config interface lan option type bridge option ifname "eth0.0" option proto static option ipaddr 192.168.0.1 option netmask 255.255.255.0
#### WAN configuration config interface wan option ifname "eth0.1" option proto static option ipaddr x.x.x.x option netmask 255.255.255.0 option gateway x.x.x.x option macaddr xx:xx:xx:xx:xx:xx option dns x.x.x.x
У меня статический внешешнй адрес, а macadr мне нужен для изменения дефолтного MAC адреса на eth0.1. В случае если у вас dhcp -- используйте соотвествуюзщий proto класс.
Настраиваем /etc/config/wireless
root@hellion:~$ cat /etc/config/wireless
config wifi-device  radio0
   option type     mac80211
   option channel  11
   option macaddr    xx:xx:xx:xx:xx:xx
   option hwmode    11g
# REMOVE THIS LINE TO ENABLE WIFI: option disabled 0
config wifi-iface option device radio0 option network lan option mode ap option ssid foss.org.ua option encryption psk2 option key mycoolenckey
По сути -- все. Делаем reboot (Чтобы обновить hostname и рестартовать сервисы. Можно конечно вручную :) После загрузки -- можно подключатся к wifi и пользоваться этими вашими интернетами.

Установка дополнительных пакетов

На компьютере настраиваем веб или ftp сервер для каталога bin/brcm47xx/packages и запускаем его.
Настраиваем в /etc/opkg.conf свое локальное зеркало:
brezerk@hellion:~$ cat /etc/opkg.conf
src/gz packages http://192.168.0.2/
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
Я решил использовать sshd вместо dropbear, а также поднять ftp и http сервисы используя vsftpd и lighttpd.
Устанавливаем пакеты:
opkg install vstftp lighttpd sudo openssh-server
Опционально можете доставить любое нужно вам ПО (например торрeнты или irssi :)
Чтобы включить старт сервиса при загрузке:
/etc/init.d/vsftpd enable
Чтобы выключить удалить сервис из процеcса загрузки:
/etc/init.d/bropbear disable
По умолчанию, настройки firewall блокируют входящие соединения из wan, чтобы разрешить их, надо добавить правила в /etc/firewall.user
brezerk@hellion:~$ cat /etc/firewall.user
# This file is interpreted as shell script.
# Put your custom iptables rules here, they will
# be executed with each firewall (re-)start.
iptables -A input_rule -p tcp -d 109.86.58.241 --dport 22 -m state --state NEW -j ACCEPT iptables -A input_rule -p tcp -d 109.86.58.241 --dport 80 -m state --state NEW -j ACCEPT
Кстати, если будете выставлять ssh в мир, рекомендую отключить аутентификацию по паролю и использовать publickey.

Hints and tips

Если вы планируете в будущем обновлять прошивку, рекомендую держать все важные настройки в одном месте в: /etc/config/ при этом делая симлинк из оригинального местоположения.
brezerk@hellion:~$ ls -al /etc/lighttpd/lighttpd.conf
/etc/lighttpd/lighttpd.conf -> /etc/config/lighttpd

Recovery mode

Если прошивка не удалась или по ошибке залили чужую прошивку и маршрутизатор стал свичем, то можно сделать следующее:
1. При нажатой кнопке Reset включить питание и удерживать кнопку в течении 15 секунд.
2. После этого зайти на 192.168.0.1 через web-интерфейс.
Будет доступна консоль восстановления.
Следуя инструкции прошить фирменную прошивку: http://ftp.dlink.ru/pub/Router/DIR-320/Firmware
Восстановление фирменной прошивки:
1. Скачиваем фирменную прошивку: http://ftp.dlink.ru/pub/Router/DIR-320/Firmware
2. Устанавливаем пакет atftp
3. Устанавливаем на компьютер ip адресс 192.168.0.1/24
4. Соединяем патч-кордом компьютер и dir320 (используем lan 1 порт)
5. Делаем reset для dir320
6. Выключаем питание
7. Включаем питание :)
8. Как только загорится индикатор lan1 -- выполняем команду:
atftp --trace --option "timeout 1" --option "mode octet" \
 --put --local-file firmware.bin 192.168.0.1

Источники

Удачи! :)
Метки: linuxopenwrtdir320block-extrootusb
[[brezerk @ 17.05.2011 11:44 Total edits: 5 ( 18.11.2011 08:50 )





Комментариев нет:

Отправить комментарий