标签归档:Extroot

在TL-WR703N上安装LEDE并扩展到U盘运行(Extroot)

更新

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中进行。

TL-WR703N、TL-WR720N将官方OpenWrt系统扩展到U盘运行

更新

2017-08-08 如无较大错漏,本文不再更新,请尽快更新至LEDE; 感谢@ian提醒,先修改fstab再复制overlay,就不会出现 fstab 恢复原始状态的状况。重新更改该部分内容。 2017-05-29 LEDE已更新为17.01.12017-02-22 目前LEDE已放出了第一个正式版,因此建议采用最新版:17.01.02017-01-18 1.如果想尝试新版固件,OpenWrt官方和LEDE均提供了一个工具:imagebuilder。可以参考这个帖子进行。 2.不要在已经Extroot的系统上更新系统或固件,可能会导致设备变砖,如需更新,请拔下U盘,并在uboot中操作。

TL-WR703N、TL-WR720N的闪存只有4M,装完官方版的OpenWrt后空间所剩无几,好在它们提供了一个usb口,可通过官方教程挂载U盘,并将OpenWrt运行在U盘中,即扩大rootfs,同时解决安装软件没有空间的尴尬。

1 系统、挂载模式、挂载方法的选择

OpenWrt系统:
如果只想安装OpenWrt官方固件,那么建议选择barrier_breaker 14.07,不建议选择最新的稳定版chaos_calmer 15.05,后者会出现空间不足导致U盘驱动无法安装的情况。
挂载模式:
目前OpenWrt官方推荐rootfs挂载’/overlay’的模式(本文使用该方法),不再推荐’/’的模式。如果U盘损坏,拔下U盘可以启动系统。
挂载方法:
如果按照官方文档所说barrier_breaker的挂载方法反而比较麻烦一点点,本文采用挂载模式中链接的最新方法。

2 准备好U盘

目前U盘价格下降,10几元就能买到8G以上的,如果都作为系统盘来用过于浪费,所以建议将U盘分成3个区,1是用来挂载系统安装软件,1-2G足够了;2作为SWAP区,比如256M;3剩下的空间作为数据区,用来做aria2或离线迅雷的下载区。U盘需要事先在windows中可通过MiniTool Partition Wizard软件分成三个区,1、3区格式化为ext4格式,2区选择swap。

3 具体步骤

将U盘插入usb口,注意:720N需要将开关拨到3G模式,否则无法识别U盘。

3.1 安装exroot所需软件包

通过putty进入路由器,更新软件包列表

root@OpenWrt:~# opkg update

安装挂载U盘必须的包
官方建议安装kmod-usb-storage-extras。但没有足够的空间。有的教程提到安装e2fsprogs来格式化U盘,那选择的一定不是官方系统,因为空间不够。这里选择的是官方系统,所以需要事先格式化好U盘。

root@OpenWrt:~# opkg install opkg install block-mount kmod-fs-ext4 kmod-usb-storage
root@OpenWrt:~# reboot

3.2 查看u盘是否已经挂载

谢谢@huxin指出命令拼写错误。

root@OpenWrt:~# block info

/dev/mtdblock2: UUID="********-********-********-********" VERSION="4.0" TYPE="squashfs"
/dev/mtdblock3: TYPE="jffs2"
/dev/sda1: UUID="********-****-****-****-************" NAME="EXT_JOURNAL" VERSION="1.0" TYPE="ext4"
/dev/sda5: VERSION="2" TYPE="swap"
/dev/sda6: UUID="********-****-****-****-************" NAME="EXT_JOURNAL" VERSION="1.0" TYPE="ext4"

出现/dev/sda1下面的三行说明U盘已经挂载成功,挂载的U盘的三个区,sda1、sda5、sda6。

3.3 修改文件系统配置文件

root@OpenWrt:~# vi /etc/config/fstab

将option enabled ‘0’改为option enabled ‘1’,
将option target ‘/dev/sda1’改为option target ‘/overlay’,
按如下修改:

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 '********-****-****-****-************'
option enabled '1'

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

config 'mount'
option target '/mnt/sda6'
option uuid '********-****-****-****-************'
option enabled '1'

按ESC键,输入:wq,保存并退出编辑器。

3.4 复制/overlay到U盘

将/dev/sda1挂载到/mnt

root@OpenWrt:~# mount /dev/sda1 /mnt

将/overlay复制到/mnt

root@OpenWrt:~# tar -C /overlay -cvf - . | tar -C /mnt -xf -
root@OpenWrt:~# umount /mnt
root@OpenWrt:~# reboot

3.5 检查是否扩展到u盘成功

查看rootfs是否增加

root@OpenWrt:~# df

也可以在luci中system-mount points下查看rootfs的大小和挂载情况。

4 解决遗留问题

此时再次查看fstab

root@OpenWrt:~# vi /etc/config/fstab

可见fstab又恢复原始状态,同时在luci中system-mount points可见Mount Points和SWAP的未勾上。
此时再次按之前的改动方法修改fstab,

root@OpenWrt:~# vi /etc/config/fstab

保存重启。

进入luci界面可见Mount Points和SWAP处enabled的勾已启用,但是Mount Points 的Filesystem处是问号。

第一行是sda1运行的/overlay,点击后面的edit,在device 处选择/dev/sda1,filesystem选择之前格式化好的格式ext4,同时勾上use as root filesystem,Save & Apply,然后点击back to overview返回Mount points主界面。

第二行是数据盘/mnt/sda6,点击edit,在device 处选择/dev/sda6,filesystem选择格式ext4,
Save & Apply,保存应用即可。

现在就可以安装很多你想安装的东西了。