Официальный форум СВД Встраиваемые Системы
10 Декабря, 2016, 07:59:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Настройка ssh под arm-le без файловой системы  (Прочитано 843 раз)
ad
Пользователь

Сообщений: 69


« : 06 Июля, 2015, 22:52:31 »

Есть контроллер ARM Cortex-A8, в котором операционная система создается одним "кирпичом" - файл загрузки <load_file>.ifs. В build-файле,соответственно, создается все необходимое для работы - запуск необходимых драйверов, служб и сервисов. Настроено telnet-соединение и ftp-соединение. Есть задача настроить ssh.
Но с ходу это не удалось. Было использовано два варианта:
1) Создать все необходимые ключи на целевом процессоре с помощью ssh-keygen (все необходимые библиотеки и дополнительные файлы для работы созданы). При запуске данной утилиты он требует запуск устройства генерации случайных последовательностей и существование каталога /dev/random. При запуске утилиты random, которая создает указанный каталог, выдается ошибка unresolved symbol ***tabz (*** - точное название вылетело из головы) и каталог /dev/random не создается.
2) Пробовал создать нужные ключи на обычном компьютере и перенести на целевой компьютер. При запуске sshd выдается ошибка "RSA_Blinding_on failed." Далее пишет, что не может загрузить данные из файлов /etc/ssh/ssh_host_dsa_key и /etc/ssh/ssh_host_rsa_key. И сервер не запускается.
Можно без полноценной файловой системы настроить правильноую работу sshd? На данный момент каталог /var  - это перенаправленная ссылка на /dev/shmem, то есть расшаренную память. Как перенастроить создаваемые файлы утилитами, чтобы они запускались, к примеру в RAM (я про /var/chroot/sshd.pid или что-то подобное)?
Записан
Владимир Махилёв
Сотрудник СВД ВС
Ветеран

Сообщений: 659



WWW
« Ответ #1 : 07 Июля, 2015, 19:24:25 »

Организовать запуск ssh сервера только из загрузочного образа возможно, хотя и достаточно витиеватыми путями. Для этого потребуется создать файловую систему в RAM памяти (/dev/shmem для этих целей не подойдёт) и отредактировать файл построения.

Для работы sshd требуется сервис random, поэтому перед запуском сервера вставьте команду:
Код:
random -t -p  &

Затем вам потребуется организовать RAM диск и создать в нем каталог /var/chroot/sshd.
Пример команд в загрузочном образе (секция файла построения [+script] startup.script = )
Код:
    #######################################################################
    ## Start sshd from image
    #######################################################################
    display_msg Preparing RAM disk and starting sshd...
    devf-ram -e -m /ramfs &

    waitfor /dev/fs0 5
    flashctl -p /dev/fs0p0 -e -f -n /ramfs -m
    waitfor /ramfs

    mkdir -p /ramfs/var/chroot/sshd
    chmod 700 /ramfs/var/chroot/sshd
   
    mkdir -p /ramfs/root
    chmod 700 /ramfs/root

    /proc/boot/start_sshd
    #######################################################################
 

Явно запустить сервер sshd не получится, для этого подойдёт скрипт который можно определить прямо в образе (секция файла построения[data=c] ):
Код:
[perms=700] /proc/boot/start_sshd = {
/usr/sbin/sshd
}

Затем вам потребуется добавить запись в файл  /etc/passwd. Например, так:
Код:
/etc/passwd = {
root::0:0:Superuser:/root:/bin/sh
sshd:x:15:6:sshd:/var/chroot/sshd:/bin/false
}


Для работы sshd необходим ряд файлов с ключами и конфигурационный файл sshd_config. Ключи необходимо подготовить заранее либо на инструментальной машине, либо на целевой, как вам удобнее.
Пример команд:
Код:
# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''

Если систем много и они тиражируются, стоит организовать генерацию различных ключей для каждой системы, например с указанием какой-либо различающейся строки в параметре -N ''.

Конфигурационный файл sshd_config отредактируйте под свои задачи.
Для входа по ключу пропишите строки:
Код:
PubkeyAuthentication yes
AuthorizedKeysFile /etc/ssh/ssh_known_hosts

Чтобы разрешить удалённое подключение пользвателю root, если это требуется:
Код:
PermitRootLogin yes

Если потребуется подключение от пользователей, то необходимо прописать их в файле /etc/passwd в составе образа.

