linux中的文件系统

文件系统

文件系统狭义的概念是一种对存储设备上的数据进行组织和控制的机制。在Linux 下,文件的含义比较广泛,文件的概念不仅仅包含通常意义的保存在磁盘的各种格式的数据,毕竟“linux下一切皆文件”。

文件系统分为:块设备文件系统(存储设备是机械硬盘和 SSD 等块,如EXT2/3/4)、闪存文件系统(存储设备 NOR 闪存、NAND 闪存,常用的闪存文件系统有目录型闪存文件系统2JFFS2、无序区块镜像文件系统UBIFS)、内存文件系统(文件在内存中,如tmpfs)、伪文件系统。

传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等;日志式文件系统: ext3 /ext4 / ReiserFS / Windows’ NTFS / IBM’s JFS / SGI’s XFS / ZFS;网络文件系统: NFS / SMBFS

查看自己的linux系统支持的文件系统

[root@lc133 ~]# ls -l /lib/modules/$(uname -r)/kernel/fs
总用量 56
drwxr-xr-x 2 root root    19 3月  15 2022 9p
drwxr-xr-x 2 root root    21 3月  15 2022 afs
-rwxr--r-- 1 root root 29096 3月  11 2022 binfmt_misc.ko
drwxr-xr-x 2 root root    22 3月  15 2022 btrfs
drwxr-xr-x 2 root root    27 3月  15 2022 cachefiles
drwxr-xr-x 2 root root    21 3月  15 2022 ceph
drwxr-xr-x 2 root root    21 3月  15 2022 cifs
drwxr-xr-x 2 root root    23 3月  15 2022 cramfs
drwxr-xr-x 2 root root    20 3月  15 2022 dlm
drwxr-xr-x 2 root root    25 3月  15 2022 ecryptfs
drwxr-xr-x 2 root root    22 3月  15 2022 exfat
drwxr-xr-x 2 root root    21 3月  15 2022 ext4
drwxr-xr-x 2 root root    21 3月  15 2022 f2fs
drwxr-xr-x 2 root root    51 3月  15 2022 fat
drwxr-xr-x 2 root root    25 3月  15 2022 freevxfs
drwxr-xr-x 2 root root    24 3月  15 2022 fscache
drwxr-xr-x 2 root root    55 3月  15 2022 fuse
drwxr-xr-x 2 root root    21 3月  15 2022 gfs2
drwxr-xr-x 2 root root    20 3月  15 2022 hfs
drwxr-xr-x 2 root root    24 3月  15 2022 hfsplus
drwxr-xr-x 2 root root    22 3月  15 2022 isofs
drwxr-xr-x 2 root root    21 3月  15 2022 jbd2
drwxr-xr-x 2 root root    22 3月  15 2022 ksmbd
drwxr-xr-x 2 root root    22 3月  15 2022 lockd
-rwxr--r-- 1 root root 18480 3月  11 2022 mbcache.ko
drwxr-xr-x 2 root root    22 3月  15 2022 netfs
drwxr-xr-x 5 root root   111 3月  15 2022 nfs
drwxr-xr-x 2 root root    40 3月  15 2022 nfs_common
drwxr-xr-x 2 root root    21 3月  15 2022 nfsd
drwxr-xr-x 2 root root    23 3月  15 2022 nilfs2
drwxr-xr-x 2 root root  4096 3月  15 2022 nls
drwxr-xr-x 2 root root    25 3月  15 2022 orangefs
drwxr-xr-x 2 root root    24 3月  15 2022 overlayfs
drwxr-xr-x 2 root root    24 3月  15 2022 pstore
drwxr-xr-x 2 root root    45 3月  15 2022 smbfs_common
drwxr-xr-x 2 root root    25 3月  15 2022 squashfs
drwxr-xr-x 2 root root    20 3月  15 2022 udf
drwxr-xr-x 2 root root    20 3月  15 2022 ufs
drwxr-xr-x 2 root root    20 3月  15 2022 xfs
drwxr-xr-x 2 root root    23 3月  15 2022 zonefs

查看内存中已加载的文件系统

