NFS 网络文件系统 介绍、安装与使用

快速使用NFS(以centos7为例)

只想快速搭建一套nfs系统的童鞋,看到这一章就可以啦~

预设值:
	服务端:192.168.100.254
	客户端:192.168.100.10

1、安装
服务端与客户端:
[root@www ~]# yum install nfs-utils

2、配置与运行
服务器端:
[root@www ~]# mkdir -p /home/public
[root@www ~]# vi /etc/exports
/home/public         192.168.100.0/24(rw)   *.ev.ncku.edu.tw(ro,sync)

[root@www ~]# systemctl start rpcbind
[root@www ~]# systemctl enable rpcbind
[root@www ~]# systemctl start nfs
[root@www ~]# systemctl enable nfs

后期添加时,无需重启,只需重新加载
[root@www ~]# exportfs -a

检查:
[root@www ~]# showmount -e localhost

客户端:
[root@www ~]# systemctl start rpcbind
[root@www ~]# systemctl enable rpcbind

[root@clientlinux ~]# mkdir -p /home/nfs/public 
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/public /home/nfs/public

检查:
[root@clientlinux ~]# mount
或者
[root@clientlinux ~]# df -h
测试目录读写权限等:
[root@clientlinux ~]# cd /home/nfs/public
[root@clientlinux ~]# touch test.txt
[root@clientlinux ~]# cat test.txt
测试结束后记得删除:
[root@clientlinux ~]# rm test.txt

目录

快速使用NFS(以centos7为例)

NFS 网络文件系统 介绍、安装与使用

 1、什么是NFS?

2、NFS怎么用呢?

2.1 安装

2.2 服务端

2.3 客户端


NFS 网络文件系统 介绍、安装与使用

想要了解更多的童鞋,或者对上一部分存在疑惑的童靴欢迎继续往下看~

推荐查看(小编所有的介绍都是基于这篇文章,相当详细,详细到不行的地步):

鸟哥对NFS的介绍:http://cn.linux.vbird.org/linux_server/0330nfs.php

 1、什么是NFS?

        Network File System(NFS),网络文件系统,可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的文件。这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样。
        NFS 依赖 RPC,最主要的功能就是在指定每个 NFS 功能所对应的端口数字,并且回报给客户端,让客户端可以连结到正确的端口上去。
        NFS 配置权限,需要注意目录的使用账号对应UID,服务器是否允许写入,NFS 文件系统是否配置有写入权限。

2、NFS怎么用呢?

2.1 安装

NFS 会直接使用到内核功能,所以你的内核必须要有支持 NFS 才行。因此你的内核版本要大于等于 2.2 版,查看内核版本的方法:

[root@www ~]# uname -srm
Linux 3.10.0-957.12.2.el7.x86_64 x86_64

解释一下Linux 3.10.0-957.12.2.el7.x86_64 x86_64:

3 - 内核版本.
10 - 主修订版本.
0-957 - 次要修订版本.
12 - 补丁版本.

         NFS分为NFS服务端和NFS客户端两种角色,服务端就是本地存放文件的地方,而客户端可以远程访问文件。服务端和客户端都需要安装:

yum安装时会自动关联依赖:rpcbind
[root@www ~]# yum install nfs-utils

2.2 服务端

(1)结构

  • 配置文件:/etc/exports
  • 登录档案:/var/lib/nfs/目录下,一个文件是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 文件则记录曾经链接到此 NFS 服务器的相关客户端数据。
  • 相关命令:/usr/sbin/exportfs(取消或分享目录)、/usr/sbin/showmount(查看 NFS 分享出来的目录资源)

(2)用法

[root@www ~]# vi /etc/exports

/tmp         192.168.100.0/24(ro)   localhost(rw)   *.ev.ncku.edu.tw(ro,sync)
[分享目录]   [第一部主机(权限)]     [可用主机名]    [可用通配符]

关于配置文件的解释说明:

每一行最前面是要分享出来的目录,注意喔!是以目录为单位啊! 然后这个目录可以依照不同的权限分享给不同的主机。
主机后面以小括号 () 设计权限参数, 若权限参数不止一个时,则以逗号","分开,且不能有空格。且主机名与小括号是连在一起的,也不能有空格

名词解释:

参数值内容说明
rw
ro
该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。
sync
async
sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘!
no_root_squash
root_squash
客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行!
all_squash不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦!
anonuid
anongid
anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 啰。
示例:
[root@www ~]# mkdir /home/public
[root@www ~]# setfacl -mg:vbirdgroup:rwx /home/public

[root@www ~]# mkdir /home/test 
[root@www ~]# setfacl -mu:dmtsai:rwx /home/test

[root@www ~]# groupadd -g 45 nfsanon 
[root@www ~]# useradd -u 45 -g nfsanon nfsanon 
[root@www ~]# mkdir /home/linux 
[root@www ~]# setfacl -mu: nfsanon:rwx /home/linux

[root@www ~]# vi /etc/exports
#1.任何人都可以用我的/tmp ,用*来处理主机名称,重点在no_root_squash 
/tmp *(rw,no_root_squash)

#2.任何人都可以读取我的/home/public,但只有来自我的区域网路192.168.100.0/24 这个网域且加入vbirdgroup的用户才能够读写
/home/public 192.168.100.0/24(rw) *(ro)

#3.仅给某个单一主机使用的目录设定,使用者的身份是dmtsai 才具有完整的权限
/home/test 192.168.100.10(rw)

#4.开放匿名登入,那么重点是all_squash,并且要配合anonuid喔喔,这样在写入目录时,该目录的所有人与所有群组,就会变成/etc/passwd 里面对应的UID 为45的那个身份的使用者
/home/linux *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)

场景体验:
用户1:与服务器拥有相同的uid和账号
假设我在192.168.100.10 登入这部NFS (IP 假设为192.168.100.254) 伺服器,并且我在192.168.100.10 的帐号为dmtsai 这个身份,同时,在这部NFS 上面也有dmtsai 这个帐号, 并具有相同的UID ,果真如此的话,那么:
1、由于192.168.100.254 这部NFS 伺服器的/tmp 权限为-rwxrwxrwt ,所以我(dmtsai 在192.168.100.10 上面) 在/tmp 底下具有存取的权限,并且写入的档案所有人为dmtsai ;
2、在/home/public 当中,由于我有读写的权限,所以如果在/home/public 这个目录的权限对于dmtsai 有开放写入的话,那么我就可以读写,并且我写入的档案所有人是dmtsai 。但是万一 /home/public 对于dmtsai 这个使用者并没有开放可以写入的权限时, 那么我还是没有办法写入档案喔!这点请特别留意!
3、在/home/test 当中,我的权限与/home/public 相同的状态!还需要NFS 伺服器的/home/test 对于 dmtsai 有开放权限;
4、在/home/linux 当中就比较麻烦!因为不论你是何种user ,你的身份一定会被变成UID=45 这个帐号!所以,这个目录就必需要针对UID = 45 的那个帐号名称,修改他的权限才行!

用户2:与服务器的账号并不相同
假如我在192.168.100.10 的身份为vbird (uid 为600),但是192.168.100.254 这部NFS 主机却没有uid=600 的帐号时,情况会变成怎样呢?
1、我在/tmp 底下还是可以写入,只是该档案的权限会保持为UID=600 ,因此伺服器端看起来就会怪怪的, 因为找不到UID=600 这个帐号的显示,故档案拥有者会填上600 呦!
2、我在/home/public 里面是否可以写入,还需要视/home/public 的权限而定,不过,由于没有加上all_squash 的参数, 因此在该目录下会保留用户端的使用者UID,同上一点所示。
3、/home/test 的观点与/home/public 相同!
4、/home/linux 底下,我的身份就被变成UID = 45 那个使用者就是了!

用户3:root
假如我在192.168.100.10 的身份为root 呢?root 这个帐号每个系统都会有呀!权限变成怎样呢?

1、我在/tmp 里面可以写入,并且由于no_root_squash 的参数,改变了预设的 root_squash 设定值,所以在/tmp 写入的档案所有人为root 喔!
2、我在/home/public 底下的身份还是被压缩成为nobody 了!因为预设属性里面都具有 root_squash 呢!所以,如果/home/public 有针对nobody 开放写入权限时,那么我就可以写入,但是档案所有人变成nobody 就是了!
3、/home/test 与/home/public 相同;
4、/home/linux 的情况中,我root 的身份也被压缩成为UID = 45 的那个使用者了!
 

(3)运行

#启动

[root@www ~]# /etc/init.d/rpcbind start 
#如果rpcbind本来就已经在执行了,那就不需要启动啊!

[root@www ~]# /etc/init.d/nfs start 
#有时候某些distributions可能会出现如下的警告讯息:
exportfs: /etc/exports [3]: No 'sync' or 'async' option specified 
for export "192.168.100.10:/home/test".
  Assuming default behaviour ('sync').
# 上面的警告讯息仅是在告知因为我们没有指定sync 或async 的参数,
# 则NFS 将预设会使用sync 的资讯而已。你可以不理他,也可以加入/etc/exports。

[root@www ~]# /etc/init.d/nfslock start
#如果你想要增加一些 NFS 服务器的数据一致性功能时,可能需要用到 rpc.lockd 及 rpc.statd 等 RPC 服务, 那么或许你可以增加一个服务,那就是 nfslock 啰!

#自启动设置
[root@www ~]# chkconfig rpcbind on 
[root@www ~]# chkconfig nfs on 
[root@www ~]# chkconfig nfslock on

查看是否正常启动(带有NFSD和rpc.statd的字段的相关说明):

[root@www ~]# tail /var/log/messages
Jul 27 17:10:39 www kernel: Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
Jul 27 17:10:54 www kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state 
recovery directory
Jul 27 17:10:54 www kernel: NFSD: starting 90-second grace period
Jul 27 17:11:32 www rpc.statd[3689]: Version 1.2.2 starting

在确认启动没有问题之后,接下来我们来瞧一瞧那么NFS 到底开了哪些端口?

[root@www ~]# netstat -tulnp| grep -E '(rpc|nfs)'
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:875 0.0.0.0:* LISTEN 3631/rpc.rquotad
tcp 0 0 0.0.0.0: 111     0.0.0.0:* LISTEN 3601/rpcbind
tcp 0 0 0.0.0.0:48470 0.0.0.0:* LISTEN 3647/rpc.mountd
tcp 0 0 0.0.0.0:59967 0.0.0.0:* LISTEN 3689/rpc.statd
tcp 0 0 0.0.0.0: 2049    0.0.0.0:* LISTEN -
udp 0 0 0.0.0.0:875 0.0.0.0:* 3631/rpc.rquotad
udp 0 0 0.0.0.0: 111     0.0.0.0:* 3601/rpcbind
udp 0 0 0.0.0.0:897 0.0.0.0:* 3689/rpc.statd
udp 0 0 0.0.0.0:46611 0.0.0.0:* 3647/rpc.mountd
udp 0 0 0.0.0.0:808 0.0.0.0:* 3601/rpcbind
udp 0 0 0.0.0.0:46011 0.0.0.0:* 3689/rpc.statd

注意看到上面喔!总共产生了好多的port 喔!真是可怕!不过主要的端口是:

rpcbind 启动的port 在111 ,同时启动在UDP 与TCP;
nfs 本身的服务启动在port 2049 上头!
其他rpc.* 服务启动的port 则是随机产生的,因此需向port 111 注册。

好了,那我怎么知道每个RPC 服务的注册状况?没关系,你可以使用rpcinfo 来观察的。
[root@www ~]# rpcinfo -p [IP|hostname] 
[root@www ~]# rpcinfo -t|-u IP|hostname程式名称
选项与参数:
-p :针对某IP (未写则预设为本机) 显示出所有的port 与porgram 的资讯;
-t :针对某主机的某支程式检查其TCP 封包所在的软体版本;
-u :针对某主机的某支程式检查其UDP 封包所在的软体版本;

# 1.显示出目前这部主机的RPC状态
[root@www ~]# rpcinfo -p localhost
   program vers proto port service
    100000 4 tcp 111 portmapper
    100000 3 tcp 111 portmapper
    100000 2 tcp 111 portmapper
    100000 4 udp 111 portmapper
    100000 3 udp 111 portmapper
    100000 2 udp 111 portmapper
    100011 1 udp 875 rquotad
    100011 2 udp 875 rquotad
    100011 1 tcp 875 rquotad
    100011 2 tcp 875 rquotad
    100003 2 tcp 2049 nfs
....(底下省略).... 
#程式代号NFS版本封包类型埠口服务名称

# 2.针对nfs这个程式检查其相关的软体版本资讯(仅察看TCP封包) 
[root@www ~]# rpcinfo -t localhost nfs
program 100003 version 2 ready and waiting
program 100003 version 3 ready and waiting
program 100003 version 4 ready and waiting
# 可发现提供nfs 的版本共有三种,分别是2, 3, 4 版呦!

我们可以在server 端先自我测试一下是否可以连线喔!就是利用showmount 这个指令来查阅!

连接
[root@www ~]# showmount [-ae] [hostname|IP]
选项与参数:
-a :显示目前主机与用户端的NFS 连线分享的状态;
-e :显示某部主机的/etc/exports 所分享的目录资料。

# 请显示出刚刚我们所设定好的相关exports分享目录资讯
[root@www ~]# showmount -e localhost
Export list for localhost:
/tmp *
/home/linux *.centos.vbird
/home/test 192.168.100.10
/home/public (everyone)

很简单吧!所以,当你要扫瞄某一部主机他提供的NFS 分享的目录时,就使用showmount -e IP (或hostname) 即可!非常的方便吧!这也是NFS client 端最常用的指令喔! 另外, NFS 关于目录权限设定的资料非常之多!在/etc/exports 只是比较特别的权限参数而已,还有很多预设参数呢!这些预设参数在哪?我们可以检查一下/var/lib/nfs/etab 就知道了!

[root@www ~]# tail /var/lib/nfs/etab
/home/public 192.168.100.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,
no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
# 上面是同一行,可以看出除了rw, sync, root_squash 等等,
# 其实还有anonuid 及anongid 等等的设定!

上面仅仅是一个小范例,透过分析anonuid=65534对比/etc/passwd后,会发现CentOS出现的是nfsnobody啦!这个帐号在不同的版本都可能会不一样的!另外,如果有其他用户端挂载了你的NFS档案系统时,那么该用户端与档案系统资讯就会被记录到/var/lib/nfs/xtab里头去的!

另外,如果你想要重新处理/etc/exports 档案,当重新设定完/etc/exports 后需不需要重新启动nfs ?不需要啦!如果重新启动nfs 的话,要得再向RPC 注册!很麻烦~这个时候我们可以透过exportfs 这个指令来帮忙喔!

[root@www ~]# exportfs [-aruv]
选项与参数:
-a :全部挂载(或卸载) /etc/exports 档案内的设定
-r :重新挂载/etc/exports 里面的设定,此外,亦同步更新/etc/exports
     及/var/lib/nfs/xtab 的内容!
-u :卸载某一目录
-v :在export 的时候,将分享的目录显示到萤幕上!

# 1.重新挂载一次/etc/exports的设定
[root@www ~]# exportfs -arv
exporting 192.168.100.10:/home/test
exporting 192.168.100.0/24:/home/public
exporting *.centos.vbird:/home/linux
exporting *:/home/public
exporting *:/tmp

# 2.将已经分享的NFS目录资源,通通都卸载
[root@www ~]# exportfs -auv 
#这时如果你再使用showmount -e localhost就会看不到任何资源了!

(4)安全

一般来说, NFS 的服务仅会对内部网域开放,不会对网际网路开放的。
关于防火墙的部分,略,嘿嘿,不过有想了解的可以看之前推荐大家的鸟哥的介绍哈 ~

  • NFS 服务器关机前的注意事项:

建议你的 NFS Server 想要关机之前,能先『关掉 rpcbind 与 nfs 』这两个东西! 如果无法正确的将这两个 daemons 关掉,那么先以 netstat -utlp 找出 PID ,然后以 kill 将他关掉先!这样才有办法正常的关机成功喔!这个请特别特别的注意呢!

2.3 客户端

(1)如何挂载
1、确认本地端已经启动了rpcbind 服务!
2、扫瞄NFS伺服器分享的目录有哪些,并了解我们是否可以使用( showmount );
3、在本地端建立预计要挂载的挂载点目录(mkdir);
4、利用mount 将远端主机直接挂载到相关目录。

# 1.启动必备的服务:若没有启动才启动,有启动则保持原样不动。
[root@clientlinux ~]# /etc/init.d/rpcbind start 
[root@clientlinux ~]# /etc/init.d/nfslock start 
#一般来说,系统预设会启动rpcbind ,不过鸟哥之前关闭过,所以要启动。
# 另外,如果伺服器端有启动nfslock 的话,用户端也要启动才能生效!

# 2.查询伺服器提供哪些资源给我们使用呢?
[root@clientlinux ~]# showmount -e 192.168.100.254
Export list for 192.168.100.254:
/tmp *
/home/linux *.centos.vbird
/home/test 192.168.100.10
/home/public (everyone)    <==这是等一下我们要挂载的目录

# 3.建立挂载点,并且实际挂载看看啰!
[root@clientlinux ~]# mkdir -p /home/nfs/public 
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/public \ 
> /home/nfs/public 
#注意一下挂载的语法!『 -t nfs 』指定档案系统类型,
# IP:/dir 则是指定某一部主机的某个提供的目录!另外,如果出现如下错误:
mount: 192.168.100.254:/home/public failed, reason given by server: No such file 
or directory
# 这代表你在Server 上面并没有建立/home/public 啦!自己在伺服器端建立他吧!

# 4.总是得要看看挂载之后的情况如何,可以使用df或mount啦!
[root@clientlinux ~]# df
档案系统1K-区段已用可用已用% 挂载点
....(中间省略).... 
192.168.100.254:/home/public 
                       7104640 143104 6607104 3% /home/nfs/public
					   
# 5、如何将挂载的NFS目录卸载?
[root@clientlinux ~]# umount /home/nfs/public

 (2)安全

#一般来说,如果你的NFS 伺服器所提供的只是类似/home 底下的个人资料, 应该不需要可执行、SUID 与装置档案,因此当你在挂载的时候,可以这样下达指令喔:

[root@clientlinux ~]# umount /home/nfs/public 
[root@clientlinux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \ 
> 192.168.100.254:/home/public /home/nfs/public

[root@clientlinux ~]# mount | grep addr
192.168.100.254:/home/public on /home/nfs/public type nfs (rw,noexec,nosuid,nodev,vers=4,addr=192.168.100.254,clientaddr=192.168.100.10)

#这样一来你所挂载的这个档案系统就只能作为资料存取之用,相对来说,对于用户端是比较安全一些的。所以说,这个nosuid, noexec, nodev等等的参数可得记得啊!

#通常如果你的NFS 是用在高速运作的环境当中的话,那么可以建议加上这些参数的说:

[root@clientlinux ~]# umount /home/nfs/public 
[root@clientlinux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \ 
> -o bg,soft,rsize=32768,wsize=32768 \ 
> 192.168.100.254:/home/public /home/nfs/public

#则当你的192.168.100.254这部伺服器因为某些因素而离线时,你的NFS可以继续在背景当中重复的呼叫!直到NFS伺服器再度上线为止。这对于系统的持续操作还是有帮助的啦!当然啦,那个rsize与wsize的大小则需要依据你的实际网路环境而定喔!

2.4 将 NFS 开机即挂载

我们知道开机就挂载的挂载点与相关参数是写入/etc/fstab 中的,那NFS 能不能写入/etc/fstab 当中呢?
非常可惜的是, 不可以呢!(这一点我也惊奇\(〇O〇)/,因为一般都是这样设置的,而且管用,不过鸟哥说的也有道理)
为啥呢?分析一下开机的流程,我们可以发现网路的启动是在本机挂载之后,
因此当你利用/etc/fstab 尝试挂载NFS 时,系统由于尚未启动网路,
所以肯定是无法挂载成功的啦!那怎办?简单!就写入/etc/rc.d/rc.local 即可!

[root@clientlinux ~]# vim /etc/rc.d/rc.local 
mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 \
192.168.100.254:/home/public /home/nfs/public

 关于/etc/fstab 的补充 by 20220518

写入/etc/fstab虽然不能用于开机即挂载,但是不仅有记录功能,也能很方便的挂载:

比如新增挂载时,可以按照以下格式写入/etc/fstab:

192.168.100.254:/home/public   /home/nfs/public  nfs  defaults  0 0

然后执行以下命令生效:

mount -a

2.5 自动挂载 autofs 的使用

        这部分之前没有研究过,也是觉得很神奇,但是并没有更深入的研究,大家感兴趣的话,欢迎尝试,并留言使用感受哈~

        神奇的功能:有用到服务器的数据时才自动挂载,没有使用了就会自动卸除!

建立主设定档/etc/auto.master ,并指定侦测的特定目录

[root@clientlinux ~]# vim /etc/auto.master 
/home/nfsfile /etc/auto.nfs
上述资料中比较需要注意的是,那个/home/nfsfile 目录不需要存在,因为autofs 会主动的建立该目录!如果你建立了,可能反而会出问题~因此,先确定一下没有该目录吧!

建立资料对应档内(/etc/auto.nfs) 的挂载资讯与伺服器对应资源
刚刚我们所指定的/etc/auto.nfs 是自行设定的,所以这个档案是不存在的。那么这个档案的格式是如何呢?你可以这样看:

[本地端次目录] [-挂载参数] [伺服器所提供的目录]
选项与参数:
[本地端次目录] :指的就是在/etc/auto.master 内指定的目录之次目录
[-挂载参数] :就是前一小节提到的rw,bg,soft 等等的参数啦!可有可无;
[伺服器所提供的目录] :例如192.168.100.254:/home/public 等

[root@clientlinux ~]# vim /etc/auto.nfs 
public -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/public
testing -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/test
temp -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/tmp 
#参数部分,只要最前面加个-符号即可!

这样就可以建立对应了!要注意的是,那些/home/nfsfile/public 是不需要事先建立的!咱们的autofs 会事情况来处理喔!好了,接下来让我们看看如何实际运作吧!

启动与观察

[root@clientlinux ~]# /etc/init.d/autofs stop 
[root@clientlinux ~]# /etc/init.d/autofs start
或
[root@clientlinux ~]# systemctl start autofs 
[root@clientlinux ~]# systemctl enable autofs 


#很奇怪!非常怪!CentOS 6.x的autofs使用restart会失效!所以鸟哥才进行两次

分享就到这结束啦~

很多地方直接搬上来了,之后再慢慢改吧,最重要的是先记下来,别让自己遗漏了知识~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值