Warning: touch() [function.touch]: Unable to create file /home/starterkit/starterkit.ru/html/error.log because Permission denied in /home/starterkit/starterkit.ru/html/errorhandler.php on line 51
tftp get\put из Хоста на плату [Решено] - Embedded Linux - Форум - starterkit.ru
Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Embedded Linux
tftp get\put из Хоста на плату [Решено]
Maxizar
Добавлено 04.07.2011 14:17 Редактировалось 05.07.2011 09:59
0
Сообщение: 1
Maxizar
0

Пункты: 424
Регистрация: 04.07.2011
Здравствуйте.
Я можно сказать 3 недели как стал линуксойдом, так что сильно не бейте..
ОС: Ubuntu 11.04
имеется плата: at91sam9g20-ek.

Задача: собрать Ядро и Файловую систему для платы. (сделано)
Грузить Файловую систему через сеть тобишь NFS (вроде все работает)
Иметь возможность с Хотса посредствам tftp сервера загружать\сгружать файлы в файловую систему (собственно проблема)

При помощи buildroot2010.05 собрал rootFS и собственно ядро.. в busybox поставил галочки для tftp и tftpd.
Загружаю ядро через сеть по средствам U-boot давая такие вот команды:
Код
setenv bootargs noinitrd ip=192.168.150.170:192.168.150.90:::video:eth0:off root=/dev/nfs rw nfsroot=192.168.150.90:/home/xxx/Temp/Lin/,nolock mem=64M

tftpboot 20000000 uImage
bootm 20000000


Все вроде грузится и работает.

Где 192.168.150.90 — адрес Хоста (убунты)
192.168.150.170 — назначаю этот адрес для платы
На Хосте поднят tftp по этому в убунте могу делать нечто подобное:

Код
tftp> get File

-файл File закачивается в ту папку в которой нахожусь из папки сервера tftp

так же могу сделать нечто подобное в линуксе на плате
Код
#tftp -g -l File 192.168.150.90

файл закачивается все хорошо...

Но вот скажем
Код
#tftp -p -l File 192.168.150.90
- не работает говорит что server error: (2) Access violation

в чем проблема?

Если же делать нечто подобное на хосте (в убунте)
Код
>tftp 192.168.150.90
tftp> put File

такая же проблема : не работает говорит что server error: (2) Access violation

По этому моя догадка что именно из-за этого я не могу сделать нечто подобное из консоли Хоста
>tftp 192.168.150.170 (адрес платы)
tftp> get File
или
tftp> put File

обе эти команды просто молчат и все потом вылет мол превышен таймаут..
Что нужно подправить?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 04.07.2011 14:56 Редактировалось 04.07.2011 15:05 Сообщение: 2
sasamy
4.70

Пункты: 76182
Регистрация: 14.08.2009
Помоему по tftp нельзя сделать put удаленно если на удаленном хосте нет файла с таким названием (нулевого размера - дело в безопасности) который хотите передать, к тому же проверьте права доступа на директорию tftp сервера.

UPD: man tftpd
Цитата

The use of tftp(1) does not require an account or password on the remote system. Due to the lack of
authentication information, tftpd will allow only publicly readable files to be accessed. Files may be
written only if they already exist and are publicly writable.

Спуститься к концу Подняться к началу
Персональная информация
Maxizar
Добавлено 04.07.2011 16:06 Сообщение: 3
Maxizar
0

Пункты: 424
Регистрация: 04.07.2011
Я тут почитал вот это: buildroot-2011.02/output/build/tftpd-5.0/INSTALL.tftp
где сказано что:
Цитата
The default prefix for the tftp-hpa package is /usr, with the tftp
client installing as /usr/bin/tftp and the tftpd server installing as
/usr/sbin/in.tftpd on most systems


так вот у меня почему то не сгенерировался in.tftpd, из-за чего я понимаю сервер не работает, а клиент работает (tftp собрался) по этому мы можем загрузить на машину, а сгрузить с нее нет....

Почему такая шляпа?

Если всматриваться то судя по этим строчкам:
Цитата
#! /bin/sh

OPTIONS="-c -l -s /var/lib/tftpboot"

set -e

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="HPA's tftpd"
NAME=in.tftpd
DAEMON=/usr/sbin/$NAME
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/S80tftpd-hpa


из файла: .etc/init.d/S80tftpd-hpa
этот скрипт как раз и запускает сервер тфтп, и называется он in.tftpd, но его в папке просто нету, Может я что-то забыл включить или галочку какую просмотрел..
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 04.07.2011 21:28 Сообщение: 4
sasamy
4.70

