Страниц: [1] 2
  Печать  
Автор Тема: QNX 4.25 Конфигурирование целевой системы. Корень (/) в RAM  (Прочитано 13048 раз)
sc0rcher
Участник
*
Offline Offline

Сообщений: 5


Просмотр профиля
« : Октября 10, 2011, 11:51:42 am »

Здравствуйте.
Возник такой вот вопрос:
Можно ли QNX 4.25 сконфигурировать таким образом, чтобы корень файловой системы располагался в RAM-диске?

Суть проблемы такова: целевая система ставится на Fastwel CPC502, сейчас конфигурация такова (осталось от предыдущей команды разработчиков):QNX грузится с набортной nand flash, она же монтируется как корневая файловая система. В виду того, что драйвер nand flash весьма медленный, возникают проблемы с работой пользовательских процессов в тот момент, когда этот драйвер задействуется для чего нибудь, и на долгие секунды забирает процессор (тестировал на входящем телнете и программке, которая раз в 20 мс по таймеру пишет, сколько прошло времени, драйвер по sin times на запуск телнет сессии тратит более трёх секунд, задержка 20 мс таймера на 19 приоритете становится на эти 3 секунды в районе 200 мс. Собственно, сам sin отъедает 500 мс). Телнет и фтп на целевой системе нужны штатно, не хотелось бы, чтобы при этом вся работа сбивалась.

У меня идея была корень развернуть в памяти, перечитал кучу интернетов, явных указаний, как это сделать и можно ли вообще, там не нашёл, экспериментальным путём ничего не добился. Не сталкивался ли кто нибудь с чем нибудь подобным?
Пока как пожарный вариант рассматриваю конфигурацию ядро грузится из nand flash, под корень выделить немного места на CFке, если с RAMом не выйдет.
Записан
ob1
Hero Member
*****
Offline Offline

Сообщений: 629


What has two thumbs up and doesn't give a crap?


Просмотр профиля WWW
« Ответ #1 : Октября 10, 2011, 12:00:10 pm »

Можно.
Записан
AG
QOR.Moderator
*****
Offline Offline

Сообщений: 872



Просмотр профиля WWW
« Ответ #2 : Октября 10, 2011, 12:58:04 pm »

Можно.

Ты его просто колоссально вдохновил своим ответом... Smiley
Когда ты уже научишься отвечать по существу? С клиентали ты так тоже разговаривашь? Smiley
Записан

sc0rcher
Участник
*
Offline Offline

Сообщений: 5


Просмотр профиля
« Ответ #3 : Октября 10, 2011, 01:04:04 pm »

да нормально вдохновил. я сейчас с текущими задачами разберусь, вспомню, на чём остановился в своих экспериментах и начну дополнительные вопросы задавать Smiley
Записан
Landy
Jr. Member
**
Offline Offline

Сообщений: 65


Просмотр профиля WWW
« Ответ #4 : Октября 10, 2011, 02:53:15 pm »

А если мне не изменяет память - то по инету гуляла дискетка на которой qnx 4.x
Вот там как раз пакованый образ распаковывался в /ram и все дальше работало
Записан
ob1
Hero Member
*****
Offline Offline

Сообщений: 629


What has two thumbs up and doesn't give a crap?


Просмотр профиля WWW
« Ответ #5 : Октября 10, 2011, 02:56:13 pm »

Ты его просто колоссально вдохновил своим ответом... Smiley
Когда ты уже научишься отвечать по существу? С клиентали ты так тоже разговаривашь? Smiley

Как оказалось, вдохновил. ;-}

Как раз и ответил по существу, т.е. прямо на вопрос: «Можно ли QNX 4.25 сконфигурировать таким образом, чтобы корень файловой системы располагался в RAM-диске?» Видимо требуется подтверждение, что такая возможность есть. Если бы был задан другой вопрос, то и ответ был бы другой. Например, написал бы, что и как делает, и что не получается. А если бы просто спросил как, то я бы указал, что почитать или просто прошёл мимо. ;-}

Клиенты платят деньги, так что ответ был бы другой. И если клиент готов вести за свои деньги пространные беседы, то почему бы и нет? А тут люди, наверное, понимают, что никто им ничего не должен. Или не понимают?
Записан
ob1
Hero Member
*****
Offline Offline

Сообщений: 629


What has two thumbs up and doesn't give a crap?


Просмотр профиля WWW
« Ответ #6 : Октября 10, 2011, 02:59:29 pm »

А если мне не изменяет память - то по инету гуляла дискетка на которой qnx 4.x
Вот там как раз пакованый образ распаковывался в /ram и все дальше работало

А если мне не изменяет память, то на дискете используется тоже самое, что и в установщике с диска QNX 4 Update Suite. Это, наверное, слишком мощно, но кое-что там есть полезное.
Записан
Basil-64
Sr. Member
****
Offline Offline

Сообщений: 282



Просмотр профиля
« Ответ #7 : Октября 11, 2011, 03:32:58 pm »

Пока как пожарный вариант рассматриваю конфигурацию ядро грузится из nand flash, под корень выделить немного места на CFке, если с RAMом не выйдет.
Хм. А кто мешает систему стартовать с CF? Емнип, там бортовая флешка отключается из биоса, а CF сидит на eide.
Записан

В жизни всегда есть место подвигу - главное быть подальше от этого места. Но никак не получается.
sc0rcher
Участник
*
Offline Offline

Сообщений: 5


Просмотр профиля
« Ответ #8 : Октября 13, 2011, 12:43:01 pm »

Цитировать
Хм. А кто мешает систему стартовать с CF? Емнип, там бортовая флешка отключается из биоса, а CF сидит на eide.
Ну сейчас так и сделал для тестовых нужд, только как то визуально (по sin times) кажется, что само ядро быстрее работает, когда оно с нанды в память загрузилось, чем когда оно из .boot на CFке берётся. Может, конечно, иллюзия.

Так, сейчас свои действия опишу при попытке описанную в первом посте проблему решить, только обещайте не смеятся Cheesy
1) первое, что сделал, это тупо в стартовый скрипт вписал копипастить всякие /bin/ /usr/ и т.д. на /ram, понавставлял в PATH в самом начале пути на /ram/bin и т.д., в inetd.conf тоже указал пути на ram для запуска telnetd, в итоге sin стал запускаться c ram`а, а telnet продолжил откушивать по 3 секунды с помощью Efsys.fastwel.
2) после этого я решил попытаться всё таки корень по нормальному в ram запихать. тренировался в виртуалке.
сначала попытался на дурака попробовать тупо сразу из .boot
mount /dev/ram  /
mount -p /dev/hd0 /dev/hd0t77 /hd - это вместо нанды, там лежит архив qnx.tar с корнем
а потом
cp /hd/qnx.tar /qnx.tar - на этой строчке при загрузке ругается, что файл /hd/qnx.tar не найден, я так понял, он не может к /hd что либо примаунтить, пока / нормального нет
3) потом решил на всякий случай Efsys.ram задействовать, вот так:
/hd2/kpda/boot/sys/boot
$ /hd2/kpda/boot/sys/boot -v

/hd2/kpda/boot/sys/Proc32_ksz
$ /hd2/kpda/boot/sys/Proc32_ksz -l 1

/hd2/kpda/boot/sys/Slib32
$ /hd2/kpda/boot/sys/Slib32

/hd2/kpda/bin/Fsys_ksz
$ /hd2/kpda/bin/Fsys_ksz

/hd2/kpda/bin/Efsys.ram
$ /hd2/kpda/bin/Efsys.ram -m 0,15M,/,/dev/ramdsk

/hd2/kpda/bin/Fsys.eide
$ /hd2/kpda/bin/Fsys.eide fsys -Ndsk0 -n0=hd

/hd2/kpda/bin/mount
$ /hd2/kpda/bin/mount -p /dev/hd0 /dev/hd0t77 /hd

/hd2/kpda/bin/cp
$/hd2/kpda/bin/cp -V -t /hd/image /dev/ramdisk 

/hd2/kpda/bin/sinit
$ /hd2/kpda/bin/sinit TERM=qnxm

в результате при загрузке получаем эффект, как в матрице, чегото символы всякие бегут по экрану, но /hd/image он вроде тоже не нашёл.

На этом я пока остановился и стал заниматься более неотложными делами, а потом решил совета спросить вот на этом самом форуме.

В каком направлении дальше двигаться?
Записан
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #9 : Октября 17, 2011, 01:20:39 pm »

Вам нужно создать начальную файловую систему на рамдиске.
По минимуму из /bin /etc /usr и тех каталогов что Вам нужны. Не забудьте пролицензироваться на рамдиск:
license /etc/licenses /ramdisk/etc/licenses
Потом можно сделать такую штуку:
cat /dev/ram | gzip -c9 > ramdisk.tgz
Размещаете архив на носителе. Минимальный набор утилит для распаковки должен быть на носителе.
Грузитесь с него, временно монтируете носитель в несуществующий каталог (/f/op), и распаковываете архив:
/f/op/gzip -cd /f/op/ramdisk > /dev/ram
Монтируете рам в корень, отмонтируете носитель.
Подобно этому я делал с дискеткой.
Только не забудьте, что в собираемый образ нужно включить "хитрые строчки" для sinit'a - ведь мы смонтировали не корень а (/f/op), а sinit будет искать /etc/config/sysinit...
Немного приврал - отмонтировать носитель не получиться. Но корень будет в RAM.
« Последнее редактирование: Октября 17, 2011, 04:01:20 pm от deadarcher » Записан
sc0rcher
Участник
*
Offline Offline

Сообщений: 5


Просмотр профиля
« Ответ #10 : Октября 26, 2011, 06:44:28 pm »

deadarcher
Спасибо за совет. Попробовал, как вы сказали, ничего не вышло Smiley
Действие происходит в виртуальной машине. На диск запихал только утилиты, sysinit и .boot.
В образе написал следующее:
Код:
hd2/kpda/boot/sys/boot
$ /hd2/kpda/boot/sys/boot -v

/hd2/kpda/boot/sys/Proc32_ksz
$ /hd2/kpda/boot/sys/Proc32_ksz -l 1

/hd2/kpda/boot/sys/Slib32
$ /hd2/kpda/boot/sys/Slib32

/hd2/kpda/bin/Fsys_ksz
$ /hd2/kpda/bin/Fsys_ksz -r 10240

/hd2/kpda/bin/Fsys.eide
$ /hd2/kpda/bin/Fsys.eide fsys -Ndsk0 -n0=hd

/hd2/kpda/bin/mount
$ /hd2/kpda/bin/mount -p /dev/hd0 /dev/hd0t77 /f/op

/hd2/kpda/bin/sinit
$ /hd2/kpda/bin/sinit -r /f/op/ TERM=qnxm
(так же ещё пробовал в разных сочетаниях -i /f/op/etc/config/sysinit.1 и -s /f/op/bin/sh)
В sysinit.1 прописал инициализацию /dev/ram, распаковку и монтирование. В итоге sysinit.1 не стартует (я туда echo вставил в самое начало). Во вложение кинул скриншот.
На всякий случай кинул на диск корень, как в архиве, не помогло.
Что я делаю не так?
Записан
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #11 : Октября 27, 2011, 10:42:48 am »

Все так. Это я подзабыл как все делал. sinit'у нужен корень. Спецом порылся и нашел.
Бут для hd0t77 у меня следующий:
Код:
sys/boot
$ boot -v

sys/Proc32
$ Proc32 -l 1

sys/Slib32
$ Slib32

sys/Slib16
$ Slib16

/bin/Fsys
$ Fsys -c640k -r8192

/bin/Fsys.atapi
$ Fsys.atapi -v

/bin/mount
$ mount -p /dev/hd0 /dev/hd0t77 /f/op

sys/wst
$ wst /f/op /f/op/bin/uesh /f/op/bin/bootinit


Содержимое hd0t77: echo, uesh, mount, gzip и сам bootinit + ramdisk.tgz
Програмка wst самопальная, за код не пинать. Она ждет появления /f/op и стартует начальный uesh с файлом bootinit. Скомпилил и положил ее в /boot/sys/wst.
bootinit такого содержания:
Код:
/f/op/echo unzipping QNX ...
/f/op/gzip -cd /f/op/ramdisk.tgz > /dev/ram
/f/op/echo mounting /dev/ram -> /
/f/op/mount /dev/ram /
/f/op/echo starting sinit ...
/bin/sinit TERM=qnx &

последняя строка - пустая, это просто список команд.
у меня sysinit уже в ram.

sysinit (кривовато, но хоть так):
Код:
echo starting consoles ...
Dev32 &
Dev32.ansi -Q -n6 &
reopen /dev/con1
export PATH=:.:/bin:/usr/bin
export TERM=qnx
echo init terminals ...
tinit -T /dev/con* -c "login root" -t /dev/con1 &


Теперь wst, можно и ровнее написать. Я писал как умел.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <fcntl.h>
#include <unistd.h>
#include <process.h>
#include <sys/stat.h>
#include <errno.h>
#include <sys/sched.h>
#include <sys/qnx_glob.h>

#define SPWNF (_SPAWN_NOZOMBIE|_SPAWN_NOHUP|_SPAWN_NEWPGRP|_SPAWN_BGROUND|_SPAWN_TCSETPGRP|_SPAWN_SETSID)
char **argvp;

int main(int argc, char **argv, char **arge)
{
 struct stat st;
 int i,r;
 pid_t pid;

setsid();
setgid(0);

if (argc<4 || !argv[1] || !argv[2])
{ printf("usage: wst <pth_wait_stat> path_sh params ...\n\r"); return -1; }
printf("\n\rWait for '%s' 20 sec \n\r",argv[1]);
fflush(stdout);

for (i=0;i<20;i++)
{
r=stat(argv[1], &st);
if (!r) break;
sleep(1);
}
argvp=&argv[2];
printf("\n\rexecing to %s %s\n\r",argvp[0],argvp[1]);
fflush(stdout);
if ((pid=qnx_spawn(1,NULL,0,-1,-1,SPWNF,argv[2],argvp,arge,NULL,-1))==-1)
printf("exec error %d\n\r",errno);
close(0); close(2); close(3); close(4);
return 0;
}
содержимое ramdisk.tgz :
каталоги bin, etc, tmp, usr - только то что из них нужно.
файлы конфиги .mqc и .licenses

Вроде ничего не забыл. Забыл вот только что sinit хочет корень, это да.
Извините, что ввел вас в заблуждение.
« Последнее редактирование: Октября 27, 2011, 10:45:40 am от deadarcher » Записан
sc0rcher
Участник
*
Offline Offline

Сообщений: 5


Просмотр профиля
« Ответ #12 : Октября 27, 2011, 11:00:53 am »

deadarcher, огромное вам спасибо! Сейчас испробую Smiley
И ещё вопрос: а вы этот ваш способ по GNU GPL распространяете? А то я ж боевую систему конфигурирую Smiley
Записан
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #13 : Июня 12, 2012, 10:32:06 am »

Когда Олег говорил что можно, он наверно имел ввиду это решение.
Гораздо более правильное и красивое. Сам сжатый рамдиск зашивается в образ и не нужна привязка к носителю.
Записан
A.N.
Jr. Member
**
Offline Offline

Сообщений: 54


Просмотр профиля
« Ответ #14 : Июня 28, 2012, 06:29:25 pm »

Да ладно? Я попробовал их решение. Ограничение на размер загрузочного образа.
Что и они там пишут.
К тому же, у них не совсем правильно реализован запуск sinit.
У вас ожидание сделано через stat, что правильно. У них через sleep.
И на виртуальной машине у меня не заработало то, что они предлагают
(задержку маленькую ставил). >:-|
Хотя, после исправления их wstart так, чтобы он использовал stat в цикле,
всё заработало. У них просто сделан execv().
У вас через qnx_spawn, что, думаю, получше будет (я не знаю чем они подробно отличаются,
но, думаю, большой разницы нет, однако qnx_spawn - "нативная").

Итог: не вариант. Всё-равно, есть привязка к носителю. Sad

P.S.:
Я взял ваш вариант, переделал, добавил LZMA, Makefile для автоматической сборки и
у меня получился сжатый загрузочный диск, который помещается на дискету.
Содержит:
1. Почти полный набор базовых утилит QNX 4.25.
2. Mishell commander и qed.
3. Fatfsys, Iso9660.
4. Скрипт, запускающийся автоматически и предлагающий выбрать проверки
(диски, память и ФС).
5. Базовые служебные и диагностические программки: fdisk, chkfsys, memtester,
dinit и т.п.

Если кому нужен, могу выложить. Smiley
Записан
Страниц: [1] 2
  Печать  
 
Перейти в: