标签 openwrt 下的文章

文章更新

20190625 初次成文

写在前面

LXC (LinuX Contains) 是操作系统级别的虚拟化技术,它可以提供轻量级的虚拟化、以便隔离进程和资源。容器有效地将操作系统管理的资源划分到独立的组中,并把各个独立的组进行隔离,可以让各自的组占用独立的资源,完成自己独立的任务。

LXC 容器已经成为 OpenWrt 项目的一部分,简单来说,LXC 允许你在 OpenWrt 中运行多个不同的系统,比如 Ubuntu、CentOS、Alpine Linux 等。

如此一来,很多 OpenWrt 上跑不起来或者暂时未适配的应用现在就都能跑啦~

LXC 的 Luci APP 源码托管在:

https://github.com/openwrt/luci/tree/master/applications/luci-app-lxc

在小苏的“自编译 OpenWrt 固件”中也加入了 LXC 及其 Luci APP 的支持,但是在国内范围内介绍 OpenWrt LXC 特性的文章不是很多,而 LXC 自身又是极其强大的一个东西,所以值得 鸽子王 小苏特地写一篇文章来介绍~

以下小苏以自己编译的适用于树莓派的 OpenWrt 固件为例:

分区新建及格式化

在使用 LXC 容器之前,我们需要做一些准备工作。因为 LXC 容器的建立过程中需要从网络上下载模板资源(包含容器自身的 RootFS 以及一些配置文件)并解压到机身存储中,不论是在容器的建立还是容器的运行过程中都会占用大量存储空间(几十至数百兆)。而运行 OpenWrt 的设备的存储根分区往往不足以承载这些“大文件”,怎么办呢?最简单的方法就是将 U 盘插入运行 OpenWrt 的设备,将 LXC 容器涉及到的文件“转移到 U 盘中”。在这篇文章中,小苏使用以 SD 卡为存储介质的树莓派做演示,因为 SD 卡的总容量完全满足 LXC 对于存储空间的要求,所以不必使用 U 盘来“转移文件”。

默认情况下,写入小苏编译的 OpenWrt 固件的 SD 卡除了 50M 的引导分区和 500M 的根分区之外,剩余存储空间皆为“空闲空间”。

Partition Guru 分区详情

虽然总空间很大,但因为小苏编译的 OpenWrt 固件根分区只有 500M ,不满足运行 LXC 容器的需求,所以小苏需要将 SD 卡的“空闲空间”新建一个分区,接着把新建好的分区挂载到 LXC 容器所在目录,来他个“狸猫换太子”~

首先我们使用 fdisk命令查看 SD 卡目前的分区状况:

root@OpenWrt:~# fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 14.9 GiB, 15931539456 bytes, 31116288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5452574f

Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1 *      8192  110591  102400   50M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      114688 1138687 1024000  500M 83 Linux

分区情况与我们刚才在 Partition Guru 中看到的结果一致。另外我们需要记住设备的最后一个分区的终止扇区,在上面 fdisk返回的结果中,我们注意到最后一个分区是 mmcblk0p2,这个分区的终止扇区是 1138687。

接下来我们把 SD 卡的“空闲空间”利用起来,用 fdisk 命令在这部分空间上新建一个分区:

root@OpenWrt:~# fdisk /dev/mmcblk0 # 【进入 fdisk 分区工具】
Welcome to fdisk (util-linux 2.33).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n # 【输入 n 新建分区】
Partition type
   p   primary (2 primary, 0 extended, 2 free)
   e   extended (container for logical partitions)
   
   
Select (default p): p # 【输入 p 选择新建主分区】
Partition number (3,4, default 3): 3 #【输入 3 选择新建分区号为3的主分区】
First sector (2048-31116287, default 2048): 1140000 # 【下文会讲到】
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1140000-31116287, default 31116287):  # 【直接按回车】

Created a new partition 3 of type 'Linux' and of size 14.3 GiB.

Command (m for help): p # 【输入 p 打印当前分区信息,效果等同于 fdisk -l 命令】
Disk /dev/mmcblk0: 14.9 GiB, 15931539456 bytes, 31116288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5452574f

Device         Boot   Start      End  Sectors  Size Id Type
/dev/mmcblk0p1 *       8192   110591   102400   50M  c W95 FAT32 (LBA)
/dev/mmcblk0p2       114688  1138687  1024000  500M 83 Linux
/dev/mmcblk0p3      1140000 31116287 29976288 14.3G 83 Linux

Command (m for help): w # 【提交对分区表的修改】
The partition table has been altered.
Syncing disks.

在这一步中:

First sector (2048-31116287, default 2048): 1140000 

小苏输入了 1140000,这个数值需要根据之前最后一个分区的终止扇区来决定,理论上可以输入大于最后一个分区终止扇区(1138687)而小于存储设备的终止扇区(31116287)之间的任意数值,但是为了节省空间,小苏建议输入一个略大于最后一个分区终止扇区的值,在上文中小苏选择了 1140000,当然这个值是区间内任意的,哪怕输入 1138688 也可以~

接下来我们把新建的分区格式化为 ext4 格式:

root@OpenWrt:~# mkfs.ext4 /dev/mmcblk0p3 # 【使用 mkfs.ext4 命令格式化刚刚新建的分区】
mke2fs 1.44.3 (10-July-2018)
Discarding device blocks: done                            
Creating filesystem with 3747036 4k blocks and 938400 inodes
Filesystem UUID: e07a04f3-933c-4a37-9f23-ed98de55e1f0
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

如上信息出现时,代表分区格式化成功~

分区挂载及目录设定

接下来我们需要将刚刚格式化好的分区挂载到 LXC 相关目录上,在 OpenWrt 中,与 LXC 相关的目录都在 /srv文件夹下,如果根目录下没有这个文件夹,我们需要先新建(若文件夹已存在可忽略此步)。

mkdir /srv

接着将 SD 卡的第三分区挂载到 /srv下:

mount -v -t ext4 -o rw /dev/mmcblk0p3 /srv

/srv 目录下新建 lxc 文件夹:

mkdir /srv/lxc

至此准备工作完成~

镜像源设定

进入 OpenWrt 的控制面板,在 “服务 - LXC Containers”我们可以进入 LXC 容器的控制界面。之前小苏提到过新建容器过程中需要从网络下载大量数据,为了提高下载速度,我们可以把 “Containers URL” 中的软件源替换成清华大学的 “LXC Images” 源:

mirrors.tuna.tsinghua.edu.cn/lxc-images

更换镜像源

“保存&应用”之后,刷新界面等一两秒,在“Create New Container”处的 “Template”下拉框中便可以加载出可用的 LXC 模板。

容器新建

在“Create New Container”的“共享名”处填入你想要给容器起的名字,在“Template”处选择容器模板,点击右侧的“Create”按钮即可启动容器新建任务,以 Ubuntu Trusty 模板为例:

新建 LXC 容器

稍等片刻,大概 5 分钟左右的时间(视网络而定),在 “Available Containers”即可出现新建完成的容器。

容器新建成功

注意:

不是所有模板创建的容器都可成功运行!

目前测试成功的模板为:

Alpine Linux 全系列

CentOS (有一些小 Bug*)

Devuan ASCII

Ubuntu Trusty

*CentOS 容器启动后可能会遇到网络无法连接的问题,可以参照 这篇文章 解决。

存在问题的模板为:

ArchLinux:无法启动

Debian 全系列:高版本发行版无法启动,低版本发行版无法联网

Ubuntu 高版本(除 Trusty):无法启动

待测试:

Fedora、Gentoo、Kali

网络配置

