码迷,mamicode.com
首页 > 系统相关 > 详细

Linux文件系统

时间:2017-04-24 12:13:11      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:linux下的文系统   挂载   swap分区的管理   

 Linux下的文件系统

一、文件系统概述

1、概述:

  文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。

  从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等

2、文件系统类型

(1)查看Linux系统支持的文件系统的类型:

    [root@dayi123 ~]# ls/lib/modules/3.10.0-514.el7.x86_64/kernel/fs/

    binfmt_misc.ko  cifs    ext4     gfs2   mbcache.ko  nls        udf

    btrfs           cramfs  fat     isofs   nfs          overlayfs   xfs

    cachefiles      dlm    fscache jbd2   nfs_common  pstore

    ceph          exofs   fuse     lockd nfsd         squashfs

(2)常见的文件系统的类型:

   1)Linux文件系统:ext2(Extendedfile system), ext3, ext4, xfs(SGI), btrfs(Oracle),reiserfs, jfs(AIX), swap

   2)光盘:iso9660

   3)Windows:fat32, ntfs

   4)Unix: FFS(fast), UFS(unix), JFS2

   5)网络文件系统:NFS, CIFS

   6)集群文件系统:GFS2, OCFS2(oracle)

   7)分布式文件系统:fastdfs,ceph, moosefs, mogilefs,glusterfs, Lustre

   8)RAW:未经处理或者未经格式化产生的文件系统

3、文件系统的分类

(1)根据是否支持日志功能

   1)日志型文件系统: ext3, ext4, xfs,

   2)非日志型文件系统: ext2, vfat

(2)Linux的虚拟文件系统:VFS

                           技术分享

虚拟文件系统图

Linux虚拟文件系统作用:

   1)向上,对应用层提供一个标准的文件操作接口;

   2)对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;

   3)VFS内部则通过一系列高效的管理机制,比如inodecache, dentry cache 以及文件系统的预读等技术,使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;

   4)此外VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单。

(3)查前Linux系统支持的文件系统:cat /proc/filesystems

二、创建文件系统(格式化)

1、使用mkfs命令创建文件系统

(1)用法:mkfs.[文件系统类型] [设备名称]

   如:mkfs.ext3 /dev/sdb1   #将/dev/sdb1文件系统类型设置为ext3

      mkfs.ext4/dev/sdb2   #将/dev/sdb2文件系统类型设置为ext4

      mkfs.vfat/dev/sdb3   #将/dev/sdb3文件系统类型设置为vfat

      mkfs.xfs  /dev/sdb4  #......(centos默认的文件系统)

(2)用法二:mkfs -t [文件系统类型] [设备名称]

   如:mkfs –t ext3/dev/sdb1#将/dev/sdb1文件系统类型设置为ext3

      mkfs –t ext4 /dev/sdb2#将/dev/sdb2文件系统类型设置为ext4

      mkfs –t vfat/dev/sdb3#将/dev/sdb3文件系统类型设置为vfat

    [root@dayi123 ~]$mkfs.     #tab键查看支持的文件系统

    mkfs.cramfs   mkfs.ext3    mkfs.ext4dev  mkfs.vfat    

    mkfs.ext2     mkfs.ext4     mkfs.msdos   

    [root@dayi123 ~]$mkfs.ext4 /dev/sdb1   #对设备/dev/sdb1创建ext4类型文件系统

    mke2fs 1.41.12 (17-May-2010)

  Filesystem label=

  ……

  [root@dayi123~]$mkfs -t ext3 /dev/sdb2 #对设备/dev/sdb2创建ext3类型文件系统

  mke2fs 1.41.12(17-May-2010)

……..

2、使用mke2fs创建文件系统(.ext系列文件系统专用管理工具)

(1)用法:mke2fs [选项] [参数]

