更新

20170808 感谢@ian提醒,先修改fstab再复制overlay,就不会出现 fstab 恢复原始状态的状况。重新更改该部分内容。 20170706 在720N上,目前新版的LEDE使用f2fs格式化的U盘做exroot时,会出现类似如下的错误: mount: mounting /dev/sda1 on /mnt failed: Invalid argument mount: mounting /dev/sda1 on /mnt failed: I/O error 暂时解决办法是:windows上使用MiniTool Partition Wizard将U盘格式化为ext4格式。 相应的,制作固件时的命令改为: make image PROFILE=tl-wr703n-v1 PACKAGES="block-mount kmod-fs-ext4 kmod-usb-storage" 20170625 LEDE稳定发行版已于20170610更新为17.01.2,本文内容做相应修改。 20170430 LEDE稳定发行版已于20170418更新为17.01.1,本文内容做相应修改。 20170315 所有硬件版本的703N均可以按此方法扩展,但是强烈建议在可以刷入pepe2k不死uboot的703N上进行操作,理论上包括:v1.0-v1.6,以及v1.7(Dec. 2012 (FW build 121204))。 20170222 延迟1周后,LEDE第一个正式版的固件和软件包终于出现在了LEDE官方的下载库中,具体版本号是:17.01.0-r3205-59508e3官方网页暂时仍显示为Current Release - LEDE 17.01.0-rc2,但是应该很快会更新。按正式版重新整理里此文档,但不管是releases版还是snapshots,此文档均适用。 20170212 在无luci的情况下,设置PPPoE和无线桥接的方法可以参考这里20170205 LEDE目前已经放出了发行版的时间表,并已公布了第一个预览版 17.01.0 RC1。 17.01.0最终版将于2017年2月15公布。

说明

说明放在前面,以免浪费你的宝贵时间或可能破坏掉你的路由器: 1.不死uboot 因为只要有了不死uboot,就可以保证只要在uboot中刷入任何固件都不会导致变砖,所以我建议折腾的基础是建立在能刷入不死uboot的703N上。目前理论上可以方便的刷入pepe2k的不死uboot的703N硬件版本为:v1.0-v1.6,以及v1.7(Dec. 2012 (FW build 121204))。尽管事实上,如果想刷,任何版本的703N(包括April 2014 (3.17.1 Build 140120 Rel.56593n))都可以按此法进行扩展,只是个别703N--特指April 2014 (3.17.1 Build 140120 Rel.56593n)--因为不能方便的写入不死uboot,在操作的过程中存在变砖的可能性,尽管有一些硬件DIY可以救,但是这种情况是应该而且可以避免的。LEDE文档说支持的是703N V1。我这个背面铭牌上印的是:Ver:1.6,并操作成功;所以,我不清楚其他版本的情况; 2.这不是一个完全手把手的教程,只是记录自己折腾的过程,因此对于从没有折腾过OpenWrt的人来说,将会面对很多细节问题,一个小问题也许就会卡住你好几天的时间,甚至破坏了你的703N; 3.如果你想折腾,请务必读完全文再决定是否动手; 4.动手之前,请务必备份好网络配置文件(/etc/config/下的network,wireless,firewall),我假设你之前成功折腾了OpenWrt,不过,你折腾过OpenWrt,这些保不保存也无所谓了; 5.如果你对在没有luci(网页版的管理界面)的情况下如何配置网络完全不了解,我劝你动手之前还是要三思。 4.本文亦适用于TL-WR720N。

TL-WR703N只有4M闪存,如果想要安装官方稳定发行版(Stable Release,带luci),不管是OpenWrt还是LEDE,目前能成功配置USB扩展(Extroot)的最新版本是barrier_breaker 14.07

作为OpenWrt的Reboot项目,LEDE已运行多时。半年多了,第一个正式版已经发布,但目前只有此外每日更新的为snapshot版(该版本默认不带luci)。因闪存空间不足以安装扩展所需的软件,LEDE官方稳定发行版(Stable Release)和其开发快照版(Development Snapshot)都是无法扩展到U盘(Extroot)的。但是LEDE和OpenWrt一样,同样提供了一个固件构建程序包(imagebuilder),可以将扩展U盘所需软件直接打包进固件当中,避免了使用opkg安装这些文件出现的空间不足问题,从而成功实现Usb扩展。因为是采用官方工具自己构建,所以对那些使用别人打包的软件心存芥蒂的人来说,是个不错的选择。此外imagebuilder并非从头编译固件,只是相对简单的打包(make),因此不会耗费太多硬件资源和时间。

