背景

一般路由器提供的跟分区“/”比较小,当安装几个软件后就会导致磁盘空间不足,为了扩容我们可以挂载外部的存储设备,例如U盘、SD卡、移动硬盘等。下面我以GL.iNet-AR750路由器为例,演示如何挂载外部SD卡。首先你需要确保你的外部设备被正确的分区,我的SD卡上面被分了3个分区,分别存储SWAP、系统和其他文件。如果没有被正确的分区,请安装fdisk然后分区。SWAP需要文件系统类型为swap、存储文件的文件系统选择ext4。下面是我已经分区好后的设备名称以及他们的用途:

/dev/sda1     SWAP             SWAP
/dev/sda2     /                系统
/dev/sda3     /mnt/sda3        其他

我们首先用mount命令查看已经挂载的设备和挂载点:

[email protected]:~# mount
/dev/root on /rom type squashfs (ro,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)
/dev/mtdblock6 on /overlay type jffs2 (rw,noatime)
overlayfs:/overlay on / type overlay (rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work)
tmpfs on /dev type tmpfs (rw,nosuid,relatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,mode=600,ptmxmode=000)
debugfs on /sys/kernel/debug type debugfs (rw,noatime)
/dev/sda2 on /mnt/sda2 type ext4 (rw,relatime,data=ordered)
/dev/sda3 on /mnt/sda3 type ext4 (rw,relatime,data=ordered)

可以看到目前跟分区“/”由设备/dev/mtdblock6挂载,我们接下来需要把它替换成/dev/sda2。

操作

1. 安装依赖

  1. opkg update
  2. opkg install fdisk (可选,如果你没有分区)
  3. opkg install block-mount

2. 拷贝系统到SD卡

注意,/mnt/sda2是你SD卡上用来存储系统的路径,依据你的实际情况修改。

mkdir -p /tmp/cproot
mount --bind / /tmp/cproot
tar -C /tmp/cproot -cvf - . | tar -C /mnt/sda2 -xf -
umount /tmp/cproot

3. 编辑ROM上的fstab文件

使用命令vi /etc/config/fstab修改文件的内容,这个fstab存储在路由器的ROM上而不是SD卡上。下面是我的路由器上面fstab中的内容,按照你自己的情况编辑,确保option target '/mnt/sda2'下面的option enabled设置为1,并且把挂载到/mnt/sda2的目录更改为/,然后增加两个option。然后删除swap和另一个mount配置,只保留global和挂载到/mnt/sda2的那一个配置。

修改前:

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 'swap'
	option	device	'/dev/sda1'
	option	enabled	'0'

config 'mount'
	option	target	'/mnt/sda2'
	option	uuid	'157e3e59-3a2f-4af5-a8de-d267d02bb63d'
	option	enabled	'0'

config 'mount'
	option	target	'/mnt/sda3'
	option	uuid	'54f650c0-9bf7-43df-b89c-4b3a85c79c5c'
	option	enabled	'0'

修改后:

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	'/'
	option	uuid	'157e3e59-3a2f-4af5-a8de-d267d02bb63d'
	option	enabled	'1'
	option  options rw,sync
	option  enabled_fsck  0

如果你不小心搞坏了fstab文件,可以使用命令block detect > /etc/config/fstab来重新生成。

4. 重启后修改SD卡的fstab文件

重启后,修改的fstab将会生效。注意,现在我们有了两份fstab文件,一份存储在路由器的ROM中,另一份存储在SD卡中。系统首先读取ROM上的fstab文件来挂载块设备,然后会读取SD卡的fstab挂载块设备。因此当系统启动完成后,我们还需要修改SD卡的/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 'swap'
	option	device	'/dev/sda1'
	option	enabled	'0'

config 'mount'
	option	target	'/mnt/sda2'
	option	uuid	'157e3e59-3a2f-4af5-a8de-d267d02bb63d'
	option	enabled	'0'

config 'mount'
	option	target	'/mnt/sda3'
	option	uuid	'54f650c0-9bf7-43df-b89c-4b3a85c79c5c'
	option	enabled	'0'

修改后:

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 'swap'
	option	device	'/dev/sda1'
	option	enabled	'1'

config 'mount'
	option	target	'/mnt/sda3'
	option	uuid	'54f650c0-9bf7-43df-b89c-4b3a85c79c5c'
	option	enabled	'1'

然后再次重启系统,我们的修改已经彻底完成。使用df -h命令查看一挂载的分区和容量:

[email protected]:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                10.3M     10.3M         0 100% /rom
tmpfs                    60.9M    332.0K     60.6M   1% /tmp
/dev/sda2                 3.9G     55.1M      3.6G   1% /
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/sda3                53.9G     52.0M     51.0G   0% /mnt/sda3

使用free命令查看SWAP:

[email protected]:~# free
             total       used       free     shared    buffers     cached
Mem:        124672      61080      63592        440       9644      24576
-/+ buffers/cache:      26860      97812
Swap:       524284          0     524284

5. 优化 – 修改swappness

我们希望当内存容量达到很高的阈值才使用swap,以防止系统因为频繁换页导致卡顿。修改文件/etc/sysctl.conf,追加vm.swappiness = 95。表示当物理内存使用到95%时才使用分页内存。

改回去

当你不再想挂载跟分区“/”到SD卡,可以使用下面的命令改回去。注意你需要按照你的实际情况选择文件系统类型并且调整相应的调整设备名和挂载目录,这些信息可以在你修改fstab文件前使用mount命令来查看。

  1. mount -t jffs2 /dev/mtdblock6 /overlay
  2. block detect > /overlay/upper/etc/config/fstab
  3. reboot

参考

  1. https://samhobbs.co.uk/2013/11/more-space-for-packages-with-extroot-on-your-openwrt-router
  2. https://oldwiki.archive.openwrt.org/doc/uci/fstab#the_right_amount_of_swap
pwrliang Linux, OpenWrt ,

Leave a Reply

Your email address will not be published. Required fields are marked *