找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 23356|回复: 71

703n完全USB启动

  [复制链接]
发表于 2013-1-24 12:41 | 显示全部楼层 |阅读模式
OpenWRT自带的extroot不是完整的USB启动,内核还是在内置的flash里的。我用kexec实现了从USB启动完整的内核。给一个固件给大家研究用。
原理:
fqrouter USB启动原理【1】:刷不死的路由器的三种选择
fqrouter USB启动原理【2】:kexec + losetup
固件下载地址
http://fqrouter.tumblr.com/post/41285770186/703n-openssh-client-autossh-redsocks

评分

参与人数 3恩山币 +5 收起 理由
pupie + 3 强大的恩山!(以下重复1万次)
tlze + 1 原创技术共享,谢谢分享
laoyangjp + 1 绝对百年一遇的强帖

查看全部评分

发表于 2017-4-1 10:11 来自手机 | 显示全部楼层
牛逼。有没有大神研究下有没有可能让腾达AC9用上?openwrt如果能引导u盘上的华硕,或者其他固件,不就免去硬改了。华硕好像开放源码,理论上还是有可能吧。
回复 支持 反对

使用道具 举报

发表于 2017-3-27 00:20 | 显示全部楼层
厉害了      
回复 支持 反对

使用道具 举报

发表于 2015-4-5 15:29 | 显示全部楼层
mark 一下,以备不时之须
回复 支持 反对

使用道具 举报

发表于 2014-9-24 18:22 | 显示全部楼层
这个要收藏,绝对是经典之作,刚刚在github上看楼主的源码,最近在搞x86的openwrt,有很多地方可以借鉴
发表于 2014-9-23 13:07 | 显示全部楼层
本帖最后由 guo4qing 于 2014-9-23 13:10 编辑
ayaka 发表于 2014-9-23 04:02
不是的u-boot chainload u-boot是可能的
我原来的意思是u-boot加载u disk当中的内核(这是可能的)

我知道 给uboot添加usb的相关指令和功能
不过这个功能虽然强大 但是不是每个人都可以随意折腾
uboot刷坏了  除非有编程器
不然就无药可救了
不过编译一个支持kexec system call的内核 然后在flash固件上运行kexec -l ****
kexec -e
确实可以启动自己编译的固件
我用的是论坛fqrouter自己编译的wr703n的initrom固件(版本为aa) 除了不支持我的usb无线网卡和我的另一个lan口之外效果很不错
亲自测试利用kexec 可以启动它提供的(bb trunk版本)
以及我自己编译的最新trunk版本(cc)都是可以利用kexec启动成功的
不过我不明白的是 我自己用bb rc3的源码编译的kexec固件失败了 在加载内核时提示killed
然后我用cc 2014年9月最新的源码编译了一个kexec的固件 这一次kexec加载内核不在失败
但是执行kexec -e后貌似路由器死掉了
不太明白到底我编译哪里出了问题
我是按照fqrouter的官方微博 以及参考了另外的几个大神的教程来编译定制的
看来目前如果想用kexec功能去体验其他内核
也就只能用fqrouter提供的wr703n的kexec固件了
不过好在这个固件原生支持usb storage 和luci
自己安装一些aa版本非内核mod的软件 还是可以完美使用的


另外我的意思是uboot的折腾难度太大 没有编程器和完美的焊接手艺不好搞移植 除非自己能改造一个双flash或者买一个淘宝改造好的双flash的ar9331的机器
然后自己去移植折腾uboot
说道移植 其实有现成的类似mips 24k的源码参考的
我说的是kexec的方式来启动uboot
这里的uboot不是那些不死的uboot
而是带usb功能的uboot
然后利用uboot再次启动优盘内的内核和initrd模块
希望成功吧
我还没有测试了

发表于 2014-9-23 04:02 | 显示全部楼层
guo4qing 发表于 2014-9-20 10:50
你是说内核的kexec加载uboot
我的神 这个意义就大了
对于搞uboot移植的人来说  十分的重要

不是的u-boot chainload u-boot是可能的
我原来的意思是u-boot加载u disk当中的内核(这是可能的)

点评

我知道 给uboot添加usb的相关指令和功能 不过这个功能虽然强大 但是不是每个人都可以随意折腾 uboot刷坏了 除非有编程器 不然就无药可救了 不过编译一个支持kexec system call的内核 然后在flash固件上运行kex  详情 回复 发表于 2014-9-23 13:07
发表于 2014-9-20 10:50 | 显示全部楼层
ayaka 发表于 2013-4-30 23:26
完全两个字有待商榷。首先启动器不是在u盘中,其次这个设备不支持从u盘中加载第一引导器。可以考虑把uboot ...