本文主要参考:
https://lede-project.org/docs/user-guide/extroot_configuration

1 Extroot的背景知识:

LEDE固件将所支持设备的内部存储划分为两部分,一部分高度压缩且只读(/),另一部分可写(/overlay)。LEDE(OpenWrt)通过linux内核的功能可以在表现形式上将这两部存储合并起来,使得对应用程序来说,只感觉到一个总的可读写的存储空间。
Extroot,则是在这两者之外,通过外置U盘等再添加一个外部的(/overlay),在启动时接替了(mounted over)内部的(/overlay)工作,从而实现扩展。还有个好处是,外部(/overlay)接替内部(/overlay)工作,并不彻底覆盖掉或破坏内部的(/overlay),只是运行于其上,这就意味着当外接U盘损坏或移除后,仍然可以通过内部的(/overlay)部分启动,恢复到开启Extroot前的状态。

2 实现步骤

2.1 所需的条件

64位的linux系统(运行在虚拟机中的也可以)
选择正确的固件构建程序包(imagebuilder)
假设是一个u盘(当时折腾14.07时分了三个区

2.2 建立工作目录

mkdir lede-703n
cd lede-703n

2.3 获取正确的imagebuilder

2.3.1 对于正式版:

2.3.1.1 在LEDE的下载库中找到703N所在的文件夹,并找到相关文件
https://downloads.lede-project.org/releases/17.01.2/targets/ar71xx/generic/

tl-wr703n-v1-squashfs-factory.bin
sha256sum: 6989535e198c7d250fcf39a4cf46e74a6230a0a40d2b5c66c22f290101e32c7c
tl-wr703n-v1-squashfs-sysupgrade.bin
sha256sum: 812ec41c9de2e94cb9fa1150f9662e050f4b2b21bd00ce328a8096f55aa1b458
lede-imagebuilder-17.01.2-ar71xx-generic.Linux-x86_64.tar.xz
sha256sum: 21635b5f9c8a21544fb46cb0fac714c4146d5da625105722867f45259fec07db

2.3.1.2 下载对应的imagebuilder:

wget https://downloads.lede-project.org/releases/17.01.2/targets/ar71xx/generic/lede-imagebuilder-17.01.2-ar71xx-generic.Linux-x86_64.tar.xz

wget出错就:

wget --no-check-certificate https://downloads.lede-project.org/releases/17.01.2/targets/ar71xx/generic/lede-imagebuilder-17.01.2-ar71xx-generic.Linux-x86_64.tar.xz

2.3.1.3 解压imagebuilder

xz -d lede-imagebuilder-17.01.2-ar71xx-generic.Linux-x86_64.tar.xz
tar -xvf lede-imagebuilder-17.01.2-ar71xx-generic.Linux-x86_64.tar
2.3.2 对于snapshots版:

2.3.2.1 在LEDE的下载库中找到703N所在的文件夹,并找到相关文件
https://downloads.lede-project.org/snapshots/targets/ar71xx/generic/

tl-wr703n-v1-squashfs-factory.bin
tl-wr703n-v1-squashfs-sysupgrade.bin
lede-imagebuilder-ar71xx-generic.Linux-x86_64.tar.xz

2.3.2.2 下载对应的imagebuilder:

wget https://downloads.lede-project.org/snapshots/targets/ar71xx/generic/lede-imagebuilder-ar71xx-generic.Linux-x86_64.tar.xz

wget出错就:

wget --no-check-certificate https://downloads.lede-project.org/snapshots/targets/ar71xx/generic/lede-imagebuilder-ar71xx-generic.Linux-x86_64.tar.xz

2.3.2.3 解压imagebuilder

xz -d lede-imagebuilder-ar71xx-generic.Linux-x86_64.tar.xz
tar -xvf lede-imagebuilder-ar71xx-generic.Linux-x86_64.tar

2.4 安装make所需的依赖

2.4.1 若是CentOS/RHEL
yum install subversion git gawk gettext ncurses-devel zlib-devel openssl-devel libxslt unzip
yum group install "Development Tools"
2.4.2若是Debian/Ubuntu
apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache gettext libssl-dev xsltproc unzip

2.5 打包固件

2.5.1 进入imagebuilder工作目录:
cd lede-imagebuilder-*
2.5.2 获取703N的打包参数PROFILE:tl-wr703n-v1。
make info
...
tl-wr703n-v1:
    TP-LINK TL-WR703N
    Packages: kmod-usb-core kmod-usb2
...
2.5.3 打包并获取固件
make image PROFILE=tl-wr703n-v1 PACKAGES="block-mount kmod-fs-f2fs kmod-usb-storage mkf2fs f2fsck"

打包很快完成,在bin/targets/ar71xx/generic/下可以找到已经打包好的固件。

ls ./bin/targets/ar71xx/generic/

17.01.2正式版:

lede-17.01.2-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin
lede-17.01.2-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin

snapshots版:

lede-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin
lede-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin

2.6 刷入固件

网线连接703N,强烈推荐在不死uboot中刷入sysupgrade固件。

2.7 扩展到U盘(Exroot)

2.7.1 更改root密码

安装好固件后,等指示灯稳定后,用puyyt连接路由器 192.168.1.1,首先是更改root密码

passwd
2.7.2 查看挂载情况
block info
/dev/mtdblock2: UUID="9fd43c61-c3f2c38f-13440ce7-53f0d42d" VERSION="4.0" MOUNT="/rom" TYPE="squashfs"
/dev/mtdblock3: MOUNT="/overlay" TYPE="jffs2"
/dev/sda1: UUID="fdacc9f1-0e0e-45ab-acee-9cb9cc8d7d49" VERSION="1.4" TYPE="ext4"
/dev/sda5: VERSION="1" TYPE="swap"
/dev/sda6: UUID="fffaa123-1234-5678-abcd-1234abcd5678" VERSION="1.7" MOUNT="/mnt/sda6" TYPE="ext4"

这里借用了原文的信息来说明情况。可见已经成功挂载U盘,三个区是:sda1、sda5、sda6。
sda1是为Extroot准备的,sda5是swap,sda6后续可以作为aria2和samba等文档存储区。

2.7.3 将U盘的第一个区sda1和第三个区sda6格式化为f2fs格式
mkfs.f2fs /dev/sda1
mkfs.f2fs /dev/sda6

f2fs格式是为闪存设计的,u盘和ssd建议为f2fs格式。

2.7.4 自动修改文件系统(fstab)信息:
block detect > /etc/config/fstab; \
sed -i s/option$'\t'enabled$'\t'\'0\'/option$'\t'enabled$'\t'\'1\'/ /etc/config/fstab; \
sed -i s#/mnt/sda1#/overlay# /etc/config/fstab; \
cat /etc/config/fstab;

此时自动配置好并显示挂载情况:

config 'global'
        option  anon_swap       '0'
        option  anon_mount      '0'
        option  auto_swap       '1'
        option  auto_mount      '1'
        option  delay_root      '5'
        option  check_fs        '0'

config 'mount'
        option  target  '/overlay'
        option  uuid    'fdacc9f1-0e0e-45ab-acee-9cb9cc8d7d49'
        option  enabled '1'

config 'swap'
        option  device  '/dev/sda5'
        option  enabled '1'

config 'mount'
        option  target  '/mnt/sda6'
        option  uuid    'fffaa123-1234-5678-abcd-1234abcd5678'
        option  enabled '1
2.7.5 复制/overlay到sda1
mount /dev/sda1 /mnt ; tar -C /overlay -cvf - . | tar -C /mnt -xf - ; umount /mnt

直接重启路由器:

reboot
2.7.6 重启后就可以查看到成功了:
df -h

2.8 后续

2.8.1想办法,把没有luci的路由器联网
如果之前备份过OpenWrt的网络配置文件,通过WinScp传回重启就可以了。
2.8.2安装必要组件:
opkg update
opkg install luci luci-i18n-base-zh-cn luci-theme-material
opkg install ...

注:
1.现在没必要安装luci-ssl,它使用的是一个自签名的证书;
2.不要在成功扩展后(Extroot)运行opkg upgrade,更不要通过luci或者putty更新固件,更新固件永远在uboot中进行。


2 条评论

ywb · 2017年2月7日 上午11:49

正好前几天也试了一下,
1、自己的固件可以不用安装f2fs驱动,就是有些软件用不了官方源的了,
2、装了python3,Ipython,太卡,没实用价值。
3、确实不能在luci刷固件了,刷完软件装不上去了。

    CD · 2017年2月8日 上午10:33

    等正式版出来再折腾吧。

发表评论

电子邮件地址不会被公开。 必填项已用*标注