• 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

    1. #!/bin/bash
    2. #coding:utf-8
    3. function make_partition() {
    4. local diskName=$1
    5. echo -e 'n\np\n\n\n\nw' | fdisk $diskName
    6. partprobe
    7. local lastErr=$?
    8. if [ $lastErr -eq 0 ]; then
    9. echo "make partition successfully."
    10. return 0
    11. else
    12. echo "make partition failed."
    13. exit $lastErr
    14. fi
    15. }
    16. function install_nfs() {
    17. yum install -y nfs-utils
    18. local lastErr=$?
    19. if [ $lastErr -eq 0 ]; then
    20. echo "NFS installed successfully."
    21. return 0
    22. else
    23. echo "NFS installed failed."
    24. exit $lastErr
    25. fi
    26. }
    27. function start_nfs() {
    28. systemctl start rpcbind && systemctl start nfs-server && systemctl enable rpcbind && systemctl enable nfs-server
    29. local lastErr=$?
    30. if [ $lastErr -eq 0 ]; then
    31. echo "NFS service started and enabled on boot."
    32. return 0
    33. else
    34. echo "NFS service start and enabl on boot failed."
    35. exit $lastErr
    36. fi
    37. }
    38. function add_nfs_config() {
    39. local exportDir=$1
    40. # Check if the dir already exists in the /etc/exports file
    41. if grep -q "$exportDir" /etc/exports; then
    42. echo "export dir $exportDir already exists in /etc/exports"
    43. return 1
    44. fi
    45. echo "$exportDir *(rw,sync,no_root_squash,no_subtree_check)" >> /etc/exports
    46. # Restart the iSCSI service to apply the changes
    47. systemctl restart nfs-server
    48. if [ $? -eq 0 ]; then
    49. echo "NFS configuration for target $target has been added"
    50. return 0
    51. else
    52. echo "NFS configuration for target $target has been failed"
    53. return 2
    54. fi
    55. }
    56. function install_iscsi() {
    57. yum install scsi-target-utils -y
    58. local lastErr=$?
    59. if [ $lastErr -eq 0 ]; then
    60. echo "iSCSI installed successfully."
    61. return 0
    62. else
    63. echo "iSCSI installed failed."
    64. exit $lastErr
    65. fi
    66. }
    67. function start_iscsi() {
    68. systemctl start tgtd && systemctl enable tgtd
    69. local lastErr=$?
    70. if [ $lastErr -eq 0 ]; then
    71. echo "iSCSI service started and enabled on boot."
    72. return 0
    73. else
    74. echo "iSCSI service start and enabl on boot failed."
    75. exit $lastErr
    76. fi
    77. }
    78. function add_iscsi_target() {
    79. #iqn.2017-03.com.longshuai:test.disk1
    80. local target=$1
    81. local partitionName=$2
    82. # Check if the target already exists in the targets.conf file
    83. if grep -q "$target" /etc/tgt/targets.conf; then
    84. echo "Target $target already exists in targets.conf"
    85. return 1
    86. fi
    87. # Append the iSCSI configuration to targets.conf
    88. echo -e "\n$target>\n\tbacking-store ${partitionName}\n" | tee -a /etc/tgt/targets.conf >/dev/null
    89. # Restart the iSCSI service to apply the changes
    90. systemctl restart tgtd
    91. if [ $? -eq 0 ]; then
    92. echo "iSCSI configuration for target $target has been added"
    93. return 0
    94. else
    95. echo "iSCSI configuration for target $target has been failed"
    96. return 2
    97. fi
    98. }
    99. function config_nfs() {
    100. local nfsDir="/data/nfs"
    101. local diskName="/dev/sda"
    102. local partitionName="/dev/sda3"
    103. # 1 install nfs
    104. install_nfs
    105. # 2 start nfs
    106. start_nfs
    107. # 3 make partition
    108. make_partition ${diskName}
    109. # 4 make fs and mount
    110. mkfs.xfs -f ${partitionName} && mkdir -p ${nfsDir} && mount ${partitionName} ${nfsDir}
    111. local lastErr=$?
    112. if [ $lastErr -ne 0 ]; then
    113. echo "make fs and mount failed"
    114. exit $lastErr
    115. fi
    116. # 5 add nfs config
    117. add_nfs_config ${nfsDir}
    118. }
    119. function config_iscsi() {
    120. local diskName="/dev/sda"
    121. local partitionName="/dev/sda3"
    122. # 1 install iscsi
    123. install_iscsi
    124. # 2 start nfs
    125. start_iscsi
    126. # 3 make partition
    127. make_partition ${diskName}
    128. # 4 add target
    129. local curdate=`date +%Y-%m`
    130. local randomStr=`tr -dc 'a-zA-Z0-9' head -c 12`
    131. local target="iqn.${curdate}.com.xxx:${randomStr}"
    132. add_iscsi_target $target $partitionName
    133. }
    134. function main() {
    135. local lastErr=0
    136. case $1 in
    137. nfs|NFS)
    138. config_nfs
    139. lastErr=$?
    140. ;;
    141. iscsi|iSCSI|ISCSI)
    142. config_iscsi
    143. lastErr=$?
    144. ;;
    145. *)
    146. echo "invalid storage type."
    147. lastErr=1
    148. ;;
    149. esac
    150. return $lastErr
    151. }
    152. main $@


     

  • 相关阅读:
    个人主页汇总 | 私信没空看,建议b站
    Immutable是什么?
    【用python的标准库画出显示实时时间的数码管】
    ASP.NET Core 6框架揭秘实例演示[23]:ASP.NET Core应用承载方式的变迁
    (二十二)Flask之上下文管理第三篇【收尾—讲一讲g】
    定岗定编设计:企业职能部门定岗定编设计项目成功案例
    ThreadX内核源码分析(SMP) - 核间互斥(arm)
    java代理示例
    使用 Vue CLI 脚手架生成 Vue 项目
    网络编程中的IO模型
  • 原文地址:https://blog.csdn.net/qdx411324962/article/details/133687318