依次点击“MORE - CONFIGURE”打开容器配置界面,注释此行:

lxc.net.0.type = empty # 注释此行

并且在在末尾添加以下内容:

lxc.net.0.type = veth
lxc.net.0.flags = up
lxc.net.0.link = br-lan
lxc.net.0.hwaddr = 26:06:06:94:e6:5b

# Init
lxc.init.cmd = /sbin/init

最后点击输入框右下角“CONFIRM”按钮提交(按钮不太显眼,可能需要向右拖动指示条)

LXC 容器网络配置

提交后输入框下方会有“LXC configuration updated”的提示。

启动容器

顾名思义,点击容器“状态指示灯”右侧的 “启动按钮”可以启动容器,启动后,指示灯会由红色转为绿色,代表容器启动成功。

接下来我们可以在 SSH 或者 TTYD 终端中输入以下命令进入容器:

lxc-attach -n 容器名称

root@OpenWrt:~# lxc-attach -n Ubuntu
root@Ubuntu:~# 

当命令指示符从root@OpenWrt: 变为 root@Ubuntu:时,代表我们成功进入容器。

除了使用 lxc-attach 的方式进入容器外,我们还可以使用 lxc-console的方式进入容器。这种进入方式更接近于实机交互,需要验证用户名和密码才可进入,所以在使用lxc-console前需要事先使用lxc-attach进入容器并设置一个用户密码。

lxc-console -n 容器名称 -t 1

其中,-t 参数后面的数字代表控制台编号,如果 -t 后跟随的数字是 1 ,那么命令执行后将会进入第一个控制台。进入控制台后,按下 Ctrl+a 后再按下 q 即可暂时离开控制台(而不退出),再次进入相同编号的控制台后可以恢复之前的会话,如果想要在终端中输入 Ctrl+a,那么按下两次 Ctrl+a 即可。

root@OpenWrt:~# lxc-console -n Ubuntu -t 1

Connected to tty 1
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself

Ubuntu 14.04.6 LTS Ubuntu tty1

Ubuntu login: root
Password: 
Welcome to Ubuntu 14.04.6 LTS (GNU/Linux 4.14.127 armv7l)

 * Documentation:  https://help.ubuntu.com/

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@Ubuntu:~#

启动容器后,我们可以在“状态 - 概况”中看到刚刚创建的容器名称:

容器 IP

这是因为,容器中系统的虚拟网卡可以直接从 OpenWrt 的 DHCP 服务器中获取 IP,也就是说,容器当前的网络状态和一台跑着 Linux 系统并且接入 OpenWrt 所在网络的真机没有什么两样。这样的好处在于,无需在 OpenWrt 与容器间建立复杂的端口映射(Docker:??),在内网下访问容器内的服务十分方便,而即使是在外网,也只需要再做一个简单的端口映射就可以。

其他设置

因为 SD 卡的第三分区是我们手动新建的,并且为了使 LXC 容器正常运行,第三分区需要挂载到指定挂载点,所以为了使 LXC 容器“可持续运行”,我们需要在设备启动时做些文章。

在“系统 - 启动项”本地启动脚本输入框中输入以下内容以实现 SD 卡第三分区开机自动挂载:

# Umount /dev/mmcblk0p3 from system generated mount point
umount /dev/mmcblk0p3

# Mount /dev/mmcblk0p3 to /srv
mount -v -t ext4 -o rw /dev/mmcblk0p3 /srv

同时因为 LXC 容器默认不会在开机时启动,所以我们还可以在开机挂载代码后输入以下内容实现容器开机启动:

lxc-start -n Ubuntu

其中,Ubuntu 为容器名称。

同时应该注意,所有代码应插入在 exit 0之前。

开机启动脚本

参考资料

【LEDE】x86 软路由之路 - 10 - 都能用 Docker 了,LXC 还远吗? - CSDN

https://blog.csdn.net/wang805447391/article/details/83542599

容器技术(一)LXC 安装及使用 - leon 的博客

https://blog.leonshadow.com/763482/774.html

文章更新

20190324 初次成文

写在前面

在上一篇文章中,小苏介绍了 OpenWrt 编译环境的搭建,源码的拉取,以及编译前的一些准备,对于编译前参数的选择,以及编译时可能遇到的问题虽然在上一篇文章中一笔带过,但实际上,这两部分才是 OpenWrt 编译过程中的重头戏,接下来小苏就以树莓派的 OpenWrt 编译过程为例,为大家详细说说这两部分的内容吧~

基本交互

在上一篇文章中,我们提到 make menuconfig 就是设定编译参数的命令,执行完这条命令之后,我们可以看到这样的一个交互窗口 (Dialog Box):

交互窗口

窗口中内容比较多,而且各种描述都是英文的,一脸懵逼怎么办...别着急,让小苏给大家慢慢解读:

在交互窗口中。按下“上下光标键”可以切换窗口中间的项目,选中项目将以蓝色高亮显示,按“左右光标键”可以切换窗口下方的 < Select > < Exit > < Help > < Save > < Load > 四个选项,“回车键”的功能就取决于这四个选项中的哪个被选中。比如,当前高亮项目是 “ Target System (Atheros AR7xxx/AR9xxx)”,如果窗口下方的 < Select > 被选中,那么此时回车键的作用就是进入 “ Target System (Atheros AR7xxx/AR9xxx)”这一项目的二级菜单,如果 < Exit > 被选中,那么回车键的作用就是退出交互或者返回上一级。

在一些选项中,我们还可能碰到类似这样的选项:

空格交互

在类似的菜单中,我们需要使用“空格键”来交互。在被蓝色高亮选中的项目上按下空格键,即可在 < >、< M >、< ✲ > 三种状态下切换,其中,< > 表示不编译此项目,< M > 表示此项目将被编译但不会集成到最终的固件中,< ✲ > 表示此项目既会被编译也会被集成到固件中,在编译过程中,我们一般会用到 < >、< ✲ > 这两项, < M > 项较少用到,但是在编译一些比较容易和其他程序冲突时的软件包时,我们可以酌情选择 < M > 项,虽然编译完成后的固件不会默认集成这个软件包,但是在后期我们可以在编译完成目录找到这个软件包自行安装。

那么,什么时候该用“回车”交互,什么时候该用“空格”交互呢?

小苏告诉大家一个小窍门,项目末尾带有 ---> 的项目都可以使用回车交互,项目开头带有 < > 的项目都可以使用 空格交互,如果一个项目即带有 ---> 又带有 < >,那这个项目既可以使用回车 (进入下一级菜单) 交互也可以使用空格 (选择是否被编译) 交互。

如果一些选项前面是 -✲- 这个样子的,且我们无法更改它的状态,说明这一项是其他项目的依赖项,需要把依赖此项的项目设为取消编译 (即 < > 状态) 后 -✲- 状态才会更改为 < > 状态。

参数选择(32位&IPV4)

好了~掌握了基本交互操作后我们便可进入重头戏“参数选择”了~

在接下来的文章中,小苏将以编译 32 位、IPV4 Only 的树莓派 OpenWrt 固件为例为大家详细解读编译过程中涉及到的参数,64 位/ IPV4+IPV6 的固件编译参数与 32位、IPV4 Only 固件大同小异,将会在之后说明。此外因为编译参数较多,小苏将只为大家介绍日常用得到并且已经体现在之前发布的固件中的一些参数,下文中没有提到的部分建议保持默认设置,以下不再赘述~

以下内容只保证使用于树莓派的 OpenWrt 编译过程,不 100% 保证适用于其他设备和情况,但大部分内容应该对其他设备有参考意义。同时小苏也无法回答除树莓派外的其他设备上出现的特有问题 (因为实在是没有其他设备...)。

