Erlo

Linux-存储管理

时间:2018-11-09 17:00   阅读:27次   来源:博客园页面报错

存储基础知识

从工作原理区分:

SSD的优势:

    SSD是摒弃传统磁介质,采用电子存储介质进行数据存储和读取的一种技术,突破了传统机械硬盘的性能瓶颈,拥有极高的存储性能,被认为是存储
    技术发展的未来新星。固态硬盘的全集成电路化、无任何机械运动部件的革命性设计,从根本上解决了在移动办公环境下,对于数据读写稳定性的需
    求。全集成电路化设计可以让固态硬盘做成任何形状。与传统硬盘相比,SSD固态电子盘具有以下优点:
    第一,SSD不需要机械结构,完全的半导体化,不存在数据查找时间、延迟时间和磁盘寻道时间,数据存取速度快。
    第二,SSD全部采用闪存芯片,经久耐用,防震抗摔,即使发生与硬物碰撞,数据丢失的可能性也能够降到最小。
    第三,得益于无机械部件及FLASH闪存芯片,SSD没有任何噪音,功耗低。
    第四,质量轻,比常规1.8英寸硬盘重量轻20-30克,使得便携设备搭载多块SSD成为可能。同时因其完全半导体化,无结构限制,可根据实际情况  
    设计成各种不同接口、形状的特殊电子硬盘。

从磁盘尺寸区分:

3.5 2.5 1.8

从插拔方式区分:

  • 热插拔
  • 非热插拔

从硬盘主要接口区分:

  • IDE    —— SATA I/II/II    个人计算机
  • SCSI  —— SAS    服务器
  • FC
  • PCIE

从存储连接方式区分:

  • 本地存储:例如DellR730本地磁盘
  • 外部存储:scsi线、stat线、sas线、FC线
  • 网络存储:以太网络、FC网络

从kernel对不同接口硬盘命名方式:

OS		IDE(并口)	    SATA(串口)		      SCSI			
RHEL5	     /dev/hda		    /dev/sda				/dev/sda		
RHEL6	     /dev/sda		    /dev/sda				/dev/sda
RHEL7	     /dev/sda		    /dev/sda				/dev/sda
KVM          /dev/vda(半虚拟化驱动)
           /dev/sda(全虚拟化驱动)

从分区方式区分:

存储大小			分区软件		分区表
2TB以下的硬盘		fdisk/parted/	MSDOS(MBR) 
2TB以上的硬盘		parted		GPT
注意:从MBR转到GPT,或从GPT转换到MBR会导致数据全部丢失!

MSDOS(MBR)分区的限制:

主引导分区(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区。

MBR(512字节)=446字节(存放grub指针)+64字节(分区表)+2字节(校验位)

主分区,扩展分区,逻辑分区

只支持4个主分区,总分区数不能超过15个

只支持2TB以下的硬盘

GPT的限制:

没有限制

HP服务器硬盘:

/dev/cciss/c0d0
/dev/cciss/c0d0p1	//c0第一个控制器, d0第一块磁盘, p1分区1
/dev/cciss/c0d0p2	//c0第一个控制器, d0第一块磁盘, p2分区2

文件系统与数据资料:

Ext3:文件系统最大16TB,单个文件最大2TB

Ext4:文件系统最大16TB,单个文件最大16TB

XFS:

Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。
然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘
的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。 Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),
且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。 XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,
即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存
储容量为18EB,这几乎满足了所有需求。

磁盘分区

磁盘管理相关命令

fdisk 分区工具

