海运的博客

编译Openwrt固件安装软件内核版本不一致问题解决

发布时间:February 5, 2015 // 分类:OpenWrt // No Comments

最近将使用近3年Openwrt Backfire 10.03固件升级到了最新版本Barrier Breaker 14.07,编译后使用opkg安装官方源提供的软件出现了内核版本不一致的问题:

Collected errors:
 * satisfy_dependencies_for: Cannot satisfy the following dependencies for openconnect:
 *     kernel (= 3.10.49-1-3051dee8f07064b727e9d57fbfeb05ec) * 
 * opkg_install_cmd: Cannot install package openconnect.

安装的openwrt kernel版本,内核大版本一样,就后面md5不一样:

opkg info kernel
Package: kernel
Version: 3.10.49-1-eac88df3cb49b94d68ac3bc78be57f95
Depends: libc
Status: install hold installed
Architecture: x86
Installed-Time: 1423195057

看看md5版本号是怎么生成的:

grep vermagic include/kernel-defaults.mk
$(SH_FUNC) grep '=[ym]' $(LINUX_DIR)/.config | LC_ALL=C sort | md5s > $(LINUX_DIR)/.vermagic

在编译前指定内核版本号:

#查看Openwrt官方源内核版本:
wget http://downloads.openwrt.org/barrier_breaker/14.07/x86/generic/packages/base/Packages.gz
zgrep -m 1 "Depends: kernel (=.*)$" Packages.gz | sed -e 's/.*-\(.*\))/\1/' > .vermagic
#取而代之
sed -i -e 's/^\(.\).*vermagic$/\1cp $(TOPDIR)\/.vermagic $(LINUX_DIR)\/.vermagic/' include/kernel-defaults.mk

编译后指定内核版本:

sed -i 's/eac88df3cb49b94d68ac3bc78be57f95/3051dee8f07064b727e9d57fbfeb05ec/' /usr/lib/opkg/status

以上解决方法和opkg --force-depends无区别,会造成不稳定因素,最好的解决方法是使用官方提供的固件,如果非要自己编译固件的话使用官方软件相同版本的源码编译,如Barrier Breaker 14.07 r42625:

svn co svn://svn.openwrt.org/openwrt/branches/barrier_breaker -r 42625 

就算使用同一版本源码编译内核md5版本号也不一致,除非使用官方提供的.config,可以使用前面的两种方法修改内核版本号。
Openwrt版本历史及版本号:
http://en.wikipedia.org/wiki/OpenWrt
http://wiki.openwrt.org/about/history#barrier_breaker

VMware测试编译的OpenWRT固件img转vmdk

发布时间:February 5, 2015 // 分类:OpenWrt // No Comments

路由刷机有风险,编译后可先使用x86版本的固件使用vmware测试,平台选择x86,目标image选择vmdk。
vmware新建虚拟机使用已存在的磁盘,硬盘一定要选择IDE格式,不要选择SCSI。
OpenWRT官方提供的x86固件自Barrier Breaker 14.07版本没有提供vmdk格式,转换方法:

yum install qemu-img
apt install qemu-utils
wget http://downloads.openwrt.org/barrier_breaker/14.07/x86/generic/openwrt-x86-generic-combined-ext4.img.gz
gunzip openwrt-x86-generic-combined-ext4.img.gz
qemu-img convert -f raw openwrt-x86-generic-combined-ext4.img  -O vmdk openwrt-x86-generic-combined-ext4.vmdk

高性能libcurl配合epoll的curl_multi_socket_action方法使用

发布时间:February 3, 2015 // 分类: // No Comments

libcurl对大量请求连接提供了管理socket的方法,用户可使用select/poll/epoll事件管理器监控socket事件,可读写时通知libcurl读写数据,libcurl读写完成后再通知用户程序改变监听socket状态。
两个重要的设置:
curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
curl_multi_setopt(multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb);
1.当使用curl_multi_add_handle(g->multi, conn->easy)添加请求时会回调multi_timer_cb,然后调用curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0, &g->still_running)初始化请求并得到一个socket(fd)。
2.调用sock_cb回调函数,传入新建的sockfd,根据传入的what状态添加到相应的事件管理器,如封装epoll的libev或libevent。
3.当事件管理器发现socket状态改变时通过curl_multi_socket_action(g->multi, fd, action, &g->still_running)通知libcurl读写数据,然后再调用sock_cb通知事件管理器,如此反复。

libcurl官网提供的基于libevlibevent事件管理示例:
http://curl.haxx.se/libcurl/c/hiperfifo.html
http://curl.haxx.se/libcurl/c/evhiperfifo.html

此内容被密码保护

发布时间:February 3, 2015 // 分类: // No Comments

请输入密码访问

此内容被密码保护

发布时间:February 2, 2015 // 分类: // 15 Comments

请输入密码访问

分类
最新文章
最近回复
  • opnfense: 谢谢博主!!!解决问题了!!!我之前一直以为内置的odhcp6就是唯一管理ipv6的方式
  • liyk: 这个方法获取的IPv6大概20分钟之后就会失效,默认路由先消失,然后Global IPV6再消失
  • 海运: 不好意思,没有。
  • zongboa: 您好,請問一下有immortalwrt設定guest Wi-Fi的GUI教學嗎?感謝您。
  • 海运: 恩山有很多。
  • swsend: 大佬可以分享一下固件吗,谢谢。
  • Jimmy: 方法一 nghtp3步骤需要改成如下才能编译成功: git clone https://git...
  • 海运: 地址格式和udpxy一样,udpxy和msd_lite能用这个就能用。
  • 1: 怎么用 编译后的程序在家里路由器内任意一台设备上运行就可以吗?比如笔记本电脑 m参数是笔记本的...
  • 孤狼: ups_status_set: seems that UPS [BK650M2-CH] is ...
归档