Target System & Profile

在设置编译参数时,第一件事情是选择 CPU 平台、CPU 和设备,以 32 位树莓派固件为例 (其他设备的 CPU 平台及型号请自行查阅相应资料):

Target System = Broadcom BCM27xx # 选择 CPU 平台
Subtarget = BCM2709/BCM2710 32 bit based boards # 选择 CPU
Target Profile = Raspberry Pi 2B/3B/3B+/3CM # 选择设备

设备选择

Target Images

Target Images 项为固件镜像选项菜单,按 “回车键”进入:

ext4 = ✲
squashfs = ✲
ext4 和 squashfs 两项为编译生成的镜像中固件分区的文件系统格式,这两者的区别除了文件系统不一致之外,还有一个区别就是 squashfs 格式的固件支持在控制面板内恢复出厂设置,而 ext4 格式暂时不支持,此外 ext4 格式的固件在分区上的自由度上大一些 (比如可以比较方便地调整分区大小等)。

Boot (SD Card) filesystem partition size = 20
此项为镜像中 boot 分区的大小 (将固件刷入 SD 卡,在 Windows 自带的文件资源管理器中看到的盘符就是这个分区),默认的 20M 基本够用,无需更改。

Root filesystem partition size = 500
此项为镜像中 root 分区的大小,因为树莓派的存储介质为 SD 卡,其存储容量相对于路由器等 ROM 大小固定的设备来说要大得多,所以我们可以尽量将 root 分区设定得大一些 (方便折腾),小苏的习惯是将 root 分区的分区大小设定为 500M,仅供参考。

除以上几项外,其他参数保持默认,效果如下:

镜像参数

Administration

Administration 菜单下的项目都是一些管理工具,在这个菜单中小苏觉得比较实用的工具是 htop,其他的工具好像平时不怎么用得到 (欢迎指出)~

Administration

Extra packages

Extra packages 项为 Lean 大为了方便大家配置某些功能而添加的一个贴心功能,选中其中的某个功能相当于选中了一系列软件包和编译参数。

automount = ✲
自动挂载,插入 USB 存储设备时,若文件系统支持,则可以自动挂载设备上的分区至设备。

Support NTFS mount = ✲
此项为 automount 是否支持 NTFS 文件系统的可选项。

autosamba = null
自动挂载 Samba 设备,在树莓派设备上启用此项可能导致板载无线网卡工作不正常,所以请谨慎选用!!

ipv6helper = null
是否加入 IPV6 支持 (因为目前以 IPV4 Only 固件为例介绍,所以目前暂时不勾选这个选项)。

k3wifi = null
此项为针对斐讯 K3 无线方面的一些设定集合,本文暂不涉及。

Extra packages

Kernel modules

Kernel modules 菜单中为有关内核的一些参数,包括即将要介绍的文件系统支持,有线网卡支持,无线网卡支持等。

Filesystems

Kernel modules - Filesystems 此项为文件系统支持选项,在这个菜单中你可以选择固件支持的文件系统,以下为小苏推荐添加支持的文件系统:

kmod-fs-exfat = ✲
kmod-fs-exportfs = ✲
kmod-fs-ext4 = ✲
kmod-fs-f2fs = ✲
kmod-fs-nfs = ✲
kmod-fs-nfs-common = ✲
kmod-fs-nfs-common-rpcsec = ✲
kmod-fs-nfs-v3 = ✲
kmod-fs-nfs-v4 = ✲
kmod-fs-nfsd = ✲
kmod-fs-ntfs = ✲
kmod-fs-squashfs = ✲
kmod-fs-vfat = ✲
kmod-fuse = ✲

Filesystems

USB Support

Kernel modules - USB Support 为针对 USB 接口的一些配置选项,在这里我们要设定的关键点就是为 USB 有线网卡添加驱动。

以下 将所有以 kmod-usb 开头的项目的状态设为 < * > ,这一操作将为列表中所有 USB 有线网卡添加驱动:

kmod-usb-net = ✲
kmod-usb-net-asix = ✲
kmod-usb-net-asix-ax88179 = ✲
···
kmod-usb-net-smsc95xx = ✲
kmod-usb-net-sr9700 = ✲

接下来为 USB2 和 USB3 控制器添加驱动:

kmod-usb2 = ✲
kmod-usb3 = ✲

USB Support

Wireless Drivers

Kernel modules - Wireless Drivers 为无线网卡支持选项,在这个菜单中我们可以为无线网卡添加驱动支持,按小苏上面的习惯应该为全部无线网卡芯片添加支持,但是偏偏是在这里,坑出现了:

在无线网卡支持菜单中,某些无线网卡项目不能同时选中,因为在把驱动打包成 ipk 软件包的过程中,这些产生冲突的驱动包将会使用同一个包名,在将软件包安装到系统的过程中这些同名软件包将会产生冲突而导致编译中断。

经过小苏的不断努力,终于找到了这些可能会产生冲突的软件包,所以在添加无线网卡驱动的过程中,小苏建议将这些无线网卡芯片项目的状态设为 < M >,以便需要时可以自行安装相应的软件包。

kmod-libertas-sdio = M
kmod-libertas-spi = M
kmod-libertas-usb = M

kmod-rsi91x-sdio = M
kmod-rsi91x-usb = M

除此之外的其他无线网卡项目都应设置为 < ✲ >,这将为列表中除上面 5 个无线网卡芯片之外的所有无线网卡芯片设备添加驱动。

Wireless Drivers

LuCI

接下来就进入编译过程中的重中之重 - LuCI APP 的选择和添加~

LuCI 即为 OpenWrt 控制面板中的 Web 控制面板, 选择和添加 LuCI APP 将把对应 APP 的二进制可执行文件和其对应的 Web 控制面板页面添加到 LuCI 控制面板中。

Applications

LuCI - Applications 菜单即为 LuCI APP 集合,此菜单中的项目即为 LuCI 控制面板中各种各样的功能。

由于选项较多,下面仅列出一些常用的选项:

luci-app-accesscontrol # 访问时间控制
luci-app-adblock # adblock 广告过滤
luci-app-adbyby-plus # 广告屏蔽大师 Plus +
luci-app-advanced-reboot # 高级重启
luci-app-aliddns # 阿里 DDNS 客户端
luci-app-amule # aMule 下载工具
luci-app-aria2 # Aria2 下载工具
luci-app-arpbind # IP/MAC 绑定
luci-app-autoreboot # 支持计划重启
luci-app-commands # Shell 命令模块
luci-app-cshark # CloudShark 捕获工具
luci-app-ddns # 动态域名 DNS
luci-app-dnspod # DNSPod
luci-app-filetransfer # 文件传输
luci-app-firewall # 防火墙支持
luci-app-flowoffload # Turbo ACC FLOW 转发加速
luci-app-frpc # 内网穿透 Frp
luci-app-guest-wifi # WiFi 访客网络
luci-app-hd-idle # 硬盘休眠
luci-app-minidlna # minidlan 服务器
luci-app-mjpg-streamer # 兼容 Linux-UVC 的摄像头程序
luci-app-mwan # MWAN 负载均衡
luci-app-mwan3helper # MWAN3 分流助手
luci-app-n2n_v2 # N2N 内网穿透 VPN
luci-app-nlbwmon # 网络带宽监视器
luci-app-ntpc # NTP 时间同步服务器
luci-app-openvpn # OpenVPN 客户端
luci-app-openvpn-server # OpenVPN 服务器
luci-app-pptp-server # PPTP VPN 服务器
luci-app-ramfree # 释放内存
luci-app-samba # 网络共享 (Samba)
luci-app-samba4 # 网络共享 (Samba4)
luci-app-shadowsocks-libev # SS-libev 服务端
luci-app-shairplay # AirPlay 支持
luci-app-sqm # 流量智能队列管理 (QOS)

