起因
由于工作中需要两台服务器之间共享一块硬盘空间,因此准备搭建一个nfs服务器,下面会为大家阐述安装步骤和用php去访问共享分区
简介NFS
NFS(Netword File System),网络文件系统,是Unix系统之间实现磁盘文件共享的一种方法,它支持应用程序在客户端通过网络访问位于服务器磁盘中数据的一种文件系统协议。(ps:我理解的NFS呢,是一种C/S的架构,SERVER共享目录给CLIENT使用)
原理
NFS运行在SUN的RPC(Remote Procedure Call, 远程过程调用)基础上, RPC定义了一种与系统无关的方法来实现进程间通信. 由此, NFS server也可以看作是RPC server.
正因为NFS是一个RPC服务程序, 所以在使用它之前, 先要映射好端口——通过portmap设定. 比如: 某个NFS client发起NFS服务请求时, 它需要先得到一个端口(port). 所以它先通过portmap得到port number.
服务器端配置
安装服务器端软件
sudo apt-get install nfs-kernel-server
安装完nfs-kernel-server后,系统会自动为我们安装好portmap(端口映射器)和nfs-common(客户端软件,用于测试)
配置portmap
sudo vim /etc/exports
注释掉一条配置语句如下:
#OPTIONS = "-i 127.0.0.1"
重启portmap(ps:真bug,portmap竟然不支持直接restart)
sudo service portmap stop
sudo service portmap start
配置共享目录
sudo vim /etc/exports
一个典型的共享目录配置代码如下:
/home/xiaoyi *(rw,sync,no_subtree_check)
/home :服务器端需要共享的文件目录(可自己任意指定)
* : 容许访问的计算机,可以是以下内容:
单个机器=>一个完整的IP地址,一个全限定域名(能够被服务器解析),主机名(能够被服务器解析)
通配符指定的主机名,IP地址中不允许使用通配符,*表示允许所有能访问到server的主机来连接共享目录
IP网络:192.168.1.1/24这种IP地址+子网掩码的方式
():共享选项
rw:客户端拥有读写权限(ro:代码只有读权限)
sync:同步写入资料到内存和硬盘中
no_subtree_check:不检测子目录权限
root_squash:如果客户端使用root权限访问共享目录,则会被认为是匿名用户(权限缩小)
no_root_squash:如果客户端使用root权限访问共享目录,权限依旧为root
配置完成后,重启nfs-server服务
sudo /etc/init.d/nfs-kernel-server restart
客户端配置
安装客户端软件
sudo apt-get install nfs-common
同样的,apt会自动帮你安装好portmap
配置portmap
sudo vim /etc/default/portmap
注释掉一条命令如下:
#OPTIONS="-i 127.0.0.1"
重启portmap
sudo service portmap stop
sudo service portmap start
挂在服务器端共享目录到本地
sudo mount server_ip:/share_nfs_directory client_nfs_directory
取消挂载目录
sudo umonut client_nfs_directory
PHP操作NFS挂载分区
//1.测试创建目录
$temp_dir = "/srv/www/nfs/image";
if(mkdir($temp_dir))
{
echo "PHP操作nfs挂载分区目录成功!\n";
}else
{
echo "PHP操作nfs挂载分区目录失败!\n";
}
//2.测试创建文件
$temp_file = $temp_dir."/ceshi.txt";
if(!$fp = fopen($temp_file, 'a'))
{
echo "创建文件失败!\n";
}
$content = "hello world!\n";
if(fwrite($fp, $content))
{
echo "www-data用户写入成功!\n";
}else
{
echo "写入失败!\n";
}
fclose($fp);