OpneWrt 作为嵌入式操作系统,为了节省空间,采用了 SquashFS 文件系统。
SquashFS 文件系统是一种采用压缩技术的文件系统,OpenWrt 采用了 LZMA 算法,更加节省空间的占用。同时,SquashFS 是只读的,系统启动后会将需要文件解压到内存中使用,所以不需要对原始文件进行修改。
这样设计的好处就是可以最大程度的节省空间占用,并且由于 SquashFS 的只读特性,可以方便的进行系统还原。
但是既然 SquashFS 文件是只读的,那么如何保存配置和安装软件呢。这就用到了 Overlay 分区。
Overlay 分区就如其名称一样,可以被理解成附加到 SquashFS 文件系统上的可写数据层。新装软件会保留在该分区,对于只读数据的修改信息也保存在该分区,系统会将修改信息映射到只读数据上,根据 Overlay 分区的数据对只读数据进行修改后保存到内存成成为系统最终的运行数据。
这也可以理解为什么采用 SquashFS 文件系统可以方便的进行系统还原了。因为只需要将 Overlay 分区的内容清空,则自然就恢复到出设置了。
我们首先看一下 OpenWrt 系统的磁盘分区挂载情况,使用如下命令:
# df -hT
图.1 OpenWrt SquashFS 分区挂载情况
如图.1所示,系统的根分区挂载到使用 overlayfs 文件系统的”/overlay”目录,而这个目录是一个 Linux 系统的虚拟块设备”/dev/loop0″。在 Linux中,这种特殊的块设备 loop 被称为还回块设备,这种 loop 设备是通过映射操作系统上的正常的文件而形成的虚拟块设备。因为这种设备的存在,就为我们提供了一种创建一个存在于其他文件中的虚拟文件系统的机制。
而实际 OpenWrt 的文件则使用 SquashFS 文件系统挂载到”/rom”目录。
再次查看系统块文件信息,使用如下命令:
# opkg update # opkg install lsblk # lsblk
图.2 OpenWrt 系统块文件信息
可以看到,事实上磁盘被分成两个分区,即”/sda1″和”/sda2″,其中”/sda1″是启动分区,而”/sda2″是根分区。这个分区采用 Overlay 技术,将文件保存在”/rom”和”/overlay”两个挂载目录中。其中”/rom”中的文件是只读的,”/overlay”目录中的文件用于映射修改内容和新装软件。
由于 OpenWrt 官方镜像 Overlay 分区很小,只有80M多一点,显示满足不了使用要求,那么如何扩容 Overlay 分区呢?
现在假设将 SquashFS 系统的 OpenWrt 镜像刷写到一块 2GB 磁盘,之后实际演示如何扩容 Overlay 分区。
首先安装必软件:
# opkg update # opkg install parted losetup resize2fs
然后使用如下命令扩容”/dev/sda2″分区:
# parted -f -s /dev/sda resizepart 2 100%
之后使用如下命令,查看分区情况:
# parted -l -s
图.3 使用 parted 工具扩容分区
可以看到,”/dev/sda2″分区已经成功扩容。重新启动系统,让修改生效。
之后,使用如下命令扩容”/dev/loop0″虚拟块设备的容量,以使扩容真正生效:
# losetup /dev/loop0 /dev/sda2 2> /dev/null # resize2fs -f /dev/loop0
图.4 调整虚拟块设备容量
再次重启系统,就会发现”/overlay”分区容量已经扩容至2GB了。
图.5 查看 OpenWrt 存储空间容量
至此,采用 SquashFS 文件系统及 Overlay 分区的 OpenWrt 系统就完成了扩容。