OpenWrt 固件自编译教程:从入门到精通!
编译环境准备
创建用户
不推荐使用 root 用户进行编译,所以先使用 root 权限创建一个用户,以创建 helloworld 用户为例。
# 添加用户
adduser helloworld
为新用户设置密码
passwd helloworld
为该用户指定命令解释程序
usermod -s /bin/bash helloworld
为该用户添加 sudo 权限
chmod u+w /etc/sudoers
因 /etc/sudoers 文件默认是只读文件,因此需先添加 sudoers 文件的写权限
chmod u+w /etc/sudoers
编辑 sudoers 文件
vim /etc/sudoers
#找到这行 root ALL=(ALL) ALL 追加新行
helloworld ALL=(ALL:ALL) ALL
保存修改后,安全考虑建议撤销 sudoers 文件写权限
chmod u-w /etc/sudoers
创建新用户会自动创建一个以用户名命名的新目录,需要为新目录添加读写权限
chown openwrt:openwrt -R /home/helloworld/
从 root 用户切换使用新用户
# 运行两次,并输入新用户的密码进行切换
su helloworld
从此刻开始,以非 root 用户执行编译过程的所有操作。
更新本地环境
# 更新软件列表、升级软件包
sudo sh -c "apt update && apt upgrade -y"
安装依赖
ubuntu 20.04 (推荐系统),安装依赖
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync
ubuntu 18.04 安装依赖
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs gcc-multilib g++-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler antlr3 gperf wget swig rsync
首次编译步骤
不要使用 root 用户!
拉取源码
拉取源码到编译环境
git clone https://github.com/coolsnowwolf/lede.git openwrt
添加自定义源
注:以下是自己正在使用的软件源,这里你也可以换成自己喜欢的软件源
# 进入openwrt目录
cd ~/openwrt
# 添加自定义源
cat >> feeds.conf.default <<EOF
src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git passwall https://github.com/xiaorouji/openwrt-passwall
EOF
更新下载软件仓库的源码到本地,并安装自定义源包含的软件包
./scripts/feeds update -a && ./scripts/feeds install -a
单独添加软件包(可选项)
如果需要单独添加软件,请拉取源码到 package 目录之下。示例如下:
# 添加 OpenAppFilter 应用过滤插件
git clone https://github.com/destan19/OpenAppFilter package/OpenAppFilter
设置默认主题(可选项)
注:此操作请在编译前执行,设置 argon 为默认主题,以此为例举一反三
# 删除自定义源默认的 argon 主题
rm -rf package/lean/luci-theme-argon
# 拉取 argon 原作者的源码
git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git package/lean/luci-theme-argon
# 替换默认主题为 luci-theme-argon
sed -i 's/luci-theme-bootstrap/luci-theme-argon/' feeds/luci/collections/luci/Makefile
设置路由器默认的 LAN IP(可选项)
注:此操作请在编译前执行
# 设置默认IP为 192.168.199.1
sed -i 's/192.168.1.1/192.168.199.1/g' package/base-files/files/bin/config_generate
仅制作.config文件,无需本地编译固件(可选项)
根据自己的定制需求,调整 OpenWrt 系统组件
make menuconfig
通过以下命令行获得 seed.config 配置文件,然后使用 GitHub Actions 云编译。
# 若在调整OpenWrt系统组件的过程有多次保存操作,则建议先删除.config.old文件再继续操作
rm -f .config.old
# 根据编译环境生成默认配置
make defconfig
# 对比默认配置的差异部分生成配置文件(可以理解为增量)
./scripts/diffconfig.sh > seed.config
若需要编译固件
根据自己的定制需求,调整 OpenWrt 系统组件
make menuconfig
下载编译所需的软件包
make download -j8 V=s
编译 OpenWrt 固件
# -j1:单线程编译
make -j1 V=s
单线程编译可提高编译成功率,但过程非常漫长,也完全取决于机器的性能。编译完成后固件输出路径:/openwrt/bin/targets/ 之下。
二次编译步骤
不要使用 root 用户!
更新本地编译环境
# 更新软件列表、升级软件包
sudo sh -c "apt update && apt upgrade -y"
# 拉取最新源码
cd ~/openwrt && git pull
# 更新下载安装订阅源包含的软件包
cd ~/openwrt
./scripts/feeds update -a && ./scripts/feeds install -a
清理旧文件
# 删除/bin和/build_dir目录中的文件
make clean
如果要更换架构,例如要从 x86_64 换到 MediaTek Ralink MIPS 建议执行以下命令深度清理 /bin 和/build_dir 目录的中的文件 (make clean) 以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件。
make dirclean
如果需要对组件重新调整,则建议先删除旧配置
rm -rf ./tmp && rm -rf .config
根据自己的定制需求,再次调整 OpenWrt 系统组件
make menuconfig
下载编译所需的软件包
make download -j8 V=s
编译 OpenWrt 固件
make -j$(nproc) || make -j1 || make -j1 V=s
二次编译可以优先使用多线程,报错会自动使用单线程,仍然报错会单线程执行编译并输出详细日志。
附加内容
如果没有特殊的定制需求,运行 make menuconfig 命令配置目标架构完成后,进入 LUCI --> Applications 选择需要的插件,进入 LUCI --> Themes 选择喜欢的主题皮肤,编译即可。
如果是硬路由务必记得勾选 luci-app-mtwifi 闭源的 Wi-Fi 驱动
1. x86_64 平台
Target System (x86) --->
Subtarget (x86_64) --->
Target Profile (Generic x86/64) --->
无特殊需求,那么 Target Images 勾选
[*] squashfs (NEW)
[*] Build GRUB images (Linux x86 or x86_64 host only) (NEW)
[*] GZip images (NEW)
自定义固件大小
(32) Kernel partition size (in MB) (NEW)
(400) Root filesystem partition size (in MB) (NEW)
如果因为勾选基于 EXT4 文件系统编译固件而造成编译报错,建议调高 Root filesystem partition size
2. 常用插件列表
在调整 OpenWrt 系统组件时:[*] 表示编译软件包并加入到固件;[M] 表示编译软件包但不加入固件;[ ] 则表示不对软件包进行任何设置。
## 插件类
LuCI ---> Applications ---> luci-app-adbyby-plus #去广告
LuCI ---> Applications ---> luci-app-arpbind #IP/MAC绑定
LuCI ---> Applications ---> luci-app-autoreboot #高级重启
LuCI ---> Applications ---> luci-app-aliddns #阿里DDNS客户端
LuCI ---> Applications ---> luci-app-ddns #动态域名 DNS
LuCI ---> Applications ---> luci-app-filetransfer #文件传输
LuCI ---> Applications ---> luci-app-firewall #添加防火墙
LuCI ---> Applications ---> luci-app-frpc #内网穿透 Frp
LuCI ---> Applications ---> luci-app-mwan3 #MWAN负载均衡
LuCI ---> Applications ---> luci-app-nlbwmon #网络带宽监视器
LuCI ---> Applications ---> luci-app-ramfree #释放内存
LuCI ---> Applications ---> luci-app-samba #网络共享(Samba)
LuCI ---> Applications ---> luci-app-sqm #流量智能队列管理(QOS)
LuCI ---> Applications ---> luci-app-openclash #你懂的那只猫
LuCI ---> Applications ---> luci-app-dnsfilter #广告过滤
LuCI ---> Applications ---> luci-app-passwall #不敢解释
LuCI ---> Applications ---> luci-app-mtwifi #闭源Wi-Fi驱动
LuCI ---> Applications ---> luci-app-eqos #根据IP控制网速
LuCI ---> Applications ---> luci-app-syncdial #薛定谔的多拨应用
LuCI ---> Applications ---> luci-app-zerotier #虚拟局域网
LuCI ---> Applications ---> luci-app-jd-dailybonus #京东签到自动领豆
LuCI ---> Applications ---> luci-app-oaf #应用过滤神器
LuCI ---> Applications ---> luci-app-watchcat #断网检测功能与定时重启
LuCI ---> Applications ---> luci-app-wol #WOL网络唤醒
LuCI ---> Applications ---> luci-app-wrtbwmon #实时流量监测
LuCI ---> Applications ---> luci-app-upnp #通用即插即用UPnP(端口自动转发)
LuCI ---> Applications ---> luci-app-argon-config #Argon主题设置
# 常用主题类
LuCI ---> Themes ---> luci-theme-argon
# 网络相关 (普通用户用不上)
Network ---> IP Addresses and Names ---> ddns-scripts_cloudflare.com-v4
Network ---> IP Addresses and Names ---> bind-dig
Network ---> Routing and Rediction ---> ip-full
Network ---> File Transfer ---> curl
Network ---> File Transfer ---> wget-ssl
Network ---> iperf3
Network ---> ipset
Network ---> socat #多功能的网络工具
Base system --> dnsmasq-full #DNS缓存和DHCP服务(dnsmasq-full和dnsmasq二者不可共存)
# 工具类 (普通用户用不上)
Utilities --> Editors --> nano #Nano 编辑器
Utilities --> Shells --> bash #命令解释程序
Utilities --> disc --> fdisk #MBR分区工具
Utilities --> disc --> gdisk #GBT分区工具
Utilities --> disc --> lsblk #列出磁盘设备及分区查看工具
Utilities --> Filesystem --> resize2fs #调整文件系统大小
# IPv6(未来运营商可能不再提供 IPv4 公网地址,有远程访问需求的建议加入)
Extra packages ---> ipv6helper (勾选此项即可,下面几项自动勾选)
Network ---> odhcp6c
Network ---> odhcpd-ipv6only
LuCI ---> Protocols ---> luci-proto-ipv6
LuCI ---> Protocols ---> luci-proto-ppp
3. 为 OpenWrt 单独编译 ipk 插件
克隆源码
以编译 Rosy 主题为例:
# 进入 OpenWrt 目录
cd ~/openwrt/
# 克隆 Rosy 主题源码到 package 目录
git clone https://github.com/rosywrt/luci-theme-rosy.git package/luci-theme-rosy
配置组件
make menuconfig
进入 LuCI --> Themes 选项找到 luci-theme-rosy
然后配置该选项为 'M',保存退出。M 表示选中插件但不编译进固件。如下:
<M> luci-theme-rosy....................... Rosy Theme
编译插件
make package/luci-theme-rosy/luci-theme-rosy/compile V=99
注:V=99 表示输出详细的 debug 信息
我这里是 x86_64 架构,编译完成插件包默认存放路径:~/openwrt/bin/packages/x86_64/base 目录下
上传 IPK 软件包到 OpenWrt
scp luci-theme-rosy_git-19.069.38477-5ed9705-1_all.ipk root@192.168.199.1:/tmp
安装 IPK 软件包
SSH 进入路由器,安装 tmp 目录下的 ipk 软件包,例如
opkg install /tmp/luci-theme-rosy_git-19.069.38477-5ed9705-1_all.ipk
清理编译
编译完成,若需要清理刚刚编译的插件,可通过以下命令:
make package/luci-theme-rosy/luci-theme-rosy clean
虽然 OpenWrt 编译出的内核模块也是一个 ipk 包,它们的名字基本会以 kmod- 作为前缀,但它是无法独立地运行的,内核对内核模块进行严格的版本检查,即使一个小版本号不一致也会导致加载的不成功,因此对于新手用户尽量不要尝试卸载 / 安装内核模块,这极大可能会影响 OpenWrt 正常使用。
OpenWrt 新手配置使用指南
1、更改 OpenWrt 默认登录密码
若没有自行替换修改过管理账号密码,OpenWrt 默认账号 root 密码 password,若需要更改 OpenWrt 默认登录密码则依次进入「系统」 - 「管理权」 ,在「主机密码」的输入框输入新密码,保存应用。
2、更换界面/主题
「系统」 - 「系统」 - 「语言和界面」,在「主题」下拉框选择更换新主题 / 界面,保存应用。
3、修改时区
「系统」 - 「系统」 - 「系统属性」 - 「常规设置」,在「时区」下拉框选择 Asia/Shanghai,保存应用。
4、更换 LAN IP 地址
「网络」 - 「接口」 - 「LAN」 - 「修改」,在「IPv4 地址」自定义需要的 LAN IP 地址
5、作为主路由拨号上网
将猫设置为桥接模式,通过路由器来实现拨号。通过「网络」 - 「接口」找到 WAN 口,修改 OpenWRT 的 WAN 口协议将其切换为 PPPoE。填写宽带运营商提供的账号密码(PAP/CHAP 用户名:宽带账号;PAP/CHAP 密码:宽带密码),保存并应用。
6、禁用 IPv6
§ 删除「网络」- 「接口」 中的 WAN6 接口。
§ 在「网络」 -「接口」 -「WAN」-「高级设置」,使用内置的ipv6管理(取消勾选);
§ 在「网络」 -「接口」 -「LAN」,在「基本设置」将 IPv6 分配长度设置为已禁用;在「高级设置」使用内置的 ipv6 管理(取消勾选);在「IPv6 设置」,更改设置如下:
· 路由通告服务:已禁用
· DHCPv6 服务:已禁用
· NDP 代理:已禁用
详细的图文介绍,请移步 -->《OpenWrt 如何彻底禁用 IPv6 功能》
7、动态解析/P2P 实现远程访问
如果有公网 IP,首选 DDNS 方案。常用的插件有 AliDDNS -> 插件下载 及 腾讯云 DDNS -> 插件下载 (两款插件使用门槛较低)
如果没有公网 IP,较经济的方案:推荐 ZeroTier -> 插件下载 和 DDNSTO -> 插件安装(基本不存在上手的门槛,因为不直接通过公网 IP 因此也无需考虑防火墙设置、端口转发)
详细的配置过程已有相关文章,请移步 -->《OpenWrt 远程访问:ddns 动态解析和 ZeroTier 虚拟局域网》 以及 《Tailscale:一款开箱即用的虚拟局域组网工具!》
8、SSH 开启远程访问
「系统」 - 「管理权」 - 「SSH 访问」 - 「Dropbear 实例」 ,变更「接口」 为 「未指定」。
默认 SSH 端口为 22,可自行更换使用其他可用端口。
9、更换为国内软件源
由于国内的软件源均已支持 https,更换软件源前需确保 curl 支持 ssl
opkg update
opkg install ca-certificates luci-ssl-openssl
「系统」 - 「软件包」 - 「配置」,完整复制一份「发行版软件源」所有条目,粘贴到「自定义软件源」输入框,将其中的 http://downloads.openwrt.org/ 全部替换为 https://mirrors.cloud.tencent.com/lede/ (腾讯镜像源)或者 https://mirrors.ustc.edu.cn/lede/ (中科大镜像源) ,提交。
也可以直接使用 sed 命令替换软件源为腾讯镜像源。
sed -i 's_downloads.openwrt.org_mirrors.cloud.tencent.com/lede_' /etc/opkg/distfeeds.conf
10、OpenWrt 插件的安装与卸载
通过 LuCi 界面管理软件包
「系统」 - 「软件包」 -「动作」,可在「已安装软件包」的列表中找到需要卸载的包名称进行卸载,同时通过在「过滤器」的输入框内输入插件的关键词,在软件仓库中查找需要的安装包进行安装。大多数插件可通过 LuCi 进行安装 / 卸载。
通过SSH终端安装/更新/卸载
1、如果是第三方下载的软件包可通过终端命令进行安装,可通过 scp 命令上传到 OpenWrt 的 tmp 目录进行安装。(推荐上传至 tmp 是因为它占用的是内存而不占用实际的存储空间)
# 1、通过Scp上传文件
scp -P [Port] [PackageName] root@[OpenWrt LANIP]:/tmp
## 示例
## 上传本地当前路径下的luci-app-aliddns包文件到LANIP为192.168.1.1的tmp目录
scp -P 22 ./luci-app-aliddns_v0.3.0-1.ipk root@192.168.1.1:/tmp
# 2、在OpenWrt终端安装已上传的包
opkg install /tmp/[PackageName]
## 示例
opkg install /tmp/luci-app-aliddns_v0.3.0-1.ipk
2、SSH 终端 opkg 包管理常见命令
# 获取软件列表
opkg list
# 安装
opkg install [PackageName]
# 卸载
opkg remove [PackageName]
# 更新软件包
opkg upgrade [PackageName]
# 更新所有可被更新的软件包
opkg upgrade $(opkg list-upgradable | awk '{print $1}')
注:因内核对内核模块进行严格的版本检查,即使一个小版本号不一致也会导致加载的不成功,因此尽量不要尝试卸载 / 安装内核模块,极大可能会影响 OpenWrt 正常使用。
11、配置旁路由
已有相关文章供参考,请移步 --> 《OpenWrt 配置旁路由教程》
12、sysupgrade 更新固件
1)先本地上传固件到 OpenWrt 的 tmp 目录
# 默认为22端口可以不追加-P参数
scp -P 22 ./openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin root@192.168.1.1:/tmp
2)OpenWrt 终端使用 sysupgrade 命令更新固件,根据个人的性格、喜好、胆识选择适合自己的姿势尝试刷入更新包
# 保留配置升级
sysupgrade -i /tmp/openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin
# 不保留配置升级
sysupgrade -n /tmp/openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin
# 梭哈模式(不保留配置,强制更新)不计较得失成败,不要怂就是干
sysupgrade -n -F /tmp/openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin
13、OpenWrt 扩展容量
1. 前期准备
1.1 如果你怕操作出错,可进入 虚拟机 找到正在运行的 OpenWrt 虚拟机,点击 操作 - 拍快照 方便出错时可以快速恢复。
1.2 通过 Xshell、Putty 等 SSH 终端工具登录 OpenWrt ,安装磁盘分区工具:
opkg update
opkg install cfdisk fdisk e2fsprogs
命令行中 cfdisk 、fdisk 均为磁盘分区工具,e2fsprogs 包含了 mkfs 命令,用于格式化分区。
2. 方案一:利用剩余空间扩容
2.1 创建新分区
SSH 终端运行 cfdisk 命令进入磁盘分区界面,通过键盘上下键切换到 Free space (剩余空间),左右键切换至NEW (新增分区),然后按下回车键。
分区类型设置为 Primary (主分区),按下回车键。
左右键切换 Write 按下回车键,写入新分区。
输入 yes 按下回车键,确认写入新分区。
切换 Quit ,按下回车键退出。运行 fdisk -l 命令,查看是否成功创建新分区。
2.2 格式化新分区
SSH 终端运行下面的命令,将新分区的文件系统格式化为 ext4:
mkfs.ext4 /dev/sda3
2.3 挂载新分区
进入 OpenWrt 管理后台,依次点击 系统 - 挂载点 找到并点击全局设置中的 生成配置 。
在 挂载点 找到创建的新分区,点击 修改 重新调整挂载项目的设置。
勾选 启用此挂载点,挂载点 选择为 作为根文件系统使用 ,完整复制根目录准备中的所有命令行后,点击 保存并应用。
⚠️ 上面复制得到的命令行不要直接运行!!!不要直接运行!!!否则报错。
需要手动修改命令行中 mount /dev/sda1 /tmp/extroot 为 cfdisk 创建的新分区盘符,例如这里应修改为mount /dev/sda3 /tmp/extroot,然后进入 SSH 终端,运行修改后的完整命令行,如下:
mkdir -p /tmp/introot
mkdir -p /tmp/extroot
mount --bind / /tmp/introot
mount /dev/sda3 /tmp/extroot # 修改后
tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
umount /tmp/introot
umount /tmp/extroot
回车键到底,直到跑完所有命令行。然后运行 reboot 重启 OpenWrt ~
重新进入 SSH 终端运行 df -h ,如上图表示扩容成功~
3. 方案二:通过新增磁盘扩容
3.1 添加新磁盘
打开群晖 VMM 找到正在运行的 OpenWrt 虚拟机,选择 关机 - 强制停止。
在 虚拟机 中找到已经停止运行的 OpenWrt 虚拟机,依次选择 操作 - 编辑,找到 存储 设置项,自定义磁盘空间大小(例如 10GB),点击 + 号,新增一块磁盘,例如 虚拟盘 2 (建议勾选空间回收),点击 确定 保存设置。
回到 虚拟机 ,点击已停止运行的 OpenWrt 虚拟机,执行 开机 操作。
3.2 磁盘分区
SSH 终端连接 OpenWrt,运行下面命令查看磁盘信息
fdisk -l
此时,会显示一个未被使用的磁盘 sdb 即新磁盘,,屏幕打印信息如下:
root@OpenWrt:~# fdisk -l
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: QEMU HARDDISK
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: 0x711b2af7
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 512 66047 65536 32M 83 Linux
/dev/sda2 66560 1704959 1638400 800M 83 Linux
Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
若要使用这块新磁盘,就需要对新磁盘进行分区,运行以下命令:
fdisk /dev/sdb
创建一个主分区,分区操作步骤如下:
root@OpenWrt:~# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.37).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x1d291a31.
Command (m for help): n (输入 n 创建分区)
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p (输入 p 创建主分区)
Partition number (1-4, default 1): (回车键,默认创建一个分区)
First sector (2048-20971519, default 2048): (回车键)
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-20971519, default 20971519):
Created a new partition 1 of type 'Linux' and of size 10 GiB.
Command (m for help): w (输入 w 写入分区表)
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
查看磁盘信息:
fdisk -l
屏幕打印信息如下:
root@OpenWrt:~# fdisk -l
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: QEMU HARDDISK
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: 0x711b2af7
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 512 66047 65536 32M 83 Linux
/dev/sda2 66560 1704959 1638400 800M 83 Linux
Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: QEMU HARDDISK
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: 0x1d291a31
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 20971519 20969472 10G 83 Linux
其中 /dev/sdb1 即新创建的新分区分配的盘符
3.3 格式化
将分区格式化 ext4 文件系统:
mkfs.ext4 /dev/sdb1
3.4 挂载分区
进入 OpenWrt 管理后台,依次点击 系统 - 挂载点 找到并点击全局设置中的 生成配置 。
在 挂载点 找到创建的新分区,点击 修改 重新调整挂载项目的设置。
勾选 启用此挂载点,挂载点 选择为 作为根文件系统使用 ,完整复制根目录准备中的所有命令行后,点击 保存并应用。
⚠️ 上面复制得到的命令行不要直接运行!!!不要直接运行!!!否则报错。
需要手动修改命令行中 mount /dev/sda1 /tmp/extroot 为 fdisk 创建的新分区盘符,例如这里应修改为mount /dev/sdb1 /tmp/extroot,然后进入 SSH 终端,运行修改后的完整命令行,如下:
mkdir -p /tmp/introot
mkdir -p /tmp/extroot
mount --bind / /tmp/introot
mount /dev/sdb1 /tmp/extroot # 修改后
tar -C /tmp/introot -cvf - . | tar -C /tmp/e
OpenWrt 固件自编译教程:从入门到精通!
编译环境准备
创建用户
不推荐使用 root 用户进行编译,所以先使用 root 权限创建一个用户,以创建 helloworld 用户为例。
# 添加用户
adduser helloworld
为新用户设置密码
passwd helloworld
为该用户指定命令解释程序
usermod -s /bin/bash helloworld
为该用户添加 sudo 权限
chmod u+w /etc/sudoers
因 /etc/sudoers 文件默认是只读文件,因此需先添加 sudoers 文件的写权限
chmod u+w /etc/sudoers
编辑 sudoers 文件
vim /etc/sudoers
#找到这行 root ALL=(ALL) ALL 追加新行
helloworld ALL=(ALL:ALL) ALL
保存修改后,安全考虑建议撤销 sudoers 文件写权限
chmod u-w /etc/sudoers
创建新用户会自动创建一个以用户名命名的新目录,需要为新目录添加读写权限
chown openwrt:openwrt -R /home/helloworld/
从 root 用户切换使用新用户
# 运行两次,并输入新用户的密码进行切换
su helloworld
从此刻开始,以非 root 用户执行编译过程的所有操作。
更新本地环境
# 更新软件列表、升级软件包
sudo sh -c "apt update && apt upgrade -y"
安装依赖
ubuntu 20.04 (推荐系统),安装依赖
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync
ubuntu 18.04 安装依赖
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs gcc-multilib g++-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler antlr3 gperf wget swig rsync
首次编译步骤
不要使用 root 用户!
拉取源码
拉取源码到编译环境
git clone https://github.com/coolsnowwolf/lede.git openwrt
添加自定义源
注:以下是自己正在使用的软件源,这里你也可以换成自己喜欢的软件源
# 进入openwrt目录
cd ~/openwrt
# 添加自定义源
cat >> feeds.conf.default <<EOF
src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git passwall https://github.com/xiaorouji/openwrt-passwall
EOF
更新下载软件仓库的源码到本地,并安装自定义源包含的软件包
./scripts/feeds update -a && ./scripts/feeds install -a
单独添加软件包(可选项)
如果需要单独添加软件,请拉取源码到 package 目录之下。示例如下:
# 添加 OpenAppFilter 应用过滤插件
git clone https://github.com/destan19/OpenAppFilter package/OpenAppFilter
设置默认主题(可选项)
注:此操作请在编译前执行,设置 argon 为默认主题,以此为例举一反三
# 删除自定义源默认的 argon 主题
rm -rf package/lean/luci-theme-argon
# 拉取 argon 原作者的源码
git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git package/lean/luci-theme-argon
# 替换默认主题为 luci-theme-argon
sed -i 's/luci-theme-bootstrap/luci-theme-argon/' feeds/luci/collections/luci/Makefile
设置路由器默认的 LAN IP(可选项)
注:此操作请在编译前执行
# 设置默认IP为 192.168.199.1
sed -i 's/192.168.1.1/192.168.199.1/g' package/base-files/files/bin/config_generate
仅制作.config文件,无需本地编译固件(可选项)
根据自己的定制需求,调整 OpenWrt 系统组件
make menuconfig
通过以下命令行获得 seed.config 配置文件,然后使用 GitHub Actions 云编译。
# 若在调整OpenWrt系统组件的过程有多次保存操作,则建议先删除.config.old文件再继续操作
rm -f .config.old
# 根据编译环境生成默认配置
make defconfig
# 对比默认配置的差异部分生成配置文件(可以理解为增量)
./scripts/diffconfig.sh > seed.config
若需要编译固件
根据自己的定制需求,调整 OpenWrt 系统组件
make menuconfig
下载编译所需的软件包
make download -j8 V=s
编译 OpenWrt 固件
# -j1:单线程编译
make -j1 V=s
单线程编译可提高编译成功率,但过程非常漫长,也完全取决于机器的性能。编译完成后固件输出路径:/openwrt/bin/targets/ 之下。
二次编译步骤
不要使用 root 用户!
更新本地编译环境
# 更新软件列表、升级软件包
sudo sh -c "apt update && apt upgrade -y"
# 拉取最新源码
cd ~/openwrt && git pull
# 更新下载安装订阅源包含的软件包
cd ~/openwrt
./scripts/feeds update -a && ./scripts/feeds install -a
清理旧文件
# 删除/bin和/build_dir目录中的文件
make clean
如果要更换架构,例如要从 x86_64 换到 MediaTek Ralink MIPS 建议执行以下命令深度清理 /bin 和/build_dir 目录的中的文件 (make clean) 以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件。
make dirclean
如果需要对组件重新调整,则建议先删除旧配置
rm -rf ./tmp && rm -rf .config
根据自己的定制需求,再次调整 OpenWrt 系统组件
make menuconfig
下载编译所需的软件包
make download -j8 V=s
编译 OpenWrt 固件
make -j$(nproc) || make -j1 || make -j1 V=s
二次编译可以优先使用多线程,报错会自动使用单线程,仍然报错会单线程执行编译并输出详细日志。
附加内容
如果没有特殊的定制需求,运行 make menuconfig 命令配置目标架构完成后,进入 LUCI --> Applications 选择需要的插件,进入 LUCI --> Themes 选择喜欢的主题皮肤,编译即可。
如果是硬路由务必记得勾选 luci-app-mtwifi 闭源的 Wi-Fi 驱动
1. x86_64 平台
Target System (x86) --->
Subtarget (x86_64) --->
Target Profile (Generic x86/64) --->
无特殊需求,那么 Target Images 勾选
[*] squashfs (NEW)
[*] Build GRUB images (Linux x86 or x86_64 host only) (NEW)
[*] GZip images (NEW)
自定义固件大小
(32) Kernel partition size (in MB) (NEW)
(400) Root filesystem partition size (in MB) (NEW)
如果因为勾选基于 EXT4 文件系统编译固件而造成编译报错,建议调高 Root filesystem partition size
2. 常用插件列表
在调整 OpenWrt 系统组件时:[*] 表示编译软件包并加入到固件;[M] 表示编译软件包但不加入固件;[ ] 则表示不对软件包进行任何设置。
## 插件类
LuCI ---> Applications ---> luci-app-adbyby-plus #去广告
LuCI ---> Applications ---> luci-app-arpbind #IP/MAC绑定
LuCI ---> Applications ---> luci-app-autoreboot #高级重启
LuCI ---> Applications ---> luci-app-aliddns #阿里DDNS客户端
LuCI ---> Applications ---> luci-app-ddns #动态域名 DNS
LuCI ---> Applications ---> luci-app-filetransfer #文件传输
LuCI ---> Applications ---> luci-app-firewall #添加防火墙
LuCI ---> Applications ---> luci-app-frpc #内网穿透 Frp
LuCI ---> Applications ---> luci-app-mwan3 #MWAN负载均衡
LuCI ---> Applications ---> luci-app-nlbwmon #网络带宽监视器
LuCI ---> Applications ---> luci-app-ramfree #释放内存
LuCI ---> Applications ---> luci-app-samba #网络共享(Samba)
LuCI ---> Applications ---> luci-app-sqm #流量智能队列管理(QOS)
LuCI ---> Applications ---> luci-app-openclash #你懂的那只猫
LuCI ---> Applications ---> luci-app-dnsfilter #广告过滤
LuCI ---> Applications ---> luci-app-passwall #不敢解释
LuCI ---> Applications ---> luci-app-mtwifi #闭源Wi-Fi驱动
LuCI ---> Applications ---> luci-app-eqos #根据IP控制网速
LuCI ---> Applications ---> luci-app-syncdial #薛定谔的多拨应用
LuCI ---> Applications ---> luci-app-zerotier #虚拟局域网
LuCI ---> Applications ---> luci-app-jd-dailybonus #京东签到自动领豆
LuCI ---> Applications ---> luci-app-oaf #应用过滤神器
LuCI ---> Applications ---> luci-app-watchcat #断网检测功能与定时重启
LuCI ---> Applications ---> luci-app-wol #WOL网络唤醒
LuCI ---> Applications ---> luci-app-wrtbwmon #实时流量监测
LuCI ---> Applications ---> luci-app-upnp #通用即插即用UPnP(端口自动转发)
LuCI ---> Applications ---> luci-app-argon-config #Argon主题设置
# 常用主题类
LuCI ---> Themes ---> luci-theme-argon
# 网络相关 (普通用户用不上)
Network ---> IP Addresses and Names ---> ddns-scripts_cloudflare.com-v4
Network ---> IP Addresses and Names ---> bind-dig
Network ---> Routing and Rediction ---> ip-full
Network ---> File Transfer ---> curl
Network ---> File Transfer ---> wget-ssl
Network ---> iperf3
Network ---> ipset
Network ---> socat #多功能的网络工具
Base system --> dnsmasq-full #DNS缓存和DHCP服务(dnsmasq-full和dnsmasq二者不可共存)
# 工具类 (普通用户用不上)
Utilities --> Editors --> nano #Nano 编辑器
Utilities --> Shells --> bash #命令解释程序
Utilities --> disc --> fdisk #MBR分区工具
Utilities --> disc --> gdisk #GBT分区工具
Utilities --> disc --> lsblk #列出磁盘设备及分区查看工具
Utilities --> Filesystem --> resize2fs #调整文件系统大小
# IPv6(未来运营商可能不再提供 IPv4 公网地址,有远程访问需求的建议加入)
Extra packages ---> ipv6helper (勾选此项即可,下面几项自动勾选)
Network ---> odhcp6c
Network ---> odhcpd-ipv6only
LuCI ---> Protocols ---> luci-proto-ipv6
LuCI ---> Protocols ---> luci-proto-ppp
3. 为 OpenWrt 单独编译 ipk 插件
克隆源码
以编译 Rosy 主题为例:
# 进入 OpenWrt 目录
cd ~/openwrt/
# 克隆 Rosy 主题源码到 package 目录
git clone https://github.com/rosywrt/luci-theme-rosy.git package/luci-theme-rosy
配置组件
make menuconfig
进入 LuCI --> Themes 选项找到 luci-theme-rosy
然后配置该选项为 'M',保存退出。M 表示选中插件但不编译进固件。如下:
<M> luci-theme-rosy....................... Rosy Theme
编译插件
make package/luci-theme-rosy/luci-theme-rosy/compile V=99
注:V=99 表示输出详细的 debug 信息
我这里是 x86_64 架构,编译完成插件包默认存放路径:~/openwrt/bin/packages/x86_64/base 目录下
上传 IPK 软件包到 OpenWrt
scp luci-theme-rosy_git-19.069.38477-5ed9705-1_all.ipk root@192.168.199.1:/tmp
安装 IPK 软件包
SSH 进入路由器,安装 tmp 目录下的 ipk 软件包,例如
opkg install /tmp/luci-theme-rosy_git-19.069.38477-5ed9705-1_all.ipk
清理编译
编译完成,若需要清理刚刚编译的插件,可通过以下命令:
make package/luci-theme-rosy/luci-theme-rosy clean
虽然 OpenWrt 编译出的内核模块也是一个 ipk 包,它们的名字基本会以 kmod- 作为前缀,但它是无法独立地运行的,内核对内核模块进行严格的版本检查,即使一个小版本号不一致也会导致加载的不成功,因此对于新手用户尽量不要尝试卸载 / 安装内核模块,这极大可能会影响 OpenWrt 正常使用。
OpenWrt 新手配置使用指南
1、更改 OpenWrt 默认登录密码
若没有自行替换修改过管理账号密码,OpenWrt 默认账号 root 密码 password,若需要更改 OpenWrt 默认登录密码则依次进入「系统」 - 「管理权」 ,在「主机密码」的输入框输入新密码,保存应用。
2、更换界面/主题
「系统」 - 「系统」 - 「语言和界面」,在「主题」下拉框选择更换新主题 / 界面,保存应用。
3、修改时区
「系统」 - 「系统」 - 「系统属性」 - 「常规设置」,在「时区」下拉框选择 Asia/Shanghai,保存应用。
4、更换 LAN IP 地址
「网络」 - 「接口」 - 「LAN」 - 「修改」,在「IPv4 地址」自定义需要的 LAN IP 地址
5、作为主路由拨号上网
将猫设置为桥接模式,通过路由器来实现拨号。通过「网络」 - 「接口」找到 WAN 口,修改 OpenWRT 的 WAN 口协议将其切换为 PPPoE。填写宽带运营商提供的账号密码(PAP/CHAP 用户名:宽带账号;PAP/CHAP 密码:宽带密码),保存并应用。
6、禁用 IPv6
§ 删除「网络」- 「接口」 中的 WAN6 接口。
§ 在「网络」 -「接口」 -「WAN」-「高级设置」,使用内置的ipv6管理(取消勾选);
§ 在「网络」 -「接口」 -「LAN」,在「基本设置」将 IPv6 分配长度设置为已禁用;在「高级设置」使用内置的 ipv6 管理(取消勾选);在「IPv6 设置」,更改设置如下:
· 路由通告服务:已禁用
· DHCPv6 服务:已禁用
· NDP 代理:已禁用
详细的图文介绍,请移步 -->《OpenWrt 如何彻底禁用 IPv6 功能》
7、动态解析/P2P 实现远程访问
如果有公网 IP,首选 DDNS 方案。常用的插件有 AliDDNS -> 插件下载 及 腾讯云 DDNS -> 插件下载 (两款插件使用门槛较低)
如果没有公网 IP,较经济的方案:推荐 ZeroTier -> 插件下载 和 DDNSTO -> 插件安装(基本不存在上手的门槛,因为不直接通过公网 IP 因此也无需考虑防火墙设置、端口转发)
详细的配置过程已有相关文章,请移步 -->《OpenWrt 远程访问:ddns 动态解析和 ZeroTier 虚拟局域网》 以及 《Tailscale:一款开箱即用的虚拟局域组网工具!》
8、SSH 开启远程访问
「系统」 - 「管理权」 - 「SSH 访问」 - 「Dropbear 实例」 ,变更「接口」 为 「未指定」。
默认 SSH 端口为 22,可自行更换使用其他可用端口。
9、更换为国内软件源
由于国内的软件源均已支持 https,更换软件源前需确保 curl 支持 ssl
opkg update
opkg install ca-certificates luci-ssl-openssl
「系统」 - 「软件包」 - 「配置」,完整复制一份「发行版软件源」所有条目,粘贴到「自定义软件源」输入框,将其中的 http://downloads.openwrt.org/ 全部替换为 https://mirrors.cloud.tencent.com/lede/ (腾讯镜像源)或者 https://mirrors.ustc.edu.cn/lede/ (中科大镜像源) ,提交。
也可以直接使用 sed 命令替换软件源为腾讯镜像源。
sed -i 's_downloads.openwrt.org_mirrors.cloud.tencent.com/lede_' /etc/opkg/distfeeds.conf
10、OpenWrt 插件的安装与卸载
通过 LuCi 界面管理软件包
「系统」 - 「软件包」 -「动作」,可在「已安装软件包」的列表中找到需要卸载的包名称进行卸载,同时通过在「过滤器」的输入框内输入插件的关键词,在软件仓库中查找需要的安装包进行安装。大多数插件可通过 LuCi 进行安装 / 卸载。
通过SSH终端安装/更新/卸载
1、如果是第三方下载的软件包可通过终端命令进行安装,可通过 scp 命令上传到 OpenWrt 的 tmp 目录进行安装。(推荐上传至 tmp 是因为它占用的是内存而不占用实际的存储空间)
# 1、通过Scp上传文件
scp -P [Port] [PackageName] root@[OpenWrt LANIP]:/tmp
## 示例
## 上传本地当前路径下的luci-app-aliddns包文件到LANIP为192.168.1.1的tmp目录
scp -P 22 ./luci-app-aliddns_v0.3.0-1.ipk root@192.168.1.1:/tmp
# 2、在OpenWrt终端安装已上传的包
opkg install /tmp/[PackageName]
## 示例
opkg install /tmp/luci-app-aliddns_v0.3.0-1.ipk
2、SSH 终端 opkg 包管理常见命令
# 获取软件列表
opkg list
# 安装
opkg install [PackageName]
# 卸载
opkg remove [PackageName]
# 更新软件包
opkg upgrade [PackageName]
# 更新所有可被更新的软件包
opkg upgrade $(opkg list-upgradable | awk '{print $1}')
注:因内核对内核模块进行严格的版本检查,即使一个小版本号不一致也会导致加载的不成功,因此尽量不要尝试卸载 / 安装内核模块,极大可能会影响 OpenWrt 正常使用。
11、配置旁路由
已有相关文章供参考,请移步 --> 《OpenWrt 配置旁路由教程》
12、sysupgrade 更新固件
1)先本地上传固件到 OpenWrt 的 tmp 目录
# 默认为22端口可以不追加-P参数
scp -P 22 ./openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin root@192.168.1.1:/tmp
2)OpenWrt 终端使用 sysupgrade 命令更新固件,根据个人的性格、喜好、胆识选择适合自己的姿势尝试刷入更新包
# 保留配置升级
sysupgrade -i /tmp/openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin
# 不保留配置升级
sysupgrade -n /tmp/openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin
# 梭哈模式(不保留配置,强制更新)不计较得失成败,不要怂就是干
sysupgrade -n -F /tmp/openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin
13、OpenWrt 扩展容量
1. 前期准备
1.1 如果你怕操作出错,可进入 虚拟机 找到正在运行的 OpenWrt 虚拟机,点击 操作 - 拍快照 方便出错时可以快速恢复。
1.2 通过 Xshell、Putty 等 SSH 终端工具登录 OpenWrt ,安装磁盘分区工具:
opkg update
opkg install cfdisk fdisk e2fsprogs
命令行中 cfdisk 、fdisk 均为磁盘分区工具,e2fsprogs 包含了 mkfs 命令,用于格式化分区。
2. 方案一:利用剩余空间扩容
2.1 创建新分区
SSH 终端运行 cfdisk 命令进入磁盘分区界面,通过键盘上下键切换到 Free space (剩余空间),左右键切换至NEW (新增分区),然后按下回车键。
分区类型设置为 Primary (主分区),按下回车键。
左右键切换 Write 按下回车键,写入新分区。
输入 yes 按下回车键,确认写入新分区。
切换 Quit ,按下回车键退出。运行 fdisk -l 命令,查看是否成功创建新分区。
2.2 格式化新分区
SSH 终端运行下面的命令,将新分区的文件系统格式化为 ext4:
mkfs.ext4 /dev/sda3
2.3 挂载新分区
进入 OpenWrt 管理后台,依次点击 系统 - 挂载点 找到并点击全局设置中的 生成配置 。
在 挂载点 找到创建的新分区,点击 修改 重新调整挂载项目的设置。
勾选 启用此挂载点,挂载点 选择为 作为根文件系统使用 ,完整复制根目录准备中的所有命令行后,点击 保存并应用。
⚠️ 上面复制得到的命令行不要直接运行!!!不要直接运行!!!否则报错。
需要手动修改命令行中 mount /dev/sda1 /tmp/extroot 为 cfdisk 创建的新分区盘符,例如这里应修改为mount /dev/sda3 /tmp/extroot,然后进入 SSH 终端,运行修改后的完整命令行,如下:
mkdir -p /tmp/introot
mkdir -p /tmp/extroot
mount --bind / /tmp/introot
mount /dev/sda3 /tmp/extroot # 修改后
tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
umount /tmp/introot
umount /tmp/extroot
回车键到底,直到跑完所有命令行。然后运行 reboot 重启 OpenWrt ~
重新进入 SSH 终端运行 df -h ,如上图表示扩容成功~
3. 方案二:通过新增磁盘扩容
3.1 添加新磁盘
打开群晖 VMM 找到正在运行的 OpenWrt 虚拟机,选择 关机 - 强制停止。
在 虚拟机 中找到已经停止运行的 OpenWrt 虚拟机,依次选择 操作 - 编辑,找到 存储 设置项,自定义磁盘空间大小(例如 10GB),点击 + 号,新增一块磁盘,例如 虚拟盘 2 (建议勾选空间回收),点击 确定 保存设置。
回到 虚拟机 ,点击已停止运行的 OpenWrt 虚拟机,执行 开机 操作。
3.2 磁盘分区
SSH 终端连接 OpenWrt,运行下面命令查看磁盘信息
fdisk -l
此时,会显示一个未被使用的磁盘 sdb 即新磁盘,,屏幕打印信息如下:
root@OpenWrt:~# fdisk -l
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: QEMU HARDDISK
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: 0x711b2af7
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 512 66047 65536 32M 83 Linux
/dev/sda2 66560 1704959 1638400 800M 83 Linux
Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
若要使用这块新磁盘,就需要对新磁盘进行分区,运行以下命令:
fdisk /dev/sdb
创建一个主分区,分区操作步骤如下:
root@OpenWrt:~# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.37).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x1d291a31.
Command (m for help): n (输入 n 创建分区)
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p (输入 p 创建主分区)
Partition number (1-4, default 1): (回车键,默认创建一个分区)
First sector (2048-20971519, default 2048): (回车键)
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-20971519, default 20971519):
Created a new partition 1 of type 'Linux' and of size 10 GiB.
Command (m for help): w (输入 w 写入分区表)
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
查看磁盘信息:
fdisk -l
屏幕打印信息如下:
root@OpenWrt:~# fdisk -l
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: QEMU HARDDISK
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: 0x711b2af7
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 512 66047 65536 32M 83 Linux
/dev/sda2 66560 1704959 1638400 800M 83 Linux
Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: QEMU HARDDISK
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: 0x1d291a31
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 20971519 20969472 10G 83 Linux
其中 /dev/sdb1 即新创建的新分区分配的盘符
3.3 格式化
将分区格式化 ext4 文件系统:
mkfs.ext4 /dev/sdb1
3.4 挂载分区
进入 OpenWrt 管理后台,依次点击 系统 - 挂载点 找到并点击全局设置中的 生成配置 。
在 挂载点 找到创建的新分区,点击 修改 重新调整挂载项目的设置。
勾选 启用此挂载点,挂载点 选择为 作为根文件系统使用 ,完整复制根目录准备中的所有命令行后,点击 保存并应用。
⚠️ 上面复制得到的命令行不要直接运行!!!不要直接运行!!!否则报错。
需要手动修改命令行中 mount /dev/sda1 /tmp/extroot 为 fdisk 创建的新分区盘符,例如这里应修改为mount /dev/sdb1 /tmp/extroot,然后进入 SSH 终端,运行修改后的完整命令行,如下:
mkdir -p /tmp/introot
mkdir -p /tmp/extroot
mount --bind / /tmp/introot
mount /dev/sdb1 /tmp/extroot # 修改后
tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
umount /tmp/introot
umount /tmp/extroot
回车键到底,直到跑完所有命令行。然后运行 reboot 重启 OpenWrt
4. 写在最后
以上就是喵斯基部落提供的关于 OpenWrt 存储空间扩容的两个简单的示例,如果你使用的 OpenWrt 是 EXT4 文件系统可参考本文示例,但需要留意盘符可能有所不同,切勿完全照搬。如果使用的是 squashfs 文件系统那么挂载点需要设置为 /overlay 作为 overlay 分区使用。