fdisk是一个创建和维护分区表的程序,它兼容DOS类型的分区表、BSD或者SUN类型的磁盘列表。

  • 语法:

    fdisk [必要参数][选择参数]

  • 必要参数:

    -l 列出素所有分区表
    -u 与"-l"搭配使用,显示分区数目

  • 选择参数:

    -s<分区编号> 指定分区
    -v 版本信息

  • 菜单操作说明:

    a   toggle a bootable flag                  --设置启动分区
    b   edit bsd disklabel                      --编辑分区标签
    d   delete a partition                      --删除一个分区
    l   list known partition types              --列出分区类型
    m   print this menu                         --帮助
    n   add a new partition                     --建立一个新的分区
    o   create a new empty DOS partition table  --创建一个新的空白DOS分区表
    p   print the partition table               --打印分区表
    q   quit without saving changes             --退出不保存设置
    t   changea partition's system id           --改变分区的类型
    u   changedisplay/entry units               --改变显示的单位
    v   verifythe partition table               --检查验证分区表
    w   write table to disk and exit            --保存分区表

  • 示例

    # fdisk -l
    
    Disk /dev/sda: 10.7 GB, 10737418240 bytes
    255 heads, 63 sectors/track, 1305 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
      Device Boot   Start     End   Blocks  Id System
    /dev/sda1  *      1     13   104391  83 Linux
    /dev/sda2       14    1305  10377990  8e Linux LVM
    
    Disk /dev/sdb: 5368 MB, 5368709120 bytes
    255 heads, 63 sectors/track, 652 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    显示当前分区情况

    # fdisk -lu  
    
    Disk /dev/sda: 10.7 GB, 10737418240 bytes
    255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
    Units = sectors of 1 * 512 = 512 bytes
    
      Device Boot   Start     End   Blocks  Id System
    /dev/sda1  *     63   208844   104391  83 Linux
    /dev/sda2     208845  20964824  10377990  8e Linux LVM
    
    Disk /dev/sdb: 5368 MB, 5368709120 bytes
    255 heads, 63 sectors/track, 652 cylinders, total 10485760 sectors
    Units = sectors of 1 * 512 = 512 bytes

    显示SCSI硬盘的每个分区情况

lsblk 查看块设备

lsblk用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,cd-ROM等等。

  • 选项:

    -a, --all            显示所有设备。
    -b, --bytes          以bytes方式显示设备大小。
    -d, --nodeps         不显示 slaves 或 holders。
    -D, --discard        print discard capabilities。
    -e, --exclude <list> 排除设备 (default: RAM disks)。
    -f, --fs             显示文件系统信息。
    -h, --help           显示帮助信息。
    -i, --ascii          use ascii characters only。
    -m, --perms          显示权限信息。
    -l, --list           使用列表格式显示。
    -n, --noheadings     不显示标题。
    -o, --output <list>  输出列。
    -P, --pairs          使用key="value"格式显示。
    -r, --raw            使用原始格式显示。
    -t, --topology       显示拓扑结构信息。

  • 示例

    [root@centos7-1 ~]# lsblk 
    NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0          11:0    1 1024M  0 rom  
    vda         252:0    0   10G  0 disk 
    ├─vda1      252:1    0  500M  0 part /boot
    └─vda2      252:2    0  9.5G  0 part 
      ├─cl-root 253:0    0    9G  0 lvm  /
      └─cl-swap 253:1    0  500M  0 lvm  [SWAP]
    
    NAME:这是块设备名。
    MAJ:MIN:本栏显示主要和次要设备号。
    RM:本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
    SIZE:本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
    RO:该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
    TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
    MOUNTPOINT:本栏指出设备挂载的挂载点。

partprobe 刷新授权表

