产品信息
- 系统:SONiC系统(linux 4.9.110),ONIE(4.1.38)
- 项目背景:此项目是一个网络流量设备,作为流量转发器,将大批量的流量收集,筛选,过滤,重定向至新的端口,然后转发至后端设备,进行流量操作。
- 硬件:COM-E CPU主板,交换芯片,多种IIC设备(pca9548,pca9535等),NVME磁盘,USB转IIC总线芯片等;32个100G网口,2个USB口,一个串口,1个以太网口。
调试过程
第一阶段—检查硬件
- 检查电源是否正常,插上电源,判定能够设备是否上电,若未上电或者说出现上电延迟则返回硬件部处理
- 连接串口,进入系统后,判定串口是否有输出,且是否能够顺利进入BIOS界面。(串口助手推荐MobaXterm_Personal和SecureCRT)
问题1:设备重启时,串口没有输出,但是等一段时间后再重启就有输出了
原因:串口设备口前连有一个3.3V的放电设备,如果断电后立马重启,由于3.3V未放电完成,造成时序紊乱,从而造成串口没有输出
解决方案:串口位于前面板,调试时,前面未加上32个100G网口,所以放电慢,添加100G网口后放电会迅速很多。
第二阶段—烧写ONIE
该阶段主要记录烧写ONIE设备
6. ONIE基本知识
ONIE官网 简言之就是类似玩儿linux内核时的BootLoader,不同之处在于ONIE也是一个微型的linux内核,ONIE的目的是为了发现SONiC安装地址,从而进行安装。
7. 烧写ONIE,准备好U盘,准备好烧写工具Win32DiskImager
----[a]网络上下载ONIE源码,公司有备份可以从备份中check一份代码,编译烧写至U盘
----[b]BIOS下选择冲U盘启动,然后进行烧写
问题二:烧写ONIE不成功,出现字样如下:Installing ONIE in /dev/sda …can‘t write data to /dev/sda等字样
原因:目前设备使用的是nvme驱动的磁盘(添加nvme驱动),命名方式是nvme0n1开头,所以找不到/dev/sda设备
解决方案:修改machine/xxx/xxx/installer.conf,文件中通过寻找/sys/block/*/device,判定设备设备pci地址是否为pci0000:00/0000:00:1f.2,从而返回设备名字,这里调试采用直接返回nvme0n1,从而让程序知道磁盘名字
这里注意:为了更好查看程序执行,在shell脚本中加上set -x,可以看到每一步程序执行从而更清晰的了解程序
—[c]再次编译烧写
问题三:谁写ONIE不成功,出现字样如下:ERROR: Problems accessing sys_eeprom
原因:设备目前还出于探测不到IIC器件,也就是说根本没有eeprom设备,从而导致出错。
解决方案:找到代码installer/install.sh,将代码返回值改变,因为目前无法探测,所以暂时将代码返回值默认为正确的
—[d]再次编译烧写,烧写成功
第三阶段—检查设备驱动,IIC总线是否存在,网口设备是否存在
- 首先检查i2cbus是否能探测到-----i2cdetect -l发现并没有总线bus;然后dmesg检测内核信息打印是否有相关输出。
问题四:无IIC总线,内核出错信息如下:
原因:这是驱动程序和ACPI操作区域(SystemIO,SystemMemory)之间有冲突,
解决方案:这里暂时性的方法是:acpi_enforce_resources=lax启动选项处加上,解释:
acpi_enforce_resources={strict|lax|no}
检查驱动程序和ACPI操作区域(SystemIO,SystemMemory)之间资源冲突的方式。
strict(默认值)禁止任何驱动程序访问已被ACPI声明为"受保护"的操作区域,这是最安全的方式,可以从根本上避免冲突。
lax允许驱动程序访问已被ACPI声明的保护区域(但会显示一个警告)。这可能会造成冲突,但是可以兼容某些老旧且脑残的驱动程序(例如某些硬件监控驱动)。
no表示根本不声明任何ACPI保护区域,也就是完全允许任意驱动程序访问ACPI操作区域。 - 启动后IIC总线出现了,一并出现的还有4个系统地址。至于为什么后面IIC地址没有出现,原因是硬件断开了,所以探测不到。
- 查找USB转IIC总线芯片是否就绪,通过lsusb发现usb设备
,再次通过i2cdetect -l查看芯片是否作用,是否转出iic总线
问题五:USB芯片未转出IIC总线
原因:没有安装mcp2221驱动,导致芯片未作用
解决方案:在build文件夹下找到kernel下对应的内核版本4.1.38,在driver中添加mcp2221.c驱动文件,并在Makfile下添加obj-y=mcp2221.o将驱动编译进内核,buses/Kconfig添加mcp的注释选项,这个的目的是为在make menuconfig时有对应的选项显示(这种方法只适合调试,最后版本需要通过补丁的形式将文件打入内核中) - 重新编译烧写内核后通过i2cdetect -l查看i2c总线
- 检测网络状态,连上网线,ping 任意网址是否能ping通;fconfig是否有网卡信息
第三阶段—烧写SONiC系统
- 通过onie-nos-install http://文件服务器ip/文件进行系统烧写
问题六:烧写SONiC系统失败,错误信息如下:
原因:SONiC系统未支持nvme磁盘的命令方式,导致磁盘名错误,找不到磁盘,无法烧写
解决方法:在烧写SONIC系统时,ONIE就不再接管系统,开始读写SONIC的系统信息,因此代码这是应该从ONIE转向SONIC,搜索打印字样make2fs无果,搜索the operation…无果,搜索 Creating new…找到在installer/x86_64/install.sh下,发现create_demo_gpt_partition()通过sgdisk进行磁盘分区,这个函数执行完成后,返回调用出,发现下面的代码就是mkfs.ext4 -L $demo_volume_label $demo_dev 进行文件系统的制作。在shell下实验该命令发现果然错误参数会打印出make2fs…信息。在此加入对nvme磁盘的支持 - 编译系统,重新烧写,成功。
- 进入系统,检测IIC总线
问题七:有SMbus总线,没有IIC mc2221转的总线
原因:SONiC系统未支持mcp2221驱动
解决方案:SONiC下驱动有两种方式,一种是直接加在内核里面,第二种是加在自己设备下platform/xxxxx/modules/,为了兼容性采用第二种方案,修改其中的Makefile,同时将驱动加载的driver_load.sh脚本同过server的方式加载进内核 - 重新编译烧写,验证网卡是否就绪,ifconfig发现网卡就绪
总结
至此,设备硬件验证完毕,之后会持续更新该博客,更新关于IIC设备树结构方式,目前验证出连接到总线上的设备,第二层iic设备还没有探测出。
补充
- 关于ONIE补丁方式以及设备特殊化的处理
之前调试驱动,都是直接将文件放入内核中,这种方式不利于内核的一致性,接下讲述关于patch的制作以及设备特殊化处理
patch制作
patch文件放在serial同目录下
设备特殊化处理
onie中machine文件就是每个设备自己构建的系统驱动,内核配置的地址,在serials同目录下的conf文件就是内核配置的驱动选项位置,在其中加上
即可将10G网卡,NVME磁盘,MCP2221编译进内核