Linux网络存储:NFS

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 $target>\n\tbacking-store ${partitionName}\n</target>" | 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' </dev/urandom | 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 $@


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值