说明:在移植交换机软件到rtk系列交换机上遇到的一些问题总结在此留一个备份
1、在原厂提供的SDK中会报错mknod时会出现权限不够的问题
解决方法:修改kernel中编译nod的makefile,在其中加入权限
2、uboot是2011年的古董,在使用make envtools命令后在env文件夹下没有生成lib.a那么在程序中调用env方面的函数是不行的
解决方法:下载一个2018的uboot使用make envtools命令会生成lib.a但是这个库直接使用是不行的,因为通过查看源代码会发现访问fw_env.config这个文件的实现方法,2018和2011有一些不同,因为去修改2011会涉及太多的函数,直接修改2018的函数然后重新make envtools就可以了
3、在根目录下通过make rtusr-so命令生成动态库,当然前提是打开了diag否则会报错将生成的库放入文件系统的lib中,那么就可以在程序中调用了,当然也需要修改程序的makefile使其识别到该库
4、文件系统中没有fstab,自己自行创建该文件,然后在启动shell中使用mount -a挂载
仅供参考
# <file system> <mount pt> <type> <options> <dump> <pass>
/dev/root / ext2 rw,noauto 0 1
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620,ptmxmode=0666 0 0
tmpfs /dev/shm tmpfs mode=0777 0 0
tmpfs /tmp tmpfs mode=1777 0 0
tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0
sysfs /sys sysfs defaults 0 0
/dev/mtdblock3 /data jffs2 defaults 0 0
#/dev/mtdblock2 /var/lock jffs2 defaults 0 0
启动shell(rc文件)仅供参考
#!/bin/sh
#
# create essential directory
#
mkdir /var/empty
mkdir /dev/pts
mkdir /dev/shm
#
# mount process
#
mount -t devpts devpts /dev/pts
mount -t proc proc /proc
#mount -t jffs2 -o rw,sync /dev/mtdblock3 /mnt
echo "5 4 1 7" > /proc/sys/kernel/printk
#
# insert kernel module if exist
# default path is /lib/modules/X.X.XX/kernel
#
if [ -d "/lib/modules/X.X.XX/kernel" ]; then
cd /lib/modules/X.X.XX/kernel
fi
cat /proc/meminfo > /tmp/mem_log_rtsdk_start
RESULT=1
if [ -f "drivers/net/switch/rtcore/rtcore.ko" ]; then
insmod drivers/net/switch/rtcore/rtcore.ko
RESULT=$?
else
if [ -f "/lib/modules/rtcore.ko" ]; then
insmod /lib/modules/rtcore.ko
RESULT=$?
fi
fi
if [ $RESULT -eq 0 ] && [ -f "drivers/net/switch/rtk/rtk.ko" ]; then
insmod drivers/net/switch/rtk/rtk.ko
RESULT=$?
else
if [ $RESULT -eq 0 ] && [ -f "/lib/modules/rtk.ko" ]; then
insmod /lib/modules/rtk.ko
RESULT=$?
fi
fi
if [ $RESULT -eq 0 ] && [ -f "drivers/net/switch/rtnic/rtnic.ko" ]; then
insmod drivers/net/switch/rtnic/rtnic.ko
RESULT=$?
else
if [ $RESULT -eq 0 ] && [ -f "/lib/modules/rtnic.ko" ]; then
insmod /lib/modules/rtnic.ko
RESULT=$?
fi
fi
if [ $RESULT -eq 0 ] && [ -f "/lib/model/model.ko" ]; then
insmod /lib/model/model.ko
RESULT=$?
fi
if [ $RESULT -eq 0 ] && [ -f "net/switch/rtdrv/rtdrv.ko" ]; then
insmod net/switch/rtdrv/rtdrv.ko
RESULT=$?
else
if [ $RESULT -eq 0 ] && [ -f "/lib/modules/rtdrv.ko" ]; then
insmod /lib/modules/rtdrv.ko
RESULT=$?
fi
fi
if [ $RESULT -eq 0 ] && [ -f "/lib/modules/rise.ko" ]; then
insmod /lib/modules/rise.ko
RESULT=$?
fi
if [ -f "/lib/modules/rlapp.ko" ]; then
insmod /lib/modules/rlapp.ko
RESULT=$?
fi
cd /
cat /proc/meminfo > /tmp/mem_log_rtsdk_finish
mount -a
#
# network interface configuration
#
# print logo
clear
uname -nrsv
cat /etc/motd
ifconfig lo 127.0.0.1
route add -net 127.0.0.0 netmask 255.255.255.0 lo
ifconfig eth0 192.168.1.1
#
# start application
#
if [ $RESULT -eq 0 ] && [ -f "/bin/switch" ]; then
switch
fi
5、内核没有使能jffs2文件支持,需要手动在内核中启用,如果没有这个无法挂载和访问它给的cfg和log分区那么就无法写入和读取配置了,重启之后配置就丢失了,注意不要和File systems中的JFS filesystem support弄混了,它在Miscellaneous filesystems中。
6、当然还少不了tmpfs的支持了,在kernel中开启 File systems > Pseudo filesystems
7、必须开启MTD(memory technology device support)中的caching block device access to MTD支持否则在升级的时候会报错。
ps:由于使用不了turnkey命令那么busybox只能手动编写config文件,一个是defconfig一个是mkconfig,然后删除.config文件才能将功能启用,比如sync,route等等命令的启用,当然还有一些更恶心的东西,比如hwclock命令你在busybox中启用了但是会无法通过编译,这玩意还要在内核中启用ptp和rtc才行
总结:rtk搞的这套古董,uboot是2011年的,给的内核也是古董,什么东西都没有还不如直接放到buildroot里面,搭建这破环境都用了我半个月,能用了之后一看api也是古董,插拔反应还这么慢,真的比不上marvell和broadcom半根毛,也就在低端玩玩了凸m凸