luci-app-SSR-plus # SSR/SS/V2Ray 三合一用户界面
Include Shadowsocks New Version # 选择在 SSR-Plus 中是否包含新版 SS 代理
Include V2ray # 选择是否包含 V2Ray 代理
Include Kcptun # 选择是否支持 Kcptun
Include ShadowsocksR Server # 选择是否包含 SSR 服务器
Include ShadowsocksR Socks and Tunnel #选择是否包含 SSR Tunnel

luci-app-ssrserver-python #SSR Python 服务器
luci-app-statistics # 流量监控工具
luci-app-syncdial # 多线多拨
luci-app-transmission # Transmission BT 下载工具
luci-app-ttyd # TTYD 终端命令行
luci-app-upnp # UPnP 服务
luci-app-usb-printer # USB 打印服务器
luci-app-v2ray-pro # V2Ray 代理
luci-app-vlmcsd # KMS 服务器设置
luci-app-vnstat # vnStat 网络监控 (图表)
luci-app-vsftpd # FTP 服务器
luci-app-watchcat # 断网检测与定时重启
luci-app-webadmin # Web 管理页面设置
luci-app-wifischedule # WiFi 计划
luci-app-wireguard # WireGuard 状态
luci-app-wol # Wake on Lan 网络唤醒
luci-app-wrtbwmon # 实时流量监测
luci-app-xlnetacc # 迅雷快鸟
luci-app-zerotier # ZeroTier 内网穿透

其中, luci-app-samba 与luci-app-samba4 两个选项只可选择其中的一项,如果两项都被选中,编译时会因为这两项包名相同而产生冲突造成中断!!

luci-app-v2ray-pro 集成到固件后为默认打开状态,但因为默认情况下未添加任何节点,可能造成极少数网站无法正常打开的情况 (如 阿里云 等),需要手动关闭 V2Ray 开关才可恢复正常~

大家可以根据自身需求添加上面的 LuCI APP 到固件中,如果想了解此菜单中的其他 LUCI APP 的作用可以查看这篇帖子 (感谢作者的努力~):

https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=344825

Applications

Themes

LuCI - Themes 菜单中可以为 LuCI 控制面板添加主题。Lean 大源码中默认为我们添加了一套 Material 主题,在此菜单选择此主题后控制面板将默认启用此主题,如果你不喜欢这个主题,也可以使用默认的 Bootstrap 主题 (默认已选择)。

Themes

Network

Network 菜单为 OpenWrt 编译过程中和网络有关的选项。

Network

Download Manager

Network - Download Manager 菜单为 Aria2 的 Web 控制面板,在这里小苏推荐选择 webui-aria2 项作为 Aria2 的 Web 控制面板。

Download Manager

File Transfer

Network - File Transfer 为网络文件传输工具菜单。在这里我们可以添加一些常用的文件传输工具,比如 wget、curl、aria2、rsync 等,我们可以根据需求按需添加。在这里我们还可以设置 aria2 的支持参数 (Network - File Transfer - Aria2 Configuration)

File Transfer

Aria2 Configuration

SSH

Network - SSH 菜单为与 SSH 有关的选项,默认情况下 OpenWrt 已为我们添加了 dropbear SSH 服务器,所以在这里我们无需勾选 openssh-server,但默认情况下 SFTP 服务是没有启用的,如果有 SFTP 需求的话我们可以在这里添加 openssh-sftp-client 和 openssh-sftp-server 来启用 SFTP 客户端和服务器。

SSH

Utilities

Utilities 菜单包含一些额外的实用工具,下文中小苏仅介绍一些常用工具,其他工具可按需添加。

Utilities

Compression

Utilities - Compression 为压缩工具支持菜单,小苏推荐添加以下压缩工具支持:

bsdtar # tar 打包工具支持
gzip # gzip 压缩工具支持
unzip # zip 解压工具支持
zip # zip 压缩工具支持

Compression

Disc

Utilities - Disc 菜单为一些与文件系统相关的工具,小苏推荐添加以下工具:

fdisk # fdisk MBR 分区工具
gdisk # gdisk GBT 分区工具
lsblk # lsblk 磁盘设备及分区查看工具

Disc

Editors

Utilities - Editors 为编辑器支持菜单,小苏推荐添加 nano 和 vim 编辑器。

注意:在 vim 编辑器系列中只建议添加 vim、vim-full、vim-fuller 三种工具中的一种,否则在编译过程中会因为包名相同产生冲突造成编译中断。

Editors

Filesystem

Utilities - Filesystem 菜单为与文件系统相关的工具,小苏推荐添加:

f2fs-tools # f2fs 工具
fstrim # 文件系统 fstrim 工具
resize2fs # ext 分区大小调节工具

Filesystem

Shells

Utilities - Shells 菜单中可以添加用户交互 Shell,默认 Shell 为 bash,如果大家有需求的话可以添加 zsh。

Shells

Terminal

Utilities - Terminal 菜单中可以添加和终端有关的工具,小苏推荐添加 screen 和 tmux ,这里就不解释啦~

Terminal

另外在 Utilities 菜单下面还有一些可能比较常用的小工具比如 adb、whereis 等,可以按需添加~

参数选择(IPV6)

若为固件添加 IPV6 支持,按上面 IPV4 固件的步骤操作完成后,还需要进行以下几项:

ipv6helper

在 Extra packages 菜单中将 ipv6helper 设为 < ✲ > 状态:

ipv6helper

ip6tables 额外选项(可选)

在 Network - Firewall - ip6tables 下启用 ip6tables-extra 和 ip6tables-mod-nat 项:

ip6tables

LuCI APP 额外设置

已知多线多拨、负载均衡、mwan3分流助手 这三个 LuCI APP 与 IPV6 网络存在冲突,为固件添加 IPV6 支持时必须取消编译这三个 LuCI APP。

在 LuCI - Applications 中 先后 取消以下项目:

luci-app-syncdial = null
luci-app-mwan3helper = null
luci-app-mwan3 = null

由于luci-app-mwan3 是 luci-app-syncdial 和 luci-app-mwan3helper 这两个软件包的依赖项,所以应该先取消掉这两个选项后才可取消 luci-app-mwan3。

LuCI APP 额外设置

参数选择(64位)

在第一部分中我们介绍的是 32 位固件 (适用于树莓派 2B/3B/3B+) 的编译选项,如果你想编译树莓派 64 位固件 (适用于 树莓派 3B/3B+),可以按上面 32 位固件步骤操作完成后,额外更改以下几项:

更改 CPU 和设备参数

将 Subtarget 和 Target Profile 更改为适用于 64 位树莓派的参数 (因为 CPU 平台相同,Target System 无需更改):

Subtarget = BCM2710 64 bit based boards
Target Profile = Raspberry Pi 3B/3B+

更改CPU和设备参数

取消 Kcptun 支持

因为 Kcptun 官方暂时没有适配于 64 位设备 (arm64/aarch64) 的软件包,如果编译 64 位设备固件时勾选 Kcptun 将会导致编译过程中无法找到相应的软件包而报错,从而导致编译中断,所以在编译 64 位固件之前我们需要取消对 Kcptun 的支持:

LuCI APP 设置

首先我们应该取消在 luci-app-ssr-plus 中对 Kcptun 的支持:

