产品信息

  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编译进内核

ONIE-sonic内核调试相关推荐

  1. 开源项目-基于Intel VT技术的Linux内核调试器

    本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...

  2. Windows Server 2008 R2 如何启动内核调试

    相信windbg大家都不陌生,其提供了一个异常强大的功能就是kernel dbg, 在不同版本的windows 系统中启动kernel dbg的方式不禁相同,为了方便大家使用kernel dbg,本文 ...

  3. Linux内核调试 - 一般人儿我都不告诉他(一)【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/04/14/2396821.html 悄悄地进入Linux内核调试(一) 本文基址:http://blo ...

  4. linux内核调试技术 kprobe使用与实现

    Linux kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术.利用kprobes技术,内核开发人员可以在内核的绝大多数指定函数中动态的插入探测点来收集 ...

  5. 使用WinDbg内核调试

    WINDOWS调试工具很强大,但是学习使用它们并不容易.特别对于驱动开发者使用的WinDbg和KD这两个内核调试器(CDB和NTSD是用户态调试器). 本教程的目标是给予一个已经有其他调试工具使用经验 ...

  6. Windbg+Vmware/VirutalBox内核调试加速工具VirtualKD

    今天又想起来VirtualKD这个东西,试用了一下,真是爽坏了,可能我火星了~~ 很久以前就知道小喂有个VmKd工具,使用Vmware的后门指令直接拷贝数据来代替模拟串口,能大大提高调试时的数据传输速 ...

  7. 内核调试相关变量说明

    KdInitSystem 函数让内核调试引擎初始化 KiDebugRoutine 当系统分发异常时会调用KiDebugRoutine变量所指向的函数 KiDebugRoutine写入函数地址KdpSt ...

  8. windbg+VM 设置内核调试环境(双机调试)

    虚拟机是XP情况: 启动项添加调试启动,并设置波特率为115200 具体操作可在boot.ini中添加如下代码: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS ...

  9. 基于IntelVt技术的Linux内核调试器 - 2

    4 基于IntelVt技术的Linux内核调试器- 调试器设计与实现(2):调试核心 4.1反汇编引擎 如果说调试框架是一个调试器的灵魂,那么接口与反汇编引擎就是一个调试器的身体.我们在调试过程中是要 ...

  10. 错误:由于系统启用了内核调试器,因此不可能进行调试解决方案

    错误:由于系统启用了内核调试器,因此不可能进行调试解决方案 原文地址如下所示: http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1 ...

最新文章

  1. 0x12.基本数据结构 — 队列与单调队列
  2. python图像复制、显示、保存
  3. php88,php88微博
  4. linux deepin/ubuntu安装flameshot火焰截图
  5. C++ Primer(第四版) 课后习题3.14 vector单词转大写
  6. 【LeetCode笔记】剑指 Offer 13-. 机器人的运动范围 (Java、dfs)
  7. 太原计算机专业专科大学排名,太原【计算机学校】排名
  8. 10条途径迅速提高你的生活
  9. QML工作笔记-文本输入设置长度以及回显方式(TextInput与TextField通用)
  10. android 购票代码,android完美电影购票源码
  11. 4.c++模式设计-建造者模式
  12. WF从入门到精通(第十章):事件活动 (转)
  13. c语言熵值法,干货 | R语言熵值法详解(附代码) 秒懂自定义函数
  14. Java中的break Label 和continue Label
  15. 用jquery在一个页面加载另一个页面
  16. 计算机个性化设计小组工作计划,电脑兴趣小组工作计划.doc
  17. Few-Shot Video Object Detection
  18. Chrome 80 Cookie跨域 Samesite Lax 的错误
  19. 知名互联网公司面试题
  20. mysql的right函数_MySQL数据库中系统函数right功能简介

热门文章

  1. java.lang.NoSuchFieldError: No static field ib_back of type I in class Lcom/example/demo/R$id; or
  2. 2022年茶艺师(中级)上岗证题库及答案
  3. 美团 iOS 端开源框架 Graver 在动态化上的探索与实践
  4. ​学会这8个引流获客方法,让你不再缺流量!
  5. docker 容器启动失败:Could not attach to network
  6. bugtrap microsoft 默认崩溃提示框_办公利器?微软(Microsoft)Surface go P?鼠标仅售169.00元_...
  7. Linux管理工具集合
  8. 吾生也有涯,吾知也无涯_乌拉(6)
  9. 安卓中蓝牙对战游戏 (cocos2d-x 调用)
  10. 360手机助手显示手机型号错误