partprobe命令用于重读分区表,当出现删除文件后,出现仍然占用空间。可以partprobe在不重启的情况下重读分区。

  • 选项:

    -d:不更新内核;
    -s:显示摘要和分区;
    -h:显示帮助信息;
    -v:显示版本信息。

  • 示例:

    1、添加新的磁盘分区
    [root@localhost ~]# fdisk /dev/sda
    The number of cylinders for this disk is set to 38770.
    There is nothing wrong with that, but this is larger than 1024,
    and could in certain setups cause problems with:
    1) software that runs at boot time (e.g., old versions of lilo)
    2) booting and partitioning software from other OSs
       (e.g., DOS FDISK, OS/2 FDISK)
    
    command (m for help): p
    
    Disk /dev/sda: 318.9 GB, 318901321728 bytes
    255 heads, 63 sectors/track, 38770 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   id  System
    /dev/sda1   *           1        3824    30716248+  83  Linux
    /dev/sda2            3825        7648    30716280   83  Linux
    /dev/sda3            7649        8668     8193150   82  Linux swap / Solaris
    
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Selected partition 4
    First cylinder (8669-38770, default 8669):
    Using default value 8669
    last cylinder or +size or +sizeM or +sizeK (8669-38770, default 38770): +100G   
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: Re-reading the partition table failed with error 16: 
    
    Device or resource busy.
    The kernel still uses the old table.
    The new table will be used at the next reboot.
    Syncing disks.
    
    2、 使用工具partprobe让kernel读取分区信息
    [root@localhost ~]# partprobe
    使用fdisk工具只是将分区信息写到磁盘,如果需要mkfs磁盘分区则需要重启系统,而使用partprobe则可以使kernel重新读取分区信息,从而避免重启系统。
    
    3、格式化文件系统
    [root@localhost ~]# mkfs.ext3 /dev/sda4
    mke2fs 1.39 (29-May-2006)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    12222464 inodes, 24416791 blocks
    1220839 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=4294967296
    746 block groups
    32768 blocks per group, 32768 fragments per group
    16384 inodes per group
    Superblock backups stored on blocks:
            32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 
        2654208, 4096000, 7962624, 11239424, 20480000, 23887872
    
    Writing inode tables: done
    Creating journal (32768 blocks): done
    Writing superblocks and filesystem accounting information:
    
    done
    
    This filesystem will be automatically checked every 26 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
    [root@localhost ~]#
    
    4、 mount新的分区/dev/sda4
    [root@localhost ~]# e2label  /dev/sda4 /data
    [root@localhost ~]# mkdir /data
    [root@localhost ~]# mount /dev/sda4 /data
    [root@localhost ~]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/sda1             29753556   3810844  24406900  14% /
    /dev/sda2             29753588  11304616  16913160  41% /oracle
    tmpfs                  2023936         0   2023936   0% /dev/shm
    /dev/sda4             96132968    192312  91057300   1% /data

    View Code

blkid  查看设备UUID

在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。

  • 示例:

    # blkid /dev/sda3
    /dev/sda3: UUID="3bca1b81-1339-4345-9df4-9c25ec00a60b" TYPE="swap" 

磁盘分区示例

分区步骤:

  • 1、需要有一块硬盘
  • 2、使用分区工具对硬盘进行分区(fdisk)
  • 3、格式化分区
  • 4、挂载使用
  1. 进入分区表 新建分区
  2. 更新分区表(刷新分区表)
  3. 格式化
  4. 挂载

第1步:我们首先使用fdisk命令来尝试管理/dev/vdb硬盘设备。在看到提示信息后输入参数p来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:

[root@centos7-1 ~]# fdisk /dev/vdb 
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xf24ceedc 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):p

磁盘 /dev/vdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xf24ceedc

   设备 Boot      Start         End      Blocks   Id  System

命令(输入 m 获取帮助):

第2步:输入参数n尝试添加新的分区。系统会要求您是选择继续输入参数p来创建主分区,还是输入参数e来创建扩展分区。这里输入参数p来创建一个主分区:

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p

第3步:在确认创建一个主分区后,系统要求您先输入主分区的编号。我们在前文得知,主分区的编号范围是1~4,因此这里输入默认的1就可以了。接下来系统会提示定义起始的扇区位置,这不需要改动,我们敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后,系统会要求定义分区的结束扇区位置,这其实就是要去定义整个分区的大小是多少。我们不用去计算扇区的个数,只需要输入+2G即可创建出一个容量为2GB的硬盘分区。

分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048):此处敲击回车
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+2G
分区 1 已设置为 Linux 类型,大小设为 2 GiB