在 LuCI - Applications - luci-app-ssr-plus 中取消选择 Include Kcptun:

取消编译

取消 Include Kcptun 还不够,我们还需要在 Network 中取消对 Kcptun 的编译:

kcptun = null

注意一定要设为 null 不要 设为 < M >!!

取消编译

结束配置

至此,编译参数部分介绍完毕,设定完所有参数后,返回到主菜单,按下“左右光标键”,将光标移动到 “Exit ”按钮上按下回车,将弹出退出提示框,询问是否保存当前设置,如果想要保存当前设置请使用左右光标键选择 “Yes”并回车,如果想放弃此次更改请选择 “No”并回车。如果误点击退出按钮出现此提示框,双击两次 “ESC”键即可回到设置界面。

结束配置

结束配置后,此次配置信息将存储在 lede 目录下的 .config 文件中,如果在进行保存编译配置后之后再次执行 make menuconfig 命令,系统将会自动载入 .config 文件中的内容,你可以在上次保存的编译配置上进行更改。如果丢失此文件,所有配置将会丢失并重置,所以请务必妥善保存此文件。

至此,编译配置部分到此结束,下篇文章中,我们聊聊编译过程中遇到的问题~

文章更新

20190323 初次成文

写在前面

很久之前就打算写一篇有关 OpenWrt 编译的教程,结果因为自己的原因,这篇教程从 2018 年拖(咕)到了 2019 年 3 月 (也就是说这算一篇跨年教程了?),趁着论文前的这段空档时间,再不抓紧时间把之前挖过的坑填上的话以后就有可能咕更久了,于是就有了这篇教程~

在之前的文章中小苏有提到过 “我的编译教程要比别人的更简单”,为了“让编译更简单”,在这篇教程中小苏将会使用打包好的 Docker 镜像作为 OpenWrt 的编译环境,并且会将编译过程中需要下载的众多源码和依赖包单独提供出来,尽量减少大家编译时漂洋过海下载源码包的麻烦。

特别说明:本文中提供的 dl.tar.gz (下文中会提及) 不保证 100% 适用于除树莓派外的其他情况和设备,除此之外的内容应该适用于其他大部分设备。

前期准备

在这篇教程中,为了成功搭建 OpenWrt 编译环境,你需要准备:
系统为 Linux 或 macOS 的 PC 或 Server 设备(需要支持安装 Docker);
科学上网环境(最好部署到路由器上)。
挂载目录所在分区剩余空间应大于 50G 。

搭建环境

在接下来的操作中,假定你已经安装并配置好 Linux 系统、 Docker 环境,Docker 环境的一系列安装和配置步骤(包括但不限于配置 Docker 加速器,加入 sudo 用户组)可以从 Docker - 从入门到实践 项目中找到~

配置好 Docker 环境及加速器后,在终端中执行:

docker --version

若可以正确返回类似如下的 Docker 的版本信息即为安装成功~

Docker version 18.06.3-ce, build d7080c1

安装和配置好 Docker 环境之后,我们需要拉取编译所需的 Docker 镜像。这里的 Docker 镜像是小苏通过 Dockerfile 构建的,镜像中包含 OpenWrt 编译所需的所有依赖环境和一些常用工具,除此之外镜像中还配置好了 zsh,oh-my-zsh,以及一系列 zsh 插件 (git / sudo / zsh-syntax-highlighting / zsh-autosuggestions),可以说是开箱即用的一个 Docker 镜像。

因为镜像基于 Ubuntu 14.04 构建,所以小苏在 “前期准备”一节中并没有规定需要安装某种指定的 Linux 发行版,所以不论你的机器上安装了哪种 Linux 发行版,在 OpenWrt 编译的整个过程始终在容器内的 Ubuntu 14.04 中进行,这样的好处是可以保持编译环境的高度一致性,基本上杜绝了因编译环境不同导致的编译失败的情况,同时也可以省去大家对编译环境的配置,有助于提高效率和编译成功率~

关于此镜像的更多信息:
Dockerfile :
https://github.com/SuLingGG/openwrtenv
Docker Hub:
https://hub.docker.com/r/sulinggg/openwrtenv

好了,不自卖自夸了,我们需要执行以下命令拉取编译所需的 Docker 镜像:

docker pull sulinggg/openwrtenv

镜像拉取过程中为分层拉取,拉取完成后可以看到类似如下信息:

Using default tag: latest
latest: Pulling from sulinggg/openwrtenv
e082d4499130: Pull complete 
371450624c9e: Pull complete 
c8a555b3a57c: Pull complete 
1456d810d42e: Pull complete 
4ce8c7c9791d: Pull complete 
cfbcf6e48aaf: Pull complete 
Digest: sha256:13c93c3895421d8f70f3c39f9403c6c7299601b190351aedf81e9190e059f73c
Status: Downloaded newer image for sulinggg/openwrtenv:latest

接下来我们需要在主机上新建一个目录作为编译过程中的挂载目录:

mkdir ~/workspace

接下来我们使用刚刚拉取的镜像建立一个名为 openwrtenv 的容器:

docker run -itd -v ~/workspace:/home/admin/workspace --name openwrtenv sulinggg/openwrtenv

其中:
-v ~/workspace:/home/admin/workspace 表示将刚刚建立的文件夹 ~/workspace 挂载到容器中的 /home/admin/workspace 文件夹中(若容器中此文件夹不存在则会递归新建);
--name openwrtenv 表示新建的容器名为 openwrtenv;
sulinggg/openwrtenv表示将使用 sulinggg/openwrtenv 镜像创建容器。

命令执行完毕后,返回结果中如果只返回容器的 sha256 值则说明容器创建成功。

接下来我们执行以下命令进入容器:

docker exec -it openwrtenv zsh

其中:
openwrtenv为容器名称;
zsh为此次执行的容器中的命令,一般情况下选用 bashsh,但因为小苏在镜像中已经配置好了 zsh,所以可以直接选用 zsh

执行后我们将会看到类似的提示:

# root @ 6883dad1f91e in / [18:58:25] 
$ 

此时当前用户为默认的 root 用户,而 OpenWrt 不能使用 root 用户编译,针对这种情况,小苏在镜像中建立并配置了普通用户 admin,接下来我们需要把刚刚挂载到容器的 workspace 文件夹的所有者改为 admin 以使 admin 用户可以正常读写此目录 (感谢评论区 :) 的指出):

chown -R admin:admin /home/admin/workspace

完成 workspace 文件夹的所有者更改后,我们执行命令切换用户为 admin:

su admin

此时我们便切换到了普通用户 admin:

# admin @ 6883dad1f91e in / [18:58:50] 
$ 

接下来我们切换目录为普通用户 admin 的 home 目录,看看下面有什么东西:

cd ~ && ls

我们可以看到 admin 用户的 home 目录下 (/home/admin) 存在一个 workspace 文件夹,这个文件夹就是我们挂载到容器中的挂载文件夹,即主机下的 ~/workspace 文件夹,主机中的这个文件夹中的内容将与容器中的 /home/admin/workspace 文件夹保持同步,即容器中文件夹中的内容改变情况会同步到主机,主机中的内容改变情况也会同步到容器。
之后的编译工作就在 workspace 文件夹中进行。

编译准备

环境已经搭建完毕,接下来进入编译前的准备阶段。(从现在开始应该保持全程科学上网状态)

首先我们切换到容器内的 workspace 文件夹并且把 Lean 大的 OpenWrt 仓库克隆到本地:

cd ~/workspace && git clone https://github.com/coolsnowwolf/lede