Пункты: 76182
Регистрация: 14.08.2009
Цитата

по этому мы можем загрузить на машину, а сгрузить с нее нет....

Почему такая шляпа?


Шляпа в том что tftp использовать на уже загруженной системе нелогично, намного логичнее заюзать уже полноценный ftp. Кстати - можно на плате поднять dropbear (это маленький клиент и сервер SSH) и пользоваться на хосте виртуальной ФС в МС - вся корневая платы будет в отдельной панели МС как локальный ресурс - по ней можно бродить, копироать туда-сюда и прочие радости файлового менеджера.
Спуститься к концу Подняться к началу
Персональная информация
Maxizar
Добавлено 05.07.2011 09:56 Сообщение: 5
Maxizar
0

Пункты: 424
Регистрация: 04.07.2011
Нашел вроде бы решение, возможно будет кому-то полезным:
1 - На самом деле in.tftpd не нужен.
2 - Для работы и запуска tftpd сервера, необходимо создать файл inetd.conf в директории /etc/
3 - согласно документации по busybox а именно: http://www.busybox.net/downloads/BusyBox.html в пункте про tftpd написано, что для запуска сервака в файле inetd.conf нужно прописать вот это:

Код
69 dgram udp nowait root tftpd tftpd /var/lib/tftpboot


Итого содержание моего файла inetd.conf:
Код

# /etc/inetd.conf: see inetd(8) for further informations.
#
# Internet superserver configuration database
#
#
# Lines starting with "#:LABEL:" or "#<off>#" should not
# be changed unless you know what you are doing!
#
# If you want to disable an entry so it isn't touched during
# package updates just comment it out with a single '#' character.
#
# Packages should modify this file by using update-inetd(8)
#
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
#:INTERNAL: Internal services
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
#daytime stream tcp nowait root internal
#time stream tcp nowait root internal

#:STANDARD: These are standard services.
#:BSD: Shell, login, exec and talk are BSD protocols.
#:MAIL: Mail, news and uucp services.
#:INFO: Info services
#:BOOT: TFTP service is provided primarily for booting. Most sites
# run this only on machines acting as "boot servers."
69 dgram udp nowait root tftpd tftpd /var/lib/tftpboot


Где /var/lib/tftpboot - путь к папке загрузки...

После запуска Линукса на плате, нам необходимо запустить сервис inetd, просто введя inetd и нажать энтер. Проверить, запущен сервис или нет, можно введя команду top, (покажет запущенные приложения), для выхода необходимо нажать клавишу q.
После этого можно проверить работает ли, наш сервак посредством загрузки из Хоста (Убунты) файла из платы на хост.
Консоль убунты (Хоста)
Код
>tftp 192.168.150.170
tftp> get /var/lib/tftpboot/Primer.txt
tftp>quit
>

Где 192.168.150.170 адрес платы.
после чего мы загрузили из консоли Хоста, в текущую директорию файл Primer.txt из платы.
Замечание: Необходимо задавать полный путь для файла, возможно это ограничение tftpd сервера busybox, хотя возможно это мои кривые руки.

По поводу логичности:
Ну передо мной поставили такую задачу, настроить линукс так, чтобы иметь именно такую возможность (загружать файлы из платы из консоли Хоста). и именно по tftp.

И еще я ведь написал, что я под линуксом 3 недели от силы, и мол поднять FTP и т.п. Вы типа пошутили, я понимаю....
Тут наверное большинство Линуксойды с большим стажем, и встраиваемые системы под управлением линукса для вас это как с мотоцикла пересесть на мопед - смешно, легко и не принужденно...


Надеюсь, мой пост будет полезен таким же новичкам, как и я.
А я пока пойду почитаю про то как запустить сервис inetd в автоматическом режиме.

Спасибо всем.

PS. Так много в консоли я ни разу не работал :)
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 05.07.2011 10:25 Редактировалось 05.07.2011 10:33 Сообщение: 6
sasamy
4.70

Пункты: 76182
Регистрация: 14.08.2009
Цитата

Ну передо мной поставили такую задачу


Тогда понятно - просто я на всякий случай напомнил что есть и более интересные протоколы :)

Цитата

Надеюсь, мой пост будет полезен таким же новичкам, как и я.


Описание решения всегда полезно, вообще похвально что человек работающий с linux 3 недели сам находит решения.

Цитата

А я пока пойду почитаю про то как запустить сервис inetd в автоматическом режиме.