[root@lc133 ~]# cat /proc/filesystems
nodev   sysfs
nodev   tmpfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cgroup2
nodev   cpuset
nodev   devtmpfs
nodev   configfs
nodev   debugfs
nodev   tracefs
nodev   securityfs
nodev   sockfs
nodev   bpf
nodev   pipefs
nodev   ramfs
nodev   hugetlbfs
nodev   devpts
nodev   autofs
nodev   mqueue
nodev   pstore
        fuseblk
nodev   fuse
nodev   fusectl
        xfs
nodev   rpc_pipefs
nodev   binfmt_misc

centos6默认使用ext4文件系统

[root@server1 ~]# df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda10     ext4   3.8G  330M  3.3G   9% /
tmpfs          tmpfs  7.9G  4.1G  3.8G  52% /dev/shm
/dev/sda2      ext4    24G   44M   23G   1% /app
/dev/sda1      ext4   3.8G   47M  3.6G   2% /boot
/dev/sda11     ext4   789G   37G  713G   5% /home
/dev/sda6      ext4    15G   38M   14G   1% /opt
/dev/sda7      ext4    15G   38M   14G   1% /tmp
/dev/sda3      ext4    24G  6.0G   17G  27% /usr
/dev/sda8      ext4    15G  4.3G  9.4G  32% /usr/local
/dev/sda5      ext4    20G  355M   18G   2% /var

centos7默认使用xfs文件系统

[root@lc133 ~]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  959M     0  959M    0% /dev
tmpfs                   tmpfs     977M     0  977M    0% /dev/shm
tmpfs                   tmpfs     977M  9.8M  967M    1% /run
tmpfs                   tmpfs     977M     0  977M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        17G  7.6G  9.5G   45% /
/dev/sda1               xfs      1014M  188M  827M   19% /boot
tmpfs                   tmpfs     196M   32K  196M    1% /run/user/1000
tmpfs                   tmpfs     196M     0  196M    0% /run/user/0

superblock

记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等,一个文件系统应该只有一个superblock.

inode

inode 的默认大小为 128 Byte ( ext4 与 xfs 可设定到 256 bytes),每个文件均对应一个inode (索引节点) , 它是由文件系统中唯一数值编址,该数值称为inode 编号(或称inode 号, inode number) ,inode 存储了与文件有关的元数据,例如文件的访问权限、最后访问时间戳、所有者、用户组、大小以及文件数据的存储位置,inode 没有存储文件名 ,文件名保存在文件所在目录的 block 中。

inode节点的总数,在格式化时就给定(ext文件系统),或者动态配置(xfs文件系统),inodes最大数量就是文件的最大数量。

每个文件都独自占用一个 inode,文件内容由 inode 的记录来指向;

如果想要读取文件内容,就必须借助目录中记录的文件名找到该文件的 inode,才能成功找到文件内容所在的 block 块;

查找文件的流程:系统会先根据文件名去查找它对应的 inode 号码,通过 inode 号码获取 inode 信息,根据 inode 信息看该用户是否具有访问这个文件的权限,如果有就指向对应的数据 block,并读取数据。在Linux内部的时候,访问文件都是通过inode号来进行的,所谓文件名仅仅是给用户容易使用的。

当我们查找一个文件,比如 /root/test 时,要经过以下步骤:

  1. 首先找到根目录的 inode(根目录的 inode 是系统已知的),然后判断用户是否有权限访问根目录的 block。
  2. 如果有权限,则可以在根目录的 block 中访问到 /root 的文件名及对应的 inode 号。
  3. 通过 /root/ 目录的 inode 号,可以查找到 /root/ 目录的 inode 信息,接着判断用户是否有权限访问 /root/ 目录的 block。
  4. 如果有权限,则可以从 /root/ 目录的 block 中读取到 test 文件的文件名及对应的 inode 号。
  5. 通过 test 文件的 inode 号,就可以找到 test 文件的 inode 信息,接着判断用户是否有权限访问 test 文件的 block。
  6. 如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问。

硬链接:硬链接有相同的inode号码,

不论是修改源文件,还是修改硬链接文件,另一个文件中的数据都会发生改变。

不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问。

硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。

硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。

硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接

使用ln命令创建硬链接

ln [选项] 源文件 目标文件

经常看到一个目录有很多硬链接,比如etc目录

[root@lc133 hello]# stat /etc
  文件:"/etc"
  大小:12288           块:32         IO 块:4096   目录