除了编译所需的环境镜像之外,小苏还为大家提供了编译过程中需要的一些依赖和源码包,并将它们打包成了一个文件,将文件解包到指定目录后,在编译过程中就不需要漂洋过海去下载了:

注:此文件 (dl.tar.gz) 不保证 100% 适用于除树莓派外的其他情况和设备

cd ~/workspace/lede && wget http://netdisk.club/DockerRes/BuildRes/dl.tar.gz

如果上面的链接下载速度慢的话,也可以试试这个,但下载文件时必须处于科学上网环境下,否则此文件无法下载成功:

cd ~/workspace/lede && wget https://image.moeclub.org/GoogleDrive/1DnECAO7PDL_lR-9kneyLshM7unwr_6Ma -O dl.tar.gz

下载完成后解压:

tar -zxvf dl.tar.gz

接下来安装和更新必要的软件包:

./scripts/feeds update -a
./scripts/feeds install -a

测试编译环境:

make defconfig

配置固件菜单:

make menuconfig

在“配置固件菜单”这一步内中,我们需要选择编译对象设备的 CPU 平台、CPU 型号、固件格式、固件分区大小、包含的软件包以及其它选项。

开始编译:

make V=99 -j1

编译所用时间与设备硬件性能,添加的软件包多少,CPU 线程数有关。

编译完成后的固件、ipk 软件包及其他资料将存放到 OpwnWrt 项目仓库的 bin 文件下,如果你严格按照本文教程操作,编译完成后的一系列文件将存放在容器的 /home/admin/workspace/lede/bin 文件夹下,同时因为我们使用了挂载目录的原因,这些文件也会永久存放在到主机的 ~/workspace/lede/bin 文件下。

至此,OpenWrt 编译教程的第一部分就结束了,在下一篇 “完全指南” 中,小苏将重点讲讲 make menuconfigmake V=99 -j1 这两项,同时,这两项也是编译过程中的重头戏。
另外,除本文提到的 dl.tar.gz 文件外,此教程的大部分内容应该适用于绝大多数情况和设备。

更多编译细节,请看下一篇~

参考资料

OpenWrt By Lean · coolsnowwolf/lede - GitHub:
https://github.com/coolsnowwolf/lede

OpenWrt Project Document - The build system:
https://openwrt.org/docs/guide-developer/build-system/start

OpenWrt Environment · SuLingGG/openwrt - GitHub:
https://github.com/SuLingGG/openwrtenv

SuLingGG/openwrtenv - Docker Hub:
https://hub.docker.com/r/sulinggg/openwrtenv

Docker 从入门到实践 · yeasy/docker_practice - GitHub:
https://github.com/yeasy/docker_practice

从零开始编译OpenWRT/LEDE固件 - GXNAS博客:
https://wp.gxnas.com/2367.html

文章更新

20190107 初次成文(第一版)
20190305 更新固件 更新和优化了树状功能图(文章底部) 并做一些补充说明
20190306 加入 IPV6 支持(实验性)(第二版)
20190317 正式支持 IPV6 并添加 IPV6 使用说明,增加64位固件,并做固件升级说明(第三版)
20190321 修复重启后板载网卡不工作的问题,增加了若干功能(第四版)
20190416 暂停 64 位固件更新,日常跟进更新并再做一些补充说明(第五版)
20190521 日常跟进更新(第六版)
20190620 日常跟进更新(第七版)

写在前面

OpenWrt 是适合于嵌入式设备的一个 Linux 发行版,今天小苏为大家带来的是自己编译的 OpenWrt 固件,为了满足大家的各种需求,小苏为大家提供两种固件,其中 IPV4 Only 固件适用于 不需要连通 IPV6 网络的情况(如果你没有连通 IPV6 的需求,IPV4 Only 固件也是小苏的推荐选择),IPV4+IPV6 固件适用于需要连通 IPV6 网络的使用情况。

固件仅支持树莓派 2B/3B/3B+,不支持上述树莓派型号以外的其他设备;
包括但不限于 x86 平台、斐讯 N1、OrangePi、NanoPi、Newifi 等设备。
(换句话说除了树莓派以外的其他设备都不支持,望周知)

编译 OpenWrt 采用的源码来自 Lean 大的 Openwrt 项目:

https://github.com/coolsnowwolf/lede

在此特别感谢 Lean 大~

固件更新日志

第七版固件更新日志

固件版本更新: R9.5.6 -> R9.6.19 ;
Linux 内核更新: 4.14.118 -> 4.14.127;
以下是源码更新主要内容:
新增软件包 解锁网易云灰色歌曲、天翼家庭云/天翼云盘提速、V2ray 服务器;

第六版固件更新日志

固件版本更新: R9.4.6 -> R9.5.6 ;
Linux 内核更新: 4.14.111 -> 4.14.118;
以下是源码更新主要内容:
加入 HAProxy 实现对 SSR 的负载均衡和高可用;
为 ShandowsocksR Plus+ 加入 V2ray 订阅;
加入可道云支持;
在以后的版本中 ShandowsocksR Plus+ 不会受到影响。

第五版固件更新日志

固件版本更新: R9.3.17 -> R9.4.6 ;
Linux 内核更新: 4.14.104 -> 4.14.111;
[实验性] 加入 MentoHUST (锐捷校园网拨号客户端) 及 luci-app-mentohust (MentoHUST 控制面板) 支持,因为小苏这边没有校园网网络环境,所以请大家帮忙测试~
[实验性] 加入 LXC 容器支持 (建议科学上网使用);
加入更多小工具( file grep htop lrzsz lsusb lscpu mc tree whereis 等);
因 64 位版本固件问题较多,暂停 64 位版本更新,敬请谅解。

第四版固件更新日志

紧急修复了由于 autosamba 导致的重启后板载网卡不工作的问题;
加入了open-ssh-serverNFS文件系统支持,添加了遗漏的 fdisk ;
实验性增加了博通的 debug 无线驱动 (不知道有没有用);
固件进一步细分,将固件分为 IPV4 Only 和 IPV4+IPV6 两类,如果对连通 IPV6 有要求,可以直接选择 IPV4+IPV6 固件(但需要进一步设置),当然,如果你对 IPV6 没有需求,强烈推荐选择 IPV4 Only 固件;
由于冲突的原因,此次编译了 V2ray Pro 但未集成进固件内,可以在 “Packages (ipk)” 文件夹找到所有软件包的 ipk 压缩包解压后搜索 luci-app-v2ray-pro_1.0-11_all.ipk自行安装;
3B 上安装 64 位固件依然会存在 CPU 负载高,网络性能变差的问题,所以如果你的设备是 3B,尽量还是选择 32 位固件。但目前 在 3B+ 上好像没有这些问题
此次编译好像漏掉了 htop ,下次补上吧~

第三版固件更新日志

由 2019.03.17 再次拉取 Lean 大最新源码进行编译,发布第三版固件:
固件版本更新: R9.2.14 -> R9.3.17;
Linux 内核更新: 4.14.103 ->4.14.104 ;
新增 aarch64 架构 (64 位) 固件,但目前发现 64 位固件在 3B 上工作不稳定,如 CPU 负载异常增高,网络性能变差等,请谨慎刷入。原 arm 架构固件在树莓派 3B / 3B+ 设备上仍然适用。
应大家要求加回 wachcat 功能 ;
新增 sysupgrade 格式升级专用固件,降低升级成本 (详见下文)。

第二版固件更新日志

