[2020.4.3更新]配置NFS,以及使用NFS进入子系统
上一篇《在OpenWRT上配置debian子系统》的续集。
由于安装OpenWRT的软路由存储器IO性能太差(使用SD卡),但是千兆网络性能和内存性能却是实打实的,考虑到局域网内还有一台NAS,故尝试将根文件系统放在NAS上,然后使用NFS挂载到软路由上后再进入系统。
首先在服务器上安装NFS:
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install nfs-common nfs-kernel-server
创建一个共享路径,并确保其对其他用户可写。此处以/mnt/hdd/debian为例:
mkdir /mnt/hdd/debian
chmod ugo+w /mnt/hdd/debian
之后需要修改/etc/exports文件,添加共享的目录以及客户端。以下以客户端IP为192.168.1.3为例,在该文件中添加如下行:
/mnt/hdd/debian 192.168.1.3(rw,sync)
如果需要设置为只读,将rw改为ro即可。设置完毕后重启nfs服务:
sudo service nfs-kernel-server restart
客户端上需要安装nfs-common。如果使用OpenWRT,则需要保证内核支持nfs,可以用如下命令查看:
cat /proc/filesystems | grep nfs
如果有输出则说明内核支持,否则需要更换内核或固件,或尝试自行编译含有nfs的内核。有的固件将nfs编译为kmod的形式,可安装相应的软件包,通过加载内核模块以提供对nfs的支持。之后需要通过opkg安装nfs-utils:
opkg update
opkg install nfs-utils
之后在客户端上需先建立远程路径在本地的挂载点,然后便可挂载路径,部分发行版注意使用root权限,此处以/mnt/remote/debian为例,作为服务端的NAS的IP为192.168.1.2:
mkdir /mnt/remote/debian
mount -t nfs 192.168.1.2:/mnt/hdd/debian /mnt/remote/debian
之后服务端的/mnt/hdd/debian就会挂载在本地的/mnt/remote/debian,通过df可以查看剩余容量。
接下来的步骤与之前的方法类似,将子系统的文件拷贝到/mnt/remote/debian/中后,将/proc、/sys、/dev添加到子系统的目录中:
mount -o bind /proc /mnt/remote/debian/proc
mount -o bind /sys /mnt/remote/debian/sys
mount -o bind /dev /mnt/remote/debian/dev
mount -o bind /dev/pts /mnt/remote/debian/dev/pts
接着chroot进入该目录即可:
chroot /mnt/remote/debian/
此时,debian的根文件系统就存放在NFS中了。
在使用千兆网络和SSD的情况下,根文件系统的读写速度远快于原有的SD卡速度。但存在一些文件权限方面的问题,需要步骤后续解决。
[以下内容更新于2020.4.3]
将根文件系统存放在img文件中,使用ext4即可解决文件权限问题:
在OpenWRT上(其他系统上类似,注意使用root权限),先创建一个img文件,以下命令可创建一个大小为4G的img(注:如果支持fallocate,建议使用更快的fallocate创建空文件),并将其格式化为ext4:
dd if=/dev/zero of=/debian_rootfs.img bs=4K count=1M
mkfs.ext4 /debian_rootfs.img
之后以可读写的方式挂载该文件,以下以挂载到/mnt/img0为例,注意使用root权限:
mount -o loop,rw,sync /debian_rootfs.img /mnt/img0
将原有的根文件系统拷贝或移动到img0中即可,注意只有root用户才能完整地保留所有文件权限。完毕后记得运行umount /mnt/img0确保缓存全部写入到img0中。
然后将该文件移动到NAS的共享路径中,并注意附加写入权限(sudo chmod ugo+w /mnt/hdd/debian/debian_rootfs.img),否则远程挂载的时候可能文件系统会变为只读。
之后OpenWRT上先挂载远程nfs目录,再在nfs中挂载img0。
mount -t nfs -o rw,sync 192.168.1.2:/mnt/hdd/debian/ /mnt/remote
mount -o loop,rw,sync /mnt/remote/debian_rootfs.img /mnt/img0
然后注意需要将dev等目录添加到img0中:
mount -o bind /proc /mnt/img0/proc
mount -o bind /sys /mnt/img0/sys
mount -o bind /dev /mnt/img0/dev
mount -o bind /dev/pts /mnt/img0/dev/pts
然后chroot进入子系统即可:chroot /mnt/img0
此时,将不会再有nfs中文件从属错乱、权限未知等问题了。
//ps
大概除了我这奇葩的局域网构架,大概不会有什么实际情况会用到这样的例子吧...
由于宿舍晚上常年断电6小时,自己使用了12节18650制作了一个UPS,并且所有的局域网夜间设备都为低功耗设备,网关目前为NanoPi R2S(5V0.4A,2W),内网有一台FAST迷你千兆交换机FSG105C(5V0.1A,0.5W)和一台TPLink的WDR4310(12V0.6A,7.2W)提供5G Wifi接入和内网千兆互联,以及具有SATA接口和千兆网口的BananaPiM2U配合SSD(静态电流合计5V0.6A)作为NAS。
BananaPiM2U的CPU性能很烂(4x CortexA7 @1GHz),但是却有SATA接口和千兆网口,做NAS可以跑满SSD的写入带宽(不过是垃圾SSD罢了),实现内网访问NAS达到95MB/s的速度。而NanoPiR2S负责转发IPv6,以及使用DDNS服务便于在外访问回内网,但是这样NanoPi的CPU性能(4x CortexA53 @1.5GHz)几乎都是浪费的,这次也是为了利用起其相对强的CPU性能,才有了这样一整篇的奇妙操作。
``