CF卡启动的问题

这是一个一直没有解决的问题,我用CF卡来启动系统,同时系统中还有两块硬盘,再BIOS里面IDE1是primary master,IDE2是primary slave,CF卡是secondary master(这是板卡厂家设置的,并且修改不了),我用CF卡启动时将其格式化为QNX下的79格式,在build文件中为了驱动CF卡用了以下语句:
devb-eide blk automount=hd2t79:/:qnx4 cd dos exec=all cam quiet eide,ioport=ox1f0,irq=14 &

这看起来没有问题,但是如果硬盘中的一块发生问题,比如一块硬盘坏了,那么QNX将自动将CF卡认成hd1,如果两块硬盘都坏了,那么QNX将自动将CF卡认成hd0,这两种情况下系统都无法启动,可是在现场硬盘发生问题的现象很普遍,另外我用CF卡启动的目的就是保证在硬盘损坏的情况下系统能够可靠启动,各位高手请告诉我该如何解决这个问题呢?

可以写一个Shell Script来执行。

devb-eide cd dos exec=all cam quiet eide,ioport=ox1f0,irq=14 
sleep 5
if test -z /dev/hd2t79; then
   mount /dev/hd2t79 /
elif test -z /dev/hd1t79; then
   mount /dev/hd1t79 /
elif test -z /dev/hd0t79; then
   mount /dev/hd0t79 /
fi

这个程序不一定很准确,供你参考吧。当然你也可以用C写一段小程序,用来spawn()和判断应该mount哪一个分区。

加上您说的
sleep 5
if test -z /dev/hd2t79; then
mount /dev/hd2t79 /
elif test -z /dev/hd1t79; then
mount /dev/hd1t79 /
elif test -z /dev/hd0t79; then
mount /dev/hd0t79 /
fi
启动是系统说
unable to start “sleep”
unable to start “if”
反正都是unable to start
在CF卡没有mount成功的情况下如何运行它上面的程序呢?所有没办法运行您说得C程序呀!

那个不能直接写在build script里,得写在文件里,然后把文件包括在image里面。

C程序也是这样,编译成执行文件后也要包含在image里。就好象devb-eide是一个在image里的执行文件一样。

那如何将自己的文件加到image里面呢?

跟别的执行文件一样啊。在Build Script里找找看devb-eide是在哪里加入的?(通常是在一个 [data=c]的部份,在那里面加上自已的执行文件,然后用这个Build Script重新做一个image就可以了。

这是关于怎样做OS Image的详细文档。
http://www.qnx.com/developers/docs/6.3.0SP1/neutrino/building/building_nto.html

我按您的方法在BIN目录下写了一个SCRIPT,名字叫myscript,将文件属性设为可执行,在[data=c]后加入了一行myscript,原来的build文件变为
devb-eide cd dos exec=all cam quiet eide,ioport=ox1f0,irq=14
myscrpt
重建image,警告信息提示myscript未找到,于是我在myscript前面加入了绝对路径/bin/myscript,这下可以编过去了,可是系统启动时报unable to start myscript

试试 sh -c myscript,当然你的image里还得有sh可执行文件。

还是不行呀!系统报no such file or directory /bin/sh,实际上当前硬盘上的BIN目录并没有被找到

会不会你写的是 /bin/sh -c myscript ?

只要写 sh -c myscript 就可以了。你把 sh 加入 image了吗?

我写的是sh -c myscript,sh也加入了image了。

或许是myscript的开头有 #!/bin/sh ?

没有,只是如下:
sleep 5
if test -z /dev/hd2t79; then
mount /dev/hd2t79 /
elif test -z /dev/hd1t79; then
mount /dev/hd1t79 /
elif test -z /dev/hd0t79; then
mount /dev/hd0t79 /
fi

唐先生,怎么解决呢?:slight_smile:

把你的完整的Build Script,myscript 和起动时的出错信息都贴上来。系统通常不会自动去找/bin/sh的。

virtual=x86,bios +compress] boot = {
startup-bios -s 64k -Npmu
PATH=/proc/boot:/bin:/photon/bin
LD_LIBRARY_PATH=/proc/boot:/dev/shmem:/lib:/usr/lib procnto
}

[+script] startup = {

PATH=/proc/boot:/bin:/usr/photon/bin
PHOTON_PATH=/usr/photon

PHOTON2_PATH=/usr/photon

LD_LIBRARY_PATH=/proc/boot:/usr/lib:/lib:/usr/photon/bin:/dev/shmem:/usr/photon/dll:/lib/dll

HOME=/root

SHELL=esh

PHWM=pwm

TMPDIR=/tmp

PHFONT=/usr/photon/font_repository

TERM=qansi
SYSNAME=nto
HOSTNAME=pmu

#display_msg “Step 1: Start the console and persud console…”
devc-con -n 10 &
devc-pty -n 32 &
reopen /dev/con1
#display_msg “Done”

#display_msg “Step 2: Scan the PCI device…”
seedres
pci-bios &
waitfor /dev/pci 30
#display_msg “Done”

#display_msg “Step 3: Start pipe,mqueue and slogger services…”
pipe &
mqueue &
slogger -l /var/log/slog
#display_msg “Done”

display_msg "Step4: Scan the CF card and mount it as / "

devb-eide blk cd dos exec=all cam quiet eide,ioport=ox1f0,irq=14 &
myscript

display_msg “Done”

HOME=/root

[+session] esh &

}

/var/log/slog = {
}
/dev/log={

}

ldqnx.so.2 must be in the fixed place of /usr/lib

[type=link] /usr/lib/ldqnx.so.2=/proc/boot/libc.so
[type=link] /usr/lib/ldqnx.so.1=/proc/boot/libc.so

the following link is needed by the devb-eide

[type=link] /proc/boot/libcam.so.2=/proc/boot/libcam.so

shared library need by font server

[type=link] /usr/lib/libph.so.2=/usr/lib/libph.so
[type=link] /usr/lib/libph.so.1=/usr/lib/libph.so

shared library needed by the io-graphics

[type=link] /usr/lib/libphrender.so.2=/usr/lib/libphrender.so
[type=link] /usr/lib/libphrender.so.1=/usr/lib/libphrender.so
[type=link] /usr/lib/libdisputil.so.2=/usr/lib/libdisputil.so
[type=link] /usr/lib/libffb.so.2=/usr/lib/libffb.so

shared library needed by some photon application

[type=link] /usr/lib/libAp.so.2=/usr/lib/libAp.so
[type=link] /usr/lib/libAp.so.1=/usr/lib/libAp.so
[type=link] /usr/lib/libm.so.2=/usr/lib/libm.so

[type=link] /usr/lib/libphexlib.so.2=/usr/lib/libphexlib.so

[type=link] /usr/lib/libphimg.so.2=/usr/lib/libphimg.so
[type=link] /usr/lib/libz.so.2=/usr/lib/libz.so
[type=link] /usr/lib/libjpeg.so.2=/usr/lib/libjpeg.so
[type=link] /usr/lib/libexpat.so.2=/usr/lib/libexpat.so


libc.so

#Library needed by the harddisk access
libcam.so
io-blk.so
cam-disk.so
fs-qnx4.so

[data=c]
[perms=+r,+x]
seedres
pci-bios
devb-eide
slogger
devc-con
devc-pty
esh
shutdown
mount
ls
pipe
mqueue
pidin
myscript

  1. 在[data=c]区里,我没有看到sh,这样你的myscript无法执行。
  2. 建议你使用 sh -c myscript,你试过了吗?
  3. 你的myscript事先试过可以正常执行吗?
  4. 你也可以自己用C写一个程序,编译生成执行文件后,把执行文件放在[data=c]区里。这样就可以在devb-eide后直接执行你的程序而不是"myscript"
  5. devb-eide … 的最后用了 “&”,应该去掉。

先试试这些吧。:D:D

那这个C程序怎么写呢?请给点提示

用stat()函数判断设备文件(/dev/hd2t79)是不是存在,用mount()函数把一个设备文件mount到根目录上去。

http://www.qnx.com/developers/docs/6.3.0SP1/neutrino/lib_ref/s/stat.html
http://www.qnx.com/developers/docs/6.3.0SP1/neutrino/lib_ref/m/mount.html

还是不行,错误提示是COULD NOT FIND LIBRARY libcpp.so.2a,好象是没有加载C程序执行的库