由 2019.03.05 拉取 Lean 大最新源码进行编译,发布第二版固件,更新内容如下:
(我只负责拉取源码 & 编译发布,不负责固件开发,固件更新内容与 OpenWrt 项目和 Lean 大项目有关)
固件版本更新: R9.1.1 -> R9.2.14;
Linux 内核更新: 4.14.90 -> 4.14.103;
为提高稳定性和兼容性砍掉了一些基本不用的功能,常用功能不受影响 (文章底部的树状功能图为最新版固件带有的功能);
重磅: 尽最大程度加入了若干无线网卡支持,目前 OpenWrt 源码中支持的 95% 的无线网卡,90% 的无线网卡应该无需单独安装驱动;
[实验性] 支持 IPV6 (固件文件名前带有 [IPV6] 标识),感谢评论区 @wgedu实验性增加 ip6tables & ip6tables_mod_nat 特性。

补充说明(重要):

目前已经可以确定固件在 RaspberryPi 3B+ 设备上基本运行正常,但是在 3B+ 设备上会出现树莓派的板载 WIFI 网卡在 2.4Ghz 频段下无法工作在 N 模式的 Bug ,(2.4Ghz 频段下的 Legacy 模式与 5GHz 频段下没有这个问题)。感谢评论区 :) 的测试反馈~
在设置树莓派 3B+ 的板载无线网卡时,请优先设置 radio0 接口,在设置树莓派 3B 的板载无线网卡时,请优先设置 radio2 接口(点此跳转详情)。

从第四版固件开始,文件夹名为 “IPV4+IPV6”内固件已支持连通 IPV6,但默认情况下,需要做一些设置才可正常连通 IPV6 网络 (点此跳转详情)。如果你不需要接入 IPV6,强烈建议选择文件夹 “IPV4 Only” 内只支持 IPV4 的固件。
同时,因为与 IPV6 网络存在冲突的原因,支持 IPV6 的固件中未集成 “负载均衡”“多线多拨”“mwan3 分流助手”这些功能,IPV4 Only 固件默认集成这些功能,不受影响。

如果你想从我编译的旧版固件升级到新版固件,可以直接在 Luci 控制面板中刷入 sysupgrade 格式固件,此操作可仅升级系统分区(需打钩“保留配置”),用户数据不受影响 (点此跳转详情)。

从第三版开始新增适配于树莓派 3B / 3B+ 设备的 64 位固件,但此 64 位固件在 “系统 - 概览”中存在显示 Bug,表现为 “架构”项显示为 “?”,大家可以在 SSH 或者 TTYD 终端中使用 uname -a命令查看固件的真实架构。
64 位固件中 Adbyby Plus + 无法正常运行。
64 位固件目前暂时不支持 kcptun,原因是 kcptun 目前暂无适配于 aarch64 架构的官方编译版本。详见:https://github.com/coolsnowwolf/lede/issues/1107

OpenWrt 编译教程会出的,并且我的教程要比别人的教程简单哦(敬请期待)~

固件说明

由于树莓派的性能要比普通的路由器高很多,并且树莓派采用 SD 卡作为存储介质,所以在编译时不必过多考虑固件大小及插件对设备造成的影响 ,为了更有效地利用树莓派“优秀”的硬件性能(当然是相对于普通路由器而言),小苏在编译时采用了比较“激进”的方式:尽可能编译“更多”插件以满足使用者各种各样的需求。

同时默认支持板载网卡,如果插入网卡后出现不兼容的情况(在“网络 - 接口 - 添加新接口”界面没有出现新网卡)请自行谷歌并安装适用于此网卡的驱动(前提是此网卡有驱动,小苏的绿联有线网卡,芯片 AX88772 完美支持)。

为了方便使用者配置和使用,固件在编译时加入了一些常用工具,比如 adb, bzip, gzip, htop, nano, resize2fs, tmux, unzip, vim,固件原生支持 exfat, ext4, f2fs, fat32, ntfs, squashfs, fuse 等文件系统。并且加入了 automount 支持,即外部可存储设备插入 USB 接口时,若文件系统支持,可以自动挂载设备。

为了满足使用者的各种需求,小苏为大家提供了两种格式的固件:ext4 格式和 squashfs 格式。这两种固件的区别是,ext4 格式的固件更适合熟悉 Linux 系统的用户使用,可以比较方便地调整 ext4 分区的大小,而 squashfs 格式的固件适用于“不折腾”的用户,其优点是可以比较方便地进行系统还原(你没听错,在控制面板里面点击一下“恢复出厂设置”按钮就可以回到刚刷入固件时的状态了,就像长按路由器后面的 Reset 按钮的效果一样),哪怕你一不小心玩坏固件,只要还能进入控制面板,就可以很方便地进行“系统还原操作”。相应的,在编译固件时小苏为 ext4 或 squashfs 根分区留出了 500M 的空间,一般来说这 500M 根分区空间足够你各种折腾了(毕竟固件本身才不到 100M),SD卡 剩余的空闲空间可以在 Windows 下使用 DiskGenius 新建一个分区继续折腾。当然,如果 500M 的根分区空间还是不够你折腾,你也可以选用 ext4 格式的固件刷入 SD卡 然后使用 fdisk(需要 opkg install fdisk 安装) e2fsck 和 resize2fs 命令来扩展根分区(方法详见参考资料最后一项)。

初始设置

刷入固件通电开机后,稍等 30秒 你将可以搜索到一个 SSID 为: Openwrt 的 WIFI 热点,连接此热点,在浏览器地址栏输入:

http://192.168.1.1

即可进入 Luci 控制面板。同时你也可以选择用网线连接树莓派和电脑,在浏览器输入相同的地址来进入控制面板。登陆控制面板时用户名默认为 root,密码默认为 password。登陆面板时,你会发现控制面板采用 https 作为连接协议,这可能会导致浏览器弹出“https证书不被信任”的提示,为了解决这个问题,你可以在“系统 - WEB 管理”中进行如下设置,保存并应用,清除浏览器缓存后即可使用默认的 http 协议访问控制面板:

WEB 管理页面

网口设置

刷入固件后树莓派的网口默认为 Lan 口,如果你有拨号需求或者需要将树莓派设置为子路由的话,需要将树莓派的网口改为 Wan 口,配置方法如下:

以下内容每做完一步后必须点击“保存”而不是“保存&应用”,做完全部步骤之后才可点击右上角的 “未保存的配置”应用所有修改,否则可能会造成在设置过程中无法连接到树莓派的情况发生。

进入“网络 - 接口”,点击“添加新接口”:

添加新接口

在“新接口的名称” 中填入 wan(小写),“新接口的协议”依据具体情况而定,如果要将树莓派的作拨号用,则选择PPPOE,如果想要用网线与上一设备 (如路由器) 的 Lan 口相连的话则选择DHCP客户端,在接口选项中,选择以太网适配器 "eth0",选择完成后,点击右下角的“提交”。

配置新接口

之后在 Lan 接口的 “物理设置”中修改取消勾选eth0,点击下方的“保存”而不是“保存&应用”

取消 Lan 口绑定的 eth0 接口

最后点击右上角的 “未保存的配置”应用所有修改即可。

值得一提的是,如果你是使用网线方式连接电脑和树莓派的话,当你把树莓派的网口改为 Wan 口后,你将无法通过浏览器进入 Luci 控制面板,但是使用无线方式连接到树莓派还是可以正常进入控制面板的,所以当你发现电脑无法进入控制面板后,不要惊慌,拔掉网线连接树莓派的无线热点即可正常进入控制面板~

无线设置(板载网卡)

在设置树莓派 3B+ 的板载无线网卡时,请优先设置 radio0 接口;
在设置树莓派 3B 的板载无线网卡时,请优先设置 radio2 接口;
如果你的设备是树莓派 3B+,板载网卡将无法工作在 2.4Ghz 频段的 Legacy 模式下。

目前已知
在树莓派 3B+ 下, 5Ghz 频段工作正常,2.4Ghz 频段下 Legacy 模式工作正常 (radio0 接口)。
树莓派 3B 下, 2.4Ghz 频段下 Legacy 模式和 N 模式工作正常 (radio2 接口)。

IPV6

从第四版固件开始,文件名带有 “IPV4+IPV6”的固件已支持连通 IPV6,但我们需要在 “网络 - 接口”中将 “IPv6 ULA 前缀”框中的内容清空 (如果此项本身为空可忽略此步),重启后才可正常连通 IPV6 网络,否则 IPV6 默认不可用。如果你不需要接入 IPV6 可以忽略此项。

清空"IPv6 ULA 前缀"

IPV6 连通成功

重启即可连通 IPV6 网络~

查看 IPV6 是否连通可以在这里测试:http://test-ipv6.hkg.vr.org/

IPV6 测试成功

开启神秘功能

本固件自带 ShadowSocksR 客户端,但是因为蜜汁原因,刷好固件后 ShadowSocksR 的控制面板默认隐藏,我们可以在 SSH 或者 TTYD 终端中执行以下命令开启这个十分重要的功能(来自:https://github.com/coolsnowwolf/lede/issues/881#issuecomment-444450163

echo 0xDEADBEEF > /etc/config/google_fu_mode

ShadowSocksR控制面板

功能展示

看到这里,你可能会说:小苏你自卖自夸了这么长时间,这个固件究竟有哪些功能呢?别着急,有图有真相:

控制面板首页

控制面板首页

软件包控制面板

软件包控制面板

ShadowSocksR Plus+

ShadowSocksR Plus+ (同时支持 V2Ray 和 SS)

Adbyby Plus+

Adbyby Plus+ 去广告程序

Frpc 内网穿透客户端

Frpc 内网穿透客户端

MentoHUST(锐捷校园网拨号客户端)

MentoHUST

LXC 容器

LXC 容器

Aria2

Aria2 配置

Aria2 Web-UI

Aria2 Web-UI

Samba

Samba 4.0

Transmission

Transmission

Transmission Web 界面

Transmission Web Interface

SSR Python 服务器

SSR Python 服务器

Turbo ACC 网络加速

Turbo ACC 网络加速(支持 BBR 加速)

多线多拨

多线多拨

负载均衡

负载均衡

统计图表

统计图表

固件功能列表

OpenWrt
├── 状态
│├── 概况
│├── 防火墙
│├── 路由表
│├── 系统日志
│├── 内核日志
│├── 进程
│├── 实时信息
│├── VNStat 流量监控
│├── WireGuard 状态
│├── 负载均衡
│└── 释放内存
├── 系统
│├── 系统
│├── Web 管理
│├── 管理权
│├── 软件包
│├── TTYD 终端
│├── 启动项
│├── 计划任务
│├── 时间同步
│├── 挂载点
│├── LED 配置
│├── 备份/升级
│├── 自定义命令
│├── 定时重启
│├── 文件传输
│├── 双分区启动切换
│└── 重启
├── 服务
│├── MentoHUST
│├── ShadowSocksR Plus+
│├── 广告屏蔽大师 Plus+
│├── Adblock
│├── 上网时间控制
│├── 动态 DNS
│├── WiFi 计划
│├── LXC Containers
│├── WatchCat
│├── 网络唤醒
│├── Tinyproxy
│├── UPnP
│├── Frp 内网穿透
│├── KMS 服务器
│├── HAProxy
│├── Shairplay
│├── 迅雷快鸟
│└── MWAN3 分流助手 (IPV4+IPV6 固件不可用)
├── 网络存储
│├── 可道云
│├── USB打印服务器
│├── 硬盘休眠
│├── 网络共享
│├── aMule 设置
│├── Aria2 配置
│├── miniDLNA
│├── MJPG-streamer
│├── Transmission
│└── FTP服务器
├── VPN
│├── SSR Python 服务器
│├── N2N v2 VPN
│├── OpenVPN 服务器
│├── PPTP VPN 服务器
│└── ZeroTier
├── 网络
│├── 接口
│├── 无线
│├── 访客网络
│├── DHCP/DNS
│├── 主机名
│├── IP/MAC 绑定
│├── 静态路由
│├── 防火墙
│├── 诊断
│├── SQM QoS
│├── 动态 DNSPOD
│├── Turbo ACC 网络加速
│├── 多线多拨 (IPV4+IPV6 固件不可用)
│└── 负载均衡 (IPV4+IPV6 固件不可用)
├── 带宽监控
│├── 显示
│├── 配置
│├── 备份
│└── 实时流量监测
└── 统计
├── 图表
└── 设置

安装和升级

安装

带有 factory 字样的文件为安装固件,下载固件到本地并解压即可得到 factory 格式的 img 镜像文件。其中,文件名中带有 ext4 字样的为 ext4 固件,文件名中带有 squashfs 字样的为 squashfs 格式固件,即使固件格式不同,但是它们刷入 SD卡 的方法是一样的,在 Windows 下你可以使用 Win32 Disk Imager或者 Etcher 将 img 固件写入 SD卡,在 Linux 下你可以使用 dd命令写入。

升级

带有 sysupgrade 字样的文件为升级固件,下载固件到本地并解压即可得到 sysupgrade 格式的 img 镜像文件,如果你想从我编译的旧版固件升级到新版固件,可以直接在 Luci 控制面板中刷入 sysupgrade 格式的 img 镜像固件 (可免去在电脑端刷写固件的麻烦),此操作只会升级系统分区,如果打钩“保留配置”,那么用户数据将不受影响。

如果卡中的固件不是我编译的 OpenWrt 固件 ,包括但不限于其他发行版固件 (如 Raspbian,Arch Linux Arm 等) 或其他人编译的 OpenWrt 固件,都需要刷入带有 factory 字样的固件

固件升级

固件下载

蓝奏云 (只提供最新版下载):

32位 (适用于 2/3B/3B+):
IPV4 Only:
https://www.lanzous.com/b791329
IPV4+IPV6:
https://www.lanzous.com/b791330
ipk 软件包 (IPV4 / IPV6 通用):
https://www.lanzous.com/b791331

Oneindex 文件镜像(包含当前版本及所有历史版本):

http://netdisk.club/OpenWrt/

百度网盘(包含当前版本及所有历史版本):

链接: https://pan.baidu.com/s/1DqhSb9WtYpPnBterziObTA
密码: vemw

参考资料

OpenWrt By Lean · coolsnowwolf/lede - GitHub:
https://github.com/coolsnowwolf/lede

不显示S-SR-plus · Issue #881 · coolsnowwolf/lede - GitHub:
https://github.com/coolsnowwolf/lede/issues/881#issuecomment-444450163

MentoHUST OpenWrt ipk · KyleRicardo/MentoHUST-OpenWrt-ipk - Github:
https://github.com/KyleRicardo/MentoHUST-OpenWrt-ipk

OpenWrt/LEDE LuCI for MentoHUST BoringCat/luci-app-mentohust - Github:
https://github.com/BoringCat/luci-app-mentohust

树莓派 3(Raspberry Pi 3)安装 Openwrt + shadowsocks + ChinaDNS - 简单
http://www.wzero.net/?p=137

树莓派 3 做路由并负载 SSR - 瓜地
https://ljkgpxs.xyz/2018/01/24/raspberry3b-router-run-shadowsocksr/

Resize the root partition - Banoffee Pi Server:
http://banoffeepiserver.com/resize-the-root-file-system-partition.html