NSF 笔记:
NFS是通过网络来进行服务器和客户端之间的数据传输的,我们大家都知道,要想通过网络进行传输,必须得知道是通过哪一个端口进行传输的!
NFS服务器对于端口的选择是随机的,那么问题在于,服务器端随机选择的端口,客户端如何才能知道呢?
这就有了第三方的管理:
NFS服务器端,通过RPC(remote procedure call:远程过程调用)来实现,RPC统一管理NFS的端口
RPC统一对外端口是111,使用NFS的时候,必须先启动RPC,再启动NFS,这样NFS才能到RPC去注册端口信息,然后客户端向服务器的RPC请求服务器的NFS端口信息,这样就能够传输数据了。
实现过程:
1) 服务器端启动RPC服务,对外开放端口111
2) 启动NFS服务,向RPC注册端口。
3) 客户端启动RPC,向服务器端RPC请求服务器的NFS端口
4) 服务器端RPC服务反馈NFS端口给客户端
5) 客户端获取NFS端口,建立和服务器端的连接,进行数据传输!
Ubuntu环境下:
① 安装必要软件
sudo apt-get install nfs-kernel-server centos下执行:yum install -y nfs-utils
上述命令,apt会自动安装nfs-common、rpcbind等13个安装包
② 编写配置文件
#配置文件在 /etc/exports
sudo vim /etc/exports
#最后一行添加配置:共享目录 可连接的客户端网段ip(指定网段:192.168.0.0/16或者完全开放: *)
/home/dong/embeded_study 192.168.7.2(rw,sync,no_root_squash,no_subtree_check)
配置说明:
/home/dong/embeded_study:NFS服务器端的目录,用于共享
192.168.7.2:允许的IP访问,也可以使用 * ,允许所有网段
rw:挂接此目录的客户端对该共享目录的读写权限
sync:资料同步写入内存和硬盘
no_root_squash:root用户具有对根目录的完全管理访问权限
no_subtree_check:不检查父目录的权限
③ 更新exports文件
sudo exportfs -arv
-a:全部mount或umount文件/etc/exports中的内容。
-r:重新mount文件/etc/exports中的共享内容。
-u:umount目录。
-v:在exportfs的时候,将详细的信息输出到屏幕上。
④ 启动nfs服务
sudo /etc/init.d/rpcbind start #先启动rpcbind
sudo /etc/init.d/nfs-kernel-server start #再启动nfs
或
systemctl start rpcbind
systemctl start nfs-kernel-server
systemctl enable rpcbind
systemctl enable nfs-kernel-server
centos下执行:
systemctl start rpcbind
systemctl start nfs-server
systemctl enable rpcbind
systemctl enable nfs-server
一定得先启动rpcbind
⑤ 其他命令
#显示已经mount到本机nfs目录的客户端机器。
sudo showmount -e localhost
#将配置文件中的目录全部重新export一次!无需重启服务。
sudo exportfs -rv
#查看NFS的运行状态
sudo nfsstat
#查看rpc执行信息,可以用于检测rpc运行情况
sudo rpcinfo
#查看网络端口,NFS默认是使用111端口。
sudo netstat -tu -4
客户端使用:
① 安装工具
sudo apt install nfs-common
上述命令,apt会自动安装nfs-common、rpcbind等12个安装包
② 查看共享目录
#显示指定的(ip_localname)NFS服务器上export出来的目录
#ip_localname为服务端主机名或IP地址
sudo showmount -e ip_localname
#这一步,如果有问题,需要进行排查
#可能遇到timeout、unable to send等相关问题,排查服务器rpcbind、nfs启动顺序,客户端的ip地址是否设置正确,以及服务器端的/etc/hosts中,ip和计算机名是否匹配等等
③ 创建挂载目录
通过上一个showmount命令,可以查询到服务器端共享的文件
接下来就是挂载到客户端了!
#创建一个目录,用于挂载
sudo mkdir -p ./share_dir
④ 挂载
#将NFS服务器IP上的目录,挂载到本地的/data/use/目录下
mount -t nfs ip_localname:/data/use /data/use
⑤ 查询挂载情况
#完成挂载后,可以查询挂载情况
df -h
⑥ 自动挂载设置
vim /etc/fstab
ip_localname:/data/freeswitch /data/freeswitch nfs defaults 0 0
⑥ 参数列表
NFS常用参数
ro——只读访问
rw——读写访问
sync——所有数据在请求时写入共享
async——nfs在写入数据前可以响应请求
secure——nfs通过1024以下的安全TCP/IP端口发送
insecure——nfs通过1024以上的端口发送
wdelay——如果多个用户要写入nfs目录,则归组写入(默认)
no_wdelay——如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置
hide——在nfs共享目录中不共享其子目录
no_hide——共享nfs目录的子目录
subtree_check——如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认)
no_subtree_check——和上面相对,不检查父目录权限
all_squash——共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash——保留共享文件的UID和GID(默认)
root_squash——root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash——root用户具有根目录的完全管理访问权限
anonuid=xxx——指定nfs服务器/etc/passwd文件中匿名用户的UID
anongid=xxx——指定nfs服务器/etc/passwd文件中匿名用户的GID
Linux系统中通过service管理的,需要在/etc/init.d/目录下创建启动程序
启动
service rpcbind start
开机启动
chkconfig rpcbind on
通过systemctl管理的,需要在/lib/systemd/system/配置相应的service
启动
systemctl start rpcbind
开机启动
systemctl enable rpcbind
- #!/bin/bash
- #coding:utf-8
-
- function make_partition() {
- local diskName=$1
- echo -e 'n\np\n\n\n\nw' | fdisk $diskName
- partprobe
- local lastErr=$?
- if [ $lastErr -eq 0 ]; then
- echo "make partition successfully."
- return 0
- else
- echo "make partition failed."
- exit $lastErr
- fi
- }
-
- function install_nfs() {
- yum install -y nfs-utils
- local lastErr=$?
- if [ $lastErr -eq 0 ]; then
- echo "NFS installed successfully."
- return 0
- else
- echo "NFS installed failed."
- exit $lastErr
- fi
- }
-
- function start_nfs() {
- systemctl start rpcbind && systemctl start nfs-server && systemctl enable rpcbind && systemctl enable nfs-server
- local lastErr=$?
- if [ $lastErr -eq 0 ]; then
- echo "NFS service started and enabled on boot."
- return 0
- else
- echo "NFS service start and enabl on boot failed."
- exit $lastErr
- fi
- }
-
- function add_nfs_config() {
- local exportDir=$1
- # Check if the dir already exists in the /etc/exports file
- if grep -q "$exportDir" /etc/exports; then
- echo "export dir $exportDir already exists in /etc/exports"
- return 1
- fi
-
- echo "$exportDir *(rw,sync,no_root_squash,no_subtree_check)" >> /etc/exports
-
- # Restart the iSCSI service to apply the changes
- systemctl restart nfs-server
- if [ $? -eq 0 ]; then
- echo "NFS configuration for target $target has been added"
- return 0
- else
- echo "NFS configuration for target $target has been failed"
- return 2
- fi
- }
-
- function install_iscsi() {
- yum install scsi-target-utils -y
- local lastErr=$?
- if [ $lastErr -eq 0 ]; then
- echo "iSCSI installed successfully."
- return 0
- else
- echo "iSCSI installed failed."
- exit $lastErr
- fi
- }
-
- function start_iscsi() {
- systemctl start tgtd && systemctl enable tgtd
- local lastErr=$?
- if [ $lastErr -eq 0 ]; then
- echo "iSCSI service started and enabled on boot."
- return 0
- else
- echo "iSCSI service start and enabl on boot failed."
- exit $lastErr
- fi
- }
-
- function add_iscsi_target() {
- #iqn.2017-03.com.longshuai:test.disk1
- local target=$1
- local partitionName=$2
-
- # Check if the target already exists in the targets.conf file
- if grep -q "$target" /etc/tgt/targets.conf; then
- echo "Target $target already exists in targets.conf"
- return 1
- fi
-
- # Append the iSCSI configuration to targets.conf
- echo -e "\n
$target >\n\tbacking-store ${partitionName}\n" | tee -a /etc/tgt/targets.conf >/dev/null -
- # Restart the iSCSI service to apply the changes
- systemctl restart tgtd
- if [ $? -eq 0 ]; then
- echo "iSCSI configuration for target $target has been added"
- return 0
- else
- echo "iSCSI configuration for target $target has been failed"
- return 2
- fi
- }
-
- function config_nfs() {
- local nfsDir="/data/nfs"
- local diskName="/dev/sda"
- local partitionName="/dev/sda3"
-
- # 1 install nfs
- install_nfs
- # 2 start nfs
- start_nfs
- # 3 make partition
- make_partition ${diskName}
- # 4 make fs and mount
- mkfs.xfs -f ${partitionName} && mkdir -p ${nfsDir} && mount ${partitionName} ${nfsDir}
- local lastErr=$?
- if [ $lastErr -ne 0 ]; then
- echo "make fs and mount failed"
- exit $lastErr
- fi
- # 5 add nfs config
- add_nfs_config ${nfsDir}
- }
-
- function config_iscsi() {
- local diskName="/dev/sda"
- local partitionName="/dev/sda3"
-
- # 1 install iscsi
- install_iscsi
- # 2 start nfs
- start_iscsi
- # 3 make partition
- make_partition ${diskName}
- # 4 add target
- local curdate=`date +%Y-%m`
- local randomStr=`tr -dc 'a-zA-Z0-9' head -c 12`
- local target="iqn.${curdate}.com.xxx:${randomStr}"
- add_iscsi_target $target $partitionName
- }
-
- function main() {
- local lastErr=0
- case $1 in
- nfs|NFS)
- config_nfs
- lastErr=$?
- ;;
- iscsi|iSCSI|ISCSI)
- config_iscsi
- lastErr=$?
- ;;
- *)
- echo "invalid storage type."
- lastErr=1
- ;;
- esac
- return $lastErr
- }
-
- main $@