Linux基础介绍【第九篇】

服务器添加3块磁盘的体系结构

 

  1. [root@oldboylinux test]# free -m
  2.              total used free shared buffers cached
  3. Mem: 992 133 859 0 24 37
  4. -/+ buffers/cache: 70 921
  5. Swap: 511 0 511

注意:

1、linux系统的特性是将系统不用的物理内存缓存起来,因此,859不是系统的真是内存。

2、系统真正可用内存是921。

3、buffers为写入缓冲区,sync将缓冲区数据写入磁盘。

4、cache为读取数据的缓冲区。

5、硬盘是机械的,无论是写入还是读取都太慢了,所以读取和写入都是用来缓存技术。

6、门户架构网站都会采用缓存技术,来让用户写入读取尽可能不接触磁盘。

磁盘的内部结构

磁盘的内部结构主要包括:盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部分。

磁头组件及磁头驱动装置

1、磁头组件。它由读写磁头、传动手臂、传动轴三部分组成。

磁盘读取数据的工作原理是利用特定的磁粒子的极性来记录数据。磁头在读取数据时,将磁粒子的不同极性转换成不同的电脉冲信号,再利用数据转换器将这些原始信号变成电脑可以使用的数据,写的操作正好与此相反。

2、磁头驱动装置。磁盘的寻道是靠移动磁头,而移动磁头则需要该装置驱动才能实现(机械操作)。磁头驱动装置由电磁线圈电机、磁头驱动小车、防震动装置构成,高精度的轻型磁头驱动装置能够对磁头进行正确的驱动和定位,并能在很短的时间内精确定位系统指令指定的磁道。

3、磁盘片。盘片是磁盘存储数据的真正载体,磁盘盘片大多采用金属薄膜材料(或有机玻璃材料),这种金属薄膜较软盘的不连续颗粒载体具有更高的存储密度、高剩磁及高矫顽力等优点。

4、主轴组件。主轴组件包括如轴承和驱动电机等。磁盘主轴的转数是衡量磁盘读写性能的重要参考之一。例:SAS15K,SATA10K。

5、前置控制电路。前置电路控制磁头感应的信号、主轴电机调速、磁头驱动和伺服定位等,由于磁头读取的信号微弱,将放大电路密封在腔体内可以减少外来信号的干扰,提高操作指令的准确性。

企业生产工作中磁盘的选型

当前服务器市场,主流磁盘为SAS、SATA、SSD硬盘。

企业级SAS硬盘

企业里常见的SAS硬盘是15000转/分。当前主流300G、600G、1T,从具体的业务需求及性价比考虑,工作中多用300-600G的SAS硬盘。用于提供生产线上的普通对外提供服务的业务服务器。例如,生产线上的数据库业务、存储业务、图片业务及相关高并发业务(web http、cache服务),总的来说,如果没有特殊业务需求,SAS磁盘是生产环境首选的磁盘配置。

企业级SATA硬盘

企业级SATA硬盘7200-10000转/分,常见的容量为1T、2T、4T和6T,优点是经济实惠,容量大,从具体的业务需求及性价比考虑,工作中多用SATA磁盘做线下不提供服务的数据存储或者并发业务服务不是很大的业务应用,比如站点程序及数据库、图片的线下备份等。特性容量性价比高,一般2T的SATA磁盘较佳。

磁盘选购要点:

1、线上业务用SAS磁盘。

2、线下的业务用SATA磁盘,磁带库。

3、线上高并发、小容量的业务用SSD磁盘。

4、根据数据的访问热度,智能分析分层存储。

注意:千万不能用SATA磁盘来做在线高并发服务的数据存储或数据库业务。

磁盘相关名词解释

英文

中文

disk

磁盘

head

磁头

sector

扇区

track

磁道

cylinder

柱面

units

单元块(一个柱面的大小)

block

数据块

inode

索引节点

在磁盘不工作的时候,磁头停靠在靠近主轴接触盘片的表面,即线速度最小的地方,这里是一个不存放任何数据的特殊区域,称为启停区或着陆区(landing zone),启停区以外就是数据区。

在磁盘的最外圈,离主轴最远的磁道称为”0″磁道,磁盘数据的存放就是从最外圈”0″磁道开始的。”0″磁道非常重要,系统的引导程序就在0柱面0磁道1扇区的前446bytes。

磁道

每个盘片有两个面,都可记录信息。盘片表面以盘片中心为圆心,用于记录数据的不同半径的圆形磁化轨迹就称为磁道。

磁盘在格式化时被划分成许多同心圆,这些同心圆的轨迹叫做磁道(track)。磁道由盘面从外向内依次从0开始顺序编号。

柱面

所有的盘面上同一个半径的磁道的圆形轨迹从上到下依次会成一个圆柱体,就称作柱面(cylinder),每个圆柱上的磁头由上而下从”0″开始编号。

柱面数=一个盘面的磁道数

扇区

盘面有圆心向四周画直线,不同的磁道被直线分成许多扇形(弧形)的区域,每个弧形的区域叫做扇区,每个扇区大小为512字节。

操作系统是以扇区(sector)为单位将信息存储在磁盘上,一般情况下,每个扇区的大小是512个字节。一个扇区主要有两个部分内容,存储数据地点的标识符和存储数据的数据段。

扇区的第一个主要部分是标识符。标识符就是扇区头标,包括组成扇区三维地址的三个数字,扇区所在的磁头(或盘面)、磁道(或柱面号)以及扇区在磁道上的位置即扇区号。投标中还包括一个字段,其中有显示扇区是否能可靠存储数据,或者是否已发现某个故障因而不宜使用的标记。有些磁盘控制器在扇区头标中还记录有指示字,可在原扇区出错时指引磁盘转到替换扇区或磁道。最后,扇区头标以循环冗余校验(CRC)值作为结束,以供控制器检验扇区头标的读出情况,确保准备无误。