(2)常用选项:

   1)-t {ext2|ext3|ext4}

   2)-b {1024|2048|4096}

   3)-L ‘LABEL‘

   4)-j: 相当于-t ext3:mkfs.ext3 = mkfs-t ext3 = mke2fs -j = mke2fs -t ext3

   5)-i: 为数据空间中每多少个字节创建一个inode;此大小不应该小于block的大小

   6)-N:为数据空间创建个多少个inode

   7)-I 一个inode记录占用的磁盘空间大小,128---4096

   8)-m:为管理人员预留空间占总空间的百分比(默认5%),

   9)-O FEATURE[,...]:启用指定特性

   10)-O ^FEATURE:关闭指定特性

    #/dev/sdb1创建文件系统,并设定标签

  [root@dayi123~]$mke2fs -t ext4 /dev/sdb1 -L "/dev/sdb1"

  mke2fs 1.41.12(17-May-2010)

    Filesystem label=/dev/sdb1

    ……

    [root@dayi123 ~]$blkid /dev/sdb1    #查看/dev/sdb1设备文件信息时有标签信息

  /dev/sdb1:LABEL="/dev/sdb1" UUID="b0f616ba-d76c-46a8-8ca0-522400f3ff09"TYPE="ext4"

  #为设备/dev/sdb2创建文件系统,并指定block大小和为多少字节创建一个block

  [root@dayi123~]$mke2fs -t -b 4096 -i 8192 ext4 /dev/sdb2 -L "/dev/sdb2"

  mke2fs 1.41.12(17-May-2010)

  mke2fs: invalidblocks count - ext4

  [root@dayi123~]$dumpe2fs /dev/sdb2

  ……

  Inode count:              328656

  Block count:              1313313

  Reserved blockcount:     65665

  Free blocks:              1257307

  Free inodes:              328645

 …….

(3)inode和black

   1)磁盘分区格式化后分为inode和block两部分

   2)inode存放文件的属性以及指向文件实体的指针,文件不在inode里,一般在上级目录的block里面

   3)访问文件:通过文件——>”inode”——>”block”

   4)inode一般默认大小为256B,block大小为1k,2k,4k,默认为4k(特殊分区除外)

   5)可以通过df –I 查看inode的数量及使用情况,通过”dumpe2fs 设备名称”查看inode及block的大小及数量

   6)一个文件至少要占用一个block及一个inode,多个文件可以占用一个inode(硬链接)

   7)block太大会浪费,无法继续被其他文件使用,block不是越大越好,一般要根据文件大小进行选择,默认是4k。

3、文件系统标签

(1)查看块设备的信息:blkid

   1)用法:blkid [选项] [参数]

   2)选项:-U(UUID): 根据指定的UUID来查找对应的设备

         -L(LABEL):根据指定的LABEL来查找对应的设备

[root@dayi123~]$blkid  #查看所有块设备的信息

/dev/sda1:UUID="b595f5db-1648-4adf-8731-521e6690d9aa" TYPE="ext4"

/dev/sda2:UUID="0829c25a-e4f8-4aed-8084-522b38b65b10" TYPE="swap"

/dev/sda3:UUID="68b0f8ab-7ccc-4fc4-8bbc-a992f91e9847" TYPE="ext4"

/dev/sdb1:LABEL="/dev/sdb1" UUID="b0f616ba-d76c-46a8-8ca0-522400f3ff09"TYPE="ext4"

/dev/sdb2:UUID="9271b09a-571c-4f66-8a93-fce8ccdddfb3" SEC_TYPE="ext2"TYPE="ext3"

[root@dayi123~]$blkid -L "/dev/sdb1"  #根据标签信息查看设备名

/dev/sdb1

#根据UUID查找设备

[root@dayi123~]$blkid -U "9271b09a-571c-4f66-8a93-fce8ccdddfb3"

/dev/sdb2

(2)管理ext系列文件系统的LABEL:e2label

[root@dayi123~]$e2label /dev/sdb1    #查看设备/dev/sdb1label信息

/dev/sdb1

[root@dayi123~]$e2label /dev/sdb1 "dayi123" #更改/dev/sdb1label信息

[root@dayi123~]$e2label /dev/sdb1    #查看/dev/sdb1修改后的label信息

dayi123

(3)查找分区(依据卷标名和UUID查找查找文件系统所对应的设备文件):findfs

#根据UUID查找分区

