重新搭建嵌入式LINUX中碰到的问题

2019-07-13 02:23发布

 已经搭建好的嵌入式环境不小心被破坏了,破坏得还真彻底,需要重新从bootloader烧起,这不能不说是一件痛苦的事。同样的UBOOT,同样的内核,也是同样的烧写工具,却碰到了不同的问题。难道这些问题是由唯一不同的时间产生的,没这么恐怖吧(呵呵),不过还好,折腾了一天还是把问题都解决了,生怕下次还碰到类似的事,所以把碰到的问题和解决方法都记录下来: 1.一个匪夷所思的问题  把UBOOT烧到板子里,很顺利,其实也不应该出现问题,可是在UBOOT下用tftp时,问题来了,怎么也烧不进去,到loading:*这里就不动了,反复好几次都这样,网上一查,没这样的问题,真是晕了。要不再烧一次UBOOT试试,学习中一直没耐心还是控制住了自己,又把UBOOT烧了一遍,这次可更厉害了,在UBOOT中随便用什么命令,都出现: data abort                                                                     pc : [<33f85a18>]    lr : [<33f852fc>]                                         sp : 33f07f78  ip : 33f07f78  fp : 33f07f98                                    r10: 00000001  r9 : 33f94cfc  r8 : 33f3ffdc                                    r7 : 00000001  r6 : 33f4027f  r5 : 0000000e  r4 : 33f9901d                     r3 : 00000000  r2 : 33f9901d  r1 : 00000000  r0 : 33f9901d                     Flags: nzCv  IRQs off  FIQs off  Mode SVC_32                                   Resetting CPU ... 这问题真让我无从下手啊,当然最本能的反映就是google,可是也没查到什么解决办法。真是个诡异的问题,正当想放弃的时候,突然想到:为什么这次会出现不同的问题呢,如果我再烧一次呢,会怎么样?由于好奇,我还是忍着性子又烧了一次。没想到这次还真出现奇迹了,居然好了,所有命令都正常使用,tftp也能用了,看到loading:###################################### 这信息真让我兴奋。不过前面的问题到底是怎么回事现在还不清楚,估计跟没有擦除nand有关,估计归估计,有时间好好研究下,呵呵。   2.Nand write 出错拉!   tftp能用了,内核通过bootm也能正常启动,现在该把zImage写入nand了,本来以为这一不步会很顺利,可是出错拉: NAND write: device 0 offset 196608, size 1048576 ... nand_write_page: Failed wrRNAND write: device 0 offset 196608, size 1048576 ... nand_write_page: Failed write verify, R 其原因是:网上说是在write前没有擦除nand,不过我记得好象是擦除了,可问题还在,不过我erase nand的大小跟 write nand 的大小一样。后来让erase nand的大小大于 write nand的大小,在我板子上这样的:nand erase 0x30000 0x1d0000,nand write 0x31000000 0x3000 0x110000 这样一改就好了,write ok..   3.Bad Magic Number   在内核自启动时,出现了Bad Magic Number错误,网上有这样的问题,可没看到有效的解决方法。其中有位仁兄说到:启动参数设置错误,0x33000000处不可以执行。有的开发板sdram不是在0x33000000,所以不能把kernel uImage下载到0x33000000中运行。如我之前的bootcmd参数为:setenv bootcmd tftpboot 33000000 uImage/; bootm 33000000。但板子Omap5912的sdram地址在0x100000000,将参数改为setenv bootcmd tftpboot 10000000 uImage/; bootm 10000000后便可以启动kernel了。 可我的板子的SDRAM是从0x30000000开始的啊,这解决方法不适合我的情况。睡觉前突然想到:自启动也是把0x30000(这个地址是我nand存放内核的起始地址)加载到0x31000000处,然后运行,为什么不行呢?用tftp把内核直接在载到0x31000000怎么就可以呢,难到是nand read时没有正确的把内核从nand加载到sdram,是起始地址(0x30000)不对吗?我试着把起始地址改成0x40000。这下还真准了,能正常启动了。是不是在设置uboot环境变量时占用了内核在nand中的部分位置,即0x30000处,有这个可能,虽然不大确定,呵呵。     网上有位兄弟总结了在嵌入式Linux启动过程中的一些问题,还不错,先搞过来,以后在参考,呵呵
1.Bad Magic Number
## Booting image at 33000000 ...
Bad Magic Number
OMAP5912 OSK # (tftp下载好kernel的uImage后就停止在这,不能启动kernel)
 
问题原因:启动参数设置错误,0x30000000处不可以执行。
有的开发板sdram不是在0x33000000,所以不能把kernel uImage下载到0x33000000中运行。如我之前的bootcmd参数为:setenv bootcmd tftpboot 33000000 uImage/; bootm 33000000。但板子Omap5912的sdram地址在0x100000000,将参数改为setenv bootcmd tftpboot 10000000 uImage/; bootm 10000000后便可以启动kernel了。
 