扇区的第二个主要部分是存储数据的数据段,可分为数据和保护数据的纠错码(ECC)。在初始准备期间,计算机用512个虚拟信息字节(实际数据的存放地)和与这些虚拟信息字节相应的ECC数字填入这个部分。

磁道柱面扇区总结

磁盘最基本的组成部分是由坚硬的金属材料制成的涂以磁性介质的盘片(有很多层),不同容量磁盘的盘片数不等。

1、一块磁盘有2-14个盘片,每个盘片有两个面,每个面对应一个读写磁头,用磁头号来区分盘面,即盘面数就是磁头数,盘片数*2=磁头数(盘面数)。

2、不同盘面的磁道被划分为多个扇形区域,每个区域就是一个扇区(sector)。

3、同一个盘面,以盘片中心为圆心,每个不同半径的圆形轨迹就是一个磁道(track)。

4、不同盘面相同半径的磁道组成一个圆柱面就是柱面(cylinder)。

5、一个柱面包含多个磁道(这些磁道半径相同),一个磁道包含多个扇区。

6、数据信息记录可表示为:某磁头、某磁道(柱面)、某扇区。

磁盘容量计算

  1. [root@oldboylinux ~]# fdisk -l
  2.  
  3. Disk /dev/sda: 8589 MB, 8589934592 bytes
  4. 255 heads, 63 sectors/track, 1044 cylinders
  5. Units = cylinders of 16065 * 512 = 8225280 bytes
  6. Sector size (logical/physical): 512 bytes / 512 bytes
  7. I/O size (minimum/optimal): 512 bytes / 512 bytes
  8. Disk identifier: 0x000ec58f
  9.  
  10.    Device Boot Start End Blocks Id System
  11. /dev/sda1 * 1 26 204800 83 Linux
  12. Partition 1 does not end on cylinder boundary.
  13. /dev/sda2 26 91 524288 82 Linux swap / Solaris
  14. Partition 2 does not end on cylinder boundary.
  15. /dev/sda3 91 1045 7658496 83 Linux

方法一:

磁盘容量=512*扇区数*磁道数*磁头数

每个磁道的大小=512*扇区数

一个盘面的大小=512*扇区数*磁道数

方法二:

磁盘容量=柱面数*柱面大小

柱面数=磁道数

柱面大小=磁道大小*磁头数

磁道大小=512*扇区数

  1. [root@oldboylinux ~]# fdisk -l /dev/sda1
  2.  
  3. Disk /dev/sda1: 209 MB, 209715200 bytes
  4. 255 heads, 63 sectors/track, 25 cylinders
  5. Units = cylinders of 16065 * 512 = 8225280 bytes
  6. Sector size (logical/physical): 512 bytes / 512 bytes
  7. I/O size (minimum/optimal): 512 bytes / 512 bytes
  8. Disk identifier: 0x00000000

磁头数:255 heads,扇区数:63sectors/track,柱面数:25cylinders。

磁盘大小=512*扇区数*磁道数*磁头数=512*255*63*25=205632000 bytes

机械磁盘读写原理

1、磁盘是按照柱面为单位读写数据的,即先读取同一个盘面的某一个磁道,读完之后,如果数据没有读完,磁头也不会切换其他的磁道,而是选择切换磁头,读取下一个盘面的相同半径的磁道,直到所有盘面的相同半径的磁道读取完成之后,如果数据还没有读写完成,才会切换到其他不同半径的磁道,这个切换磁道的过程称为寻道。

2、不同磁头间的切换是电子切换,而不同磁道间的切换需要磁头做径向运动,这个径向运动需要步进电机调节,这个动作是机械的切换。

磁盘分区

磁盘存储逻辑结构

一个硬盘的存储结构包括主引导记录、分区表、分区结束标志,及其它分区的引导信息及数据区信息。

主引导扇区在整个硬盘里是唯一的,也就是一个硬盘只能有一个,下面是0磁道1扇区的放大图示。

16字节分区表的内容

字节数

说明

1bytes

state:分区状态,0=未激活,0x80=激活。

1bytes

startHead:分区起始磁头号

2bytes

startSC:分区起始扇区和柱面号,低字节的低6位为扇区号,高2位为柱面号的第9,10位,高字节为柱面号的低8位。

1bytes

type:分区类型,如0x0B=FAT32,0x83=linux等,00表示此项未用

1bytes

endHead:分区结束磁头号

2bytes

endSC:分区结束扇区和柱面号

4bytes

Relative:线性寻址方式下分区相对扇区地址(对于基本分区即为绝对地址)

4bytes

sectors:分区大小(总扇区数)