[root@dayi123 ~]#findfs UUID=‘46554560-fd0e-4a47-bb38-79bfb830f1c4‘

/dev/sda2

[root@dayi123 ~]#findfs LABEL=‘CentOS 7 x86_64‘   #根据LABEL查找分区

/dev/sr0

(4)重新设定ext系列文件系统可调整参数的值:tune2fs

   1)用法:tune2fs [选项] 参数

     选项:-l:查看指定文件系统超级块信息;

         -L:‘LABEL‘:修改卷标

         -m:修预留给管理员的空间百分比

         -j: 将ext2升级为ext3

         -O: 文件系统属性启用或禁用,

         -o: 调整文件系统的默认挂载选项,

         -U:修改UUID号

[root@dayi123~]$tune2fs -l /dev/sdb1   #查看/dev/sdb1设备信息

tune2fs 1.41.12(17-May-2010)

Filesystem volumename:   dayi123     #卷标名称为dayi123

……

[root@dayi123~]$tune2fs -L "SDB2" /dev/sdb1 #修改卷标名称为SDB2

tune2fs 1.41.12(17-May-2010)

[root@dayi123~]$tune2fs -l /dev/sdb1       

tune2fs 1.41.12(17-May-2010)

Filesystem volumename:   SDB2        #修改后的卷标名称

…..

[root@dayi123~]$blkid /dev/sdb2        #查看/dev/sdb2的卷标

/dev/sdb2:UUID="9271b09a-571c-4f66-8a93-fce8ccdddfb3" SEC_TYPE="ext2"TYPE="ext3"

[root@dayi123~]$uuidgen              #自动生成一个卷标

8cd6c32b-2976-4267-a9a4-3499d3433724

#修改/dev/sdb2设备卷标

[root@dayi123~]$tune2fs -U "8cd6c32b-2976-4267-a9a4-3499d3433724" /dev/sdb2

tune2fs 1.41.12(17-May-2010)

[root@dayi123~]$blkid /dev/sdb2       #查看修改后的卷标

/dev/sdb2:UUID="8cd6c32b-2976-4267-a9a4-3499d3433724" SEC_TYPE="ext2"TYPE="ext3"

(5)查看超级块信息

  用法:dumpe2fs [选项] [参数]

  选项:-h 查看超级快信息,不显示分组信息

[root@dayi123~]$dumpe2fs /dev/sdb1   #查看超级组信息,默认会显示分组信息

dumpe2fs 1.41.12(17-May-2010)

Filesystem volumename:   SDB2

……

[root@dayi123~]$dumpe2fs -h /dev/sdb1  # 查看超级组信息,不显示分组信息

dumpe2fs 1.41.12(17-May-2010)

……

4、文件系统修复

(1)修复条件:

   1)常发生于死机或者非正常关机之后

   2)文件系统未挂载

(2)修复方法:

   1)用法:fsck –t [文件系统类型] [选项] [参数]

         Fsck.[文件系统类型] [选项] [参数]

     选项:-p: 自动修复错误

          -r: 交互式修复错误

   2)e2fsck(ext系列文件专用的检测修复工具)

    用法:fsck [选项] [参数]

    选项:-y:自动回答为yes

        -f:强制修复

三、挂载

1、挂载与卸载

(1)挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为

(2)卸载:为解除此关联关系的过程

(3)挂载时注意事项:

   1)、卸载时:可使用设备,也可以使用挂载点

   2)挂载点下原有文件在挂载完成后会被临时隐藏

   3)挂载点目录一般为空

2、挂载命令mount

(1)用法:mount [选项] [设备]

(2)选项:

   1)-t vsftype:指定要挂载的设备上的文件系统类型

   2)-r: readonly,以只读方挂载

   3)-w: read and write, 以读写方式挂载

   4)-n: 不更新/etc/mtab,mount不可见

   5) -a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)

   6)-L ‘LABEL‘: 以卷标指定挂载设备

   7)-U ‘UUID‘: 以UUID指定要挂载的设备

   8) -B, --bind: 绑定目录到另一个目录上