第4步:再次使用参数p来查看硬盘设备中的分区信息。果然就能看到一个名称为/dev/vdb1、起始扇区位置为2048、结束扇区位置为4196351的主分区了。这时候千万不要直接关闭窗口,而应该敲击参数w后回车,这样分区信息才是真正的写入成功啦。

命令(输入 m 获取帮助):p

磁盘 /dev/vdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xf24ceedc

   设备 Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048     4196351     2097152   83  Linux

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

第5步:在上述步骤执行完毕之后,Linux系统会自动把这个硬盘主分区抽象成/dev/vdb1设备文件。我们可以使用file命令查看该文件的属性,有些时候系统并没有自动把分区信息同步给Linux内核,而且这种情况似乎还比较常见(但不能算作是严重的bug)。我们可以输入partprobe命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧,这个杀手锏百试百灵,一定会有用的。

[root@centos7-1 ~]# partprobe
[root@centos7-1 ~]# partprobe
[root@centos7-1 ~]# file /dev/vdb1 
/dev/vdb1: block special

第6步:格式化,如果硬件存储设备没有进行格式化,则Linux系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在Linux系统中用于格式化操作的命令是mkfs。这条命令很有意思,因为在Shell终端中输入mkfs名后再敲击两下用于补齐命令的Tab键,会有如下所示的效果

[root@centos7-1 ~]# mkfs
mkfs         mkfs.cramfs  mkfs.ext3    mkfs.fat     mkfs.msdos   mkfs.xfs     
mkfs.btrfs   mkfs.ext2    mkfs.ext4    mkfs.minix   mkfs.vfat 

对!这个mkfs命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.文件类型名称。例如要格式分区为XFS的文件系统,则命令应为mkfs.xfs /dev/sdb1。

[root@centos7-1 ~]# mkfs.xfs /dev/vdb1 
meta-data=/dev/vdb1              isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=524288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

第7步:挂载,完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。与之相关的步骤也非常简单:首先是创建一个用于挂载设备的挂载点目录;然后使用mount命令将存储设备与挂载点进行关联;最后使用df -h命令来查看挂载状态和硬盘使用量信息。

[root@centos7-1 ~]# mkdir /newFS
[root@centos7-1 ~]# mount /dev/vdb1 /newFS/
[root@centos7-1 ~]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root  9.1G  3.7G  5.4G   41% /
devtmpfs             481M     0  481M    0% /dev
tmpfs                497M  124K  497M    1% /dev/shm
tmpfs                497M   14M  484M    3% /run
tmpfs                497M     0  497M    0% /sys/fs/cgroup
/dev/vda1            497M  166M  332M   34% /boot
tmpfs                100M  8.0K  100M    1% /run/user/42
tmpfs                100M   16K  100M    1% /run/user/0
/dev/vdb1            2.0G   33M  2.0G    2% /newFS

开机自动挂载,通过UUID挂载,blkid  查看设备的UUID

[root@centos7-1 ~]# blkid /dev/vdb1 
/dev/vdb1: UUID="a9c72628-f6b1-4feb-bdfb-9fa456d119bb" TYPE="xfs"
[root@centos7-1 ~]# vim /etc/fstab
UUID=a9c72628-f6b1-4feb-bdfb-9fa456d119bb  /newFS         xfs     defaults        0 0

磁盘挂载与卸载

  • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
  • 单一目录不应该重复挂载多个文件系统;
  • 要作为挂载点的目录,理论上应该都是空目录才是。