Он сам демонизируется (работает в фоне) так что достаточно прописать в любой загрузочный скрипт после поднятия сети.
/usr/sbin/inetd

Кстати, ftp поднять отличается только строчкой в /etc/inetd.conf, например
21 stream tcp nowait root ftpd ftpd /mnt
Спуститься к концу Подняться к началу
Персональная информация
Maxizar
Добавлено 06.07.2011 14:11 Сообщение: 7
Maxizar
0

Пункты: 424
Регистрация: 04.07.2011
Ну давайте уж добью я эту тему.

что я сделал для автозагрузки:
Необходимо было запустить две службы на автомате, а именно:
inetd
и веб сервер в данном случае lighttpd при этом передать ему конфиг...
Так вот, для этого дела я написал два скрипта и разместил их в папку /etc/init.d

Скрипт для запуска службы inetd (имя файла: S80inetd)
Код

#! /bin/sh
#
# Function that starts the daemon/service.
#
SCRIPTNAME=/etc/init.d/S80inetd
DAEMON=inetd

d_start() {
$DAEMON
}

#
# Function that stops the daemon/service.
#
d_stop() {
killall -q $DAEMON
}

#
# Function that sends a SIGHUP to the daemon/service.
#


case "$1" in
start)
echo -n "Starting $DAEMON: "
#inetd
d_start
echo "done"
;;
stop)
echo -n "Stopping $DAEMON: "
d_stop
echo "done"
;;
#reload)
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
# If the daemon responds to changes in its config file
# directly anyway, make this an "exit 0".
#
# echo -n "Reloading $DESC configuration..."
# d_reload
# echo "done."
#;;
restart|force-reload)
#
# If the "reload" option is implemented, move the "force-reload"
# option to the "reload" entry above. If not, "force-reload" is
# just the same as "restart".
#
echo -n "Restarting $DAEMON: "
d_stop
sleep 1
d_start
echo "done"
;;
*)
# echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 1
;;
esac


Аналогично для запуска веб сервера: (S80lighttpd)
Код

#! /bin/sh
#
# Function that starts the daemon/service.
#
SCRIPTNAME=/etc/init.d/S80lighttpd
OPTIONS="-f /etc/lighttpd.conf"
DAEMON=lighttpd

d_start() {
$DAEMON $OPTIONS
}

#
# Function that stops the daemon/service.
#
d_stop() {
killall -q $DAEMON
}

#
# Function that sends a SIGHUP to the daemon/service.
#

case "$1" in
start)
echo -n "Starting $DAEMON: "
d_start
echo "done"
;;
stop)
echo -n "Stopping $DAEMON: "
d_stop
echo "done"
;;
#reload)
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
# If the daemon responds to changes in its config file
# directly anyway, make this an "exit 0".
#
# echo -n "Reloading $DESC configuration..."
# d_reload
# echo "done."
#;;
restart|force-reload)
#
# If the "reload" option is implemented, move the "force-reload"
# option to the "reload" entry above. If not, "force-reload" is
# just the same as "restart".
#
echo -n "Restarting $DAEMON: "
d_stop
sleep 1
d_start
echo "done"
;;
*)
# echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 1
;;
esac


Благодоря этим скриптам при загрузке мы запустим веб сервер и службу inetd

Кстати на счет сервера, может и лишнее, но всеже я приведу содержание моего конфига мало ли, вдруг война....

lighttpd.conf
Код

var.log_root = "/var/log/lighttpd"
var.server_root = "/srv/www"
var.state_dir = "/var/run"
var.home_dir = "/var/lib/lighttpd"
var.conf_dir = "/etc/lighttpd"

var.vhosts_dir = server_root + "/vhosts"

var.cache_dir = "/var/cache/lighttpd"

var.socket_dir = home_dir + "/sockets"


server.port = 80

server.use-ipv6 = "enable"

#server.bind = "localhost"

server.username = "nobody"
server.groupname = "nogroup"

server.document-root = "/var/www/"

server.pid-file = state_dir + "/lighttpd.pid"

server.errorlog = log_root + "/error.log"

server.event-handler = "linux-sysepoll"

server.max-fds = 2048

server.stat-cache-engine = "simple"

server.max-connections = 1024


index-file.names += (
"index.xhtml", "index.html", "index.htm", "default.htm", "index.php"
)

url.access-deny = ( "~", ".inc" )

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".scgi" )

mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain",
".jpg" => "image/jpeg",
".png" => "image/png"
)

server.follow-symlink = "enable"

server.upload-dirs = ( "/var/tmp" )
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux