QNX常用命令
0.#use -- Print a usage message (QNX Neutrino)(查看各命令協助)
#use ls
1.#pidin -- Display system statistics (QNX Neutrino)(查看系統資訊)
#pidin a #pidin mem #pidin info #pidin fa ...
pid tid name prio STATE Blocked
1 1 /sys/procnto-instr 0f READY
1 3 /sys/procnto-instr 10r RUNNING
1 4 /sys/procnto-instr 12r RECEIVE 1
2 1 sbin/tinit 10o REPLY 1
3 1 proc/boot/slogger 10o RECEIVE 1
5 1 proc/boot/pci-bios 10o RECEIVE 1
6 1 roc/boot/devb-eide 10o SIGWAITINFO
6 2 roc/boot/devb-eide 21r RECEIVE 1
2.#hogs -- List the processes that are hogging the CPU(查看CPU 使用方式)
$ hogs -n -% 10
PID NAME MSEC PIDS SYSTEM
1 451 41% 15%
6 devb-eide 141 13% 4%
8 fs-pkg 391 36% 13%
3.#sin -- Display system information
$ sin -u techpubs
procnto 1 0 0 0 0 268759990
devc-con 2 36K 68K 128M 128M 614
pci-bios 3 28K 60K 4K 516K 16
tinit 4 8K 44K 4K 516K 4
......
4.#coreinfo -- Display information about a QNX Neutrino core file
#coreinfo test_g.core
5.#dumpifs -- Dump an image filesystem
#dumpefs -- Dump an embedded filesystem
$ dumpifs shell.ifs
Offset Size Name
0 288 *.boot
288 100 Startup-header flags1=0x1 paddr_bias=0
388 6008 startup.*
6390 59 Image-header mountpoint=/
63ec 1ac Image-directory
---- ---- Root-dirent
6598 8c proc/boot/data1
6624 5c proc/boot/.script
6680 14 proc/boot/data2
7000 2c02c proc/boot/procnto
34000 12ad0 proc/boot/devc-con
47000 b66c proc/boot/esh
53000 d7fc proc/boot/ls
61000 7394 proc/boot/cat
Checksums: image=0x6d5fb484 startup=0x274d7c89
6.#showmem -- Display memory information(查看記憶體資訊)
7.qconfig -- Query and display QNX installations and configurations(查看版本等安裝資訊)
QNX常用小技巧
1.跳過登陸
跳過圖形:
在/etc/rc.d/rc.local中增加/usr/photon/bin/Photon -l '/usr/photon/bin/phlogin -O -Uuser:password'
跳過命令列:
修改/etc/config/ttys檔案,con1 "/bin/login -f root" qansi-m on
2.使用Pindows
在/etc/inetd.conf檔案裡去掉此句注釋:phrelay stream tcp nowait root /usr/bin/phrelay phrelay -x
殺死並重新運行inetd:1.#slay inetd 2.#inetd
3.去掉shelf [Photon Shelf Manager -- 邊框
用命令#shelf -e
或 A more permanent approach is to set the PHSHELF_DISABLE environment variable to 1. You can do this in your .profile file, with export PHSHELF_DISABLE=1
4.登入時進命令列模式
/etc/rc.d/rc.sysinit runs tinit. [If the -p option is specified, tinit starts Photon.]By default, the system starts Photon, but if you create a file called /etc/system/config/nophoton, then rc.sysinit tells tinit to use text mode.
5.自動運行程式
If you want to run a Photon application whenever Photon starts, put it in your $HOME/.ph/phapps file. Put each command on a separate line. For example, to start the Photon editor when you start Photon, include this line: ped &
[注:phapps需加可執行許可權,例如 #chmod +x /root/.ph/phapps]
6.登陸記錄
The login utility also updates system accounting information in var/log/utmp, /var/log/wtmp,and /var/log/lastlog. if they already exist. The login utility doesn't create /var/log/utmp, /var/log/wtmp, and /var/log/lastlog if they don't already exist. These files
can quickly become very big, which isn't good on an embedded system with limited resources.
7.TCP/IP 網路設定
設定IP,在圖形介面可用phlip
在命令列可用:先要確定Network I/O在運行:io-net -dne2000 -ptcpip
指定IP ifconfig en0 10.0.0.100
指定路由:route add default 10.0.0.1
用DHCP自動擷取IP dhcp.client -i en0 -m -u -t 1
Start the second instance of the TCP/IP stack by invoking io-net as follows:
io-net -i1 -del900 pci=0x1 -ptcpip prefix=/sock2
The -i option in the second instance of TCP/IP tells io-net to register itself as /dev/io-net1. The prefix option to npm-tcpip.so causes the second stack to be registered as /sock2/dev/socket instead of the default, /dev/socket. TCP/IP applications that wish
to use the second stack must specify the environment variable SOCK. For example:SOCK=/sock2 netstat -in
Are io-net and the drivers running? pidin -P io-net mem
Is the TCP/IP protocol stack or Ethernet driver installed? ls /dev/io-net
How do I map hostnames to IP addresses /etc/hosts
How do I get the network status? netstat -in
List the interfaces, including the MAC and IP addresses that they've been configured with. netstat -rn
Display the network routing tables that determine how the stack can reach another host. netstat -an
List information about TCP/IP connections to or from your system. For the tiny TCP/IP stack, you have to use the following command as it doesn't support netstat: cat /proc/ipstats
How do I display information about an interface controller? /usr/sbin/nicinfo /dev/io-net/en0
QNX-從4到6簡單入門
By Nicholas ZHOU
第一部分: QNX系統的安裝與使用
QNX的微核心,甚至不包括進程管理,僅提供進程間的通訊(Software Bus)。但在實際編譯的系統中,仍然是進程調度、同步、處理序間通訊等編譯在同一個可執行檔中的,它就是/boot/sys/procnto (QNX6).
QNX 4.x僅支援x86,QNX 6.x可支援PowerPC等
QNX 4.x只有Process,沒有Thread,QNX 6.x都有了,這跟POSIX 1003 – 2001是同步的。
如何建立啟動鏡像:(QNX4)
在/boot/build裡,install.1是啟動鏡像的設定檔
cd /boot
make b=install.1
上述步驟會成功編譯出/boot/images/install.1鏡像檔案(該檔案為MS-DOS可執行檔),其中包含了/boot/build/install.1設定檔中指定的所有可執行檔的映象(如Proc32、Slib32等)。
copy install.1 到 /.boot即可
clear螢幕,使用ctrl+l
檔案系統/塊裝置的驅動,qnx4在/bin下,如Fsys.eide,而qnx6在/sbin目錄下。
塊裝置命名,可以通過/boot/build/install.1的裝置驅動載入參數來指定,一般會是hd0.0(對應primary master)、hd0.1(對應primary slave)、h1.0(對應secondary master)、hd1.1(對應secondary slave)。
hd0t79,其中t79是指type 和type id
添加塊裝置後,可以使用fdisk進行分區,如fdisk /dev/hd0.1,分區後,查看/dev/hd*還只能看見/dev/hd0.1,要尋找新分出來的分區,需要使用mount –p /dev/hd0.1 (probe)。
啟動過程
如何製作磁碟片啟動的系統(QNX4)
cd /boot
make b=floppy
格式化軟碟機fdformat /dev/fd0;初始化軟碟機dinit –hb /dev/fd0;將磁碟片掛載到/fd - mount /dev/fd0 /fd
cp /boot/images/floppy /fd/.boot,啟動映象就好了。
mkdir etc;mkdir etc/config;mkdir bin;mkdir usr;mkdir /usr/bin
cp /etc/config/sysinit.floppy /fd/etc/config/sysinit
cp /etc/logo.F /fd/etc/
將必要的一些二進位檔案從/bin/或/usr/bin拷貝到/fd/bin或/fd/usr/bin(對應的),如ls、pax、fcat、esh、sh、echo、vi、Dev、Fsys.eide、mount、rm、rmdir、mv、melt、Fsys、Dev、Dev.con、chkfsys、ps、prefix、emu87、mount、rtc、df、dinit、fdformat等。
修改/etc/config/sysinit,從而載入硬碟驅動,添加下面一行:
/bin/Fsys.eide fsys –Ndsk0 –n0=hd0. –n5=cd0. eide –a1f0 –i14
重新啟動,從磁碟片載入,搞定。
關機命令:shutdown –b(完全關機不重啟)
使用者環境
Boot Image -> /etc/config/sysinit.node -> /etc/profile -> $HOME/.profile
壓縮解壓
melt / freeze,前者釋放abc.F為abc,後者將abc壓縮為abc.F(only for QNX4)
gzip / gunzip
拷貝
cp
cpio
第二部分:QNX網路
QNX有很強的網路功能,最具特色的是它的FLEET Networking,該技術架構可以將跨接於不同網路(如Ethernet + Token)的節點直接連結起來,使用者程式只需要使用msg_send即可跟網路上的任意qnx節點通訊。
Fleet Network的配置需修改:
配置結點號
修改/boot/build/install.1檔案名稱為install.x(x為你要的ID,比如2,下同),修改install.2中的$ /boot/sys/Proc32 –l 1為$ /boot/sys/Proc32 –l 2,後面這個2就是結點號。
產生新的image
cd /boot
make b=install.2
cp images/install.2 /.boot
修改設定檔
cd /etc/config
cp sysinit.1 sysinit.2
cp inetd.1 inetd.2
cd bin
cp Input.1 Input.2
cp ph.1 ph.2
cp tcpip.1 tcpip.2
修改tcpip.2,兩個內容,一個是ip地址,如果想使用dhcp,則注釋掉/usr/ucb/ifconfig en1 10.1.1.119 node$NODE up,替換為/usr/ucb/dhcp.client
然後修改/.licenses,將license添加進去
最後修改/etc/config/netmap,把網內的各個節點添加進去,完成
使用netmap –f,即時更新網路節點表,使用netmap可查看現有的 節點,使用alive可查看各節點的線上狀況
如過網卡不靈等,可用以下命令來重啟相關服務。
slay Net
Net &
Net.ether2100 –l1 –p0x1080 –i9 &
slay Socklet
Socklet node2 &
其它網路相關部分
1. 如何控制遠程機器:ditto –n3 –k,即可控制遠程node3。
2. 如何查看網卡狀態:netstat –in
3. 如何查看路由表: netstat –rn
4. 如何使用遠端桌面:phindows –n/dev/photon,在qnx側則需要啟用phrelay(inetd)。
5. 如何查PCI卡的IO地址和中斷:show pci
6. 如何進入另外一台機起:on –f 3 /bin/sh
7. 如何檢查網路監聽:netstat –an
8. 如何查看啟動後系統執行過的命令: sin ar
9. sin mem:當前進程虛擬位址分配情況
10. sin –t: 查看每個進程用了多少CPU時間。
關於QNX網路架構——
從驅動到應用程式層:Net -> Net.ether -> Socket/Socklet -> inetd -> nfsd
組態工具:ifconfig、route、hostname、netmap
查詢工具:netstat、alive
第三部分:QNX6基礎
Build Boot Image
/boot/build仍然是build啟動映象的設定檔
bios.build是X86通用的
mkifs –v bios.build bios.img
在momentics中產生一個啟動映象(支援硬碟和QNX4檔案系統)
產生QNX System Builder Project,在build檔案產生一節,選擇匯入/boot/build/bios.build檔案。
雙擊開啟project.bld,在binaries中加入devb-eide
在DLL中加入cam-disk.so、io-blk.so、fs-qnx4.so。
在share library中加入libcam.so.2
點擊bios,右鍵菜單調出properties視窗,在SYSTEM的PATH、LD_LIBRARY_PATH中添加必要的路徑,包括/bin:/sbin:/usr/bin:/usr/sbin等PATH以及/lib:/usr/lib等庫路徑。
修改bios.bsh,在PCI的section後增加硬碟驅動的部分
i. #start IDE drive
ii. devb-eide &
iii. waitfor /dev/hd0t79
iv. mount /dev/hd0t79 /
v. waitfor /bin
修改bios.bsh,在最後增加啟動/etc/system/sysinit指令碼的部分。
i. [+session] sh –c “/etc/system/sysinit”
ii. 最後注釋掉ide驅動和這之間的其它部分。
編譯產生bios.ifs,拷貝該檔案到/.boot即可。
其它
QNX6的啟動指令碼已經更象Linux/Unix了,包括了sysinit和rc.d。而QNX6的裝置驅動則遠比4要靈活——順便提一下,QNX4甚至沒有提供DDK給使用者,幾乎所有的QNX4下的裝置驅動都是QNX公司自己開發的(或受客戶委託開發)。QNX6則改變了這一局面——而且QNX6已經完全開源了,QNX6使用者也不再受那些license的困擾,普通個人使用者可以直接下載和安裝QNX6的RTOS和開發環境,包括使用Qnet——要知道,QNX4的Fleet Network倘若沒有2個以上的licenses,是無法使用的。
第四部分:關於QNX6的網路架構和Qnet
QNX6的網路尤其是它的Qnet與QNX4一樣獨具特色。相對而言,QNX4的Fleet Network無論從配置還是使用來講都要顯得複雜一些,也要偏僻一些。而QNX6的Qnet則大大簡化了配置的複雜性,也同時在盡量讓遠端訪問顯得更正常。
首先,QNX6的網路驅動不同於qnx4的Net + Net.ether + Socket/Socklet或netmap的方式,而是採用了模組化更強,更靈活也更具一致性的方式。這個改變應當源於QNX6底層架構的升級。
從QNX6的啟動看,在x86上,首先由BIOS啟動startup-bios(一個二進位包),然後就啟動了微核心procnto,緊接著在啟動指令碼裡開始載入一些驅動。首先載入的一般是一個console,devc-con;然後應當載入pci-bios,試PCI匯流排開始工作;接著載入硬碟驅動和檔案系統;最後啟動一些進程通訊管理程式,如mqueue、pipe等。
在QNX6裡,網路、硬碟與其它裝置(如音頻)一樣,都由一個io-xxx的程式來管理,硬碟是io-blk,網路則是io-net,而音頻則是io-audio。但它們之間也有差別,比如硬碟,可執行檔程式是devb-eide(常用的字元裝置和塊裝置好像都是這個方式),而網路的則是io-net(net、audio這些好像是一樣的),這多少顯得有些怪異。
扯遠了,回到io-net。
io-net的啟動一般帶一些參數,這些參數可以在載入網卡驅動的同時,載入各種協議棧,包括tcpip和Qnet。比如:
# io-net –dpcnet –ptcpip –pqnet
這一步操作即可在vmware虛擬機器上跑的qnx6中成功載入網卡驅動、tcpip協議棧和Qnet協議棧。通過下面的命令可以檢查io-net載入的狀況:
# ls /dev/io-net
en0 ip0 ip_en qnet_en
此外,還有一種方式可以向已經啟動的io-net中添加裝置驅動和協議棧。比如:
# slay io-net
# io-net
# mount –Tio-net devn-pcnet.so
# mount –Tio-net npm-tcpip.so
# mount –Tio-net npm-qnet.so
這三個操作便向io-net添加了pcnet網卡驅動、tcpip和qnet協議棧。
其它一些命令:
查看io-net中已經載入的驅動:ls /dev/io-net
查看網路中其它的qnet節點:ls /net
訪問網路中其它的qnet節點:cd /net/nodename(切換到目標結點的根目錄).至於節點名稱,則是通過hostname來設定的。
最後,補充一個,在qnx裡,msg_send是阻塞的。