В файл ssh_known_hosts добавьте открытый ключ той системы с которой вы в дальнейшем будете удалённо подключаться. Обычно он хранится в файле $HOME/.ssh/id_rsa.pub

В итоге у вас должно получиться несколько файлов. Для удобства сборки образа можно сохранить их в одном каталоге, например ssh
Код:
$ ls ./ssh
sshd_config  ssh_host_dsa_key  ssh_host_dsa_key.pub  ssh_host_rsa_key  ssh_host_rsa_key.pub  ssh_known_hosts

В файле построения пропишите
Код:
###########################################################################
## SSH
###########################################################################
[type=link] /var/chroot/sshd=/ramfs/var/chroot/sshd
[type=link] /usr/sbin/sshd=/proc/boot/sshd

[perms=600] /etc/ssh/sshd_config=../../ssh/sshd_config
[perms=600] /etc/ssh/ssh_host_dsa_key=../../ssh/ssh_host_dsa_key
[perms=600] /etc/ssh/ssh_host_rsa_key=../../ssh/ssh_host_rsa_key
[perms=644 gid=0 uid=0] /etc/ssh/ssh_known_hosts=../../ssh/ssh_known_hosts

[perms=755] sshd
[perms=755] /usr/bin/sftp=sftp
[perms=755] /usr/libexec/sftp-server=${QNX_TARGET}/${PROCESSOR}/usr/libexec/sftp-server
[perms=755] /usr/libexec/ssh-keysign=${QNX_TARGET}/${PROCESSOR}/usr/libexec/ssh-keysign

[type=link] /root=/ramfs/root

Если в SFTP нет необходимости, то строчки sftp, sftp-server и ssh-keysign можно удалить.

В sshd сервер явно зашита переменная с путями PATH, поэтому для удобства работы можно её явно переопределить с помощью /etc/profile. Например, так:
Код:
/etc/profile= {
PATH=/proc/boot:/bin:/sbin:/usr/bin:/usr/sbin
}

В результате, если все действия выполнены корректно, то будет работать удалённое подключение к целевой системе с QNX по ssh:
Цитировать
> ssh root@192.168.1.70
Welcome to QNX Neutrino!
#

Или из файлового менеджера: sftp://root@192.168.1.70/


Записан

ad
Пользователь

Сообщений: 69


« Ответ #2 : 07 Июля, 2015, 22:23:55 »

Организовать запуск ssh сервера только из загрузочного образа возможно, хотя и достаточно витиеватыми путями. Для этого потребуется создать файловую систему в RAM памяти (/dev/shmem для этих целей не подойдёт) и отредактировать файл построения.
Спасибо. Я попробую ровно так, как Вы сказали. Но... проблема в том, что как раз утилита random не запускается. Ошибку я выше описывал. Сможете подсказать, как преодолеть эту проблему? Если необходимо точное название ошибки, я завтра смогу написать. Не помню, к сожалению, точное описание ошибки.
Записан
Андрей Докучаев
Сотрудник СВД ВС
Ветеран

Сообщений: 652



WWW
« Ответ #3 : 07 Июля, 2015, 23:08:30 »

При запуске утилиты random, которая создает указанный каталог, выдается ошибка unresolved symbol ***tabz (*** - точное название вылетело из головы) и каталог /dev/random не создается.

В образ включаете утилиту, собранную точно для данной платформы? Компоненты arm, armv7, arm (sp1), armv7 (sp1) могут отличаться по набору символов в elf-файле.
Записан

ad
Пользователь

Сообщений: 69


« Ответ #4 : 08 Июля, 2015, 00:14:42 »

В образ включаете утилиту, собранную точно для данной платформы? Компоненты arm, armv7, arm (sp1), armv7 (sp1) могут отличаться по набору символов в elf-файле.
Хм... Вопрос резонный. Допускаю, что я не тот исполняемый файл включил в образ. Платформа arm-v7-le. Но, с другой стороны, из этой же директории другие утилиты успешно работают. Проверил.
Записан
Андрей Докучаев
Сотрудник СВД ВС
Ветеран

Сообщений: 652



WWW
« Ответ #5 : 08 Июля, 2015, 10:26:41 »

Но, с другой стороны, из этой же директории другие утилиты успешно работают

Ситуация достаточно однозначная. Загрузчик не может разрезолвить все символы в исполняемом файле, судя по сорцам у random зависимость только от libc, libm и libz. На этапе исполнения упомянутый символ перестал обнаруживаться в одной из этих библиотек, соответственно, либы не соответствуют бинарнику. Либо в образе не те либы, либо (что, имхо, более вероятно) не тот бинарник. Есть еще один вариант, но он из разряда совсем маловероятных - бинарник собирался с нужными либами, но не тем компилятором.

Я бы начал разбираться с поиска символа, который отсутствует. Хорошо бы найти в какой либе он должен быть, скорее всего этого будет достаточно для принятия дальнейших решений. Обычным поиском по бинарным компонентам target или же через readelf.

Но, с другой стороны, из этой же директории другие утилиты успешно работают

Линковщик включает в результирующий elf упоминания только тех символов, которые были задействованы в коде исполняемого объекта и/или билиотек, ссылок на остальные символы библиотек там быть не должно. Теоретически, random может включать мало используемый функционал одной из либ, который не требуется другим утилитам и, таким образом, требовать наличия специфичного символа уже на стадии исполнения.
« Последнее редактирование: 08 Июля, 2015, 10:32:18 от Андрей Докучаев » Записан

Владимир Махилёв
Сотрудник СВД ВС
Ветеран

Сообщений: 659



WWW
« Ответ #6 : 08 Июля, 2015, 12:20:27 »

Стоит удостовериться, что у вас изначально в образ попадают корректный файл и библиотеки из $QNX_TARGET/armle-v7/

На всякий случай контрольные суммы:
(щёлкните чтобы показать/скрыть)


В составе образа должны быть файлы:
Код:
libm.so.2
libz.so.2

[data=c]
random

Особое внимание обратите на то, что исполняемые файлы должны находиться в секции [data=c]
Если вы собираете образ в Momentics рекомендую проверить сборку в консоли с оригинальным текстовым файлом построения из BSP.

Если проверив всё вышесказанное ошибка останется - скопируйте весь отладочный вывод из консоли.
Записан

ad
Пользователь

Сообщений: 69


« Ответ #7 : 08 Июля, 2015, 13:18:24 »

Спасибо. Попробую указанные варианты. Сейчас пробую создать ключи на инструментальном компьютере. А с random следующим шагом буду разбираться.
Записан
ad
Пользователь

Сообщений: 69


« Ответ #8 : 09 Июля, 2015, 00:09:43 »

Итак, как я понял, есть два варианта. Первый вариант - настроить ключи на инструментальной машине и включить в файл построения загрузчика, либо внедрить в образ утилиты создания ключей и уже на целевом процессоре создать ключи, а затем менять образ в соответствии с этими ключами.

К сожалению, оба варианта провалились.

Второй вариант:
Как я уже говорил, у меня не запустился random (doesn't find __csz_tab........unresolved all symbols). Учитывая подсказки, посмотрел данные контрольных сумм утилиты и библиотек. У меня они получились другие. И, соответственно, вопрос. Под armle-v7 эти утилиты под QNX6.5.0 и Neutrino различаются? Как узнать, у меня что именно: Neutrino or QNX 6.5.0? Neutrino или QNX 6.5.0? Данные контрольных сумм:
(щёлкните чтобы показать/скрыть)
Соответственно, если дело не в той утилите и библиотеках, то есть ли возможность получить те, что указаны Вами?

Цитировать
Я бы начал разбираться с поиска символа, который отсутствует. Хорошо бы найти в какой либе он должен быть, скорее всего этого будет достаточно для принятия дальнейших решений. Обычным поиском по бинарным компонентам target или же через readelf.
Ну в данном случае, я догадываюсь, что дело в /usr/lib/libz.so.2, так как именно эту библиотеку пришлось добавить для работы с sshd. Скорее всего, в ней дело.

Первый вариант.
Сделал изменения в build файле для построения ядра, согласно вашим указаниям. Итак:
Создание RAM-диска:
Код:
        #######################################################################
## RAM mounting
#######################################################################
display_msg Mounting RAM
/sbin/devb-ram ram capacity=65536 disk name=ram &
waitfor /dev/ram0t77 1
mount /dev/ram0t77 /ram
chmod 777 /ram

Создание необходимых каталогов (в скрипте запускаа) и ссылок на них (в секции после скрипта):
Код:
# in script
        mkdir -p /ram/var/log
chmod 644 /ram/var/log

mkdir -p /ram/var/chroot/sshd
chmod 700 /ram/var/chroot/sshd

mkdir -p /ram/root
chmod 700 /ram/root


# after script: in other section

[type=link] /root=/ram/root
[type=link] /var=/ram/var
[type=link] /var/log=/ram/var/log
[type=link] /var/chroot/sshd=/ram/var/chroot/sshd

# Shared libraries:
# Programs require the runtime linker (ldqnx.so) to be at a fixed location

libc.so
libm.so

###########################################################################
## sshd support
###########################################################################
/usr/lib/libz.so.2=libz.so.2

Конфигурационные файлы для sshd:
(щёлкните чтобы показать/скрыть)
В итоге после запуска sshd напрямую или же через скрипт. Напрямую, то есть:
Код:
/usr/sbin/sshd
или же через скрипт, как было описано выше, то выдается ошибка следующего содержания:
Цитировать
key_load_private_pem: RSA_blinding_on failed.
Could not load host key: /etc/ssh/ssh_host_rsa_key.
Could not load host key: /etc/ssh/ssh_host_dsa_key.
Disabling protocol version 2.
Could not load host key.
sshd: no host keys available - exiting.
Записан
Владимир Махилёв
Сотрудник СВД ВС
Ветеран

Сообщений: 659



WWW
« Ответ #9 : 09 Июля, 2015, 13:12:23 »

Похоже, что проблема с random связана с неправильными версиями файлов для другой платформы.

Проверьте следующий вариант: установите комплект разработчика QNX 6.5.0 и убедитесь, что у вас переменная $QNX_TARGET указывает именно на файлы, установленные вместе с комплектом разработчика и там есть каталог armle-v7.
Также удостоверьтесь, что скрипт/команда для сборки загрузочного образа берёт эти файлы именно из этого каталога. Это можно проверить, указав дополнительные ключи -vvv утилите mkifs.


Также, для отладки можно на первом этапе запускать sshd с дополнительным отладочным выводом из консоли:
Код:
# /usr/sbin/sshd -ddd


Цитировать
Итак, как я понял, есть два варианта. Первый вариант - настроить ключи на инструментальной машине и включить в файл построения загрузчика, либо внедрить в образ утилиты создания ключей и уже на целевом процессоре создать ключи, а затем менять образ в соответствии с этими ключами.

На инструментальной, на мой взгляд, это делать удобнее. Особенно если начнётся тиражирование и потребуются различные ключи. Такие задачи достаточно неплохо автоматизируются с помощью скриптов.
Есть еще и третий вариант - генерировать ключи при каждой загрузке заново непосредственно на целевой системе.




Записан

ad
Пользователь

Сообщений: 69


« Ответ #10 : 09 Июля, 2015, 14:31:52 »

Проверил. У меня в /usr/qnx650/target/qnx6 только x86. A я копировал файлы из /usr/qnx650/target/neutrino. Значит, у меня идет нестыковка библиотеки и утилиты. СПАСИБО.
Записан
ad
Пользователь

Сообщений: 69


« Ответ #11 : 09 Июля, 2015, 15:00:56 »

Ой. Вообще не из того каталога копировал утилиты и библиотеки.
Записан
ad
Пользователь

Сообщений: 69


« Ответ #12 : 13 Июля, 2015, 09:23:59 »

Так. После того, как я перенес утилиты, ssh-keygen запускается нормально. А вот sshd не запускается с той же самой ошибкой. Чуть позже могу скинуть подробности ошибки, при запуске с флагом -d.
Записан
Владимир Махилёв
Сотрудник СВД ВС
Ветеран

Сообщений: 659



WWW
« Ответ #13 : 13 Июля, 2015, 12:29:19 »

sshd достаточно требовательный сервис. Внимательно проверьте, что запущен random, доступны все библиотеки, каталоги, конфигурационные файлы и им установлены корректные права. Особое внимание обратите на права доступа.
Для проверки и отладки на первом этапе стоит организовать и монтировать удалённо NFS в корень с минимальным набором необходимых файлов.
Записан

ad
Пользователь

Сообщений: 69


« Ответ #14 : 13 Июля, 2015, 15:14:01 »

После запуска с флагом -d разобрался с ошибкой. Не был запущен random. Cnacuбо, проблема решена. Все работает. Того подробного описания, что Вы  сделали, для запуска sshd хватило.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2016 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 01 Декабря, 2016, 05:19:06