Written by leeming
http://blog.chinaunix.net/uid-9863638-id-1996324.html
本以为linux的以太网控制台应该像串口控制台一样能够对linux环境进行控制操作的,但是深入发现这个console非彼console,以太网控制台仅仅是能允许将本地的内核信息(注意:仅仅是内核的信息)通过网络的方式传到另外一台主机,实现远程监控的功能。
虽然大大的遗憾了一把,本来我还一心还实现“一根网线走遍天下”的开发环境,但现实是残忍的,不过这个功能也很有意思,我认为比较适合用在两个场合:
1. 可以成为内核程序员进行内核开发的手段之一:因为以太网控制台是在系统比较早的时候建立的,因此即使此时串口没起来(开发中很容易碰到),你仍然能看到大部分的打印信息,以下是开发者的原文:
As a built-in, netconsole initializes immediately after NIC cards and will bring up the specified interface as soon as possible. While this doesn't allow capture of early kernel panics, it does capture most of the boot process.
2. 可以实现远程监控的功能:由于控制台是基于以太网线的,因此我可以很方便的实现远程监控,特别是监控kernel panic时的现象,联想到之前我们做集成测试,把我们的开发板拿到机房(因为机房不断电),如果使用了以太网控制你只需要在远程开一个监控窗口,一旦内核崩溃或者出现异样,在远端立马看到,方帅也不用再楼上楼下的跑了!
说了这么多,无非是想说这个network console还是蛮有用处的,而且相信随着内核版本的发展,以后很有可能实现我最开始说的那种完全控制方式的控制台。下面就谈一下如何实现arm开发板端的linux network console。
我的开发环境:基于sep4020的开发板,使用的内核是linux2.6.16;主机开发环境是fedora 7
第一步:network console是2.6的内核已经自带的,我们要做的工作是要在内核中选上这个选项,打开make menuconfig->device drivers->network device support-> Network console logging support (EXPERIMENTAL)
第二步:检查你的以太网驱动,使用network console会调用到以太网设备的一个叫poll_controller的函数(是net_device的一个成员函数),我们的驱动没有编写这个函数(一般老一点的驱动都没有,更何况以太网是我们自己写的),稍微研究了下network console的源码,其实它并没有调用这个函数,只是上层在调用的时候需要这个函数,因此我就补充了这个函数,但是里面什么都没做,这样就把上层给欺骗过去了。
如下:
添加如下代码:(当然这部分代码你不可能和我完全一样,按照自己以太网驱动的架构改)
/* Used by netconsole */
static void sep4020_poll_controller(struct net_device *dev)
{
return;
}
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = &sep4020_poll_controller;
#endif
第三步:添加配置参数,添加配置参数就是指给network console指定被监控的网卡号,和监控主机等等,有两种方式,如果你刚才在选Network console logging support (EXPERIMENTAL)是选择build-in的方式,那应该通过内核的启动参数来传递,在我们的开发板上的话就是在uboot的bootargs后面添加这么一段话:netconsole=6666@192.168.0.2/eth0,30000@192.168.0.3/ ;如果刚才是选择了module的形式,那就在系统启动之后加载模块的时候添加:insmod netconsole.ko netconsole=6666@192.168.0.2/eth0,30000@192.168.0.3/ 。
讲完了如何添加,现在来说一下添加的这句话是什么意思,首先来讲一下规则:
netconsole=[src-port]@[src-ip]/[],[tgt-port]@/[tgt-macaddr]
where src-port source for UDP packets (defaults to 6665)
src-ip source IP to use (interface address)
dev network interface (eth0)
tgt-port port for logging agent (6666)
tgt-ip IP address for logging agent
tgt-macaddr ethernet MAC address for logging agent (broadcast)
因此很明显我这句话的意思就是说我的开发板的端口为6666,开发板的ip是192.168.0.2,对应的网卡是eth0,监测主机的端口号是30000,ip是192.168.0.3(这里面ip一定要对,端口号只要不冲突随便填,其中主机的端口号待会会用到)
第四步:启用主机配置:
一切就绪,现在要做的就是启用主机软件来监控,linux源码中的document中这样说的:
The remote host can run either 'netcat -u -l -p ' or syslogd.
结果发现syslogd不知道怎么用,敲了就说已经启动,但是就没啥其它的反应,输入netcat说没命令,后来发现linux下有个nc的命令,功能类似,不过验证了半天发现还不完全相同,没办法就到netcat的官网上下了一个,给fedora安装了,netcat的官网下载地址:http://netcat.sourceforge.net/download.php ;但是在安装的时候又遇到问题,就是和fedora自带的nc软件冲突,因此先要把nc软件给卸载掉,卸载的过程如下:
先通过命令 rpm -q nc 获取nc的安装包名字(名字为nc-1.84-12.fc7),再通过命令rpm -e nc-1.84-12.fc7卸载,然后双击刚才从netcat官网上得到的rpm包安装,安装成功后启动shell终端,在终端中输入监控命令:netcat -l -p 30000 –u(30000就是我们刚刚填的远程主机的端口号)。这时候启动板子(这种方式需要network console选项是直接编进内核的,并且bootargs参数已按照上面填完整了),就能看到内核打印的信息在主机端也出现了,成功!