你是说内核的kexec加载uboot
我的神 这个意义就大了
对于搞uboot移植的人来说  十分的重要
比如我想让uboot支持优盘 但是没有ar9331对应的开发板
我就可以试试用kexec -l uboot来加载我移植后的uboot看它是否支持优盘启动  还有比如超频的uboot
还有其他的功能测试 就不枚举了
这里的完全 不是说优盘 而是说固件
确实是启动了一个完整的固件 不论内核还是模块都是全新的
很不错的做法
如此就可以免刷机只需要重启就可以在ddwrt openwrt 石像鬼 甚至于官方 四个版本之间切换了
呵呵 切换的前提只是这些内核编译中加入了initrd/initamfs支持就够了
如果是官方版本 可能要全内存运行了 因为没有优盘驱动 除非自己编译
像ddwrt 石像鬼等就简单多了 可以自己编译 当然用官方的固件 自己分离内核和rootfs 然后重新打包也不困难   加上官方的usb插件很不错的

点评

不是的u-boot chainload u-boot是可能的 我原来的意思是u-boot加载u disk当中的内核(这是可能的)  详情 回复 发表于 2014-9-23 04:02
发表于 2014-9-16 23:50 | 显示全部楼层
guo4qing 发表于 2014-9-15 14:18
大神果然牛逼
补上我海淘找回来的固件链接
http://pan.baidu.com/s/1pJx66P9

我已经编译了 bb rc3的kexec 支持的内核
也编译了usb模块
但是为啥我启动路由器后执行kexec  -l kernel (刷了你的wr703n的固件 kexec启动成功)
后出现提示 killed
然后就没有然后了
而不是正常的ok
然后执行kexec -e 就死机
为啥呀????
内核是3.10.49版本的
我夹在了好几个内核 都不行??
诡异了
发表于 2014-9-15 14:18 | 显示全部楼层
大神果然牛逼
补上我海淘找回来的固件链接
http://pan.baidu.com/s/1pJx66P9
密码是xopu
这是fqrouter的kexec 启动作品
我用wr720n v4 刷了测试了一下
不知道为什么 不能够全自动启动进入优盘的新固件
但是手动挂载优盘后再次输入
kexec -l kernel ******************
kexec -e
可以进进入优盘的固件
我对这个东西很感兴趣 最近在研究这个东西
我看了你的那些帖子 用代理看的
很强大
我想的是 要编译一个支持kexec usbstor vfat ext4 ntfs的内核
感觉比较困难
我看到make kernel_menuconfig里面的各种配置
而且很多可以用module(外置)或者buildin(集成到内核)的方式
现在openwrt的barrier_breaker 14.07 rc3已经很不错了
支持kexec的内核我会编译了
但是优盘上的固件内核 貌似需要initramfs/ramdisk的支持吧

我找到的资料是
linux驱动一个设备,如USB,可以直接在内核启动过程中就驱动,也可以等内核启动完了,再启动可选模块来驱动。默认情况下,openwrt将USB storage作为可选模块来驱动的,这样,在内核的启动过程该找rootfs的时候,因为模块还没有加载,而找不到U盘。所以,如果要实现USB root启动,就要把usb sotrage编译到内核里去。

过程:
  1、在openwrt编译环境的最上一级目录里,make menuconfig,设置平台架构,如选择ar71xx,包和kernel-modules可根据需要选,如果你要在U盘上跑debian,大多数你都可以不选了,因为debian下的驱动、软件全有了,如果你还跑openwrt,你可根据你原来的需要选择,USB storage、scsi disk的几个不要选了,因为我们回头要直接编译进内核,保存退出,此时kernel里openwrt已经帮你同步设置了过了一部分。这里有个base filessystem什么的一定要选。
  注:编译生产的文件选择:
  我们要刷的文件大致有3类,jffs类、squash类、kernel+rootfs分开类。
  对于内核和rootfs分开的,你可以选择生产文件为tgz,你回头如果你还想用openwrt,把这个tgz解压到U盘就行了。
  对于用jffs、squash类的,选择应该也会多生成一个压缩成tgz的rootfs。(未试过,不清楚了)
  2、再make kernel_menuconfig,设置kernel,在这里你加入scsi、scsi disk、usb2 、usb-ohci、usb-uhci、usb-ehci、usb mass-storage、ext2/ext3(根据你个人爱好选一个,回头你的U盘设置成你选择的文件系统,不要都选)支持,我不贴图了,详细准确的名字我也不细究了,但就这几个就够了,保存退出。
  3、在kernel hacking里,修改内核命令行为 root=/dev/sda1 rootdelay=10 noinitrd console=ttyS0,115200 init=/sbin/init
  4、make 编译。回头你在bin目录里,就会看到你定制的kernel和rootfs。

