ONIE-sonic内核调试

产品信息

  1. 系统:SONiC系统(linux 4.9.110),ONIE(4.1.38)
  2. 项目背景:此项目是一个网络流量设备,作为流量转发器,将大批量的流量收集,筛选,过滤,重定向至新的端口,然后转发至后端设备,进行流量操作。
  3. 硬件:COM-E CPU主板,交换芯片,多种IIC设备(pca9548,pca9535等),NVME磁盘,USB转IIC总线芯片等;32个100G网口,2个USB口,一个串口,1个以太网口。

调试过程

第一阶段—检查硬件

  1. 检查电源是否正常,插上电源,判定能够设备是否上电,若未上电或者说出现上电延迟则返回硬件部处理
  2. 连接串口,进入系统后,判定串口是否有输出,且是否能够顺利进入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总线是否存在,网口设备是否存在

  1. 首先检查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操作区域。
  2. 启动后IIC总线出现了,一并出现的还有4个系统地址。至于为什么后面IIC地址没有出现,原因是硬件断开了,所以探测不到。
  3. 查找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时有对应的选项显示(这种方法只适合调试,最后版本需要通过补丁的形式将文件打入内核中)
  4. 重新编译烧写内核后通过i2cdetect -l查看i2c总线在这里插入图片描述
  5. 检测网络状态,连上网线,ping 任意网址是否能ping通;fconfig是否有网卡信息

第三阶段—烧写SONiC系统

  1. 通过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磁盘的支持
    在这里插入图片描述
  2. 编译系统,重新烧写,成功。
  3. 进入系统,检测IIC总线
    问题七:有SMbus总线,没有IIC mc2221转的总线
    原因:SONiC系统未支持mcp2221驱动
    解决方案:SONiC下驱动有两种方式,一种是直接加在内核里面,第二种是加在自己设备下platform/xxxxx/modules/,为了兼容性采用第二种方案,修改其中的Makefile,同时将驱动加载的driver_load.sh脚本同过server的方式加载进内核
  4. 重新编译烧写,验证网卡是否就绪,ifconfig发现网卡就绪

总结

至此,设备硬件验证完毕,之后会持续更新该博客,更新关于IIC设备树结构方式,目前验证出连接到总线上的设备,第二层iic设备还没有探测出。

补充

  1. 关于ONIE补丁方式以及设备特殊化的处理
    之前调试驱动,都是直接将文件放入内核中,这种方式不利于内核的一致性,接下讲述关于patch的制作以及设备特殊化处理
    patch制作在这里插入图片描述
    patch文件放在serial同目录下
    设备特殊化处理
    onie中machine文件就是每个设备自己构建的系统驱动,内核配置的地址,在serials同目录下的conf文件就是内核配置的驱动选项位置,在其中加上
    在这里插入图片描述
    即可将10G网卡,NVME磁盘,MCP2221编译进内核
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值