如果你要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时的消失。 举个例子来说,假设你的 /home 原本与根目录 (/) 在同一个文件系统中,底下原本就有 /home/test 与 /home/vbird 两个目录。然后你想要加入新的硬盘,并且直接挂载 /home 底下,那么当你挂载上新的分割槽时,则 /home 目录显示的是新分割槽内的数据,至于原先的 test 与 vbird 这两个目录就会暂时的被隐藏掉了!注意:并不是被覆盖掉, 而是暂时的隐藏了起来,等到新分割槽被卸除之后,则 /home 原本的内容就会再次的跑出来啦!

  • 格式:

    mount [-t 文件系统]  [-o 额外选项]  装置文件名  挂载点

  • 参数:

    选项与参数:
    -a  :依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
    -l  :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称!
    -t  :与 mkfs 的选项非常类似的,可以加上文件系统种类来指定欲挂载的类型。
          常见的 Linux 支持类型有:ext2, ext3, vfat, reiserfs, iso9660(光盘格式),
          nfs, cifs, smbfs(此三种为网络文件系统类型)
    -n  :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序
          的运行。但在某些情况下(例如单人维护模式)为了避免问题,会刻意不写入。
          此时就得要使用这个 -n 的选项了。
    -L  :系统除了利用装置文件名 (例如 /dev/hdc6) 之外,还可以利用文件系统的标头名称
          (Label)来进行挂载。最好为你的文件系统取一个独一无二的名称吧!
    -o  :后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等:
        rw           读写
        ro           只读
        suid         支持suid
        dev          支持设备文件
        nodev        不支持设备文件
        noexec       不允许执行二进制文件
        exec         允许执行二进制文件
        auto         mount -a 开机自动挂载
        noauto       mount -a 开机不自动挂载
        async        异步写入
        sync         同步同入
        noatime      不更新访问时间atime
        usrquota     支持用户级磁盘配额功能
        grpquota     支持组级磁盘配额功能
        acl          支持acl功能
        remount      在线重新挂载
        pri          指定优先级

  • 示例

    mount -t ext4 -o acl /dev/sdb1 /mnt/disk1 
    文件系统类型:ext4,xfs,nfs,cifs,iso9660,loop

挂载IOS文件

[root@centos7-1 ~]# mount -o loop /data/CentOS-7.3-x86_64-DVD-1611.iso /ios/
[root@centos7-1 ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root  202G   34G  169G   17% /
devtmpfs                 1.7G     0  1.7G    0% /dev
tmpfs                    1.8G   12M  1.7G    1% /dev/shm
tmpfs                    1.8G   26M  1.7G    2% /run
tmpfs                    1.8G     0  1.8G    0% /sys/fs/cgroup
/dev/sda1                794M  179M  616M   23% /boot
/dev/mapper/centos-opt   200G   85M  200G    1% /opt
/dev/mapper/centos-home   51G   37M   51G    1% /home
tmpfs                    349M   36K  349M    1% /run/user/0
/dev/loop0               4.1G  4.1G     0  100% /ios

开机自动挂载

/etc/fstab

格式说明:

要挂载的资源路径    挂载点    资源类型    挂载选项    dump备份支持  文件系统检测
/dev/vda1           /      ext4      defaults        1            1
1段:挂载的设备(磁盘设备的文件名或设备的卷标或者是设备的UUID)
2段:挂载点(建议用一个空目录)
3段:文件系统类型(ext3、ext4、vfat、ntfs、swap等等)
4段:文件系统选项(fs mntops)在装载文件系统时使用的装载选项
5段:是否支持dump备份。0代表不要做dump备份,1代表要每天进行dump的动作,2也代表其他不定日期的dump备份。数字越小优先级越高。
6段:是否用 fsck 检验扇区。#开机的过程中,系统默认会用fsck检验文件系统是否完整。0是不要检验,1表示最先检验(一般只有根目录会设定为1)

[root@centos7-1 ~]# cat /etc/fstab 
...
需要挂载的设备            挂载点                  文件类型 
/dev/mapper/cl-root     /                        xfs       defaults        0 0
/dev/mapper/cl-swap     swap                     swap      defaults        0 0

下一篇:接口技术的实现:规范用户类的成员与类型

评论留言

还没有评论留言,赶紧来抢楼吧~~

Erlo大厅()

* 这里是“Erlo大厅”,在这发言所有人都可以看到。只保留当天信息

  • Erlo.vip2018-11-18 00:24:02Hello、欢迎使用Erlo大厅,这里是个吐槽的地方。
  • 首页 源码分享 新闻资讯 ERLO 搜索
    鼠标试试
    返回顶部