[root@dayi123~]$mkdir /data/sdb1

[root@dayi123~]$mount -r /dev/sdb1 /data/sdb1/  #以只读的方式进行挂载

[root@dayi123 ~]$cd/data/sdb1/            

[root@dayi123sdb1]$touch dayi123             #以只读的方式挂载后不能创建文件

touch: cannot touch`dayi123‘: Read-only file system

[root@dayi123data]$mount -n /dev/sdb1 /data/sdb1/  #挂载不可见

[root@dayi123data]$mount                   #mount命令看不到挂载信息

……

none on/proc/sys/fs/binfmt_misc type binfmt_misc (rw)

/dev/sr0 on/mnt/cdrom type iso9660 (ro)

[root@dayi123data]$df –h                  #“df –h”也看不到挂载信息

Filesystem      Size Used Avail Use% Mounted on

/dev/sda3        18G 2.0G   15G  12% /

tmpfs           491M     0 491M   0% /dev/shm

/dev/sda1       190M  66M  115M  37% /boot

/dev/sr0        3.7G 3.7G     0 100% /mnt/cdrom

[root@dayi123data]$cat /proc/mounts           #/proc/mounts中可以看到信息

……

/dev/sr0 /mnt/cdromiso9660 ro,relatime 0 0      

/dev/sdb1/data/sdb1 ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0

[root@dayi123sdb1]$mkdir {1..3}.html

[root@dayi123sdb1]$cd ..

[root@dayi123data]$mkdir sdb11

[root@dayi123 data]$mount-B /data/sdb1 /data/sdb11 #绑定目录/dev/sdb1/dev/sdb2

[root@dayi123data]$ll /data/sdb11 /data/sdb1       #绑定后两个目录中的内容一样

/data/sdb1:

total 28

drwxr-xr-x. 2 rootroot  4096 Apr 19 12:38 1.html

……

/data/sdb11:

total 28

drwxr-xr-x. 2 rootroot  4096 Apr 19 12:38 1.html

……

#将文件挂载到目录

[root@dayi123data]$dd if=/dev/zero of=/data/dayi bs=1M count=4096  #创建空文件

4096+0 records in

4096+0 records out

4294967296 bytes(4.3 GB) copied, 148.448 s, 28.9 MB/s

[root@dayi123data]$mkfs.ext4 dayi     #对创件的文件格式化

mke2fs 1.41.12(17-May-2010)

dayi is not a blockspecial device.

……

[root@dayi123data]$mount -o loop /data/dayi /data/sdb11  #挂载文件到目录下

[root@dayi123data]$df -h /data/sdb11        #查看挂载情况

Filesystem      Size Used Avail Use% Mounted on

/data/dayi      3.9G 8.0M  3.7G   1% /data/sdb11

(3)-o选项后长跟参数(默认参数为:rw, nosuid, dev, exec, auto, nouser, async),多个参数用“,”分割

   1)async:异步模式

   2)sync:同步模式,内存更改时,同时写磁盘

   3)atime|noatime:目录和文件的访问时间是否更新

   4)diratime|nodiratime:目录的访问时间戳是否更新

   5)auto|noauto:是否支持自动挂载,是否支持-a选项

   6)exec|noexec:是否支持将文件系统上运行应用程序

   7)dev|nodev:是否支持在此文件系统上使用设备文件

   8)suid|nosuid:不否支持suid和sgid权限

   9)remount:重新挂载

   10)ro:只读

   11)rw:读写

   12)user|nouser:是否允许普通用户挂载此设备,默认管理员才能挂载

   13)acl:启用此文件系统上的acl功能

[root@dayi123data]$mount -o noatime,noexec,nodev /dev/sdb3 /data/sdb3

[root@dayi123data]$mount

……

/dev/sr0 on/mnt/cdrom type iso9660 (ro)

/dev/sdb3 on/data/sdb3 type ext4 (rw,noexec,nodev,noatime)

[root@dayi123sdb3]$./hello.sh    #可执行文件再次目录下无法执行

-bash: ./hello.sh:Permission denied

[root@dayi123sdb3]$cd ..

[root@dayi123data]$./hello.sh    #在其他目录下可正常执行

hello

(2)mount可跟的设备名称:

   1) 设备文件:例如/dev/sdb3

   2) 卷标:-L ‘LABEL‘

   3) UUID, -U ‘UUID‘

   4) 伪文件系统名称(创建的空文件)

3、卸载

(1)卸载前查看

   1)查看挂载情况:findmnt MOUNT_POINT

   2)查看正在访问指定文件系统的进程:

     lsof MOUNT_POINT

     fuser -v MOUNT_POINT

   3)终止访问指定文件系统的所有进程:fuser -km MOUNT_POINT

[root@dayi123data]$findmnt  /dev/sdb1    #查看挂载情况

TARGET     SOURCE   FSTYPE OPTIONS

/data/sdb1/dev/sdb1 ext4  rw,relatime,seclabel,barrier=1,data=ordered

[root@dayi123data]$lsof /dev/sdb1         #查看正在访问指定文件系统的进程

COMMAND   PID USER  FD   TYPE DEVICE SIZE/OFF NODENAME

bash    24578 root cwd    DIR   8,17    4096    2 /data/sdb1

[root@dayi123data]$fuser -v /data/sdb1     #查看访问/data/sdb1的用户

                     USER        PID ACCESS COMMAND

/data/sdb1:          root      24578 ..c.. bash

[root@dayi123data]$fuser -km /data/sdb1   #终止访问/data/sdb1的所有进程

/data/sdb1:          24578c

(2)卸载:umount [设备名]|[目录名]

[root@dayi123data]$umount /dev/sdb3    #指定设备名称卸载

[root@dayi123data]$umount /data/sdb11  #指定目录名称卸载

[root@dayi123data]$df -h

Filesystem      Size Used Avail Use% Mounted on

/dev/sda3        18G 6.0G   11G  37% /

tmpfs           491M     0 491M   0% /dev/shm

/dev/sda1       190M  66M  115M  37% /boot

/dev/sr0        3.7G 3.7G     0 100% /mnt/cdrom

3、文件系统挂载的配置文件(/etc/fstab)

(1)挂载配置文件的说明:

[root@dayi123data]$cat /etc/fstab

UUID=68b0f8ab-7ccc-4fc4-8bbc-a992f91e9847   /    ext4   defaults       1 1

UUID=b595f5db-1648-4adf-8731-521e6690d9aa  /boot  ext4   defaults       1 2

UUID=0829c25a-e4f8-4aed-8084-522b38b65b10swap   swap   defaults        0 0

   1)第一字段(UUID=68b0f8ab-7ccc-4fc4-8bbc-a992f91e9847):要挂载的设备或伪文件系统

   2)第二字段(/):挂载点

   3)第三字段(ex4):文件系统的类型

   4)第四字段(defaults):挂载选项,相当于”mount”命令“-o”选项,多个值用逗号隔开

   5)第五字段(0):转储频率(默认为0,0:不做备份,1:每天转储,2:每隔一天转储)

   6)第六字段(0):指定分区是否被fsck检测,0代表不检测,其他数字代表检测的优先级,越小越优

(2)修改配置文件/etc/fstab,将/dev/sda4挂载到/data目录下

[root@dayi123~]$blkid /dev/sda4   #查看/dev/sda4UUID

/dev/sda4:UUID="4c5bf000-72e4-4ec6-8b54-87bea97c8af4" TYPE="xfs"

#挂载时可以使用设备名,uuid,label,建议不适用设备名称

[root@dayi123~]$cat /etc/fstab | grep UUID="4c5bf000-72e4-4ec6-8b54-87bea97c8af4"

UUID=4c5bf000-72e4-4ec6-8b54-87bea97c8af4/data                   xfs     defaults        0 0

4、配置swap分区

(1)创建swap分区

[root@dayi123~]$swapon  -s       #查看创建前的swap分区

Filename                          Type            Size    Used   Priority

/dev/sda2                         partition         2097148 0       -1

   1)新建swap分区

[root@dayi123~]$fdisk /dev/sdb    #将分区id标记为82

……

Command (m forhelp): t           #t为更改分区id

Partition number(1-4): 1           #选择第一块分区

Hex code (type L tolist codes): 82    #分区id选为82

Changed system typeof partition 1 to 82 (Linux swap / Solaris)

 

Command (m forhelp): w

……

   2)格式化Swap分区:swap 设备名

[root@dayi123~]$mkswap /dev/sdb1

Setting upswapspace version 1, size = 2104476 KiB

no label,UUID=cde5bfd7-40f3-4eb5-b768-c719655d5c84

   3)将新建分区加入配置文件/etc/fstab并使配置生效

      swapon -a/dev/sdb1   #将分区加入swap分区并生效

      swapoff/dev/sdb1     #取消swap分区

[root@dayi123~]$tail -1 /etc/fstab   #设置swap分区开机自动挂载,并指定优先级

/dev/sdb1    swap              swap    defaults        0 0

[root@dayi123~]$swapon –a        #使配置的swap分区生效

[root@dayi123~]$swapon -s

Filename                          Type           Size    Used    Priority

/dev/sda2                         partition        2097148  0      -1

/dev/sdb1                         partition        2104476 0      100  

   4)swap分区的优先级

   swap分区0到32767的优先级,值越大优先级越高,如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一。

   5)删除swap分区:

[root@dayi123~]$swapoff /dev/sdb1   #取消swap分区,并删除/etc/fstab中配置

[root@dayi123~]$swapon –s          #查看swap分区

Filename             Type            Size    Used   Priority

/dev/sda2           partition            2097148    0       -1

(2)创建文件swap分区

   1)创建swap分区文件并格式化

[root@dayi123data]$dd if=/dev/zero of=./swapfile bs=1M count=2048 #创建文件

2048+0 records in

2048+0 records out

2147483648 bytes(2.1 GB) copied, 52.2537 s, 41.1 MB/s

[root@dayi123dayi123]$mkswap ./swapfile #格式化文件swap分区

mkswap: ./swapfile:warning: don‘t erase bootbits sectors

        on whole disk. Use -f to force.

Setting upswapspace version 1, size = 2097148 KiB

no label,UUID=f298543e-4834-4d99-945b-0188d32e87f7

   2)将文件swap分区加入配置中并使生效

[root@dayi123dayi123]$tail -1 /etc/fstab     #swap配置

/data/swapfile    swap          swap   default,pri=-2        0 0

[root@dayi123dayi123]$swapon -a         #/data/swapfile加人swap

[root@dayi123dayi123]$swapon –s         #查看生效的swap

Filename         Type          Size    Used   Priority

/dev/sda2       partition       2097148 0       -1

/data/swapfile   file            2097148   0       -2

5、移动存储介质的挂载与使用

(1)光盘的使用与挂载

   1)启动图形界面会自动挂载光盘

   2)弹出光驱:eject

   3)创建ISO文件

[root@dayi123 ~]# cp/dev/sr0 /data/centos7.iso      #将设备/dev/sr0穿件为iso镜像

^C

[root@dayi123 ~]#ll /data/centos7.iso

[root@dayi123 ~]#mkisofs -r -o /data/etc.iso /etc/    #etc目录创建为ISO镜像

I: -input-charsetnot specified, using utf-8 (detected in locale settings)

Using SYSTE000.;1for  /system-release-cpe (system-release)

Using CENTO000.;1for  /centos-release-upstream(centos-release)

……

[root@dayi123 ~]#ll /data/*.iso             #查看创建好的镜像

-rw-r-----. 1 rootroot 60735488 Apr 22 21:47 /data/centos7.iso

-rw-r--r--. 1 rootroot 29456384 Apr 22 21:48 /data/etc.iso

   4)刻录光盘:wodim–v –eject centos.iso


本文出自 “dayi123” 博客,请务必保留此出处http://dayi123.blog.51cto.com/12064061/1918709

Linux文件系统

标签:linux下的文系统   挂载   swap分区的管理   

原文地址:http://dayi123.blog.51cto.com/12064061/1918709

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!