设备:fd00h/64768d      Inode:16777281    硬链接:155
权限:(0755/drwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2022-12-06 10:59:29.925515186 +0800
最近更改:2022-12-07 14:07:15.271842159 +0800
最近改动:2022-12-07 14:07:15.271842159 +0800

原因;两个特殊的文件夹 . (一个点) …(两个点)

[root@lc133 a]# ls -ia
 3397110 .  51788110 ..
[root@lc133 a]# cd ..
[root@lc133 hello]# ls -ia
51788110 .    238718 ..   3397110 a

软连接,软链接有不同的inode号码

不论是修改源文件(check),还是修改硬链接文件(check-soft),另一个文件中的数据都会发生改变。

删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在。

软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode 号。

软链接可以链接目录。

软链接可以跨分区。

block

block 的大小可以是 1KB、2KB、4KB,默认为 4KB。文件是存储在硬盘上的,硬盘的最小存储单位叫做 “扇区” (sector),每个扇区存储 512 字节。一般连续八个扇区组成一个 “块” (block),一个块是 4K 大小,是文件存取的最小单位。block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block。例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。

Block 的大小在创建文件系统的时候可以通过参数指定,如果不指定,则会从 /etc/mke2fs.conf 文件中读取对应的值。

在ext系统中:

block大小1kb2kb4kb
单个文件最大容量16GB256GB2TB
文件系统的最大容量2TB8TB16TB

ext文件系统

如果一个文件系统过于庞大时,将所有的inode和block放到一起会造成性能上的影响,所以在ext2的文件系统中,就出现了一个区块群组的概念。

在centos6中使用dumpe2fs查看ext4文件系统的具体信息,

先看下挂载位置

[root@server1 ~]# df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda10     ext4   3.8G  330M  3.3G   9% /
tmpfs          tmpfs  7.9G  4.1G  3.8G  52% /dev/shm
/dev/sda2      ext4    24G   44M   23G   1% /app
/dev/sda1      ext4   3.8G   47M  3.6G   2% /boot
/dev/sda11     ext4   789G   37G  713G   5% /home
/dev/sda6      ext4    15G   38M   14G   1% /opt
/dev/sda7      ext4    15G   38M   14G   1% /tmp
/dev/sda3      ext4    24G  6.0G   17G  27% /usr
/dev/sda8      ext4    15G  4.3G  9.4G  32% /usr/local
/dev/sda5      ext4    20G  356M   18G   2% /var
[root@server1 ~]# dumpe2fs /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   <none>						#文件系统名称,
Last mounted on:          /boot							#最近一次挂载位置
Filesystem UUID:          b7b8e165-0a00-46ff-8b65-6b7c7f88ea31	#uuid为linux对装置的定义码
Filesystem magic number:  0xEF53						
Filesystem revision #:    1 (dynamic)					#下方features为文件系统的特征数据
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl				#默认的挂载参数
Filesystem state:         clean							#文件系统状态
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              256000
Block count:              1024000
Reserved block count:     51200
Free blocks:              979713
Free inodes:              255961
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      249
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8000
Inode blocks per group:   500
RAID stride:              1
Flex block group size:    16
Filesystem created:       Mon Jan  4 17:01:58 2021
Last mount time:          Sun Dec  4 16:46:30 2022
Last write time:          Sun Dec  4 16:46:30 2022
Mount count:              77
Maximum mount count:      -1
Last checked:             Mon Jan  4 17:01:58 2021
Check interval:           0 (<none>)
Lifetime writes:          168 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      0af1d738-cef0-4297-9db2-e5d715c4c21e
Journal backup:           inode blocks			#这几项为journal日志模式的部分参数,特征数据中has_journal开启日志
Journal features:         (none)
日志大小:             64M
Journal length:           16384
Journal sequence:         0x0000007f
Journal start:            0


Group 0: (Blocks 0-32767) [ITABLE_ZEROED]
  校验和 0x938d,7962个未使用的inode
  主 superblock at 0, Group descriptors at 1-1
  保留的GDT块位于 2-250
  Block bitmap at 251 (+251), Inode bitmap at 267 (+267)
  Inode表位于 283-782 (+283)
  24475 free blocks, 7963 free inodes, 4 directories, 7962个未使用的inodes
  可用块数: 8293-32767
  可用inode数: 22, 39-8000
Group 1: (Blocks 32768-65535) [ITABLE_ZEROED]
  校验和 0x1a9b,7998个未使用的inode
  备份 superblock at 32768, Group descriptors at 32769-32769
  保留的GDT块位于 32770-33018
  Block bitmap at 252 (+4294934780), Inode bitmap at 268 (+4294934796)
  Inode表位于 783-1282 (+4294935311)
  22696 free blocks, 7998 free inodes, 2 directories, 7998个未使用的inodes
  可用块数: 35247, 35262-35263, 35271, 35282-35283, 36702-36863, 43008-65535
  可用inode数: 8003-16000
Group 2: (Blocks 65536-98303) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  校验和 0x6c35,8000个未使用的inode
  Block bitmap at 253 (+4294902013), Inode bitmap at 269 (+4294902029)
  Inode表位于 1283-1782 (+4294903043)
  32768 free blocks, 8000 free inodes, 0 directories, 8000个未使用的inodes
  可用块数: 65536-98303
  可用inode数: 16001-24000
Group 3: (Blocks 98304-131071) [INODE_UNINIT, ITABLE_ZEROED]
....

dumpe2fs的前半部分显示的是超级块的信息,包括文件系统名称、已使用以及未使用的 inode 和 block 的数量、每个 block 和 inode 的大小,文件系统的挂载时间等。

后半部分,就是每个区块群组的详细信息(如 Group0、Group1)。

Superblock 是记录整个 filesystem 相关信息的地方,其实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定都包含 superblock,如果包含,也是做为第一个 block group 内 superblock 的备份。superblock 记录的主要信息有:

  • block 与 inode 的总量
  • 未使用与已使用的 inode/block 数量
  • block 与 inode 的大小(block 为 1,2,4K,inode 为 128 Bytes 或 256 Bytes)
  • filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息
  • 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0,若未被挂载,则 valid bit 为 1

block group

Superblock(超级块)在 0号 block 内
Group Description(组描述)用来描述每个 group 的开始与结束位置的 block 号码,位于1号block内
Block bitmap(块位图)记录的是使用与未使用的 block 号,位于251号block内
Inode bitmap(inode 位图)记录的是使用与未使用的 inode 号。位于267号block内
Inode table(inode 表)Inode table 中存放着一个个 inode,inode 的内容记录文件的属性以及该文件实际数据是放置在哪些 block 内,位于283-782号block内
Data Blocks(数据块)是用来存放文件内容的地方,可用块数: 8293-32767 可用inode数: 22, 39-8000

xfs文件系统

ext文件系统(支持度最广、但格式化超慢):ext系列的文件系统,在文件格式化时,采用的是规划出所有的inode、区块、元数据等数据,未来系统可以直接使用,不需要再进行动态配置,但是这个做法在早期磁盘容量还不大的时候可以使用。如今,磁盘的容量越来越大,当使用磁盘容量在TB以上的传统ext系列文件系统在格式化的时候,会消耗相当多的时间。

xfs可以解决这个问题。xfs本身也是一个日志是的文件系统,ext4有的功能,xfs本身也都支持。

xfs文件系统在数据的分布上,主要规划为3个部分:

数据区(data section),数据区跟之前的 ext 一样,包括 inode/data block/superblock 等数据,都放置在这个区块。 这个数据区与 ext 家族的 block group 类似,也是分为多个储存区群组(allocation groups,AG) 来分别放置文件系统所需要的数据。 每个储存区群组都包含了 (1)整个文件系统的 superblock、 (2)剩余空间的管理机制、 (3)inode 的分配与追踪。此外,inode 与 block 都是系统需要用到时, 这才动态配置产生,所以格式化动作超级快!

文件系统活动登录区(log section),文件的变化会在这 里纪录下来,直到该变化完整的写入到数据区后, 该笔纪录才会被终结。如果文件系统因为某些缘故 (例如最常见的停电) 而损毁时,系统会拿这个登录区块来进行检验,看看系统挂掉之前,文件系统正在运作些啥动作,藉以快速的修复文件系统。

实时运行区(realtime section)。当有文件被创建时,会在这个区段里找一个或多个的extent区块(根据文件大小选择区块的数据),并把文件暂时放置到这个区块内,等到分配完成后,再写入到数据区(data section)中的i节点与区块中。extent区块的大小要在格式化的时候要先指定大小,它的值在4K~1G之间。一般非磁盘陈列的磁盘默认为64K容量,而如果具有类似磁盘陈列的stripe情况下,则应该将其大小设置为与stripe一样大,通常情况下这个值不改变为最好,因为它会影响到物理磁盘的性能。

在centos7中使用xfs_info查看xfs文件系统的具体信息

[root@lc133 hello]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  959M     0  959M    0% /dev
tmpfs                   tmpfs     977M     0  977M    0% /dev/shm
tmpfs                   tmpfs     977M  9.5M  968M    1% /run
tmpfs                   tmpfs     977M     0  977M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        17G  7.6G  9.5G   45% /
/dev/sda1               xfs      1014M  188M  827M   19% /boot
tmpfs                   tmpfs     196M   12K  196M    1% /run/user/42
tmpfs                   tmpfs     196M     0  196M    0% /run/user/0
[root@lc133 hello]# xfs_info /dev/sda1
meta-data=/dev/sda1              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
描述元数据的部分isize:inode的容量,每个是512 。
agcount:存储区群组(ag)的数量,4个 。
agsize:每个ag包含的block的数量,65536。配合bsize可以计算出每个ag的大小。
sectsz:逻辑扇区的大小,512byte。
整个文件系统的容量4*65536*4k=1048576k,大概一个G
数据区(data)bsize:block的大小。
blocks:有多少个block
sunit和swidth与磁盘阵列的相关性比较高,虚拟机默认没有做raid。
日志区域(log)log =internal表示日志区域使用的不是一个设备
实时运作区域realtime =none 目前还没有用过,每个extend的大小是4096

虚拟文件系统

nfs,ext为具体的文件系统。文件系统的种类很多,而操作系统为了实现对用户提供一个统一的接口,于是在用户层与为文件系统层引入了中间层,这个中间层就被称为虚拟文件系统。

一台服务器存在多种文件系统,如根目录下dev,proc,run,sys的inode节点一样,但属于不同的文件系统,所以并不是同一个文件。

[root@lc133 /]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  959M     0  959M    0% /dev
tmpfs                   tmpfs     977M     0  977M    0% /dev/shm
tmpfs                   tmpfs     977M  9.5M  968M    1% /run
tmpfs                   tmpfs     977M     0  977M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        17G  7.6G  9.5G   45% /
/dev/sda1               xfs      1014M  188M  827M   19% /boot
tmpfs                   tmpfs     196M   12K  196M    1% /run/user/42
tmpfs                   tmpfs     196M     0  196M    0% /run/user/0
[root@lc133 /]# ls -i
  163334 bin          1 dev  50331763 home        83 lib64  16778318 mnt         1 proc         1 run   50331764 srv  16777288 tmp  50331713 var
      64 boot  16777281 etc        81 lib         84 media  33763818 opt  33574977 root    163338 sbin         1 sys  33763755 usr

VFS(Virtual Filesystem Switch)定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解VFS提供的统一接口就可。

虚拟文件系统在文件系统挂载之后,将文件系统的一些元数据加载到内存中,虚拟文件系统只存在于内存中,它在系统启动时被创建,系统关闭时注销。VFS作用就是屏蔽给各类文件系统的差异,给用户、应用程序一个统一的接口。

虚拟文件系统在linux中的位置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

VFS是一种软件机制,只存在于内存中,每次系统初始化期间Linux都会先在内存中构造一棵VFS的目录树(也就是源码中的namespace)。

对于每个具体的文件系统,他们有自己的组织方法,操作方法。对于用户来说,只能于VFS打交道,不用也不能区别对待这些真正的文件系统。实际中使用系统调用函数例如read,write,映射到vfs中就是sys_read,sys_write,vfs会根据你操作的是哪个“实际文件系统”(哪个分区)来进行不同的实际的操作。

伪文件系统

伪文件系统是为了使用vfs的编程接口而设计的假的文件系统,常用的有文件系统有:

  • proc:把内核的信息导出到用户空间。
  • sockfs:文件系统使用套接字,可以使用read()接收报文write()发送报文。
  • sysfs:把内核设备的所有信息导出到用户空间,挂载目录是/sys。
  • cgroup:控制组用来控制进程的资源,能让管理员可以写成文件的方式来配置。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值