-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0420quota.html
1833 lines (1832 loc) · 156 KB
/
0420quota.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Author" content="VBird, 鸟哥">
<meta name="Description" content="可以公平使用磁盘容量的 Quota 以及可增加磁盘容量的 RAID, LVM, iSCSI 设备等介绍">
<title>鸟哥的 Linux 私房菜 -- 第十四章、磁盘配额(Quota)与高端文件系统管理</title>
<style type="text/css">
</style>
<link href="./vbird_files/style_2013.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="tablearea">
<div class="mainarea">
<div class="block1">
<!-- 本文的档头部分 -->
<h1>第十四章、磁盘配额(Quota)与高端文件系统管理</h1>
<div style="text-align:right">
<span class="text_history">最近更新日期:2015/07/28</span>
</div>
<!-- 本文的档头部分 -->
<div class="abstract">
<p>如果您的 Linux 服务器有多个用户经常访问数据时,为了维护所有用户在硬盘容量的公平使用,磁盘配额
(Quota) 就是一项非常有用的工具!另外,如果你的用户常常抱怨磁盘容量不够用,那么更高端的文件系统就得要学习学习。
本章我们会介绍磁盘数组 (RAID) 及逻辑卷轴文件系统 (LVM),这些工具都可以帮助你管理与维护用户可用的磁盘容量喔!</p>
</div>
<!-- 本文的链接区部分 -->
<div class="links">
<ul>
<li><a href="0420quota.html#the_quota">14.1 磁盘配额 (Quota) 的应用与实作</a>
<ul>
<li><a href="0420quota.html#the_quota_whatis">14.1.1 什么是 Quota</a>:
<a href="0420quota.html#the_quota_use">一般用途</a>,
<a href="0420quota.html#the_quota_limit">限制</a>,
<a href="0420quota.html#the_quota_set">规范 (inode/block, soft/hard, grace time)</a></li>
<li><a href="0420quota.html#quota_flow">14.1.2 一个 XFS 文件系统的 Quota 的实作范例</a></li>
<li><a href="0420quota.html#quota_flow_1">14.1.3 实作 Quota 流程-1:文件系统的支持与观察</a> <a href="0420quota.html#fstab">(/etc/fstab, /etc/mtab)</a></li>
<li><a href="0420quota.html#quota_flow_2">14.1.4 实作 Quota 流程-2:观察 Quota 报告数据</a> (<a href="0420quota.html#xfs_quota">xfs_quota</a>,
<a href="0420quota.html#report">print, df, report, state</a>)</li>
<li><a href="0420quota.html#quota_flow_3">14.1.5 实作 Quota 流程-3:限制值设置方式</a> (<a href="0420quota.html#limit">limit, grace_time</a>)</li>
<li><a href="0420quota.html#quota_flow_4">14.1.6 实作 Quota 流程-4:project 的限制 (针对目录限制) (Optional)</a></li>
<li><a href="0420quota.html#quota_manage">14.1.7 XFS quota 的管理与额外指令对照表</a></li>
<li><a href="0420quota.html#quota_nochange">14.1.8 不更动既有系统的 Quota 实例</a></li>
</ul></li>
<li><a href="0420quota.html#raid">14.2 软件磁盘数组 (Software RAID)</a>
<ul>
<li><a href="0420quota.html#raid_what">14.2.1 什么是 RAID</a>: <a href="0420quota.html#raid0">RAID-0</a>, <a href="0420quota.html#raid1">RAID-1</a>,
<a href="0420quota.html#raid0_1">RAID1+0</a>, <a href="0420quota.html#raid5">RAID-5</a>, <a href="0420quota.html#spare">Spare disk</a></li>
<li><a href="0420quota.html#raid_so_ha">14.2.2 software, hardware RAID</a></li>
<li><a href="0420quota.html#raid_setup">14.2.3 软件磁盘数组的设置</a>: <a href="0420quota.html#mdadm_create">mdadm --create</a></li>
<li><a href="0420quota.html#raid_rescue">14.2.4 仿真 RAID 错误的救援模式</a>: <a href="0420quota.html#mdadm_manage">mdadm --manage</a></li>
<li><a href="0420quota.html#raid_auto">14.2.5 开机自动启动 RAID 并自动挂载</a></li>
<li><a href="0420quota.html#raid_stop">14.2.6 关闭软件 RAID(重要!)</a></li>
</ul></li>
<li><a href="0420quota.html#lvm">14.3 逻辑卷轴管理员 (Logical Volume Manager)</a>
<ul>
<li><a href="0420quota.html#lvm_whatis">14.3.1 什么是 LVM: PV, PE, VG, LV 的意义</a></li>
<li><a href="0420quota.html#lvm_flow">14.3.2 LVM 实作流程</a>: <a href="0420quota.html#the_pv">PV 阶段</a>, <a href="0420quota.html#the_vg">VG 阶段</a>,
<a href="0420quota.html#the_lv">LV 阶段</a>, <a href="0420quota.html#the_file">文件系统阶段</a></li>
<li><a href="0420quota.html#lvm_large">14.3.3 放大 LV 容量</a>: <a href="0420quota.html#xfs_growfs">xfs_growfs</a></li>
<li><a href="0420quota.html#lvm_thin">14.3.4 使用 LVM thin Volume 让 LVM 动态自动调整磁盘使用率</a></li>
<li><a href="0420quota.html#lvm_snapshot">14.3.5 LVM 的磁盘快照</a>:
<a href="0420quota.html#snapshot_create">创建传统快照</a>,
<a href="0420quota.html#snapshot_rescue">以快照还原</a>,
<a href="0420quota.html#snapshot_test">用于测试环境</a></li>
<li><a href="0420quota.html#lvm_hint">14.3.6 LVM 相关指令汇整与 LVM 的关闭</a></li>
</ul></li>
<li><a href="0420quota.html#hint">14.4 重点回顾</a></li>
<li><a href="0420quota.html#ex">14.5 本章习题</a></li>
<li><a href="0420quota.html#reference">14.6 参考数据与延伸阅读</a></li>
</ul>
</div>
</div>
<!-- 本文的正式部分 -->
<a id="the_quota"></a>
<div class="block1">
<h2>14.1 磁盘配额 (Quota) 的应用与实作</h2>
<p>Quota 这个玩意儿就字面上的意思来看,就是有多少『限额』的意思啦!如果是用在零用钱上面,
就是类似『<span class="text_import2">有多少零用钱一个月</span>』的意思之类的。如果是在电脑主机的磁盘使用量上呢?以
Linux 来说,就是有多少容量限制的意思啰。我们可以使用 quota 来让磁盘的容量使用较为公平,
底下我们会介绍什么是 quota ,然后以一个完整的范例来介绍 quota 的实作喔!</p>
<a id="the_quota_whatis"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.1.1 什么是 Quota</h2>
<p>在 Linux 系统中,由于是多人多任务的环境,所以会有多人共同使用一个硬盘空间的情况发生,
如果其中有少数几个用户大量的占掉了硬盘空间的话,那势必压缩其他用户的使用权力!
因此管理员应该适当的限制硬盘的容量给用户,以妥善的分配系统资源!避免有人抗议呀!</p>
<p>举例来说,我们用户的缺省家目录都是在 /home 底下,如果 /home 是个独立的 partition ,
假设这个分区有 10G 好了,而 /home 底下共有 30 个帐号,也就是说,每个用户平均应该会有 333MB 的空间才对。
偏偏有个用户在他的家目录底下塞了好多只影片,占掉了 8GB 的空间,想想看,是否造成其他正常用户的不便呢?
如果想要让磁盘的容量公平的分配,这个时候就得要靠 quota 的帮忙啰!</p>
<a id="the_quota_use"></a>
<ul class="toplist"><li>Quota 的一般用途 (<a href="0420quota.html#ps1">注1</a>)</li></ul>
<p>quota 比较常使用的几个情况是:</p>
<ul class="text_import2">
<li>针对 WWW server ,例如:每个人的网页空间的容量限制!</li>
<li>针对 mail server,例如:每个人的邮件空间限制。</li>
<li>针对 file server,例如:每个人最大的可用网络硬盘空间 (教学环境中最常见!)</li>
</ul>
<p>上头讲的是针对网络服务的设计,如果是针对 Linux 系统主机上面的设置那么使用的方向有底下这一些:</p>
<ul>
<li><span class="text_import2">限制某一群组所能使用的最大磁盘配额 (使用群组限制)</span>:<br>
你可以将你的主机上的用户分门别类,有点像是目前很流行的付费与免付费会员制的情况,
你比较喜好的那一群的使用配额就可以给高一些!呵呵! ^_^...<br><br></li>
<li><span class="text_import2">限制某一用户的最大磁盘配额 (使用用户限制)</span>:<br>
在限制了群组之后,你也可以再继续针对个人来进行限制,使得同一群组之下还可以有更公平的分配!<br><br></li>
<li><span class="text_import2">限制某一目录 (directory, project) 的最大磁盘配额</span>:<br>
在旧版的 CentOS 当中,使用的缺省文件系统为 EXT 家族,这种文件系统的磁盘配额主要是针对整个文件系统来处理,所以大多针对『挂载点』进行设计。
新的 xfs 可以使用 project 这种模式,就能够针对个别的目录 (非文件系统喔) 来设计磁盘配额耶!超棒的!</li></ul>
<p>大概有这些实际的用途啦!基本上,quota 就是在回报管理员磁盘使用率以及让管理员管理磁盘使用情况的一个工具就是了!
比较特别的是,XFS 的 quota 是集成到文件系统内,并不是其他插件的程序来管理的,因此,透过 quota 来直接回报磁盘使用率,要比 unix 工具来的快速!
举例来说, du 这东西会重新计算目录下的磁盘使用率,但 xfs 可以透过 xfs_quota 来直接回报各目录使用率,速度上是快非常多!</p>
<a id="the_quota_limit"></a>
<ul class="toplist"><li>Quota 的使用限制</li></ul>
<p>虽然 quota 很好用,但是使用上还是有些限制要先了解的:</p>
<ul>
<li><span class="text_import2">在 EXT 文件系统家族仅能针对整个 filesystem:</span><br>
EXT 文件系统家族在进行 quota 限制的时候,它仅能针对整个文件系统来进行设计,无法针对某个单一的目录来设计它的磁盘配额。
因此,如果你想要使用不同的文件系统进行 quota 时,请先搞清楚该文件系统支持的情况喔!因为 XFS 已经可以使用 project 模式来设计不同目录的磁盘配额。<br><br></li>
<li><span class="text_import2">核心必须支持 quota :</span><br>
Linux 核心必须有支持 quota 这个功能才行:如果你是使用 CentOS 7.x 的缺省核心,
嘿嘿!那恭喜你了,你的系统已经缺省有支持 quota 这个功能啰!如果你是自行编译核心的,
那么请特别留意你是否已经『真的』开启了 quota 这个功能?否则底下的功夫将全部都视为『白工』。<br><br></li>
<li><span class="text_import2">只对一般身份用户有效:</span><br>
这就有趣了!并不是所有在 Linux 上面的帐号都可以设置 quota 呢,例如 root 就不能设置 quota ,
因为整个系统所有的数据几乎都是他的啊! ^_^<br><br></li>
<li><span class="text_import2">若启用 SELinux,非所有目录均可设置 quota :</span><br>
新版的 CentOS 缺省都有启用 SELinux 这个核心功能,该功能会加强某些细部的权限控制!由于担心管理员不小心设置错误,因此缺省的情况下,
quota 似乎仅能针对 /home 进行设置而已~因此,如果你要针对其他不同的目录进行设置,请参考到后续章节查阅解开 SELinux 限制的方法喔!
这就不是 quota 的问题了...</li>
</ul>
<p>新版的 CentOS 使用的 xfs 确实比较有趣!不但无须额外的 quota 纪录档,也能够针对文件系统内的不同目录进行配置!相当有趣!
只是<span class="text_import2">不同的文件系统在 quota 的处理情况上不太相同,因此这里要特别强调,进行 quota 前,先确认你的文件系统吧!</span></p>
<a id="the_quota_set"></a>
<ul class="toplist"><li>Quota 的规范设置项目:</li></ul>
<p>quota 这玩意儿针对 XFS filesystem 的限制项目主要分为底下几个部分:</p>
<div class="illus">
<ul><li>分别针对用户、群组或个别目录 (user, group & project):</li></ul>
<p>XFS 文件系统的 quota 限制中,主要是针对群组、个人或单独的目录进行磁盘使用率的限制!</p>
<ul><li>容量限制或文件数量限制 (block 或 inode):</li></ul>
<p>我们在<a href="0230filesystem.html">第七章</a>谈到文件系统中,说到文件系统主要规划为存放属性的
inode 与实际文件数据的 block 区块,Quota 既然是管理文件系统,所以当然也可以管理 inode 或 block 啰!
这两个管理的功能为:</p>
<ul class="text_import2" style="margin-left: 40px; list-style-type: square"><li>限制 inode 用量:可以管理用户可以创建的『文件数量』;</li>
<li>限制 block 用量:管理用户磁盘容量的限制,较常见为这种方式。</li></ul>
<ul><li>柔性劝导与硬性规定 (soft/hard):</li></ul>
<p>既然是规范,当然就有限制值。不管是 inode/block ,限制值都有两个,分别是 soft 与 hard。
通常 hard 限制值要比 soft 还要高。举例来说,若限制项目为 block ,可以限制 hard 为 500MBytes 而 soft
为 400MBytes。这两个限值的意义为:</p>
<ul style="margin-left: 40px; list-style-type: square">
<li>hard:表示用户的用量绝对不会超过这个限制值,以上面的设置为例,
用户所能使用的磁盘容量绝对不会超过 500Mbytes ,若超过这个值则系统会锁住该用户的磁盘使用权;</li>
<li style="margin-top: 10px;">soft:表示用户在低于 soft 限值时 (此例中为 400Mbytes),可以正常使用磁盘,但若超过 soft
且低于 hard 的限值 (介于 400~500Mbytes 之间时),每次用户登录系统时,系统会主动发出磁盘即将爆满的警告消息,
且会给予一个宽限时间 (grace time)。不过,若用户在宽限时间倒数期间就将容量再次降低于 soft 限值之下,
则宽限时间会停止。</li>
</ul>
<ul><li>会倒数计时的宽限时间 (grace time):</li></ul>
<p>刚刚上面就谈到宽限时间了!这个宽限时间只有在用户的磁盘用量介于 soft 到 hard 之间时,才会出现且会倒数的一个咚咚!
由于达到 hard 限值时,用户的磁盘使用权可能会被锁住。为了担心用户没有注意到这个磁盘配额的问题,
因此设计了 soft 。当你的磁盘用量即将到达 hard 且超过 soft 时,系统会给予警告,但也会给一段时间让用户自行管理磁盘。
一般缺省的宽限时间为七天,如果七天内你都不进行任何磁盘管理,那么<span class="text_import2"> soft
限制值会即刻取代 hard 限值来作为 quota 的限制</span>。</p>
<p>以上面设置的例子来说,假设你的容量高达 450MBytes 了,那七天的宽限时间就会开始倒数,
若七天内你都不进行任何删除文件的动作来替你的磁盘用量瘦身,
那么七天后你的磁盘最大用量将变成 400MBytes (那个 soft
的限制值),此时你的磁盘使用权就会被锁住而无法添加文件了。</p>
</div>
<p>整个 soft, hard, grace time 的相关性我们可以用底下的图标来说明:</p>
<a id="fig14.1.1"></a>
<div style="text-align:center; margin: 0 auto 0 auto; "><img src="./vbird_files/soft_hard.gif" alt="soft, hard, grace time 的相关性" title="soft, hard, grace time 的相关性" style="border: 1px solid black; padding: 10px "></div>
<div style="text-align: center;">图14.1.1、soft, hard, grace time 的相关性</div>
<p>图中的长条图为用户的磁盘容量,soft/hard 分别是限制值。只要小于 400M 就一切 OK ,
若高于 soft 就出现 grace time 并倒数且等待用户自行处理,若到达 hard 的限制值,
那我们就搬张小板凳等着看好戏啦!嘿嘿!^_^!这样图标有清楚一点了吗?</p>
<br></div><br>
<a id="quota_flow"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.1.2 一个 XFS 文件系统的 Quota 实作范例</h2>
<p>坐而言不如起而行啊,所以这里我们使用一个范例来设计一下如何处理 Quota 的设置流程。</p>
<ul>
<li>目的与帐号:现在我想要让我的专题生五个为一组,这五个人的帐号分别是 myquota1, myquota2,
myquota3, myquota4, myquota5,这五个用户的密码都是 password ,且这五个用户所属的初始群组都是 myquotagrp 。
其他的帐号属性则使用默认值。<br><br></li>
<li>帐号的磁盘容量限制值:我想让这五个用户都能够取得 300MBytes 的磁盘使用量(hard),文件数量则不予限制。
此外,只要容量使用率超过 250MBytes ,就予以警告 (soft)。<br><br></li>
<li>群组的限额 (option 1):由于我的系统里面还有其他用户存在,因此我仅承认 myquotagrp 这个群组最多仅能使用 1GBytes 的容量。
这也就是说,如果 myquota1, myquota2, myquota3 都用了 280MBytes 的容量了,那么其他两人最多只能使用
(1000MB - 280x3 = 160MB) 的磁盘容量啰!这就是用户与群组同时设置时会产生的后果。<br><br></li>
<li>共享目录限额 (option 2):另一种设置方式,每个用户还是具有自己独立的容量限止,但是这五个人的专题共用目录在 /home/myquota
这里,该目录请设置为其他人没有任何权限的共享目录空间,仅有 myquotagrp 群组拥有全部的权限。
且无论如何,该目录最多仅能够接受 500MBytes 的容量。请注意,<span class="text_import2">群组 (group) 的限制与目录 (directory/project) 无法同时并存喔</span>!
所以底下的流程中,我们会先以群组来设计,然后再以目录限制来进一步说明!<br><br></li>
<li>宽限时间的限制:最后,我希望每个用户在超过 soft 限制值之后,都还能够有 14 天的宽限时间。</li>
</ul>
<p>好了,那你怎么规范帐号以及相关的 Quota 设置呢?首先,在这个小节我们先来将帐号相关的属性、参数及其他环境搞定再说吧!</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd"># 制作帐号环境时,由于有五个帐号,因此鸟哥使用 script 来创建环境!</span>
[root@study ~]# <span class="term_command">vim addaccount.sh</span>
<span class="term_write">#!/bin/bash
# 使用 script 来创建实验 quota 所需的环境
groupadd myquotagrp
for username in myquota1 myquota2 myquota3 myquota4 myquota5
do
useradd -g myquotagrp $username
echo "password" | passwd --stdin $username
done
mkdir /home/myquota
chgrp myquotagrp /home/myquota
chmod 2770 /home/myquota</span>
[root@study ~]# <span class="term_command">sh addaccount.sh</span>
</pre></td></tr></tbody></table>
<p>接下来,就让我们来实作 Quota 的练习吧!</p>
<br></div><br>
<a id="quota_flow_1"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.1.3 实作 Quota 流程-1:文件系统的支持与观察</h2>
<p>前面我们就谈到,要使用 Quota 必须要核心与文件系统支持才行!假设你已经使用了缺省支持 Quota 的核心,
那么接下来就是要启动文件系统的支持啦!但是要注意,我们这边是以 XFS 文件系统为例的,如果你使用的是 EXT 家族,请找前一版的书籍说明喔!
此外,<span class="text_import2">不要在根目录底下进行 quota 设计</span>喔!因为文件系统会变得太复杂!因此,底下我们是以 /home 这个 xfs 文件系统为例的!
当然啦,首先就是要来检查看看!</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">df -hT /home</span>
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-home xfs 5.0G 67M 5.0G 2% <span class="term_write">/home </span>
</pre></td></tr></tbody></table>
<p>从上面的数据来看,鸟哥这部主机的 /home 确实是独立的 filesystem,而且确实是使用了 xfs 文件系统!所以可以使用底下的流程啰!
此外,由于 VFAT 文件系统并不支持 Linux Quota 功能,所以我们得要使用 mount 查找一下 /home 的文件系统为何才行啊!</p>
<a id="fstab"></a>
<p>在过去的版本中,管理员似乎可以透过 mount -o remount 的机制来重新挂载启动 quota 的功能,不过 XFS 文件系统的 quota 似乎是在挂载之初就声明了,
因此无法使用 remount 来重新启动 quota 功能,一定得要写入 /etc/fstab 当中,或者是在初始挂载过程中加入这个项目,
否则不会生效喔!那就来瞧瞧鸟哥改了 fstab 成为怎样吧!</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">vim /etc/fstab</span>
/dev/mapper/centos-home /home xfs defaults<span class="term_write">,usrquota,grpquota</span> 0 0
<span class="term_say"># 其他项目鸟哥并没有列出来!重点在于第四字段!于 default 后面加上两个参数!</span>
[root@study ~]# <span class="term_command">umount /home</span>
[root@study ~]# <span class="term_command">mount -a</span>
[root@study ~]# <span class="term_command">mount | grep home</span>
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,<span class="term_write">usrquota,grpquota</span>)
</pre></td></tr></tbody></table>
<p>基本上,针对 quota 限制的项目主要有三项,如下所示:</p>
<ul class="text_import2">
<li>uquota/usrquota/quota:针对用户帐号的设置</li>
<li>gquota/grpquota:针对群组的设置</li>
<li>pquota/prjquota:针对单一目录的设置,但是不可与 grpquota 同时存在!</li>
</ul>
<p>还是要再次的强调,修改完 /etc/fstab 后,务必要测试一下!若有发生错误得要赶紧处理!
因为这个文件如果修改错误,是会造成无法开机完全的情况啊!切记切记!最好使用 vim 来修改啦!
因为会有语法的检验,就不会让你写错字了!此外,由于一般用户的家目录在 /home 里面,因此针对这个项目的卸载时,
一定要将所有一般帐号的身份注销,否则肯定无法卸载喔!留意留意!</p>
<br></div><br>
<a id="quota_flow_2"></a><a id="xfs_quota"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.1.4 实作 Quota 流程-2:观察 Quota 报告数据</h2>
<p>制作文件系统支持之后,当然得要来瞧一瞧到底有没有正确的将 quota 的管理数据列出来才好!这时我们得要使用
xfs_quota 这个指令才行!这个指令真的是挺复杂的,因为全部的 quota 实作都是这个指令耶!所以里面的参数有够多!
不过稍微观察一下即可!先让我们来谈谈观察目前 quota 的报告内容吧!</p>
<a id="report"></a>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">xfs_quota -x -c "指令" [挂载点]</span>
<span class="term_say">选项与参数:
-x :专家模式,后续才能够加入 -c 的指令参数喔!
-c :后面加的就是指令,这个小节我们先来谈谈数据回报的指令
指令:
print :单纯的列出目前主机内的文件系统参数等数据
df :与原本的 df 一样的功能,可以加上 -b (block) -i (inode) -h (加上单位) 等
report:列出目前的 quota 项目,有 -ugr (user/group/project) 及 -bi 等数据
state :说明目前支持 quota 的文件系统的信息,有没有起动相关项目等</span>
<span class="term_hd">范例一:列出目前系统的各的文件系统,以及文件系统的 quota 挂载参数支持</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "print"</span>
Filesystem Pathname
/ /dev/mapper/centos-root
/srv/myproject /dev/vda4
/boot /dev/vda2
/home /dev/mapper/centos-home (<span class="term_write">uquota, gquota</span>) <span class="term_note"># 所以这里就有显示支持啰</span>
<span class="term_hd">范例二:列出目前 /home 这个支持 quota 的载点文件系统使用情况</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "df -h" /home</span>
Filesystem Size Used Avail Use% Pathname
/dev/mapper/centos-home
5.0G 67.0M 4.9G 1% /home
<span class="term_say"># 如上所示,其实跟原本的 df 差不多啦!只是会更正确就是了。</span>
<span class="term_hd">范例三:列出目前 /home 的所有用户的 quota 限制值</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "report -ubih" /home</span>
User quota on /home (/dev/mapper/centos-home)
<span class="term_write">Blocks Inodes</span>
User ID <span class="term_write">Used Soft Hard Warn/Grace</span> Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 4K 0 0 00 [------] 4 0 0 00 [------]
dmtsai 34.0M 0 0 00 [------] 432 0 0 00 [------]
<span class="term_say">.....(中间省略).....</span>
myquota1 12K 0 0 00 [------] 7 0 0 00 [------]
myquota2 12K 0 0 00 [------] 7 0 0 00 [------]
myquota3 12K 0 0 00 [------] 7 0 0 00 [------]
myquota4 12K 0 0 00 [------] 7 0 0 00 [------]
myquota5 12K 0 0 00 [------] 7 0 0 00 [------]
<span class="term_say"># 所以列出了所有用户的目前的文件使用情况,并且列出设置值。注意,最上面的 Block
# 代表这个是 block 容量限制,而 inode 则是文件数量限制喔。另外,soft/hard 若为 0,代表没限制</span>
<span class="term_hd">范例四:列出目前支持的 quota 文件系统是否有起动了 quota 功能?</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "state"</span>
User quota state on /home (/dev/mapper/centos-home)
Accounting: ON <span class="term_note"># 有启用计算功能</span>
Enforcement: ON <span class="term_note"># 有实际 quota 管制的功能</span>
Inode: #1568 (4 blocks, 4 extents) <span class="term_note"># 上面四行说明的是有启动 user 的限制能力</span>
Group quota state on /home (/dev/mapper/centos-home)
Accounting: ON
Enforcement: ON
Inode: #1569 (5 blocks, 5 extents) <span class="term_note"># 上面四行说明的是有启动 group 的限制能力</span>
Project quota state on /home (/dev/mapper/centos-home)
Accounting: OFF
Enforcement: OFF
Inode: #1569 (5 blocks, 5 extents) <span class="term_note"># 上面四行说明的是 project 并未支持</span>
Blocks grace time: [7 days 00:00:30] <span class="term_note"># 底下则是 grace time 的项目</span>
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
</pre></td></tr></tbody></table>
<p>在缺省的情况下, xfs_quota 的 report 指令会将支持的 user/group/prject 相关数据列出来,如果只是想要某个特定的项目,
例如我们上面要求仅列出用户的数据时,就在 report 后面加上 -u 即可喔!这样就能够观察目前的相关设置信息了。
要注意,限制的项目有 block/inode 同时可以针对每个项目来设置 soft/hard 喔!接下来实际的设置看看吧!</p>
<br></div><br>
<a id="quota_flow_3"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.1.5 实作 Quota 流程-3:限制值设置方式</h2>
<p>确认文件系统的 quota 支持顺利启用后,也能够观察到相关的 quota 限制,接下来就是要实际的给予用户/群组限制啰!
回去瞧瞧,我们需要每个用户 250M/300M 的容量限制,群组共 950M/1G 的容量限制,同时 grace time 设置为 14 天喔!
实际的语法与设置流程来瞧瞧:</p>
<a id="limit"></a>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "timer [-ug] [-bir] Ndays"</span>
<span class="term_say">选项与参数:
limit :实际限制的项目,可以针对 user/group 来限制,限制的项目有
bsoft/bhard : block 的 soft/hard 限制值,可以加单位
isoft/ihard : inode 的 soft/hard 限制值
name : 就是用户/群组的名称啊!
timer :用来设置 grace time 的项目喔,也是可以针对 user/group 以及 block/inode 设置</span>
<span class="term_hd">范例一:设置好用户们的 block 限制值 (题目中没有要限制 inode 啦!)</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota1" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota2" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota3" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota4" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota5" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "report -ubih" /home</span>
User quota on /home (/dev/mapper/centos-home)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquota1 12K <span class="term_write">250M 300M</span> 00 [------] 7 0 0 00 [------]
<span class="term_hd">范例二:设置好 myquotagrp 的 block 限制值</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "limit -g bsoft=950M bhard=1G myquotagrp" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "report -gbih" /home</span>
Group quota on /home (/dev/mapper/centos-home)
Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotagrp 60K <span class="term_write">950M 1G</span> 00 [------] 36 0 0 00 [------]
<span class="term_hd">范例三:设置一下 grace time 变成 14 天吧!</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "timer -ug -b 14days" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "state" /home</span>
User quota state on /home (/dev/mapper/centos-home)
<span class="term_say">.....(中间省略).....</span>
Blocks grace time: [<span class="term_write">14 days</span> 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
<span class="term_hd">范例四:以 myquota1 用户测试 quota 是否真的实际运作呢?</span>
[root@study ~]# <span class="term_command">su - myquota1</span>
[myquota1@study ~]$ <span class="term_command">dd if=/dev/zero of=123.img bs=1M count=310</span>
dd: error writing ‘123.img’: Disk quota exceeded
300+0 records in
299+0 records out
314552320 bytes (315 MB) copied, 0.181088 s, 1.7 GB/s
[myquota1@study ~]$ <span class="term_command">ll -h</span>
-rw-r--r--. 1 myquota1 myquotagrp <span class="term_write">300M</span> Jul 24 21:38 123.img
[myquota1@study ~]$ <span class="term_command">exit</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "report -ubh" /home</span>
User quota on /home (/dev/mapper/centos-home)
Blocks
User ID Used Soft Hard Warn/Grace
---------- ---------------------------------
<span class="term_write">myquota1 300M 250M 300M 00 [13 days]</span>
myquota2 12K 250M 300M 00 [------]
<span class="term_say"># 因为 myquota1 的磁盘用量已经破表,所以当然就会出现那个可怕的 grace time 啰!</span>
</pre></td></tr></tbody></table>
<p>这样就直接制做好 quota 啰!看起来也是挺简单啦!</p>
<br></div><br>
<a id="quota_flow_4"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.1.6 实作 Quota 流程-4:project 的限制 (针对目录限制) (Optional)</h2>
<p>现在让我们来想一想,如果需要限制的是目录而不是群组时,那该如何处理呢?举例来说,我们要限制的是 /home/myquota 这个目录本身,
而不是针对 myquotagrp 这个群组啊!这两种设置方法的意义不同喔!例如,前一个小节谈到的测试范例来说,
myquota1 已经消耗了 300M 的容量,而 /home/myquota 其实还没有任何的使用量 (因为在 myquota1 的家目录做的 dd 指令)。
不过如果你使用了 xfs_quota -x -c "report -h" /home 这个指令来查看,就会发现其实 myquotagrp 已经用掉了 300M 了!
如此一来,对于目录的限制来说,就不会有效果!</p>
<p>为了解决这个问题,因此我们这个小节要来设置那个很有趣的 project 项目!只是这个项目不可以跟 group 同时设置喔!
因此我们得要取消 group 设置并且加入 project 设置才行。那就来实验看看。</p>
<div class="illus">
<ul><li>修改 /etc/fstab 内的文件系统支持参数</li></ul>
<p>首先,要将 grpquota 的参数取消,然后加入 prjquota ,并且卸载 /home 再重新挂载才行!那就来测试看看!</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd"># 1. 先修改 /etc/fstab 的参数,并启动文件系统的支持</span>
[root@study ~]# <span class="term_command">vim /etc/fstab</span>
/dev/mapper/centos-home /home xfs defaults,usrquota,<span class="term_write"><span style="text-decoration: line-through">grpquota,</span>prjquota</span> 0 0
<span class="term_say"># 记得, grpquota 与 prjquota 不可同时设置喔!所以上面删除 grpquota 加入 prjquota</span>
[root@study ~]# <span class="term_command">umount /home</span>
[root@study ~]# <span class="term_command">mount -a</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "state"</span>
User quota state on /home (/dev/mapper/centos-home)
Accounting: ON
Enforcement: ON
Inode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
Accounting: OFF <span class="term_note"><==已经取消啰!</span>
Enforcement: OFF
Inode: N/A
Project quota state on /home (/dev/mapper/centos-home)
Accounting: ON <span class="term_note"><==确实启动啰!</span>
Enforcement: ON
Inode: N/A
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
</pre></td></tr></tbody></table>
<ul><li>规范目录、项目名称(project)与项目 ID</li></ul>
<p>目录的设置比较奇怪,他必须要指定一个所谓的『项目名称、项目识别码』来规范才行!而且还需要用到两个设置档!
这个让鸟哥觉得比较怪一些就是了。现在,我们要规范的目录是 /home/myquota 目录,这个目录我们给个 myquotaproject 的项目名称,
这个项目名称给个 11 的识别码,这个都是自己指定的,若不喜欢就自己指定另一个吧!鸟哥的指定方式如下:</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd"># 2.1 指定项目识别码与目录的对应在 /etc/projects</span>
[root@study ~]# <span class="term_command">echo "11:/home/myquota" >> /etc/projects</span>
<span class="term_hd"># 2.2 规范项目名称与识别码的对应在 /etc/projid</span>
[root@study ~]# <span class="term_command">echo "myquotaproject:11" >> /etc/projid</span>
<span class="term_hd"># 2.3 初始化项目名称</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "project -s myquotaproject"</span>
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion
depth infinite (-1). <span class="term_note"># 会闪过这些消息!是 OK 的!别担心!</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "print " /home</span>
Filesystem Pathname
/home /dev/mapper/centos-home (uquota, pquota)
/home/myquota /dev/mapper/centos-home (project 11, <span class="term_write">myquotaproject</span>)
<span class="term_say"># 这个 print 功能很不错!可以完整的查看到相对应的各项文件系统与 project 目录对应!</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "report -pbih " /home</span>
Project quota on /home (/dev/mapper/centos-home)
Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject 0 0 0 00 [------] 1 0 0 00 [------]
<span class="term_say"># 喔耶!确定有抓到这个项目名称啰!接下来准备设置吧!</span>
</pre></td></tr></tbody></table>
<ul><li>实际设置规范与测试</li></ul>
<p>依据本章的说明,我们要将 /home/myquota 指定为 500M 的容量限制,那假设到 450M 为 soft 的限制好了!
那么设置就会变成这样啰:</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd"># 3.1 先来设置好这个 project 吧!设置的方式同样使用 limit 的 bsoft/bhard 喔!:</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "limit -p bsoft=450M bhard=500M myquotaproject" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "report -pbih " /home</span>
Project quota on /home (/dev/mapper/centos-home)
Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject 0 <span class="term_write">450M 500M</span> 00 [------] 1 0 0 00 [------]
[root@study ~]# <span class="term_command">dd if=/dev/zero of=/home/myquota/123.img bs=1M count=510</span>
dd: error writing '/home/myquota/123.img': No space left on device
501+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 0.96296 s, 544 MB/s
<span class="term_say"># 你看!连 root 在该目录底下创建文件时,也会被挡掉耶!这才是完整的针对目录的规范嘛!赞!</span>
</pre></td></tr></tbody></table>
</div>
<p>这样就设置好了啰!未来如果你还想要针对某些个目录进行限制,那么就修改 /etc/projects, /etc/projid 设置一下规范,
然后直接处理目录的初始化与设置,就完成设置了!好简单!</p>
<p>当鸟哥跟同事分享这个 project 的功能时,强者我同事蔡董大大说,刚刚好!他有些朋友要求在 WWW 的服务中,要针对某些目录进行容量的限制!
但是因为容量之前仅针对用户进行限制,如此一来,由于 WWW 服务都是一个名为 httpd 的帐号管理的,因此所有 WWW 服务所产生的文件数据,
就全部属于 httpd 这个帐号,那就无法针对某些特定的目录进行限制了。<span class="text_import2">有了这个 project 之后,就能够针对不同的目录做容量限制!
而不用管在里头创建文件的文件拥有者</span>!哇!这真是太棒了!实务应用给各位了解啰! ^_^</p>
<br></div><br>
<a id="quota_manage"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.1.7 XFS quota 的管理与额外指令对照表</h2>
<p>不管多完美的系统,总是需要可能的突发状况应付手段啊!所以,接下来我们就来谈谈,那么万一如果你需要暂停 quota 的限制,
或者是重新启动 quota 的限制时,该如何处理呢?还是使用 xfs_quota 啦!增加几个内部指令即可:</p>
<ul>
<li><span class="text_import2">disable</span>:暂时取消 quota 的限制,但其实系统还是在计算 quota 中,只是没有管制而已!应该算最有用的功能啰!</li>
<li><span class="text_import2">enable</span>:就是回复到正常管制的状态中,与 disable 可以互相取消、启用!</li>
<li><span class="text_import2">off</span>:完全关闭 quota 的限制,使用了这个状态后,你只有卸载再重新挂载才能够再次的启动 quota 喔!也就是说,
用了 off 状态后,你无法使用 enable 再次复原 quota 的管制喔!注意不要乱用这个状态!一般建议用 disable 即可,除非你需要运行 remove 的动作!</li>
<li><span class="text_import2">remove</span>:必须要在 off 的状态下才能够运行的指令~这个 remove 可以『移除』quota 的限制设置,例如要取消 project 的设置,
无须重新设置为 0 喔!只要 remove -p 就可以了!</li>
</ul>
<p>现在就让我们来测试一下管理的方式吧:</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd"># 1. 暂时关闭 XFS 文件系统的 quota 限制功能</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "disable -up" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "state" /home</span>
User quota state on /home (/dev/mapper/centos-home)
<span class="term_write"> Accounting: ON
Enforcement: OFF</span> <span class="term_note"><== 意思就是有在计算,但没有强制管制的意思</span>
Inode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
Accounting: OFF
Enforcement: OFF
Inode: N/A
Project quota state on /home (/dev/mapper/centos-home)
<span class="term_write"> Accounting: ON
Enforcement: OFF</span>
Inode: N/A
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
[root@study ~]# <span class="term_command">dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520</span>
520+0 records in
520+0 records out <span class="term_note"># 见鬼!竟然没有任何错误发生了!</span>
545259520 bytes (545 MB) copied, 0.308407 s, 180 MB/s
[root@study ~]# <span class="term_command">xfs_quota -x -c "report -pbh" /home</span>
Project quota on /home (/dev/mapper/centos-home)
Blocks
Project ID Used Soft Hard Warn/Grace
---------- ---------------------------------
myquotaproject <span class="term_write">520M</span> 450M 500M 00 [-none-]
<span class="term_say"># 其实,还真的有超过耶!只是因为 disable 的关系,所以没有强制限制住就是了!</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "enable -up" /home</span> <span class="term_note"># 重新启动 quota 限制</span>
[root@study ~]# <span class="term_command">dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520</span>
dd: error writing ‘/home/myquota/123.img’: No space left on device
<span class="term_say"># 又开始有限制!这就是 enable/disable 的相关对应功能喔!暂时关闭/启动用的!</span>
<span class="term_hd"># 完全关闭 quota 的限制行为吧!同时取消 project 的功能试看看!</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "off -up" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "enable -up" /home</span>
XFS_QUOTAON: Function not implemented
<span class="term_say"># 您瞧瞧!没有办法重新启动!因为已经完全的关闭了 quota 的功能!所以得要 umouont/mount 才行!</span>
[root@study ~]# <span class="term_command">umount /home; mount -a</span>
<span class="term_say"># 这个时候使用 report 以及 state 时,管制限制的内容又重新回来了!好!来瞧瞧如何移除project</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "off -up" /home</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "remove -p" /home</span>
[root@study ~]# <span class="term_command">umount /home; mount -a</span>
[root@study ~]# <span class="term_command">xfs_quota -x -c "report -phb" /home</span>
Project quota on /home (/dev/mapper/centos-home)
Blocks
Project ID Used Soft Hard Warn/Grace
---------- ---------------------------------
myquotaproject 500M <span class="term_write">0 0</span> 00 [------]
<span class="term_say"># 嘿嘿!全部归零!就是『移除』所有限制值的意思!</span>
</pre></td></tr></tbody></table>
<p>请注意上表中最后一个练习,那个 remove -p 是『移除所有的 project 控制列表』的意思!也就是说,如果你有在 /home 设置多个 project 的限制,
那么 remove 会删的一个也不留喔!如果想要回复设置值,那...只能一个一个重新设置回去了!没有好办法!</p>
<p>上面就是 XFS 文件系统的简易 quota 处理流程~那如果你是使用 EXT 家族呢?能不能使用 quota
呢?除了参考<a href="0420quota/0420quota-centos5.html">上一版</a>的文档之外,鸟哥这里也列出相关的参考指令/设置文件给你对照参考!
没学过的可以看看流程,有学过的可以对照了解! ^_^</p>
<table class="news" style="width: 95%">
<tbody><tr class="theader"><td>设置流程项目</td><td>XFS文件系统</td><td>EXT家族</td></tr>
<tr class="tcenter"><td>/etc/fstab参数设置</td><td>usrquota/grpquota/prjquota</td><td>usrquota/grpquota</td></tr>
<tr class="tcenter"><td>quota 设置档</td><td>不需要</td><td>quotacheck</td></tr>
<tr class="tcenter"><td>设置用户/群组限制值</td><td>xfs_quota -x -c "limit..."</td><td>edquota 或 setquota</td></tr>
<tr class="tcenter"><td>设置 grace time</td><td>xfs_quota -x -c "timer..."</td><td>edquota</td></tr>
<tr class="tcenter"><td>设置目录限制值</td><td>xfs_quota -x -c "limit..."</td><td>无</td></tr>
<tr class="tcenter"><td>观察报告</td><td>xfs_quota -x -c "report..."</td><td>repquota 或 quota</td></tr>
<tr class="tcenter"><td>启动与关闭 quota 限制</td><td>xfs_quota -x -c "[disable|enable]..."</td><td>quotaoff, quotaon</td></tr>
<tr class="tcenter"><td>发送警告信给用户</td><td>目前版本尚未支持</td><td>warnquota</td></tr>
</tbody></table><br>
<br></div><br>
<a id="quota_nochange"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.1.8 不更动既有系统的 quota 实例</h2>
<p>想一想,如果你的主机原先没有想到要设置成为邮件主机,所以并没有规划将邮件信箱所在的 /var/spool/mail/
目录独立成为一个 partition ,然后目前你的主机已经没有办法添加或分割出任何新的分区了。那我们知道 quota 的支持与文件系统有关,
所以并无法跨文件系统来设计 quota 的 project 功能啊!因此,你是否就无法针对 mail 的使用量给予 quota 的限制呢?</p>
<p>此外,如果你想要让用户的邮件信箱与家目录的总体磁盘使用量为固定,那又该如何是好?
由于 /home 及 /var/spool/mail 根本不可能是同一个 filesystem (除非是都不分割,使用根目录,才有可能集成在一起),
所以,该如何进行这样的 quota 限制呢?</p>
<p>其实没有那么难啦!既然 quota 是针对 filesystem 来进行限制,假设你又已经有 /home 这个独立的分区了,那么你只要:</p>
<ol>
<li>将 /var/spool/mail 这个目录完整的移动到 /home 底下;</li>
<li>利用 ln -s /home/mail /var/spool/mail 来创建链接数据;</li>
<li>将 /home 进行 quota 限额设置</li>
</ol>
<p>只要这样的一个小步骤,嘿嘿!您家主机的邮件就有一定的限额啰!当然啰!您也可以依据不同的用户与群组来设置
quota 然后同样的以上面的方式来进行 link 的动作!嘿嘿嘿!就有不同的限额针对不同的用户提出啰!很方便吧!^_^</p>
<fieldset class="vbirdface"><legend style="font-family: serif; font-size:12pt; color: darkblue;">Tips</legend><img src="./vbird_files/vbird_face.gif" alt="鸟哥的图标" title="鸟哥的图标" style="float: right;"> 朋友们需要注意的是,由于目前新的 distributions 大多有使用 SELinux 的机制,
因此你要进行如同上面的目录搬移时,在许多情况下可能会有使用上的限制喔!或许你得要先暂时关闭 SELinux 才能测试,
也或许你得要自行修改 SELinux 的规则才行喔!
</fieldset><br> </div>
</div>
<a id="raid"></a>
<div class="block1">
<h2>14.2 软件磁盘数组 (Software RAID)</h2>
<p>在过去鸟哥还年轻的时代,我们能使用的硬盘容量都不大,几十 GB 的容量就是大硬盘了!但是某些情况下,我们需要很大容量的保存空间,
例如鸟哥在跑的空气品质模式所输出的数据文件一个案例通常需要好几 GB ,连续跑个几个案例,磁盘容量就不够用了。
此时我该如何是好?其实可以透过一种保存机制,称为磁盘数组
(RAID) 的就是了。这种机制的功能是什么?他有哪些等级?什么是硬件、软件磁盘数组?Linux 支持什么样的软件磁盘数组?
底下就让我们来谈谈!</p>
<a id="raid_what"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.2.1 什么是 RAID</h2>
<p>磁盘数组全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,英翻中的意思是:容错式廉价磁盘数组。
RAID 可以透过一个技术(软件或硬件),将多个较小的磁盘集成成为一个较大的磁盘设备;
而这个较大的磁盘功能可不止是保存而已,他还具有数据保护的功能呢。整个 RAID 由于选择的等级 (level)
不同,而使得集成后的磁盘具有不同的功能,基本常见的 level 有这几种(<a href="0420quota.html#ps2">注2</a>):</p>
<a id="raid0"></a>
<ul class="toplist"><li>RAID-0 (等量模式, stripe):性能最佳</li></ul>
<p>这种模式如果使用相同型号与容量的磁盘来组成时,效果较佳。这种模式的 RAID 会将磁盘先切出等量的区块 (名为chunk,一般可设置 4K~1M 之间),
然后当一个文件要写入 RAID 时,该文件会依据 chunk 的大小切割好,之后再依序放到各个磁盘里面去。由于每个磁盘会交错的存放数据,
因此当你的数据要写入 RAID 时,数据会被等量的放置在各个磁盘上面。举例来说,你有两颗磁盘组成 RAID-0 ,
当你有 100MB 的数据要写入时,每个磁盘会各被分配到 50MB 的保存量。RAID-0 的示意图如下所示:</p>
<a id="fig14.2.1"></a>
<div style="text-align:center; margin: 0 auto 0 auto; "><img src="./vbird_files/raid0.gif" alt="RAID-0 的磁盘写入示意图" title="RAID-0 的磁盘写入示意图" style="border: 1px solid black; padding: 10px "></div>
<div style="text-align: center;">图14.2.1、RAID-0 的磁盘写入示意图</div>
<p>上图的意思是,在组成 RAID-0 时,每颗磁盘 (Disk A 与 Disk B) 都会先被区隔成为小区块 (chunk)。
当有数据要写入 RAID 时,数据会先被切割成符合小区块的大小,然后再依序一个一个的放置到不同的磁盘去。
由于数据已经先被切割并且依序放置到不同的磁盘上面,因此每颗磁盘所负责的数据量都降低了!照这样的情况来看,
<span class="text_import2">越多颗磁盘组成的 RAID-0 性能会越好,因为每颗负责的数据量就更低了</span>!
这表示我的数据可以分散让多颗磁盘来保存,当然性能会变的更好啊!此外,磁盘总容量也变大了!
因为每颗磁盘的容量最终会加总成为 RAID-0 的总容量喔!</p>
<p>只是使用此等级你必须要自行负担数据损毁的风险,由上图我们知道文件是被切割成为适合每颗磁盘分割区块的大小,
然后再依序放置到各个磁盘中。想一想,如果某一颗磁盘损毁了,那么文件数据将缺一块,此时这个文件就损毁了。
由于每个文件都是这样存放的,因此<span class="text_import2"> RAID-0 只要有任何一颗磁盘损毁,在 RAID
上面的所有数据都会遗失而无法读取</span>。</p>
<p>另外,如果使用不同容量的磁盘来组成 RAID-0 时,由于数据是一直等量的依序放置到不同磁盘中,当小容量磁盘的区块被用完了,
那么所有的数据都将被写入到最大的那颗磁盘去。举例来说,我用 200G 与 500G 组成 RAID-0 ,
那么最初的 400GB 数据可同时写入两颗磁盘 (各消耗 200G 的容量),后来再加入的数据就只能写入 500G 的那颗磁盘中了。
此时的性能就变差了,因为只剩下一颗可以存放数据嘛!</p>
<a id="raid1"></a>
<ul class="toplist"><li>RAID-1 (映射模式, mirror):完整备份</li></ul>
<p>这种模式也是需要相同的磁盘容量的,最好是一模一样的磁盘啦!如果是不同容量的磁盘组成 RAID-1
时,那么总容量将以最小的那一颗磁盘为主!这种模式主要是『<span class="text_import2">让同一份数据,完整的保存在两颗磁盘上头</span>』。举例来说,如果我有一个 100MB
的文件,且我仅有两颗磁盘组成 RAID-1 时, 那么这两颗磁盘将会同步写入 100MB 到他们的保存空间去。
因此,<span class="text_import2">整体 RAID 的容量几乎少了 50%</span>。由于两颗硬盘内容一模一样,好像镜子映照出来一样,
所以我们也称他为 mirror 模式啰~</p>
<a id="fig14.2.2"></a>
<div style="text-align:center; margin: 0 auto 0 auto; "><img src="./vbird_files/raid1.gif" alt="RAID-1 的磁盘写入示意图" title="RAID-1 的磁盘写入示意图" style="border: 1px solid black; padding: 10px "></div>
<div style="text-align: center;">图14.2.2、RAID-1 的磁盘写入示意图</div>
<p>如上图所示,一份数据发送到 RAID-1 之后会被分为两股,并分别写入到各个磁盘里头去。
由于同一份数据会被分别写入到其他不同磁盘,因此如果要写入 100MB 时,数据发送到 I/O 总线后会被复制多份到各个磁盘,
结果就是数据量感觉变大了!因此在大量写入 RAID-1 的情况下,写入的性能可能会变的非常差 (因为我们只有一个南桥啊!)。
好在如果你使用的是硬件 RAID (磁盘数组卡) 时,磁盘数组卡会主动的复制一份而不使用系统的 I/O 总线,性能方面则还可以。
如果使用软件磁盘数组,可能性能就不好了。</p>
<p>由于两颗磁盘内的数据一模一样,所以任何一颗硬盘损毁时,你的数据还是可以完整的保留下来的!
所以我们可以说, <span class="text_import2">RAID-1 最大的优点大概就在于数据的备份吧!不过由于磁盘容量有一半用在备份,
因此总容量会是全部磁盘容量的一半而已</span>。虽然 RAID-1
的写入性能不佳,不过读取的性能则还可以啦!这是因为数据有两份在不同的磁盘上面,如果多个 processes
在读取同一笔数据时, RAID 会自行取得最佳的读取平衡。</p>
<a id="raid0_1"></a>
<ul class="toplist"><li>RAID 1+0,RAID 0+1</li></ul>
<p>RAID-0 的性能佳但是数据不安全,RAID-1 的数据安全但是性能不佳,那么能不能将这两者集成起来设置 RAID 呢?
可以啊!那就是 RAID 1+0 或 RAID 0+1。所谓的 RAID 1+0 就是: (1)先让两颗磁盘组成 RAID 1,并且这样的设置共有两组;
(2)将这两组 RAID 1 再组成一组 RAID 0。这就是 RAID 1+0 啰!反过来说,RAID 0+1 就是先组成 RAID-0 再组成 RAID-1 的意思。</p>
<a id="fig14.2.3"></a>
<div style="text-align:center; margin: 0 auto 0 auto; "><img src="./vbird_files/raid1+0.jpg" alt="RAID-1+0 的磁盘写入示意图" title="RAID-1+0 的磁盘写入示意图" style="border: 1px solid black; padding: 10px "></div>
<div style="text-align: center;">图14.2.3、RAID-1+0 的磁盘写入示意图</div>
<p>如上图所示,Disk A + Disk B 组成第一组 RAID 1,Disk C + Disk D 组成第二组 RAID 1,
然后这两组再集成成为一组 RAID 0。如果我有 100MB 的数据要写入,则由于 RAID 0 的关系,
两组 RAID 1 都会写入 50MB,又由于 RAID 1 的关系,因此每颗磁盘就会写入 50MB 而已。
如此一来不论哪一组 RAID 1 的磁盘损毁,由于是 RAID 1 的映像数据,因此就不会有任何问题发生了!这也是目前保存设备厂商最推荐的方法!</p>
<fieldset class="vbirdface"><legend style="font-family: serif; font-size:12pt; color: darkblue;">Tips</legend><img src="./vbird_files/vbird_face.gif" alt="鸟哥的图标" title="鸟哥的图标" style="float: right;"> 为何会推荐 RAID 1+0 呢?想像你有 20 颗磁盘组成的系统,每两颗组成一个 RAID1,因此你就有总共 10组可以自己复原的系统了!
然后这 10组再组成一个新的 RAID0,速度立刻拉升 10倍了!同时要注意,因为每组 RAID1 是个别独立存在的,因此任何一颗磁盘损毁,
数据都是从另一颗磁盘直接复制过来重建,并不像 RAID5/RAID6 必须要整组 RAID 的磁盘共同重建一颗独立的磁盘系统!性能上差非常多!
而且 RAID 1 与 RAID 0 是不需要经过计算的 (striping) !读写性能也比其他的 RAID 等级好太多了!
</fieldset><br>
<a id="raid5"></a>
<ul class="toplist"><li>RAID 5:性能与数据备份的均衡考量</li></ul>
<p>RAID-5 至少需要三颗以上的磁盘才能够组成这种类型的磁盘数组。这种磁盘数组的数据写入有点类似 RAID-0 ,
不过每个循环的写入过程中 (striping),在每颗磁盘还加入一个同位检查数据 (Parity) ,这个数据会记录其他磁盘的备份数据,
用于当有磁盘损毁时的救援。RAID-5 读写的情况有点像底下这样:</p>
<a id="fig14.2.4"></a>
<div style="text-align:center; margin: 0 auto 0 auto; "><img src="./vbird_files/raid5.gif" alt="RAID-5 的磁盘写入示意图" title="RAID-5 的磁盘写入示意图" style="border: 1px solid black; padding: 10px "></div>
<div style="text-align: center;">图14.2.4、RAID-5 的磁盘写入示意图</div>
<p>如上图所示,每个循环写入时,都会有部分的同位检查码 (parity) 被记录起来,并且记录的同位检查码每次都记录在不同的磁盘,
因此,任何一个磁盘损毁时都能够借由其他磁盘的检查码来重建原本磁盘内的数据喔!不过需要注意的是,
由于有同位检查码,因此<span class="text_import2"> RAID 5 的总容量会是整体磁盘数量减一颗。以上图为例,
原本的 3 颗磁盘只会剩下 (3-1)=2 颗磁盘的容量。而且当损毁的磁盘数量大于等于两颗时,这整组 RAID 5 的数据就损毁了。
因为 RAID 5 缺省仅能支持一颗磁盘的损毁情况</span>。</p>
<p>在读写性能的比较上,读取的性能还不赖!与 RAID-0 有的比!不过写的性能就不见得能够增加很多!
这是因为要写入 RAID 5 的数据还得要经过计算同位检查码 (parity) 的关系。由于加上这个计算的动作,
所以写入的性能与系统的硬件关系较大!尤其当使用软件磁盘数组时,同位检查码是透过 CPU 去计算而非专职的磁盘数组卡,
因此性能方面还需要评估。</p>
<p>另外,由于 RAID 5 仅能支持一颗磁盘的损毁,因此近来还有发展出另外一种等级,就是 RAID 6 ,这个 RAID 6
则使用两颗磁盘的容量作为 parity 的保存,因此整体的磁盘容量就会少两颗,但是允许出错的磁盘数量就可以达到两颗了!
也就是在 RAID 6 的情况下,同时两颗磁盘损毁时,数据还是可以救回来!</p>
<a id="spare"></a>
<ul class="toplist"><li>Spare Disk:预备磁盘的功能:</li></ul>
<p>当磁盘数组的磁盘损毁时,就得要将坏掉的磁盘拔除,然后换一颗新的磁盘。换成新磁盘并且顺利启动磁盘数组后,
磁盘数组就会开始主动的重建 (rebuild) 原本坏掉的那颗磁盘数据到新的磁盘上!然后你磁盘数组上面的数据就复原了!
这就是磁盘数组的优点。不过,我们还是得要动手拔插硬盘,除非你的系统有支持热拔插,否则通常得要关机才能这么做。</p>
<p>为了让系统可以即时的在坏掉硬盘时主动的重建,因此就需要预备磁盘 (spare disk) 的辅助。
所谓的 spare disk 就是一颗或多颗没有包含在原本磁盘数组等级中的磁盘,这颗磁盘平时并不会被磁盘数组所使用,
当磁盘数组有任何磁盘损毁时,则这颗 spare disk 会被主动的拉进磁盘数组中,并将坏掉的那颗硬盘移出磁盘数组!
然后立即重建数据系统。如此你的系统则可以永保安康啊!若你的磁盘数组有支持热拔插那就更完美了!
直接将坏掉的那颗磁盘拔除换一颗新的,再将那颗新的设置成为 spare disk ,就完成了!</p>
<p>举例来说,鸟哥之前所待的研究室有一个磁盘数组可允许 16 颗磁盘的数量,不过我们只安装了 10 颗磁盘作为 RAID 5。
每颗磁盘的容量为 250GB,我们用了一颗磁盘作为 spare disk ,并将其他的 9 颗设置为一个 RAID 5,
因此这个磁盘数组的总容量为: (9-1)*250G=2000G。运作了一两年后真的有一颗磁盘坏掉了,我们后来看灯号才发现!
不过对系统没有影响呢!因为 spare disk 主动的加入支持,坏掉的那颗拔掉换颗新的,并重新设置成为 spare 后,
系统内的数据还是完整无缺的!嘿嘿!真不错!</p>
<ul class="toplist"><li>磁盘数组的优点</li></ul>
<p>说的口沫横飞,重点在哪里呢?其实你的系统如果需要磁盘数组的话,其实重点在于:</p>
<ol class="text_import2">
<li>数据安全与可靠性:指的并非网络信息安全,而是当硬件 (指磁盘) 损毁时,数据是否还能够安全的救援或使用之意;</li>
<li>读写性能:例如 RAID 0 可以加强读写性能,让你的系统 I/O 部分得以改善;</li>
<li>容量:可以让多颗磁盘组合起来,故单一文件系统可以有相当大的容量。</li>
</ol>
<p>尤其数据的可靠性与完整性更是使用 RAID 的考量重点!毕竟硬件坏掉换掉就好了,软件数据损毁那可不是闹着玩的!
所以企业界为何需要大量的 RAID 来做为文件系统的硬件基准,现在您有点了解了吧?那依据这三个重点,我们来列表看看上面几个重要的 RAID
等级各有哪些优点吧!假设有 n 颗磁盘组成的 RAID 设置喔!</p>
<table class="news" style="width: 95%">
<tbody><tr class="theader"><td style="width: 20%">项目</td><td style="width: 16%">RAID0</td><td style="width: 16%">RAID1</td><td style="width: 16%">RAID10</td><td style="width: 16%">RAID5</td><td style="width: 16%">RAID6</td></tr>
<tr class="tcenter"><td>最少磁盘数</td><td>2</td><td>2</td><td>4</td><td>3</td><td>4</td></tr>
<tr class="tcenter"><td>最大容错磁盘数(1)</td><td>无</td><td>n-1</td><td>n/2</td><td>1</td><td>2</td></tr>
<tr class="tcenter"><td>数据安全性(1)</td><td>完全没有</td><td>最佳</td><td>最佳</td><td>好</td><td>比 RAID5 好</td></tr>
<tr class="tcenter"><td>理论写入性能(2)</td><td>n</td><td>1</td><td>n/2</td><td><n-1</td><td><n-2</td></tr>
<tr class="tcenter"><td>理论读出性能(2)</td><td>n</td><td>n</td><td>n</td><td><n-1</td><td><n-2</td></tr>
<tr class="tcenter"><td>可用容量(3)</td><td>n</td><td>1</td><td>n/2</td><td>n-1</td><td>n-2</td></tr>
<tr class="tcenter"><td>一般应用</td><td>强调性能但数据不重要的环境</td><td>数据与备份</td><td>服务器、云系统常用</td><td>数据与备份</td><td>数据与备份</td></tr>
</tbody></table>
<p>注:因为 RAID5, RAID6 读写都需要经过 parity 的计算机制,因此读/写性能都不会刚好满足于使用的磁盘数量喔!</p>
<p>另外,根据使用的情况不同,一般推荐的磁盘数组等级也不太一样。以鸟哥为例,在鸟哥的跑空气品质模式之后的输出数据,动辄几百 GB 的单一大文件数据,
这些情况鸟哥会选择放在 RAID6 的数组环境下,这是考量到数据保全与总容量的应用,因为 RAID 6 的性能已经足以应付模式读入所需的环境。</p>
<p>近年来鸟哥也比较积极在作一些云程序环境的设计,在云环境下,确保每个虚拟机能够快速的反应以及提供数据保全是最重要的部份!
因此性能方面比较弱的 RAID5/RAID6 是不考虑的,总结来说,大概就剩下 RAID10 能够满足云环境的性能需求了。在某些更特别的环境下,
如果搭配 SSD 那才更具有性能上的优势哩!</p>
<br></div><br>
<a id="raid_so_ha"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.2.2 software, hardware RAID</h2>
<p>为何磁盘数组又分为硬件与软件呢?所谓的硬件磁盘数组 (hardware RAID) 是透过磁盘数组卡来达成数组的目的。
磁盘数组卡上面有一块专门的芯片在处理 RAID 的任务,因此在性能方面会比较好。在很多任务 (例如 RAID 5 的同位检查码计算)
磁盘数组并不会重复消耗原本系统的 I/O 总线,理论上性能会较佳。此外目前一般的中高端磁盘数组卡都支持热拔插,
亦即在不关机的情况下抽换损坏的磁盘,对于系统的复原与数据的可靠性方面非常的好用。</p>
<p>不过一块好的磁盘数组卡动不动就上万元台币,便宜的在主板上面『附赠』的磁盘数组功能可能又不支持某些高端功能,
例如低级主板若有磁盘数组芯片,通常仅支持到 RAID0 与 RAID1 ,鸟哥喜欢的 RAID6 并没有支持。
此外,操作系统也必须要拥有磁盘数组卡的驱动程序,才能够正确的捉到磁盘数组所产生的磁盘机!</p>
<p>由于磁盘数组有很多优秀的功能,然而硬件磁盘数组卡偏偏又贵的很~因此就有发展出利用软件来仿真磁盘数组的功能,
这就是所谓的软件磁盘数组 (software RAID)。软件磁盘数组主要是透过软件来仿真数组的任务,
因此会损耗较多的系统资源,比如说 CPU 的运算与 I/O 总线的资源等。不过目前我们的个人电脑实在已经非常快速了,
因此以前的速度限制现在已经不存在!所以我们可以来玩一玩软件磁盘数组!</p>
<p>我们的 CentOS 提供的软件磁盘数组为 mdadm 这套软件,这套软件会<span class="text_import2">以 partition
或 disk 为磁盘的单位</span>,也就是说,你不需要两颗以上的磁盘,只要有两个以上的分区 (partition)
就能够设计你的磁盘数组了。此外, mdadm 支持刚刚我们前面提到的 RAID0/RAID1/RAID5/spare disk 等!
而且提供的管理机制还可以达到类似热拔插的功能,可以在线 (文件系统正常使用) 进行分区的抽换!
使用上也非常的方便呢!</p>
<p>另外你必须要知道的是,硬件磁盘数组在 Linux 底下看起来就是一颗实际的大磁盘,因此硬件磁盘数组的设备文件名为
/dev/sd[a-p] ,因为使用到 SCSI 的模块之故。至于<span class="text_import2">软件磁盘数组则是系统仿真的,因此使用的设备文件名是系统的设备档,
文件名为 /dev/md0, /dev/md1...</span>,两者的设备文件名并不相同!不要搞混了喔!因为很多朋友常常觉得奇怪,
怎么他的 RAID 文件名跟我们这里测试的软件 RAID 文件名不同,所以这里特别强调说明喔!</p>
<fieldset class="vbirdface"><legend style="font-family: serif; font-size:12pt; color: darkblue;">Tips</legend><img src="./vbird_files/vbird_face.gif" alt="鸟哥的图标" title="鸟哥的图标" style="float: right;"> Intel 的南桥附赠的磁盘数组功能,在 windows 底下似乎是完整的磁盘数组,但是在 Linux 底下则被视为是软件磁盘数组的一种!
因此如果你有设置过 Intel 的南桥芯片磁盘数组,那在 Linux 底下反而还会是 /dev/md126, /dev/md127 等等设备文件名,
而他的分区竟然是 /dev/md126p1, /dev/md126p2... 之类的喔!比较特别,所以这里加强说明!
</fieldset><br> </div><br>
<a id="raid_setup"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.2.3 软件磁盘数组的设置</h2>
<p>软件磁盘数组的设置很简单呢!简单到让你很想笑喔!因为你只要使用一个指令即可!那就是 mdadm 这个指令。
这个指令在创建 RAID 的语法有点像这样:</p>
<a id="mdadm_create"></a>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">mdadm --detail /dev/md0</span>
[root@study ~]# <span class="term_command">mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK \</span>
> <span class="term_command">--raid-devices=N --spare-devices=N /dev/sdx /dev/hdx...</span>
<span class="term_say">选项与参数:
--create :为创建 RAID 的选项;
--auto=yes :决定创建后面接的软件磁盘数组设备,亦即 /dev/md0, /dev/md1...
--chunk=Nk :决定这个设备的 chunk 大小,也可以当成 stripe 大小,一般是 64K 或 512K。
--raid-devices=N :使用几个磁盘 (partition) 作为磁盘数组的设备
--spare-devices=N :使用几个磁盘作为备用 (spare) 设备
--level=[015] :设置这组磁盘数组的等级。支持很多,不过建议只要用 0, 1, 5 即可
--detail :后面所接的那个磁盘数组设备的详细信息</span>
</pre></td></tr></tbody></table>
<p>上面的语法中,最后面会接许多的设备文件名,这些设备文件名可以是整颗磁盘,例如 /dev/sdb ,
也可以是分区,例如 /dev/sdb1 之类。不过,这些设备文件名的总数必须要等于 --raid-devices
与 --spare-devices 的个数总和才行!鸟哥利用我的测试机来建置一个 RAID 5 的软件磁盘数组给您瞧瞧!
底下是鸟哥希望做成的 RAID 5 环境:</p>
<ul>
<li>利用 4 个 partition 组成 RAID 5;</li>
<li>每个 partition 约为 1GB 大小,需确定每个 partition 一样大较佳;</li>
<li>利用 1 个 partition 设置为 spare disk</li>
<li>chunk 设置为 256K 这么大即可!</li>
<li>这个 spare disk 的大小与其他 RAID 所需 partition 一样大!</li>
<li>将此 RAID 5 设备挂载到 /srv/raid 目录下</li>
</ul>
<p>最终我需要 5 个 1GB 的 partition。在鸟哥的测试机中,根据前面的章节实做下来,包括课后的情境仿真题目,目前应该还有 8GB 可供利用!
因此就利用这部测试机的 /dev/vda 切出 5 个 1G 的分区。实际的流程鸟哥就不一一展示了,自己透过 gdisk /dev/vda 实作一下!
最终这部测试机的结果应该如下所示:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">gdisk -l /dev/vda</span>
Number Start (sector) End (sector) Size Code Name
1 2048 6143 2.0 MiB EF02
2 6144 2103295 1024.0 MiB 0700
3 2103296 65026047 30.0 GiB 8E00
4 65026048 67123199 1024.0 MiB 8300 Linux filesystem
<span class="term_write"> 5 67123200 69220351 1024.0 MiB FD00 Linux RAID
6 69220352 71317503 1024.0 MiB FD00 Linux RAID
7 71317504 73414655 1024.0 MiB FD00 Linux RAID
8 73414656 75511807 1024.0 MiB FD00 Linux RAID
9 75511808 77608959 1024.0 MiB FD00 Linux RAID</span>
<span class="term_say"># 上面特殊字体的部份就是我们需要的那 5 个 partition 啰!注意注意!</span>
[root@study ~]# <span class="term_command">lsblk</span>
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0 disk
|-vda1 252:1 0 2M 0 part
|-vda2 252:2 0 1G 0 part /boot
|-vda3 252:3 0 30G 0 part
| |-centos-root 253:0 0 10G 0 lvm /
| |-centos-swap 253:1 0 1G 0 lvm [SWAP]
| `-centos-home 253:2 0 5G 0 lvm /home
|-vda4 252:4 0 1G 0 part /srv/myproject
<span class="term_write">|-vda5 252:5 0 1G 0 part
|-vda6 252:6 0 1G 0 part
|-vda7 252:7 0 1G 0 part
|-vda8 252:8 0 1G 0 part
`-vda9 252:9 0 1G 0 part</span>
</pre></td></tr></tbody></table>
<ul class="toplist"><li>以 mdadm 建置 RAID</li></ul>
<p>接下来就简单啦!透过 mdadm 来创建磁盘数组先!</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256K \</span>
> <span class="term_command"> --raid-devices=4 --spare-devices=1 /dev/vda{5,6,7,8,9}</span>
mdadm: /dev/vda5 appears to contain an ext2fs file system
size=1048576K mtime=Thu Jun 25 00:35:01 2015 <span class="term_note"># 某些时刻会出现这个东西!没关系的!</span>
Continue creating array? <span class="term_command">y</span>
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
<span class="term_say"># 详细的参数说明请回去前面看看啰!这里我透过 {} 将重复的项目简化!
# 此外,因为鸟哥这个系统经常在建置测试的环境,因此系统可能会抓到之前的 filesystem
# 所以就会出现如上前两行的消息!那没关系的!直接按下 y 即可删除旧系统</span>
[root@study ~]# <span class="term_command">mdadm --detail /dev/md0</span>
/dev/md0: <span class="term_note"># RAID 的设备文件名</span>
Version : 1.2
Creation Time : Mon Jul 27 15:17:20 2015 <span class="term_note"># 建置 RAID 的时间</span>
Raid Level : raid5 <span class="term_note"># 这就是 RAID5 等级!</span>
Array Size : 3142656 (3.00 GiB 3.22 GB) <span class="term_note"># 整组 RAID 的可用容量</span>
Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB) <span class="term_note"># 每颗磁盘(设备)的容量</span>
Raid Devices : 4 <span class="term_note"># 组成 RAID 的磁盘数量</span>
Total Devices : 5 <span class="term_note"># 包括 spare 的总磁盘数</span>
Persistence : Superblock is persistent
Update Time : Mon Jul 27 15:17:31 2015
<span class="term_write">State : clean</span> <span class="term_note"># 目前这个磁盘数组的使用状态</span>
Active Devices : 4 <span class="term_note"># 启动(active)的设备数量</span>
Working Devices : 5 <span class="term_note"># 目前使用于此数组的设备数</span>
Failed Devices : 0 <span class="term_note"># 损坏的设备数</span>
Spare Devices : 1 <span class="term_note"># 预备磁盘的数量</span>
Layout : left-symmetric
Chunk Size : 256K <span class="term_note"># 就是 chunk 的小区块容量</span>
Name : study.centos.vbird:0 (local to host study.centos.vbird)
UUID : 2256da5f:4870775e:cf2fe320:4dfabbc6
Events : 18
Number Major Minor <span class="term_write">RaidDevice State</span>
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
2 252 7 2 active sync /dev/vda7
5 252 8 3 active sync /dev/vda8
4 252 9 - spare /dev/vda9
<span class="term_say"># 最后五行就是这五个设备目前的情况,包括四个 active sync 一个 spare !
# 至于 RaidDevice 指的则是此 RAID 内的磁盘顺序</span>
</pre></td></tr></tbody></table>
<p>由于磁盘数组的建置需要一些时间,所以你最好等待数分钟后再使用『 mdadm --detail /dev/md0 』去查阅你的磁盘数组详细信息!
否则有可能看到某些磁盘正在『spare rebuilding』之类的建置字样!透过上面的指令,
你就能够创建一个 RAID5 且含有一颗 spare disk 的磁盘数组啰!非常简单吧!
除了指令之外,你也可以查阅如下的文件来看看系统软件磁盘数组的情况:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">cat /proc/mdstat</span>
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 vda8[5] vda9[4](S) vda7[2] vda6[1] vda5[0] <span class="term_note"><==第一行</span>
3142656 blocks super 1.2 level 5, 256k chunk, algorithm 2 [4/4] [UUUU] <span class="term_note"><==第二行</span>
unused devices: <none>
</pre></td></tr></tbody></table>
<p>上述的数据比较重要的在特别指出的第一行与第二行部分(<a href="0420quota.html#ps3">注3</a>):</p>
<ul>
<li>第一行部分:指出 md0 为 raid5 ,且使用了 vda8, vda7, vda6, vda5 等四颗磁盘设备。每个设备后面的中括号 []
内的数字为此磁盘在 RAID 中的顺序 (RaidDevice);至于 vda9 后面的 [S] 则代表 vda9 为 spare 之意。<br><br></li>
<li>第二行:此磁盘数组拥有 3142656 个block(每个 block 单位为 1K),所以总容量约为 3GB,
使用 RAID 5 等级,写入磁盘的小区块 (chunk) 大小为 256K,使用 algorithm 2 磁盘数组算法。 [m/n]
代表此数组需要 m 个设备,且 n 个设备正常运作。因此本 md0 需要 4 个设备且这 4 个设备均正常运作。
后面的 [UUUU] 代表的是四个所需的设备 (就是 [m/n] 里面的 m) 的启动情况,U 代表正常运作,若为 _ 则代表不正常。</li>
</ul>
<p>这两种方法都可以知道目前的磁盘数组状态啦!</p>
<ul class="toplist"><li>格式化与挂载使用 RAID</li></ul>
<p>接下来就是开始使用格式化工具啦!这部分就需要注意喔!因为涉及到 xfs 文件系统的优化!还记得第七章的内容吧?我们这里的参数为:</p>
<ul>
<li>srtipe (chunk) 容量为 256K,所以 su=256k</li>
<li>共有 4 颗组成 RAID5 ,因此容量少一颗,所以 sw=3 喔!</li>
<li>由上面两项计算出数据宽度为: 256K*3=768k</li>
</ul>
<p>所以整体来说,要优化这个 XFS 文件系统就变成这样:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">mkfs.xfs -f -d su=256k,sw=3 -r extsize=768k /dev/md0</span>
<span class="term_say"># 有趣吧!是 /dev/md0 做为设备被格式化呢!</span>
[root@study ~]# <span class="term_command">mkdir /srv/raid</span>
[root@study ~]# <span class="term_command">mount /dev/md0 /srv/raid</span>
[root@study ~]# <span class="term_command">df -Th /srv/raid</span>
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 3.0G 33M 3.0G 2% /srv/raid
<span class="term_say"># 看吧!多了一个 /dev/md0 的设备,而且真的可以让你使用呢!还不赖!</span>
</pre></td></tr></tbody></table>
<br></div><br>
<a id="raid_rescue"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.2.4 仿真 RAID 错误的救援模式</h2>
<p>俗话说『天有不测风云、人有旦夕祸福』,谁也不知道你的磁盘数组内的设备啥时会出差错,因此,
了解一下软件磁盘数组的救援还是必须的!底下我们就来玩一玩救援的机制吧!首先来了解一下 mdadm
这方面的语法:</p>
<a id="mdadm_manage"></a>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">mdadm --manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备] </span>
<span class="term_say">选项与参数:
--add :会将后面的设备加入到这个 md 中!
--remove :会将后面的设备由这个 md 中移除
--fail :会将后面的设备设置成为出错的状态</span>
</pre></td></tr></tbody></table>
<ul class="toplist"><li>设置磁盘为错误 (fault)</li></ul>
<p>首先,我们来处理一下,该如何让一个磁盘变成错误,然后让 spare disk 自动的开始重建系统呢?</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd"># 0. 先复制一些东西到 /srv/raid 去,假设这个 RAID 已经在使用了</span>
[root@study ~]# <span class="term_command">cp -a /etc /var/log /srv/raid</span>
[root@study ~]# <span class="term_command">df -Th /srv/raid ; du -sm /srv/raid/*</span>
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 3.0G 144M 2.9G 5% /srv/raid
28 /srv/raid/etc <span class="term_note"><==看吧!确实有数据在里面喔!</span>
51 /srv/raid/log
<span class="term_hd"># 1. 假设 /dev/vda7 这个设备出错了!实际仿真的方式:</span>
[root@study ~]# <span class="term_command">mdadm --manage /dev/md0 --fail /dev/vda7</span>
mdadm: set /dev/vda7 faulty in /dev/md0 <span class="term_note"># 设置成为错误的设备啰!</span>
/dev/md0:
<span class="term_say">.....(中间省略).....</span>
Update Time : Mon Jul 27 15:32:50 2015
State : clean, <span class="term_write">degraded, recovering</span>
Active Devices : 3
Working Devices : 4
Failed Devices : 1 <span class="term_note"><==出错的磁盘有一个!</span>
Spare Devices : 1
<span class="term_say">.....(中间省略).....</span>
Number Major Minor RaidDevice State
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
4 252 9 2 <span class="term_write">spare rebuilding /dev/vda9</span>
5 252 8 3 active sync /dev/vda8
2 252 7 - <span class="term_write">faulty /dev/vda7</span>
<span class="term_say"># 看到没!这的动作要快做才会看到! /dev/vda9 启动了而 /dev/vda7 死掉了</span>
</pre></td></tr></tbody></table>
<p>上面的画面你得要快速的连续输入那些 mdadm 的指令才看的到!因为你的 RAID 5 正在重建系统!
若你等待一段时间再输入后面的观察指令,则会看到如下的画面了:</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd"># 2. 已经借由 spare disk 重建完毕的 RAID 5 情况</span>
[root@study ~]# <span class="term_command">mdadm --detail /dev/md0</span>
<span class="term_say">....(前面省略)....</span>
Number Major Minor RaidDevice State
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
4 252 9 2 active sync /dev/vda9
5 252 8 3 active sync /dev/vda8
2 252 7 - faulty /dev/vda7
</pre></td></tr></tbody></table>
<p>看吧!又恢复正常了!真好!我们的 /srv/raid 文件系统是完整的!并不需要卸载!很棒吧!</p>
<ul class="toplist"><li>将出错的磁盘移除并加入新磁盘</li></ul>
<p>因为我们的系统那个 /dev/vda7 实际上没有坏掉啊!只是用来仿真而已啊!因此,如果有新的磁盘要替换,其实替换的名称会一样啊!
也就是我们需要:</p>
<ol>
<li>先从 /dev/md0 数组中移除 /dev/vda7 这颗『磁盘』</li>
<li>整个 Linux 系统关机,拔出 /dev/vda7 这颗『磁盘』,并安装上新的 /dev/vda7 『磁盘』,之后开机</li>
<li>将新的 /dev/vda7 放入 /dev/md0 数组当中!</li>
</ol>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd"># 3. 拔除『旧的』/dev/vda7 磁盘</span>
[root@study ~]# <span class="term_command">mdadm --manage /dev/md0 --remove /dev/vda7</span>
<span class="term_say"># 假设接下来你就进行了上面谈到的第 2, 3 个步骤,然后重新开机成功了!</span>
<span class="term_hd"># 4. 安装『新的』/dev/vda7 磁盘</span>
[root@study ~]# <span class="term_command">mdadm --manage /dev/md0 --add /dev/vda7</span>
[root@study ~]# <span class="term_command">mdadm --detail /dev/md0</span>
<span class="term_say">....(前面省略)....</span>
Number Major Minor RaidDevice State
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
4 252 9 2 active sync /dev/vda9
5 252 8 3 active sync /dev/vda8
6 252 7 - spare /dev/vda7
</pre></td></tr></tbody></table>
<p>嘿嘿!你的磁盘数组内的数据不但一直存在,而且你可以一直顺利的运作 /srv/raid 内的数据,即使 /dev/vda7
损毁了!然后透过管理的功能就能够加入新磁盘且拔除坏掉的磁盘!注意,这一切都是在上线 (on-line) 的情况下进行!
所以,您说这样的咚咚好不好用啊! ^_^</p>
<br></div><br>
<a id="raid_auto"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.2.5 开机自动启动 RAID 并自动挂载</h2>
<p>新的 distribution 大多会自己搜索 /dev/md[0-9] 然后在开机的时候给予设置好所需要的功能。不过鸟哥还是建议你,
修改一下设置档吧! ^_^。software RAID 也是有设置档的,这个设置档在 /etc/mdadm.conf !这个设置档内容很简单,
你只要知道 /dev/md0 的 UUID 就能够设置这个文件啦!这里鸟哥仅介绍他最简单的语法:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">mdadm --detail /dev/md0 | grep -i uuid</span>
UUID : 2256da5f:4870775e:cf2fe320:4dfabbc6
<span class="term_say"># 后面那一串数据,就是这个设备向系统注册的 UUID 识别码!</span>
<span class="term_hd"># 开始设置 mdadm.conf</span>
[root@study ~]# <span class="term_command">vim /etc/mdadm.conf</span>
<span class="term_write">ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6</span>
<span class="term_say"># RAID设备 识别码内容</span>
<span class="term_hd"># 开始设置开机自动挂载并测试</span>
[root@study ~]# <span class="term_command">blkid /dev/md0</span>
/dev/md0: UUID="494cb3e1-5659-4efc-873d-d0758baec523" TYPE="xfs"
[root@study ~]# <span class="term_command">vim /etc/fstab</span>
<span class="term_write">UUID=494cb3e1-5659-4efc-873d-d0758baec523 /srv/raid xfs defaults 0 0</span>
[root@study ~]# <span class="term_command">umount /dev/md0; mount -a</span>
[root@study ~]# <span class="term_command">df -Th /srv/raid</span>
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 3.0G 111M 2.9G 4% /srv/raid
<span class="term_say"># 你得确定可以顺利挂载,并且没有发生任何错误!</span>
</pre></td></tr></tbody></table>
<p>如果到这里都没有出现任何问题!接下来就请 reboot 你的系统并等待看看能否顺利的启动吧! ^_^</p>
<br></div><br>
<a id="raid_stop"></a>
<div class="block2"><div class="gototop"><a href="0420quota.html#top">Top</a></div>
<h2>14.2.6 关闭软件 RAID(重要!)</h2>
<p>除非你未来就是要使用这颗 software RAID (/dev/md0),否则你势必要跟鸟哥一样,将这个 /dev/md0 关闭!
因为他毕竟是我们在这个测试机上面的练习设备啊!为什么要关掉他呢?因为这个 /dev/md0 其实还是使用到我们系统的磁盘分区,
在鸟哥的例子里面就是 /dev/vda{5,6,7,8,9},如果你只是将 /dev/md0 卸载,然后忘记将 RAID 关闭,
结果就是....未来你在重新分割 /dev/vdaX 时可能会出现一些莫名的错误状况啦!所以才需要关闭 software RAID 的步骤!
那如何关闭呢?也是简单到爆炸!(请注意,确认你的 /dev/md0 确实不要用且要关闭了才进行底下的玩意儿)</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd"># 1. 先卸载且删除设置档内与这个 /dev/md0 有关的设置:</span>
[root@study ~]# <span class="term_command">umount /srv/raid</span>
[root@study ~]# <span class="term_command">vim /etc/fstab</span>
<span style="text-decoration: line-through">UUID=494cb3e1-5659-4efc-873d-d0758baec523 /srv/raid xfs defaults 0 0</span>
<span class="term_say"># 将这一行删除掉!或者是注解掉也可以!</span>
<span class="term_hd"># 2. 先覆盖掉 RAID 的 metadata 以及 XFS 的 superblock,才关闭 /dev/md0 的方法</span>
[root@study ~]# <span class="term_command">dd if=/dev/zero of=/dev/md0 bs=1M count=50</span>
[root@study ~]# <span class="term_command">mdadm --stop /dev/md0</span>
mdadm: stopped /dev/md0 <span class="term_note"><==不啰唆!这样就关闭了!</span>