背景
一般路由器提供的跟分区“/”比较小,当安装几个软件后就会导致磁盘空间不足,为了扩容我们可以挂载外部的存储设备,例如U盘、SD卡、移动硬盘等。下面我以GL.iNet-AR750路由器为例,演示如何挂载外部SD卡。首先你需要确保你的外部设备被正确的分区,我的SD卡上面被分了3个分区,分别存储SWAP、系统和其他文件。如果没有被正确的分区,请安装fdisk然后分区。SWAP需要文件系统类型为swap、存储文件的文件系统选择ext4。下面是我已经分区好后的设备名称以及他们的用途:
/dev/sda1 SWAP SWAP /dev/sda2 / 系统 /dev/sda3 /mnt/sda3 其他
我们首先用mount命令查看已经挂载的设备和挂载点:
root@GL-AR750:~# 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. 安装依赖
- opkg update
- opkg install fdisk e2fsprogs (可选,如果你没有分区)
- 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命令查看一挂载的分区和容量:
root@GL-AR750:~# 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:
root@GL-AR750:~# 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命令来查看。
- mount -t jffs2 /dev/mtdblock6 /overlay
- block detect > /overlay/upper/etc/config/fstab
- reboot