四、使用
  1、准备rootfs,把前面生成的rootfs.tgz解压到准备好的U盘里,如果你用debian也是一样,准备好。
  2、对于kernel+rootfs分开的,把kernel刷进路由
  对于用jffs/squash的,刷jffs或squash文件
  3、重启,你应该是从USB启动了。

另外你做的那个外置rom是把kernel和rootfs编译到一起了
我查资料是可以分开的吧
我想问一下把ext4 vfat ntfs和usb storage驱动都集成到kernel 同时开启这个内核的kexec system call支持以及开启initrd/initramfs支持之后
应该能用kexec -l kernel root=/dev/sda1 rootdelay=10 noinitrd console=ttyS0,115200 init=/sbin/init或者kexec -l kernel append initrd=initramfs.gz 之类的命令来启动么??
这样的话就好办了
另外好像从4M的wr720n提取出来的kernel似乎不支持被直接kexec吧
应该是加了一个uboot的文件头吧
说了这么多 我想问下能否实现??
我编译了几个固件 刷入wr720n后都失败了
内核似乎有问题 但是第一次能启动 只不过貌似jffs2的补丁我手动打上的  最后进入路由 提示只读
第二次不知道咋回事 都不能启动了 呜呜
求大神告诉我 怎么用官方的openwrt提供的编译好的toolchain编译一个 集成ext4/3/2 vfat ntfs usbstor kexec支持的内核  版本是3.10.49 就是网上的openwrt snapshot trunk的内核或者是barrier_breaker 14.07 rc3的内核
我不会配置内核
用svn的方式获取了barrier_breaker的源码
然后照着网上的教程弄
编译出来的固件不能用
现在路由器刷了 wr3020的ddwrt官方固件 有usb支持 但是貌似无法挂上
求大神指点下
我是想用官方编译好的toolchain去编译3.10.49的内核
然后用编译好的内核和官方编译好的openwrt imagebuilder来制作自己的固件
至于你提到的 要编译target ramdisk  我想直接把 kernel和initramfs.gz分离开 方便修改调试

点评

我已经编译了 bb rc3的kexec 支持的内核 也编译了usb模块 但是为啥我启动路由器后执行kexec -l kernel (刷了你的wr703n的固件 kexec启动成功) 后出现提示 killed 然后就没有然后了 而不是正常的ok 然后执  详情 回复 发表于 2014-9-16 23:50
发表于 2013-7-4 00:37 | 显示全部楼层
源地址已经挂了 哎呀
发表于 2013-5-13 10:09 | 显示全部楼层
再次思考。。。
发表于 2013-5-11 15:01 | 显示全部楼层
很好,不过问一句,刷这个东西等于是刷uboot吗?还是只是刷 FM?
发表于 2013-4-30 23:26 | 显示全部楼层
完全两个字有待商榷。首先启动器不是在u盘中,其次这个设备不支持从u盘中加载第一引导器。可以考虑把uboot放在u盘中chainloader,不过没什么意义。

点评

你是说内核的kexec加载uboot 我的神 这个意义就大了 对于搞uboot移植的人来说 十分的重要 比如我想让uboot支持优盘 但是没有ar9331对应的开发板 我就可以试试用kexec -l uboot来加载我移植后的uboot看它是否支  详情 回复 发表于 2014-9-20 10:50
发表于 2013-4-30 22:59 | 显示全部楼层
很好的想法,支持。
发表于 2013-4-18 12:23 | 显示全部楼层
楼主,我在设置上级路由的时候遇到以下问题
  1. /usr/lib/lua/luci/dispatcher.lua:448: Failed to execute call dispatcher target for entry '/fqrouter/network/upstream/list'.
  2. The called action terminated with an exception:
  3. /usr/lib/lua/luci/controller/fqrouter/network.lua:79: table index is nil
  4. stack traceback:
  5.         [C]: in function 'assert'
  6.         /usr/lib/lua/luci/dispatcher.lua:448: in function 'dispatch'
  7.         /usr/lib/lua/luci/dispatcher.lua:195: in function </usr/lib/lua/luci/dispatcher.lua:194>
复制代码
请问如何解决?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-6-14 19:30

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表