备份与恢复MBR

  1. [root@oldboylinux ~]# dd if=/dev/sda of=mbr.bin bs=512 count=1 #备份MBR
  2. 1+0 records in
  3. 1+0 records out
  4. 512 bytes (512 B) copied, 0.000217105 s, 2.4 MB/s
  5. [root@oldboylinux ~]# od -xa mbr.bin #查看MBR
  6. 0000000 48eb 1090 d08e 00bc b8b0 0000 d88e c08e
  7.           k H dle dle so P < nul 0 8 nul nul so X so @
  8. 0000020 befb 7c00 00bf b906 0200 a4f3 21ea 0006
  9.           { > nul | ? nul ack 9 nul stx s $ j ! ack nul
  10. 0000040 be00 07be 0438 0b75 c683 8110 fefe 7507
  11.         nul > > bel 8 eot u vt etx F dle soh ~ ~ bel u
  12. 0000060 ebf3 b416 b002 bb01 7c00 80b2 748a 0203
  13.           s k syn 4 stx 0 soh ; nul | 2 nul nl t etx stx
  14. 0000100 0080 8000 8176 0000 0800 90fa f690 80c2
  15.         nul nul nul nul v soh nul nul nul bs z dle dle v B nul
  16. 0000120 0275 80b2 59ea 007c 3100 8ec0 8ed8 bcd0
  17.           u stx 2 nul j Y | nul nul 1 @ so X so P <
  18. 0000140 2000 a0fb 7c40 ff3c 0274 c288 f652 80c2
  19.         nul sp { sp @ | < del t stx bs B R v B nul
  20. 0000160 5474 41b4 aabb cd55 5a13 7252 8149 55fb
  21.           t T 4 A ; * U M dc3 Z R r I soh { U
  22. 0000200 75aa a043 7c41 c084 0575 e183 7401 6637
  23.           * u C sp A | eot @ u enq etx a soh t 7 f
  24. 0000220 4c8b be10 7c05 44c6 01ff 8b66 441e c77c
  25.          vt L dle > enq | F D del soh f vt rs D | G
  26. 0000240 1004 c700 0244 0001 8966 085c 44c7 0006
  27.         eot dle nul G D stx soh nul f ht \ bs G D ack nul
  28. 0000260 6670 c031 4489 6604 4489 b40c cd42 7213
  29.           p f 1 @ ht D eot f ht D ff 4 B M dc3 r
  30. 0000300 bb05 7000 7deb 08b4 13cd 0a73 c2f6 0f80
  31.         enq ; nul p k } 4 bs M dc3 s nl v B nul si
  32. 0000320 f084 e900 008d 05be c67c ff44 6600 c031
  33.         eot p nul i cr nul > enq | F D del nul f 1 @
  34. 0000340 f088 6640 4489 3104 88d2 c1ca 02e2 e888
  35.          bs p @ f ht D eot 1 R bs J A b stx bs h
  36. 0000360 f488 8940 0844 c031 d088 e8c0 6602 0489
  37.          bs t @ ht D bs 1 @ bs P @ h stx f ht eot
  38. 0000400 a166 7c44 3166 66d2 34f7 5488 660a d231
  39.           f ! D | f 1 R f w 4 bs T nl f 1 R
  40. 0000420 f766 0474 5488 890b 0c44 443b 7d08 8a3c
  41.           f w t eot bs T vt ht D ff ; D bs } < nl
  42. 0000440 0d54 e2c0 8a06 0a4c c1fe d108 6c8a 5a0c
  43.           T cr @ b ack nl L nl ~ A bs Q nl l ff Z
  44. 0000460 748a bb0b 7000 c38e db31 01b8 cd02 7213
  45.          nl t vt ; nul p so C 1 [ 8 soh stx M dc3 r
  46. 0000500 8c2a 8ec3 4806 607c b91e 0100 db8e f631
  47.           * ff C so ack H | ` rs 9 nul soh so [ 1 v
  48. 0000520 ff31 f3fc 1fa5 ff61 4226 be7c 7d7f 40e8
  49.           1 del | s % us a del & B | > del } h @
  50. 0000540 eb00 be0e 7d84 38e8 eb00 be06 7d8e 30e8
  51.         nul k so > eot } h 8 nul k ack > so } h 0
  52. 0000560 be00 7d93 2ae8 eb00 47fe 5552 2042 4700
  53.         nul > dc3 } h * nul k ~ G R U B sp nul G
  54. 0000600 6f65 006d 6148 6472 4420 7369 006b 6552
  55.           e o m nul H a r d sp D i s k nul R e
  56. 0000620 6461 2000 7245 6f72 0072 01bb b400 cd0e
  57.           a d nul sp E r r o r nul ; soh nul 4 so M
  58. 0000640 ac10 003c f475 00c3 0000 0000 0000 0000
  59.         dle , < nul u t C nul nul nul nul nul nul nul nul nul
  60. 0000660 0000 0000 0000 0000 c58f 000e 0000 2080
  61.         nul nul nul nul nul nul nul nul si E so nul nul nul nul sp
  62. 0000700 0021 9f83 1906 0800 0000 4000 0006 9f00
  63.           ! nul etx us ack em nul bs nul nul nul @ ack nul nul us
  64. 0000720 1907 e482 5a0a 4800 0006 0000 0010 e400
  65.         bel em stx d nl Z nul H ack nul nul nul dle nul nul d
  66. 0000740 5a0b fe83 ffff 4800 0016 b800 00e9 0000
  67.          vt Z etx ~ del del nul H syn nul nul 8 i nul nul nul
  68. 0000760 0000 0000 0000 0000 0000 0000 0000 aa55
  69.         nul nul nul nul nul nul nul nul nul nul nul nul nul nul U *
  70. 0001000
  71. [root@oldboylinux ~]# dd if=mbr.bin of=/dev/sda bs=512 count=1 #恢复MBR

磁盘分区

1、磁盘分区的实质就是针对0磁头0磁道1扇区的前446字节后面接下来的64bytes的分区表进行设置,即主要是划分起始以及结束磁头号,及扇区号和柱面号。

2、分区工具有fdisk(适合小于2T的磁盘分区),parted(适合大于2T的磁盘分区,可以对小于2T的磁盘分区),fdisk首选,只有大于2T时才会选parted。

3、一块磁盘的分区表仅有64bytes大小,每个分区表要占用16字节,因此一块磁盘仅支持四个分区表信息,即主分区+扩展分区的总量不超过4个。

4、磁盘分区是按照柱面(cylinder)来划分的。

5、扩展分区不能直接使用的,还需要在扩展分区的基础上创建逻辑分区。

6、扩展分区有自己的分区表,因此扩展分区下面的逻辑分区可以有多个。

磁盘在使用前一般需要进行分区,当然如果不分区直接格式化使用也可以,但这不是常见情况。磁盘分区有主分区、扩展分区和逻辑分区。一块硬盘最多可以有4个分区表信息(磁盘本身限制),其中一个主分区的位置可以用一个扩展分区替换,且一块硬盘只能有一个扩展分区(操作系统限制),在这个扩展分区中可以划分多个逻辑分区(IDE磁盘分区编号大概5-63),SATA(编号5-15)。

一台服务器6块600G的磁盘,raid5后,总大小3T,次数无法装系统。解决办法是做raid5后,不要直接重启装系统,而是再raid界面,继续分一个小的虚拟磁盘vd 200G,用这个200G的虚拟磁盘装系统,装完系统后再把剩余的2.8T通过parted分区。

主分区primary

主分区是磁盘上必须存在的分区,一般为磁盘的第一个分区。在一个磁盘上最多只能有4个主分区。

一个磁盘想分6个分区,主分区和扩展分区的数量:

1p+1e,2p+1e,3p+1e。

扩展分区Extended

扩展分区就像一个虚拟出来的一个小硬盘一样,但是不同的是没有MBR,而只有扩展分区表,而且这个扩展分区表示没有64bytes的限制的,所以可以在扩展分区上划分多个逻辑分区。一块磁盘只能存放一个扩展分区,并且扩展分区不能直接存放数据,扩展分区受限于操作系统。

逻辑分区logical

不能在磁盘中单独直接划分逻辑分区(fdisk),逻辑分区必须存在于扩展分区内。在扩展分区内可以划分多个逻辑分区,逻辑分区的编号从数字5开始。在这个扩展分区内可以划分多个逻辑分区(IDE磁盘大概编号可以是5-63)。

磁盘分区注意事项

1、任意多个主分区,但要求1<=主分区数量<=4。

例如,一个硬盘可以分为4个主分区、3个主分区、2个主分区、1个主分区。

2、扩展分区可以和主分区组合,但要求2<=(主分区+扩展分区)<=4。

例如:3个主分区+1个扩展分区、2个主分区+1个扩展分区或1个主分区+1个扩展分区。当总分区的数量大于4个的时候,必须提前分一个扩展分区。

3、如果要分成四个磁盘分区的话,那么分区方式可以为p+p+p+p或p+p+p+e。

注意:

由于MBR及磁盘分区表大小的限制,如果对磁盘分配了4p或3p+e后,即使磁盘还有剩余未分的空间,那么这部分空间也无法分区使用了(因为无分区可分了,分区表空间已经被沾满)。因此,在做分区规划时,如果业务需要,在分区之前就已经明确要超过4个分区,就可以选择3p+e的分区方式,并且在最后一个扩展分区要将所有的剩余空间都分配给这个扩展分区。当然,也可以采用1p+1e、2p+1e的分区方式,其实就是主分区不能分完,保留不分。

说明:

1、扩展分区不是一个真正的可用分区,建立完扩展分区后,还需要在扩展分区上面建立逻辑分区才可以使用。

2、对于主分区和逻辑分区在一本的数据存储使用上是没有区别的(对于大多数的数据存储),在安装操作系统时第一个分区要选主分区。

3、分区数字编号1-4留给主分区或扩展分区使用,逻辑分区编号只能从5开始,即使1-4分区号有剩余,也不会分配给逻辑分区。

4、对硬盘分区,实际上就是修改硬盘的分区表(partition table),也就是说可以通过fdisk分区实际上就是在修改64字节的分区表,分区对应的数据没有关系。因此,理论上调整分区大小,不会删除分区内的数据。

分区方案

方案一:集群结构中的某个节点,数据有多份或者不重要。

/boot 100MB linux引导程序

swap 物理内存的1.5倍,当内存大于等于8G时,给8G即可。

/ 剩余硬盘大小

方法二:数据库及存储,有大量重要数据

/boot 100MB

/ 50-200G

swap 物理内存的1.5倍,当内存大于等于8G时,给8G即可。

/data 剩余硬盘大小,放数据库及存储数据。

方案三:门户级别或大网站

/boot 100MB

swap 物理内存的1.5倍,当内存大于等于8G时,给8G即可。

/ 50-200G

剩余空间保留,不再进行分区,将来分给别的需要的部门。

硬盘分区的设备名

在linux系统中,是通过设备名来访问设备的,设备名存放在”/dev”目录中。

设备名称的定义规则如下,其他的分区依次类推:

系统的第一块IDE接口的硬盘:/dev/hda

系统的第二块IDE接口的硬盘:/dev/hdb

系统的第一块SCSI接口的硬盘:/dev/sda

系统的第二块SCSI接口的硬盘:/dev/sdb

SATA、SAS都是sd开头。

每个分区则使用磁盘名称加对应的数字编号表示:

系统的第一块IDE接口硬盘的第一个分区:/dev/hda1

系统的第一块IDE接口硬盘的第五个分区:/dev/hda5

系统的第二块SCSI接口硬盘的第一个分区:/dev/sdb1

系统的第二块SCSI接口硬盘的第五个分区:/dev/sdb5

注意:

1、分区数字编号1-4留给主分区或扩展分区使用,逻辑分区编号只能从5开始。

2、IDE硬盘设备名均以/dev/hd开头,不同硬盘编号依次是/dev/hda/、/dev/hdb、/dev/hdc…。

3、SCSI/SAS/SATA/USB接口硬盘的设备名均以/dev/sd开头。不同硬盘编号依次是/dev/sda、/dev/sdb、/dev/sdc…。

4、特别注意,SAS/SATA为当前互联网生产环境主流硬盘接口,SSD固态硬盘,由于是电子设备,性能很高,也逐渐被应用。

5、linux环境下没有盘符的概念。要对磁盘设备进行操作,需要使用磁盘设备名,读取磁盘设备内容,需要把创建的分区或逻辑卷上的文件系统挂载到指定的目录上。

6、在linux系统上划分了分区之后,还要在分区上创建文件系统。

文件系统类型

文件系统是对一个存储设备上的数据和元数据进行组织的一种机制。文件系统是在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区上组织文件的方式和方法,常见文件系统如ext2、ext3、ext4、NTFS、FAT、FAT32等。文件系统是组织存储文件或数据的方法,目的是易于查询和存取数据。因此,如果磁盘上没有文件系统也就无法存储数据了,因此,在磁盘分区后能够使用之前必须建立对应的文件系统才行。

文件系统是基于存储设备的,比如硬盘或光盘,并且包含文件物理位置的维护,文件系统也可以说是虚拟数据或网络数据存储的方法,比如NFS、MFS、GFS。目前unix、linux的文件系统有很多种实现,例如:UFS(基于BSD的unix文件系统)、ext2、ext3、ext4、zfs、xfs和reiserfs等。

注意:

1、文件系统是对一个存储设备上的数据和元数据进行组织的一种机制。

2、分区必须格式化创建文件系统才能存放数据。

3、一个分区只能有一种文件系统。

4、linux下常见文件系统ext2、ext3、ext4、zfs、xfs(CentOS7)和reiserfs(单独安装)。windows下常见文件系统NTFS、FAT32。

文件系统的选择

SAS、SATA银盘文件系统选择:

1、reiserfs:大量小文件业务首选reiserfs(100k以内)

2、xfs:有的门户的数据块mysql业务。

4、ext4:视频下载、流媒体、数据库、小文件业务。

5、ext2:没有日志,CDN网站加速服务。

常用应用:

CentOS5.x系统:默认ext3。

CentOS6.x系统:默认ext4。

CentOS7.x系统:默认xfs。

SSD文件系统选择

ext4、reiserfs可以作为SSD文件系统,但未对SSD做优化,不能充分发挥SSD性能,并影响SSD使用时间。

btrfs对SSD作了优化,mount通过参数启用。但btrfs仍处于试验阶段,生产环境谨慎使用。

jffs32、nilfs2、yaffs是常用的flash file system,在嵌入式环境广泛应用,建议使用。

在linux中制作文件系统

用类似如下命令在linux中制作并优化reiserfs文件系统:

/sbin/mkreiserfs /dev/sda2

用类似如下命令在linux中制作xfs文件系统:

mkfs -t xfs -f /dev/sda2

注意:ext3fs其实是简单的激活了记账的ext2fs。当创建该文件系统时,对mke2fs使用-j选项:

/sbin/mke2fs -j /dev/sda2

查看目前支持的文件系统

  1. [root@oldboylinux ~]# ls /lib/modules/2.6.32-504.el6.x86_64/kernel/fs/
  2. autofs4 cramfs ext3 gfs2 mbcache.ko squashfs
  3. btrfs dlm ext4 jbd nfs ubifs
  4. cachefiles ecryptfs fat jbd2 nfs_common udf
  5. cifs exportfs fscache jffs2 nfsd xfs
  6. configfs ext2 fuse lockd nls

文件系统内部

  1. [root@oldboylinux ~]# dumpe2fs /dev/sda
  2. dumpe2fs 1.41.12 (17-May-2010)
  3. dumpe2fs: Bad magic number in super-block while trying to open /dev/sda
  4. Couldn\’t find valid filesystem superblock.
  5. [root@oldboylinux ~]# dumpe2fs /dev/sda1
  6. dumpe2fs 1.41.12 (17-May-2010)
  7. Filesystem volume name: <none>
  8. Last mounted on: /boot
  9. Filesystem UUID: 16664a83-1118-495f-af51-363c9f6fb6e0
  10. Filesystem magic number: 0xEF53
  11. Filesystem revision #: 1 (dynamic)
  12. Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
  13. Filesystem flags: signed_directory_hash
  14. Default mount options: user_xattr acl
  15. Filesystem state: clean
  16. Errors behavior: Continue
  17. Filesystem OS type: Linux
  18. Inode count: 51200
  19. Block count: 204800
  20. Reserved block count: 10240
  21. Free blocks: 166642
  22. Free inodes: 51162
  23. First block: 1
  24. Block size: 1024
  25. Fragment size: 1024
  26. Reserved GDT blocks: 256
  27. Blocks per group: 8192
  28. Fragments per group: 8192
  29. Inodes per group: 2048
  30. Inode blocks per group: 256
  31. Flex block group size: 16
  32. Filesystem created: Fri Dec 16 22:02:58 2016
  33. Last mount time: Sat Jan 7 08:51:29 2017
  34. Last write time: Sat Jan 7 08:51:29 2017
  35. Mount count: 28
  36. Maximum mount count: -1
  37. Last checked: Fri Dec 16 22:02:58 2016
  38. Check interval: 0 (<none>)
  39. Lifetime writes: 36 MB
  40. Reserved blocks uid: 0 (user root)
  41. Reserved blocks gid: 0 (group root)
  42. First inode: 11
  43. Inode size: 128
  44. Journal inode: 8
  45. Default directory hash: half_md4
  46. Directory Hash Seed: 5c41ba8b-25c4-49f3-ab7e-e14d96dca193
  47. Journal backup: inode blocks
  48. Journal features: (none)
  49. Journal size: 4096k
  50. Journal length: 4096
  51. Journal sequence: 0x00000025
  52. Journal start: 0

超级块:记录文件系统的控制与管理信息(Group0以前的信息)。

1、block和inode的个数和大小,及其已用和未用的数量。

2、文件系统的载入时间、最近一次写入数据时间、最近一次执行fsck进行磁盘检查的时间等。

3、有效位:0已载入,1位载入。

组描述:记录本块组从何处开始

块位示图:使用位示图记录哪些块已用哪些块未用。

inode位示图:使用位示图记录inode的使用情况。

inode区:各个inode组成的区域,每个inode都有一个唯一编号。

数据块区:各个block组成的区域,用于存储文件数据。

磁盘分区

添加一块磁盘创建6个分区

1p+1e(5L):/dev/sdb1,/dev/sdb5,/dev/sdb6,/dev/sdb7,dev/sdb8,dev/deb9

分区:设置分区表

格式化:创建文件系统

查看磁盘信息

  1. [root@oldboylinux ~]# fdisk -l
  2.  
  3. Disk /dev/sda: 8589 MB, 8589934592 bytes
  4. 255 heads, 63 sectors/track, 1044 cylinders
  5. Units = cylinders of 16065 * 512 = 8225280 bytes
  6. Sector size (logical/physical): 512 bytes / 512 bytes
  7. I/O size (minimum/optimal): 512 bytes / 512 bytes
  8. Disk identifier: 0x000ec58f
  9.  
  10.    Device Boot Start End Blocks Id System
  11. /dev/sda1 * 1 26 204800 83 Linux
  12. Partition 1 does not end on cylinder boundary.
  13. /dev/sda2 26 91 524288 82 Linux swap / Solaris
  14. Partition 2 does not end on cylinder boundary.
  15. /dev/sda3 91 1045 7658496 83 Linux
  16.  
  17. Disk /dev/sdb: 1073 MB, 1073741824 bytes
  18. 255 heads, 63 sectors/track, 130 cylinders
  19. Units = cylinders of 16065 * 512 = 8225280 bytes
  20. Sector size (logical/physical): 512 bytes / 512 bytes
  21. I/O size (minimum/optimal): 512 bytes / 512 bytes
  22. Disk identifier: 0x00000000

 

  1. [root@oldboylinux ~]# fdisk -cu /dev/sdb
  2. Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
  3. Building a new DOS disklabel with disk identifier 0xf7a4dd89.
  4. Changes will remain in memory only, until you decide to write them.
  5. After that, of course, the previous content won\’t be recoverable.
  6.  
  7. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
  8.  
  9. Command (m for help): m #查看帮助
  10. Command action
  11.    a toggle a bootable flag
  12.    b edit bsd disklabel
  13.    c toggle the dos compatibility flag
  14.    d delete a partition #删除创建的分区
  15.    l list known partition types #列出分区类型
  16.    m print this menu #查看帮助
  17.    n add a new partition #创建分区
  18.    o create a new empty DOS partition table
  19.    p print the partition table #查看分区
  20.    q quit without saving changes #退出,不保存
  21.    s create a new empty Sun disklabel
  22.    t change a partition\’s system id #更改分区的系统id
  23.    u change display/entry units
  24.    v verify the partition table
  25.    w write table to disk and exit #保存,写入分区表
  26.    x extra functionality (experts only)
  27. Command (m for help):

 

  1. Command (m for help): p #查看分区情况
  2.  
  3. Disk /dev/sdb: 1073 MB, 1073741824 bytes
  4. 255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
  5. Units = sectors of 1 * 512 = 512 bytes
  6. Sector size (logical/physical): 512 bytes / 512 bytes
  7. I/O size (minimum/optimal): 512 bytes / 512 bytes
  8. Disk identifier: 0xf7a4dd89
  9.  
  10.    Device Boot Start End Blocks Id System #没有分区信息
  11.  
  12. Command (m for help): n #创建分区
  13. Command action
  14.    e extended
  15.    p primary partition (1-4)
  16. p #选择分区类型
  17. Partition number (1-4): 1 #选择分区标号
  18. First sector (2048-2097151, default 2048): #扇区
  19. Using default
    value 2048
  20. Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +100M #指定大小
  21.  
  22. Command (m for help): p #查看分区情况
  23.  
  24. Disk /dev/sdb: 1073 MB, 1073741824 bytes
  25. 255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
  26. Units = sectors of 1 * 512 = 512 bytes
  27. Sector size (logical/physical): 512 bytes / 512 bytes
  28. I/O size (minimum/optimal): 512 bytes / 512 bytes
  29. Disk identifier: 0xf7a4dd89
  30.  
  31.    Device Boot Start End Blocks Id System #目前的分区情况
  32. /dev/sdb1 2048 206847 102400 83 Linux
  33.  
  34. Command (m for help):

 

  1. Command (m for help): n #创建分区
  2. Command action
  3.    e extended
  4.    p primary partition (1-4)
  5. e #选择分区类型
  6. Partition number (1-4): 2 #选择分区标号
  7. First sector (206848-2097151, default 206848):
  8. Using default
    value 206848
  9. Last sector, +sectors or +size{K,M,G} (206848-2097151, default 2097151): #默认全部大小
  10. Using default
    value 2097151
  11.  
  12. Command (m for help): p #查看分区情况
  13.  
  14. Disk /dev/sdb: 1073 MB, 1073741824 bytes
  15. 255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
  16. Units = sectors of 1 * 512 = 512 bytes
  17. Sector size (logical/physical): 512 bytes / 512 bytes
  18. I/O size (minimum/optimal): 512 bytes / 512 bytes
  19. Disk identifier: 0xf7a4dd89
  20.  
  21.    Device Boot Start End Blocks Id System
  22. /dev/sdb1 2048 206847 102400 83 Linux
  23. /dev/sdb2 206848 2097151 945152 5 Extended #扩展分区
  24.  
  25. Command (m for help):

 

  1. Command (m for help): n
  2. Command action
  3.    l logical (5 or over)
  4.    p primary partition (1-4)
  5. p
  6. Partition number (1-4): 3
  7. No free sectors available #没有扇区
  8.  
  9. Command (m for help):

 

  1. Command (m for help): n
  2. Command action
  3.    l logical (5 or over)
  4.    p primary partition (1-4)
  5. l #逻辑分区
  6. First sector (208896-2097151, default 208896):
  7. Using default
    value 208896
  8. Last sector, +sectors or +size{K,M,G} (208896-2097151, default 2097151): +10M #指定大小
  9.  
  10. Command (m for help): p
  11.  
  12. Disk /dev/sdb: 1073 MB, 1073741824 bytes
  13. 255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
  14. Units = sectors of 1 * 512 = 512 bytes
  15. Sector size (logical/physical): 512 bytes / 512 bytes
  16. I/O size (minimum/optimal): 512 bytes / 512 bytes
  17. Disk identifier: 0xf7a4dd89
  18.  
  19.    Device Boot Start End Blocks Id System
  20. /dev/sdb1 2048 206847 102400 83 Linux
  21. /dev/sdb2 206848 2097151 945152 5 Extended
  22. /dev/sdb5 208896 229375 10240 83 Linux #逻辑分区
  23.  
  24. Command (m for help):

 

  1. Command (m for help): n
  2. Command action
  3.    l logical (5 or over)
  4.    p primary partition (1-4)
  5. l
  6. First sector (231424-2097151, default 231424):
  7. Using default
    value 231424
  8. Last sector, +sectors or +size{K,M,G} (231424-2097151, default 2097151): +10M
  9.  
  10. Command (m for help): p
  11.  
  12. Disk /dev/sdb: 1073 MB, 1073741824 bytes
  13. 255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
  14. Units = sectors of 1 * 512 = 512 bytes
  15. Sector size (logical/physical): 512 bytes / 512 bytes
  16. I/O size (minimum/optimal): 512 bytes / 512 bytes
  17. Disk identifier: 0xf7a4dd89
  18.  
  19.    Device Boot Start End Blocks Id System
  20. /dev/sdb1 2048 206847 102400 83 Linux
  21. /dev/sdb2 206848 2097151 945152 5 Extended
  22. /dev/sdb5 208896 229375 10240 83 Linux
  23. /dev/sdb6 231424 251903 10240 83 Linux
  24.  
  25. Command (m for help):

 

  1. Command (m for help): d #删除
  2. Partition number (1-6): 5 #指定标号
  3.  
  4. Command (m for help): p
  5.  
  6. Disk /dev/sdb: 1073 MB, 1073741824 bytes
  7. 255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
  8. Units = sectors of 1 * 512 = 512 bytes
  9. Sector size (logical/physical): 512 bytes / 512 bytes
  10. I/O size (minimum/optimal): 512 bytes / 512 bytes
  11. Disk identifier: 0xf7a4dd89
  12.  
  13.    Device Boot Start End Blocks Id System
  14. /dev/sdb1 2048 206847 102400 83 Linux
  15. /dev/sdb2 206848 2097151 945152 5 Extended
  16. /dev/sdb5 231424 251903 10240 83 Linux #/dev/sdb6变为/dev/sdb5
  17. Command (m for help):

最后分区情况

  1. Command (m for help): p
  2.  
  3. Disk /dev/sdb: 1073 MB, 1073741824 bytes
  4. 255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
  5. Units = sectors of 1 * 512 = 512 bytes
  6. Sector size (logical/physical): 512 bytes / 512 bytes
  7. I/O size (minimum/optimal): 512 bytes / 512 bytes
  8. Disk identifier: 0xf7a4dd89
  9.  
  10.    Device Boot Start End Blocks Id System
  11. /dev/sdb1 2048 206847 102400 83 Linux
  12. /dev/sdb2 206848 2097151 945152 5 Extended
  13. /dev/sdb5 208896 229375 10240 83 Linux
  14. /dev/sdb6 231424 253951 11264 83 Linux
  15. /dev/sdb7 256000 280575 12288 83 Linux
  16. /dev/sdb8 282624 309247 13312 83 Linux
  17. /dev/sdb9 311296 2097151 892928 83 Linux
  18.  
  19. Command (m for help):

列出类型

  1. Command (m for help): l
  2.  
  3.  0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
  4.  1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT-
  5.  2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
  6.  3 XENIX usr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
  7.  4 FAT16 <32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx
  8.  5 Extended 42 SFS 86 NTFS volume set da Non-FS data
  9.  6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / .
  10.  7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility
  11.  8 AIX 4f QNX4.x 3rd part 8e Linux LVM df BootIt
  12.  9 AIX bootable 50 OnTrack DM 93 Amoeba e1 DOS access
  13.  a OS/2 Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O
  14.  b W95 FAT32 52 CP/M 9f BSD/OS e4 SpeedStor
  15.  c W95 FAT32 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs
  16.  e W95 FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT
  17.  f W95 Ext\’d (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/
  18. 10 OPUS 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b
  19. 11 Hidden FAT12 5c Priam Edisk a8 Darwin UFS f1 SpeedStor
  20. 12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor
  21. 14 Hidden FAT16 <3 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary
  22. 16 Hidden FAT16 64 Novell Netware af HFS / HFS+ fb VMware VMFS
  23. 17 Hidden HPFS/NTF 65 Novell Netware b7 BSDI fs fc VMware VMKCORE
  24. 18 AST SmartSleep 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto
  25. 1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep
  26. 1c Hidden W95 FAT3 80 Old Minix be Solaris boot ff BBT
  27. 1e Hidden W95 FAT1
  28.  
  29. Command (m for help):

 

  1. Command (m for help): t #调整分区类型
  2. Partition number (1-9): 9 #指定需要调整分区的编号
  3. Hex code (type L to list codes): L #列出分区类型
  4.  
  5.  0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
  6.  1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT-
  7.  2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
  8.  3 XENIX usr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
  9.  4 FAT16 <32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx
  10.  5 Extended 42 SFS 86 NTFS volume set da Non-FS data
  11.  6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / .
  12.  7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility
  13.  8 AIX 4f QNX4.x 3rd part 8e Linux LVM df BootIt
  14.  9 AIX bootable 50 OnTrack DM 93 Amoeba e1 DOS access
  15.  a OS/2 Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O
  16.  b W95 FAT32 52 CP/M 9f BSD/OS e4 SpeedStor
  17.  c W95 FAT32 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs
  18.  e W95 FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT
  19.  f W95 Ext\’d (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/
  20. 10 OPUS 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b
  21. 11 Hidden FAT12 5c Priam Edisk a8 Darwin UFS f1 SpeedStor
  22. 12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor
  23. 14 Hidden FAT16 <3 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary
  24. 16 Hidden FAT16 64 Novell Netware af HFS / HFS+ fb VMware VMFS
  25. 17 Hidden HPFS/NTF 65 Novell Netware b7 BSDI fs fc VMware VMKCORE
  26. 18 AST SmartSleep 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto
  27. 1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep
  28. 1c Hidden W95 FAT3 80 Old Minix be Solaris boot ff BBT
  29. 1e Hidden W95 FAT1
  30. Hex code (type L to list codes): 8e #指定的分区类型
  31. Changed system type of partition 9 to 8e (Linux LVM)
  32.  
  33. Command (m for help): p #查看分区情况
  34.  
  35. Disk /dev/sdb: 1073 MB, 1073741824 bytes
  36. 255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
  37. Units = sectors of 1 * 512 = 512 bytes
  38. Sector size (logical/physical): 512 bytes / 512 bytes
  39. I/O size (minimum/optimal): 512 bytes / 512 bytes
  40. Disk identifier: 0xf7a4dd89
  41.  
  42.    Device Boot Start End Blocks Id System
  43. /dev/sdb1 2048 206847 102400 83 Linux
  44. /dev/sdb2 206848 2097151 945152 5 Extended
  45. /dev/sdb5 208896 229375 10240 83 Linux
  46. /dev/sdb6 231424 253951 11264 83 Linux
  47. /dev/sdb7 256000 280575 12288 83 Linux
  48. /dev/sdb8 282624 309247 13312 83 Linux
  49. /dev/sdb9 311296 2097151 892928 8e Linux LVM #分区类型已经调整
  50.  
  51. Command (m for help): w #写入分区表
  52. The partition table has been altered!
  53.  
  54. Calling ioctl() to re-read partition table.
  55. Syncing disks.

通知linux分区表的变化(否则需要重启系统才能看到变化)

  1. [root@oldboylinux ~]# partprobe /dev/sdb

查看结果

  1. [root@oldboylinux ~]# fdisk -l
  2.  
  3. Disk /dev/sda: 8589 MB, 8589934592 bytes
  4. 255 heads, 63 sectors/track, 1044 cylinders
  5. Units = cylinders of 16065 * 512 = 8225280 bytes
  6. Sector size (logical/physical): 512 bytes / 512 bytes
  7. I/O size (minimum/optimal): 512 bytes / 512 bytes
  8. Disk identifier: 0x000ec58f
  9.  
  10.    Device Boot Start End Blocks Id System
  11. /dev/sda1 * 1 26 204800 83 Linux
  12. Partition 1 does not end on cylinder boundary.
  13. /dev/sda2 26 91 524288 82 Linux swap / Solaris
  14. Partition 2 does not end on cylinder boundary.
  15. /dev/sda3 91 1045 7658496 83 Linux
  16.  
  17. Disk /dev/sdb: 1073 MB, 1073741824 bytes
  18. 255 heads, 63 sectors/track, 130 cylinders
  19. Units = cylinders of 16065 * 512 = 8225280 bytes
  20. Sector size (logical/physical): 512 bytes / 512 bytes
  21. I/O size (minimum/optimal): 512 bytes / 512 bytes
  22. Disk identifier: 0xf7a4dd89
  23.  
  24.    Device Boot Start End Blocks Id System
  25. /dev/sdb1 1 13 102400 83 Linux
  26. Partition 1 does not end on cylinder boundary.
  27. /dev/sdb2 13 131 945152 5 Extended
  28. Partition 2 does not end on cylinder boundary.
  29. /dev/sdb5 14 15 10240 83 Linux
  30. /dev/sdb6 15 16 11264 83 Linux
  31. /dev/sdb7 16 18 12288 83 Linux
  32. /dev/sdb8 18 20 13312 83 Linux
  33. /dev/sdb9 20 131 892928 8e Linux LVM

文件系统的简单操作

磁盘与目录的容量:

df:列出文件系统的整体磁盘使用量。

du:评估文件系统的磁盘使用量(常用于评估目录所占容量)。

1、将容量结果以易读的容量格式显示出来:df -h。

2、将/etc下面的可用的磁盘容量以易读的容量格式显示:df -h /etc。

3、将目前各个分区当做可用的inode数量列出:df -ih。

4、检查根目录下面每个目录所占用的容量:du -sm/*。

连接文件:ln

1、hard link(硬链接实际链接):只是在某个目录下新建一条文件名链接到某inode号码的关联记录而已。

2、symbolic link(符号链接,快捷方式):再创建一个独立的文件,而这个文件会让数据的读取指向它链接的那个文件夹的文件名。

3、将/etc/passwd复制到/tmp下面,并且查看inode与block

磁盘格式化:mkfs -t ext3 /dev/sda6

磁盘检查:fsck、badblocks

fsck -C -f -t ext3 /dev/sda6,卸载状态检查。

badblocks -sv /dev/sda6

磁盘挂载与卸载

1、挂载ext2、ext3文件系统

mount /dev/sda6 /mnt

df –h

2、挂载cd或dvd光盘

mkdir /media/cdrom

mount -t iso9660 /dev/cdrom /media/cdrom #-t iso9660这个是光盘的格式

mount /dev/cdrom /media/cdrom #系统自己去测试挂载

df

3、格式化与挂载软盘

mkfs -t vfat /dev/fd0

mkdir /media/floppy

mount -t fat /dev/fd0 /media/floppy

df

4、挂载U盘

mkdir /tmp/flash

mount -t vfat -o iocharset=cp950 /dev/sda1 /tmp/flash

df

5、文件卸载umount

umount /dev/sda6

umount /media/cdrom

umount /tmp/flash

umount /dev/fd0

umount /tmp/home

强制卸载:umount –lf 挂载点

强制卸载nfs案例:

umount:/mnt:device is busy解决办法

当无法卸载nfs挂载目录时,原因及解决办法:

1、可能当前目录就是挂载的nfs目录(/mnt)

解决办法:退出挂载的目录/mnt,再执行卸载。

2、比如nfs server挂了,nfs client会出问题(df -h窗会死掉口)

最好的强制卸载方法umount -lf /mnt。

版权声明:本文为yinshoucheng-golden原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yinshoucheng-golden/p/6259923.html