Thinking_Out_Loud

为OpenWRT配置extroot

2018-10-21

安装新package时磁盘不够用怎么办?

配置extroot

有两种方法给系统增加可读写的存储,extroot正是由这两种方法组成:

  1. /overlay放到U盘(external overlay or pivot-overlay);
  2. 将整个根文件系统/放到U盘 (external root or pivot-root)。

基本的原理是,启用extroot后,在系统启动过程中会先使用之前的/overlay直到extroot被挂载。

官方WiKi上已经给出了清晰的配置步骤,这里主要记录一下我的配置过程。

新分区

原先的U盘是ext4文件系统,但是只划分了一个分区,打算单独划出200M的空间挂载到/overlay

  1. 先备份数据
  2. 使用fdisk /dev/sda可以进入分区编辑界面;
  3. 主要使用d子命令删除一个分区,再用n新建分区,用p查看编辑后的分区;
  4. 使用w将分区表的更改写入磁盘。

值得注意的是,如果当前文件系统正在使用,新的分区表需要重启后才能生效。

分区完后,我们还需要格式化分区才能使用,官方WiKi中有说明仅ext4格式的文件系统有效:

1
> mkfs.ext4 /dev/sda1

迁移文件

这一步主要是将原/overlay中的文件拷贝到新的中:

1
> mount /dev/sda1 /mnt ; tar -C /overlay -cvf - . | tar -C /mnt -xf - ; umount /mnt

编辑fstab

自动将系统检测到的可挂载文件系统配置写入/etc/config/fstab。OpenWRT中都是使用UCI更改系统配置。如果按照一般方式直接编辑文件,如/etc/fstab,会被UCI覆盖,这一点需要注意。

1
2
3
4
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;

接下来我们更改/etc/config/fstab中需要启用挂载的option enable项值为'1';再选择选择作为extroot的分区,更改挂载目标option target值为'/overlay',如下:

1
2
3
4
5
config 'mount'
option target '/overlay'
option uuid 'c91232a0-c50a-4eae-adb9-14b4d3ce3de1'
option fstype 'ext4'
option enabled '1'

之后我们就可以重启来验证配置是否成功了。

1
2
3
4
5
6
7
8
9
root@Joe-OpenWrt:~# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 9.5M 9.5M 0 100% /rom
tmpfs 61.0M 644.0K 60.4M 1% /tmp
/dev/sda1 188.7M 20.7M 154.0M 12% /overlay
overlayfs:/overlay 188.7M 20.7M 154.0M 12% /
tmpfs 512.0K 0 512.0K 0% /dev
/dev/sda2 23.2G 150.5M 21.9G 1% /mnt/tmp
/dev/sda3 23.2G 150.5M 21.9G 1% /mnt

肉眼可见/的可用空间变大了。

注意事项

不要在extroot中使用upgrade

会导致状态不一致有变砖的风险。

  • The main reason is that the uClibc ABI (Application Binary Interface) is unstable and changes from revision to revision, so binaries for one version of uClibc may be incompatible with versions from another.
  • Another problem that can arise is if you try to upgrade the kernel packages, then flash and reboot, but your operation is interrupted in any way, then you will have a kernel and module mismatch and likely a brick.
  • Finally, if you upgrade all packages but the kernel and the kernel modules, some packages like iptables will be broken.

访问原来的/overlay

如果要访问原来的/overlay,我们可以通过重新挂载到其它目录的方式。

1
2
3
4
5
6
7
config mount
option target /overlay-boot
option device /dev/mtdblock6
option fstype jffs2
option options rw,sync
option enabled 1
option enabled_fsck 0

参考资料

  1. https://wiki.openwrt.org/doc/howto/extroot
  2. https://wiki.openwrt.org/doc/howto/extroot/extroot.theory
  3. https://wiki.mbirth.de/know-how/software/openwrt/sysupgrade-with-extroot.html
  4. https://dreamcreator108.com/dreams/openwrt-extroot/