2.启动停止在"Starting kernel ..."
TFTP from server 192.168.167.170; our IP address is 192.168.167.15
Filename 'uImage'
Load address: 0x10000000
Loading: #################################################################
         #################################################################
done
Bytes transferred = 2025908 (1ee9b4 hex)
## Booting image at 10000000 ...
   Image Name:   Linux-2.6.18-mh8_pro500-versatil
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2025844 Bytes =  1.9 MB
   Load Address: 30008000
   Entry Point:  30008000
   Verifying Checksum ... OK
OK
Starting kernel ...   (卡在这里)
 
问题原因:多半是kernel没编译成功。
确认configure参数是否配置正确,是否选择了正确的目标编译平台,如smdk2410等。
 
3.不能启动kernel
Starting kernel ...
Uncompressing Linux.........................................................
.................... done, booting the kernel.
 
问题原因:可能是Bootargs参数设置错误,确认bootargs设置是否正确。
 
4.不能挂载nfs
eth0: link up
IP-Config: Complete:
      device=eth0, addr=192.168.167.15, mask=255.255.255.0, gw=192.168.167.254,
     host=192.168.167.15, domain=, nis-domain=(none),
     bootserver=192.168.167.170, rootserver=192.168.167.170, rootpath=
Looking up port of RPC 100003/2 on 192.168.167.170
Root-NFS: Unable to get nfsd port number from server, using default
Looking up port of RPC 100005/1 on 192.168.167.170
Root-NFS: Unable to get mountd port number from server, using default
mount: server 192.168.167.170 not responding, timed out
Root-NFS: Server returned error -5 while mounting /work/nfs/rootfs_bluetooth_omap
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
 
问题原因:这种情况通常是nfs配置问题。
确认uboot的bootargs参数里和nfs相关的ip地址信息设置是否正确,以及Host机/etc/exports配置无误,重起nfs服务,重新尝试连接。另外还需要注意bootargs内console和mem两个参数的设置。kernel2.6后console最好设置为ttySAC0,mem也要根据开发板实际情况设置正确。
 
5.文件系统不能启动问题
eth0: link up
IP-Config: Complete:
      device=eth0, addr=192.168.167.15, mask=255.255.255.0, gw=192.168.167.254,
     host=192.168.167.15, domain=, nis-domain=(none),
     bootserver=192.168.167.170, rootserver=192.168.167.170, rootpath=
Looking up port of RPC 100003/2 on 192.168.167.170
Looking up port of RPC 100005/1 on 192.168.167.170
VFS: Mounted root (nfs filesystem).
Freeing init memory: 128K
/sbin/initKernel panic - not syncing: Attempted to kill init!
 
问题原因:制作的文件系统缺少运行busybox所需的libcrypt.so库,新版本会有缺库提示,老版本(1.60)没有。
注:运行一个busybox文件系统至少需要如下几个库:
ld-linux.so.x
libc.so.6
libcrypt.so.x
较新版本的busybox可能还需要
libm.so.6
libgcc_s.so.x
(x为版本号)
 
6.文件系统不能启动问题2
eth0: link up
IP-Config: Complete:
      device=eth0, addr=192.168.167.15, mask=255.255.255.0, gw=192.168.167.254,
     host=192.168.167.15, domain=, nis-domain=(none),
     bootserver=192.168.167.170, rootserver=192.168.167.170, rootpath=
Looking up port of RPC 100003/2 on 192.168.167.170
Looking up port of RPC 100005/1 on 192.168.167.170
VFS: Mounted root (nfs filesystem).
Freeing init memory: 128K
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.
 
问题原因:对比一个可用的文件系统后发现,缺少了ld-linux.so.x库,文件系统里只有ld-linux.so.x的连接文件,少拷了库文件。
 
8.不能获得帐户UID信息
Could not get password database information for UID of current process: User "???" unknown or no memory to allocate password entry
Unknown username "root" in message bus configuration file
Could not get password database information for UID of current process: User "???" unknown or no memory to allocate password entry
Failed to start message bus: Could not get UID and GID for username "root"
 
问题原因:
情况一:系统帐户验证出现问题.怀疑是调用getuid、getguid时并没有返回正确值,可能是缺少帐户验证相关库,实际排查后发现,缺少libnss_files库。拷贝交叉编译器的libnss_files库到文件系统后,启动文件系统成功。
情况二:系统没有root帐号。可以由whoami命令看出。
手动创建帐号。
#vi /etc/passwd
root:x:0:0:root:/root:/bin/sh
kyo:x:500:500:kyo:/home/kyo:/bin/bash
添加组
#vi group
root:x:0:root
 
9.
Freeing init memory: 128K
init started: BusyBox v1.6.1 (2007-08-27 14:33:15 CST) multi-call binary
starting pid 834, tty '': '/etc/init.d/rcS'
Cannot run '/etc/init.d/rcS': No such file or directory
Please press Enter to activate this console.
发现没有/etc/init.d/rcS文件系统一样能正常启动。看来rcS只是用来设置一些随机启动的参数,对文件能否正常运行关系不大。
注:这个不是错误,是偶然发现! :) 文章引用自: v