磁盘管理

课程目标:

一、硬盘的基本知识

1.了解硬盘的接口类型

IDE ——> SATA I/II/III 个人pc机 SCSI ——> SAS 服务上 PCIE FC

https://blog.csdn.net/tianlesoftware/article/details/6009110

2. kernel对不同接口硬盘命名方式

OSIDE(并口)SATA(串口)SCSI
RHEL5/dev/hda/dev/sda/dev/sda
RHEL6/dev/sda/dev/sda/dev/sda
RHEL7/dev/sda/dev/sda/dev/sda

3. 磁盘设备的命名

/dev/sda2 s=硬件接口类型(sata/scsi),d=disk(硬盘),a=第1块硬盘(b,第二块),2=第几个分区 /dev/hd h=IDE硬盘 /dev/hdd3 /dev/vd v=虚拟硬盘 /dev/vdf7

字符设备:c 块设备:b 普通文件:f 目录:d 链接文件:l 套接字:s 管道文件:p

4. HP服务器硬盘

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

5. 硬盘的分区方式

MBR <2TB fdisk 4个主分区或者3个主分区+1个扩展分区(N个逻辑分区)

MBR(Master Boot Record)的缩写,由三部分组成,即:

MBR=512字节=446个字节【Bootloader(主引导程序)】+64个字节【DPT分区表(Disk Partition Table)】+2个字节【硬盘有效标志(校验位)】

MBR引导扇区

注意:从MBR转到GPT,或从GPT转换到MBR会导致数据全部丢失

http://www.eassos.cn/jiao-cheng/ying-pan/mbr-vs-gpt.php

二、硬盘的工作原理

机械硬盘的构成: 盘片(Platter): 磁道(Track): 扇区(Sector): 读写磁头(Head): 柱面(Cylinder):

磁盘读取数据的最小单位是一个扇区:512字节

操作系统读取数据的最小单位是一个数据块:block 4kb

 

三、基本分区管理

1. 磁盘划分思路:

2. fdisk分区(重点掌握)

2.1 使用fdisk分区
# fidsk /dev/sdb

硬盘容量 = 柱面数 × 盘面数(磁头数) × 扇区数 × 扇区大小(一般为512字节)
Disk /dev/sda: 26.8 GB, 26843545600 bytes   磁盘空间
 255 heads, 63 sectors/track, 3263 cylinders   255磁头    63个扇区 每 磁道   3263个圆柱体
Units = cylinders of 16065 * 512 = 8225280 bytes       单元
Sector size (logical/physical): 512 bytes / 512 bytes   扇区大小(逻辑/物理)  都是512字节。
I/O size (minimum/optimal): 512 bytes / 512 bytes   I/O 大小(最小/最大) 都是512字节。
Disk identifier: 0x00030124   设备识别码
 启动设备加*           起始         结束      块           id     系统
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2497    20051968   83  Linux
/dev/sda2            2497        2611      916481    5  Extended   有一个扩展分区
/dev/sda3            2612        3263     5237190   83  Linux
/dev/sda5            2497        2611      916480   82  Linux swap / Solaris

Command(m for help): m      	输出帮助信息
Commandaction
   a  toggle a bootable flag  	设置启动分区
   b  edit bsd disklabel      	编辑分区标签
   c  toggle the dos compatibility flag
   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           	退出不保存设置
   s   create a new empty Sun disklabel	创建一个新的空的SUN标示
   t   changea partition's system id          	改变分区的标号
   u   changedisplay/entry units            	改变显示的单位
   v   verify the partition table              	检查验证分区表
   w  write table to disk and exit           	保存分区表

需求1:需要2G的空间

1. 增加一块10g硬盘
2. 使用fdisk命令进行分区 /dev/sdb[12345]
3. 格式化指定分区
4. 创建一个空的目录作为挂载点
5. 手动挂载使用

 

总结:

  1. 扩展分区的大小决定了所有逻辑分区的大小
  2. 删除扩展分区后下面的逻辑分区都被删除
  3. 分完区后需要手动刷新分区表
  4. 创建分区的时候尽可能注意分区序号的连续性

 

2.2 挂载分区设备
手动挂载:
mount   [options]     需要挂载的设备     挂载点
特点:系统重启后需要重新挂载;手动卸载后需要手动挂载

-o:挂载选项	-o ro,sync

[root@MissHou ~]# mount -o remount,ro /u02		//可以是挂载点也可以是设备

remount:重新挂载一个正在挂载的设备

挂载设备:真实设备、设备UUID,设备的卷标
/dev/sdb
/dev/sdb1
[root@MissHou ~]# blkid /dev/sdb1				//查看设备的UUID和文件系统类型
/dev/sdb1: UUID="FD3A-F14D" TYPE="vfat" 
[root@MissHou ~]# blkid /dev/sdb2
/dev/sdb2: UUID="f1cc2198-7e5f-4408-9c74-9b93d4716d8d" TYPE="ext4"
[root@server ~]# e2label /dev/sdb1 DISK1


说明:e2label只能够对ext2~ext4的文件系统设置卷标

[root@MissHou ~]# e2label /dev/sdb2 disk2
[root@MissHou ~]# blkid /dev/sdb2
/dev/sdb2: UUID="f1cc2198-7e5f-4408-9c74-9b93d4716d8d" TYPE="ext4" LABEL="disk2"

[root@MissHou ~]# umount /u01
[root@MissHou ~]# umount /dev/sdb2
[root@MissHou ~]# mount UUID="FD3A-F14D" /u01
[root@MissHou ~]# mount LABEL="disk2" /u02


开机自动挂载:
# vim /etc/fstab        //开机自动挂载
UUID="9bf6b9f7-92ad-441b-848e-0257cbb883d1" /mnt/disk1   auto    defaults    0 0       
UUID="4d26172c-7aff-4388-baa5-c6756c014d52" /mnt/disk2    ext4    ro    0 0
# mount -a
特点:系统重启后自动挂载;手动卸载后重启会自动挂载或者使用mount -a自动挂载



/etc/fstab文件:
格式:
要挂载的资源路径	挂载点	文件系统类型	挂载选项	dump备份支持  文件系统检测
UUID=289370eb-9459-42a8-8cee-7006507f1477   /      ext4    defaults        1 1
1段:挂载的设备(磁盘设备的文件名或设备的卷标或者是设备的UUID)
2段:挂载点(建议用一个空目录),建议不要将多个设备挂载到同一个挂载点上
3段:文件系统类型(ext3、ext4、vfat、ntfs(安装软件包)、swap等等)
4段:挂载选项
async/sync  异步/同步:
auto/noauto     自动/非自动:
rw/ro   读写/只读:
exec/noexec     可被执行/不可被执行:
remount     重新挂在一个已经挂载的文件系统,常用于修改挂载参数
user/nouser     允许/不允许其他普通用户挂载:
suid/nosuid     具有/不具有suid权限:该文件系统是否允许SUID的存在。
usrquota    这个是在启动文件系统的时候,让其支持磁盘配额,这个是针对用户的。
grpquota    支持用户组的磁盘配额。
....
defaults 同时具有rw, dev, exec, acl, async,nouser等参数。

man mount 可以找到详细信息

5段:是否支持dump备份。//dump是一个用来备份的命令,0代表不要做dump备份,1代表要每天进行dump的动作,2也代表其他不定日期的dump备份。通常这个数值不是0就是1。数字越小优先级越高。

6段:是否用 fsck 检验扇区。//开机的过程中,系统默认会用fsck检验文件系统是否完整。0是不要检验,1表示最先检验(一般只有根目录会设定为1),2也是要检验,只是1是最先,2是其次才进行检验。

fsck -f /dev/sdb2

说明:
要挂载的资源路径可以是文件系统的UUID,设备路径,文件系统的标签 ,光盘镜像文件(iso),亦或是来自网络的共享资源等

建议:
/etc/rc.local  操作系统启动后读取的最后一个文件

vim /etc/rc.local
...
/bin/mount /dev/sdb1 /u01


自动挂载 Automount:
特点:挂载是由访问产生;卸载是由超时产生;依赖于后台的autofs服务
思路:
1. 所有的监控都是由一个程序完成  autofs
2. 服务启动后才会监控挂载的设备
3. 修改配置文件来指定需要监控的设备


需求1:让系统自动挂载/dev/sdb1设备,如果2分钟没有被用自动卸载
步骤:
1)安装autofs软件
[root@MissHou ~]# rpm -q autofs
autofs-5.0.5-88.el6.x86_64
2)修改配置文件(指定需要监控的设备和挂载的目录)
vim /etc/auto.master		//定义一级挂载点/u01和子配置文件
/u01    /etc/auto.u01	-t 120 或者 --timeout 120  单位秒   (设置超时时间去卸载)

vim /etc/auto.u01			//子配置文件自己创建,定义二级挂载点和需要挂载的设备
test  -fstype=ext4,ro   :/dev/sdb2


3)重启服务
[root@MissHou ~]# service autofs restart
Stopping automount:                                        [  OK  ]
Starting automount:                                        [  OK  ]
[root@MissHou ~]# 

4)测试验证




后续补充:
如果想要将/dev/sdb1挂载到/u01下,怎么做?


需求2:将10.1.1.2上的共享目录/share/nfs挂载到10.1.1.1本地的/notes下面
环境:
server:10.1.1.1	搭建NFS服务,共享/share/nfs/xxx
client:10.1.1.2   使用autofs自动挂载server上共享目录
步骤:
1. server端共享文件
[root@server ~]# mkdir /share/nfs -p
[root@server ~]# touch /share/nfs/file{1..3}
[root@server ~]# mkdir /share/nfs/dir{1..3}
[root@server ~]# ls /share/nfs/
dir1  dir2  dir3  file1  file2  file3
[root@server ~]# vim /etc/exports 
/share/nfs	*(rw)
[root@server ~]# service nfs restart

2. client端使用autofs方式自动挂载
1)vim /etc/auto.master
/nfs		/etc/auto.notes

2)vim /etc/auto.notes
notes		-nfs,ro	10.1.1.1:/share/nfs

3) 重启服务

4)测试验证

注意:一级和二级挂载点可以不用创建,autofs可以让我们临时使用

3. 扩容swap空间(扩展)

方法1:增加一个硬盘或者分区来扩容swap空间

[root@server ~]# mkswap /dev/sdb6
Setting up swapspace version 1, size = 2064316 KiB
no label, UUID=dcd9338f-8709-47ca-b039-0266b8926a8a
[root@server ~]# blkid /dev/sdb6
/dev/sdb6: UUID="dcd9338f-8709-47ca-b039-0266b8926a8a" TYPE="swap" 

//激活swap分区。swap空间不能手动挂载
[root@server ~]# swapon /dev/sdb6

[root@server ~]# swapon -s
Filename				Type		Size	Used	Priority
/dev/dm-1                               partition	2031608	0	-1
/dev/sdb6                               partition	2064312	0	-2

方法2:使用dd命令模拟大文件来扩容swap

[root@server ~]# dd if=/dev/sr0 of=/rhel6.iso
[root@server ~]# dd if=/dev/sda1 of=/tmp/bak.boot
[root@server ~]# 
[root@server ~]# dd if=/dev/zero of=/dev/sda1 bs=1M count=100  //不要执行

if=源文件
of=目标文件
bs=复制数据的大小
count=复制的个数

注意:
1. 一般可以使用dd命令做块设备文件的备份
2. /dev/zero 特殊设备,一般用来模拟一个大文件,源源不断的二进制的bit流


 

1. 使用dd命令模拟大文件
# dd if=/dev/zero of=/tmp/swapfile bs=1M count=1024
2. 格式化大文件
[root@server ~]# mkswap /tmp/swapfile 

3.激活大文件
[root@server ~]# swapon -p 1 /tmp/swapfile

4. 查看
[root@server ~]# swapon -s
Filename				Type		Size	Used	Priority
/tmp/swapfile                           file		1048568	0	1

作业:

1、虚拟机里添加一块10G硬盘,分7个分区,格式化前4个分区为ext4的文件系统类型,第5个分区格式化成swap分区,大小为1G 2、使用两种方式扩容你的swap空间,扩容1G大小。 3、使用autofs一键触发挂载新添加硬盘的第2个分区到/u01/test目录下;超时时间为1分钟 4、使用autofs一键式触发挂载10.1.1.2:/data/share/notes目录 5、将第一个分区设置开机自动挂载

 

扩展:

====gdisk====
GPT  128个主分区
1.创建分区
# gdisk -l /dev/sdc
# gdisk /dev/sdc
# partprobe /dev/sdc
# ll /dev/sdc*

2.创建文件系统(格式化)redhat7默认使用xfs
# mkfs.xfs /dev/sdb1

3.挂载(手动、开机自动、autofs自动)
# mkdir /mnt/disk1
# mkdir /mnt/disk2
# mount -t xfs -o ro /dev/sdb1 /mnt/disk1		//手动挂载
# umount /mnt/disk1

 

四、逻辑卷管理

1. 逻辑卷介绍

逻辑卷: 逻辑卷(LVM):它是Linux环境下对磁盘分区进行管理的一种机制,它是建立在物理存储设备之上的一个抽象层,优点在于灵活管理。 特点: 1、动态在线态扩容 2、离线裁剪 3、数据条带化 4、数据镜像

2. 逻辑卷基本概念

物理卷是底层真正提供容量,存放数据的设备,它可以是整个硬盘、硬盘上的分区等。

卷组建立在物理卷之上,它由一个或多个物理卷组成。即把物理卷整合起来提供容量分配。 一个LVM系统中可以只有一个卷组,也可以包含多个卷组。

逻辑卷建立在卷组之上,它是从卷组中“切出”的一块空间。它是最终用户使用的逻辑设备。逻辑卷创建之后,其大小可以伸缩。

每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是能被LVM寻址的最小单元。PE的大小可指定,默认为4 MB。 PE的大小一旦确定将不能改变,同一个卷组中的所有物理卷的PE的大小是一致的。 4MB=4096kb=4096kb/4kb=1024个block

逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

真实的物理设备 逻辑上 物理卷(pv)——>卷组(vg)——>逻辑卷(lv)

3. 逻辑卷LVM应用

3.1 创建一个大小为1.5G的逻辑卷
思路:
1. 物理的设备
2. 将物理设备做成物理卷
3. 创建卷组并将物理卷加入其中
4. 创建逻辑卷
5. 格式化逻辑卷
6. 挂载使用


3.2 逻辑卷动态扩容

需求1:将/data目录动态扩容到3G

思路:
1. 查看/data目录所对应的逻辑卷是哪一个  /dev/vg01/lv01
2. 查看当前逻辑卷所在的卷组vg01剩余空间是否足够
3. 如果vg01空间不够,得先扩容卷组,再扩容逻辑卷
4. 如果vg01空间足够,直接扩容逻辑卷


需求2:离线裁剪逻辑卷

[root@server ~]# umount /data/
[root@server ~]# e2fsck -f /dev/vg01/lv01		检验文件系统
[root@server ~]# resize2fs /dev/vg01/lv01 2G	裁剪文件系统到2G
[root@server ~]# lvreduce /dev/vg01/lv01 -L 2G	裁剪逻辑卷
[root@server ~]# mount /dev/vg01/lv01 /data		挂载使用

 

3.3 扩展
3.3.1 逻辑卷实现条带化
条带化:
        把保存到逻辑卷的数据分成n等分,分别写到不同的物理卷,可以提高数据的读写效率;
        如果任何一个涉及到的物理卷出现故障,数据都会无法恢复。


sdb                             8:16   0   10G  0 disk 
├─sdb1                          8:17   0    2G  0 part 
├─sdb2                          8:18   0    2G  0 part 
├─sdb3                          8:19   0    1K  0 part 
├─sdb5                          8:21   0    2G  0 part 
└─sdb6                          8:22   0    2G  0 part 
[root@server ~]# pvcreate /dev/sdb[12]
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdb2" successfully created
[root@server ~]# pvs /dev/sdb[12]
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb1       lvm2 a--  2.01g 2.01g
  /dev/sdb2       lvm2 a--  2.01g 2.01g
[root@server ~]# vgcreate vg01 /dev/sdb[12]
  Volume group "vg01" successfully created
//实现条带化之前:
[root@server ~]# pvs /dev/sdb[12]
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb1  vg01 lvm2 a--  2.00g 2.00g
  /dev/sdb2  vg01 lvm2 a--  2.00g 2.00g
[root@server ~]# vgs vg01
  VG   #PV #LV #SN Attr   VSize VFree
  vg01   2   0   0 wz--n- 4.01g 4.01g

创建实现条带化的逻辑卷:
lvcreate -n lv01 -L 1G -i 2 vg01 /dev/sdb[12]
-i 参数:给出条带化的数量

[root@server ~]# lvcreate -n lv01 -L 1G -i 2 vg01 /dev/sdb[12]
  Using default stripesize 64.00 KiB
  Logical volume "lv01" created
[root@server ~]# pvs /dev/sdb[12]
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb1  vg01 lvm2 a--  2.00g 1.50g
  /dev/sdb2  vg01 lvm2 a--  2.00g 1.50g

格式化挂载使用:
683  mkfs.ext4 /dev/vg01/lv01 
684  mount /dev/vg01/lv01 /data/


测试:
# iostat -d -m /dev/sdb[12] 2     
-d 查看磁盘
-m 以什么速度显示,每秒M
2  每隔2s显示一次 
   如果后面还有数字则代表总共显示多少次
3.3.2 逻辑卷实现镜像
逻辑卷实现镜像:
镜像:对某个逻辑卷的数据做镜像,起到数据备份的作用。

镜像前:
[root@server ~]# pvs /dev/sdb[56]
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb5  vg02 lvm2 a--  2.00g 2.00g
  /dev/sdb6  vg02 lvm2 a--  2.00g 2.00g




[root@server ~]# lvcreate -n lv02 -L 1G -m 1 vg02 /dev/sdb[56]
  Logical volume "lv02" created

-m参数:给出镜像的个数

[root@server ~]# lvs
  LV      VG         Attr       LSize  Pool Origin Data%  Move Log       Cpy%Sync Convert
  lv01    vg01       -wi-ao----  1.00g                                                   
  lv02    vg02       mwi-a-m---  1.00g                         lv02_mlog    19.92        

说明: Cpy%Sync 19.92该值是100%说明复制ok 

创建后:
[root@server ~]# pvs /dev/sdb[56]
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb5  vg02 lvm2 a--  2.00g 1.00g
  /dev/sdb6  vg02 lvm2 a--  2.00g 1.00g
  
格式化逻辑卷:
mkfs -t ext4 /dev/vg02/lv02
挂载使用
mount /dev/vg02/lv02 /u02
touch /u02/file{1..5}
mkdir /u02/aaa{1..3}
 
测试验证:
思路:损坏一个磁盘,测试数据是否在第二个物理卷中
1. 使用dd命令破坏一个物理卷
dd if=/dev/zero of=/dev/sdb5 bs=1M count=100
2. 再次查看物理卷发现有一个unknown Device
unknown device vg02       lvm2 a-m   2.00g 1.00g
/dev/sdb6      vg02       lvm2 a--   2.00g 1.00g
3. 将损坏的盘从卷组中移除
vgreduce vg02 --removemissing --force

4. 再次查看挂载点/u02数据依然存在

自己也可以再次测试:
1. 再拿刚刚人为损坏的盘做成物理卷再次加入到vg02卷组中
2. 再次让/dev/sdb5和/dev/sdb6互为镜像
lvconvert -m 1 /dev/vg02/lv02 /dev/sdb[56]
3. 等待复制完成就可以再次人为模拟另一块物理卷损坏继续测试

3.3.3 逻辑卷快照

理解原理

1. 创建快照 (EXT4)
[root@node1 ~]# lvcreate -L 128M -s -n lv2-snap /dev/vg1/lv2
[root@node1 ~]# mount -o ro /dev/vg1/lv2-snap /mnt/lv2-snap/

[root@node1 ~]# lvscan 
  ACTIVE            '/dev/vg1/lv1' [768.00 MiB] inherit
  ACTIVE   Original '/dev/vg1/lv2' [512.00 MiB] inherit
  ACTIVE   Snapshot '/dev/vg1/lv2-snap' [128.00 MiB] inherit


2. 修改原卷的数据

3. 观察Snapshot

[root@node1 ~]# dmsetup ls --tree
vg1-lv2--snap (252:5)
 ├─vg1-lv2--snap-cow (252:7)
 │  └─ (253:17)
 └─vg1-lv2-real (252:6)
    ├─ (253:17)
    └─ (253:18)
vg1-lv2 (252:1)
 └─vg1-lv2-real (252:6)
    ├─ (253:17)
    └─ (253:18)

XFS:
[root@node1 ~]# mount -o nouuid,ro /dev/vg1/lv1-snap /mnt/lv1-snap/s
挂载快照,尽量使用ro的方式,将不会破坏快照卷中的数据

应用场景:
/var/lib/mysql
1. 锁表
2. 备份【逻辑|物理备份】
3. 解锁

100G  物理备份		/var/lib/mysql/xxx

1. 锁表
2. 创建快照
3. 解锁
4. 挂载快照
5. 备份到指定地方
6. 删除快照

快照实现自动扩容:
/etc/lvm/lvm.conf 
snapshot_autoextend_threshold = 80
snapshot_autoextend_percent = 20
//当快照使用到80%时,自动扩容20%


3.4 相关命令
pvcreate /dev/sdb[123]
vgcreate vgname /dev/sdb1
lvcreate -n lvname -L [+]size |-l pe个数or 30%free vgname

lvextend -L [+]size /dev/vgname/lvname
resize2fs /dev/vgname/lvname

vgextend vgname /dev/sdb2
vgreduce vgname /dev/sdb2
vgreduce vgname --removemissing --force

resize2fs /dev/vgname/lvname size
lvreduce -L size /dev/vgname/lvname

lvremove /dev/vgname/lvname
vgremove vgname
pvremove /dev/sdb2


 

课堂作业:

1、添加一块新的10G物理磁盘到你的Linux操作系统中,并将其分为2个分区(大小自己决定)。如sdb1和sdb2。 2、将sdb1做成大小为2kG的逻辑卷lv01挂载到系统中的/u01目录下面,并且在/u01目录下面创建file1~file5 5个文件。 3、假设sdb1分区有坏块,现在需要将sdb1分区上的数据快速放到另外块盘sdb2上,怎么做? 4、由于业务需要,/u01目录需要扩大到9G,怎么做? 5、新建一个卷组,名称为vg0,PEsize为8M,在卷组中创建一个名为lv02的逻辑卷,大小为50个PE,格式化为ext3,挂载在/mnt/lv01要求每次开机都生效。

五、磁盘配额(补充扩展)

磁盘配额 quota
====================================================================================
作用: 限制用户或组对磁盘空间的使用,例如文件服务器,邮件服务器...

一、启用磁盘限额
1. 让文件系统支持配额 [ext3/4]
# vim /etc/fstab 
/dev/mapper/vg01-lv01   /data                   ext4    defaults,usrquota,grpquota 1 2
# mount -o remount /data
# mount |grep data
/dev/mapper/vg01-lv01 on /data type ext4 (rw,usrquota,grpquota)

2. 创建磁盘配额的数据库文件
注意: 建议停用SELinux

# quotacheck -acug
# ls /data/aquota.*
/data/aquota.group  /data/aquota.user

//-a 所有分区(已支持配额)
//-c 创建
//-u 用户
//-g 组

3.启动磁盘配额
# quotaon -a			//启动所有分区的磁盘配额


二、日常管理
+++设置配额+++
方法一:edquota
# edquota -u stu1
Disk quotas for user stu1 (uid 500):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/mapper/vg01-lv01          0           0          0          0        0        0  



soft:又称软限制,当用户到达这个限制以后,系统会给予警告,但仍可写入。
hard:又称硬限制,到达这个限制,就完全禁止任何写入

以下三个为磁盘空间的限制设置:
blocks:已使用空间,无需要设置
soft:用户空间使用限制,为软限制,需要设置
hard:用户空间使用限制,为硬限制,需要设置
以下三个为总文件个数的限制:
inodes:已有文件总数,无需要设置
soft:文件总数限制,为软限制,需要设置
hard:文件总数限制,为硬限制,需要设置

我们要限制stu1用户使用空间10M,最多不能超过12M,文件总数为200个,
最多不能超过250个,设置如下:
Filesystem        blocks soft hard inodes soft hard
/dev/mapper/vg01-lv01       0 10240 12288 0 200 250 
注:空间限制是以k为单位的。

grace time: 宽限期,默认7天 
# edquota -t  修改配额的宽限期


测试:
# su - stu1
[stu1@vm1 data]$ dd if=/dev/zero of=test99 bs=1M count=11
dm-1: warning, user block quota exceeded.
11+0 records in
11+0 records out
11534336 bytes (12 MB) copied, 0.108284 s, 107 MB/s


[stu1@vm1 data]$ dd if=/dev/zero of=test99 bs=1M count=13
dm-1: warning, user block quota exceeded.
dm-1: write failed, user block limit reached.
dd: writing `test99': Disk quota exceeded
13+0 records in
12+0 records out
12582912 bytes (13 MB) copied, 0.257964 s, 48.8 MB/s

[stu1@vm1 data]$ touch file{1..6}
dm-1: warning, user file quota exceeded.

[stu1@vm1 data]$ touch file{1..11}
dm-1: write failed, user file limit reached.
touch: cannot touch `file10': Disk quota exceeded
touch: cannot touch `file11': Disk quota exceeded

[stu1@vm1 data]$ quota		//查看自己的配额情况
Disk quotas for user stu1 (uid 500): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/vg01-lv01
                  12288*  10240   12288   24:00       1       5      10 


方法二: setquota
# setquota -u username block软限制 block硬限制 inode软限制 inode硬限制 分区
# setquota -u jack 80000 100000 15 20 /dev/sda2
# quota jack

方法三:复制
# edquota -p alice tom robin user1 user2 user3
将alice的配额方案复制给后面所有用户

# for i in {1..10}
> do
> useradd zhang$i
> edquota -p stu1 zhang$i
> done


+++查看配额+++
查看单个用户的配额:	    # quota jack
查看所有用户的配额:	    # repquota -a
                              	        # repquota -ag
普通用户查看自己配额:  $ quota


扩展知识:针对组设置配额
例1:限制hr组的成员能在/home/hr目录中:100M   50文件
# groupadd hr
# useradd hr01 -G hr 
# useradd hr02 -G hr
# mkdir /home/hr
# chgrp hr /home/hr
# chmod 2770 /home/hr
# ll -d /home/hr
drwxrws--- 2 root hr 4096 09-12 17:07 /home/hr

# edquota -g hr
Disk quotas for group hr (gid 507):
 	Filesystem                           blocks       soft       hard     inodes     soft     hard
	/dev/mapper/vg01-lv_home          4          0     102400          1        0        50
# repquota -ag
====================================================================================

rhel7:
注意:
1、不需要手动执行quotacheck命令对xfs文件系统进行检查,它会在mount的时候自动执行
2、不需要在xfs文件系统的根下生成quota数据文件


 # mount -o uquota /dev/xvm/home /home
 # xfs_quota -x -c 'limit bsoft=500m bhard=550m tanya' /home
 # xfs_quota -x -c report /home

-x:专家模式
-c:交互模式,可加多个

六、小工具使用

管道(|):连接多个命令的工具 命令1 | 命令2 | 命令3

1. grep工具:行过滤

OPTIONS: -i: 不区分大小写 -v: 查找不包含指定内容的行,反向选择 -w: 按单词搜索 -c: 统计匹配到的次数 -n: 显示行号 -r: 逐层遍历目录查找 -A: 显示匹配行及前面多少行 -B: 显示匹配行及后面多少行 -C: 显示匹配行前后多少行 --color=auto :可以将找到的关键词部分加上颜色的显示 -l:只列出匹配的文件名 -L:列出不匹配的文件名 -e: 使用正则搜索 ^key:以什么开头 key$:以什么结尾

每次过滤都显示颜色: vim ~/.bashrc alias grep='grep --color=auto' source ~/.bashrc

2. cut工具:列过滤

-c :以字符为单位进行分割。 -d :自定义分隔符,默认为制表符。 -f  :与-d一起使用,指定显示哪个区域。

课堂练习: 用小工具列出你当系统的运行级别。5/3

3. sort工具: 排序

将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

-u :去除重复行 -r :降序排列,默认是升序 -o :将排序结果输出到文件中 -n :以数字排序,默认是按字符排序 -t :分隔符 -k :第N列 -b :忽略前导空格。 -R :随机排序,每次运行的结果均不同。

4. uniq 去除连续重复行

-i: 忽略大小写 -c: 统计重复行次数 -d:只显示重复行

5. tee:从标准输入读取并写入标准输出和文件

tee 双向覆盖重定向<屏幕输出|文本输入> -a 双向追加重定向

6. paste 合并文件行

-d:自定义间隔符,默认是tab -s:串行处理,非并行

7. tr 替换

tr用来从标准输入中通过替换或删除操作进行字符转换。

tr主要用于删除文件中控制字符或进行字符转换。

使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。 -d 删除字符串1中所有输入字符。 -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。

a-z 任意小写 A-Z 任意大写 0-9 任意数字 [:alnum:] all letters and digits//所有字母和数字 [:alpha:] all letters//所有字母 [:blank:] all horizontal whitespace//所有水平空白 [:cntrl:] all control characters//所有控制字符 \b Ctrl-H  退格符 \f Ctrl-L  走行换页 \n Ctrl-J  新行 \r Ctrl-M  回车 \t Ctrl-I  tab键 [:digit:] all digits//所有数字 [:graph ] all printable characters, not including space//所有可打印的字符,不包含空格 [:lower:] all lower case letters//所有小写字母 [:print:] all printable characters, including space//所有可打印的字符,包含空格 [:punct:] all punctuation characters//所有的标点符号 [:space:] all horizontal or vertical whitespace//所有水平或垂直的空格 [:upper:] all upper case letters//所有大写字母 [:xdigit:] all hexadecimal digits//所有十六进制数字 [=CHAR=] all characters which are equivalent to CHAR//所有字符

8 .wc工具: 统计行 字符 单词数

-l:打印行数 -c:打印字节数 -m:打印字符数 -w:打印单词数 -L:打印最长行的长度 扩展: (一)“字节”的定义 字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。 (二)“字符”的定义 字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。 (三)“字节”与“字符” 不同编码里,字符和字节的对应关系不同: ①ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。 ②UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。 ③Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。 符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。 ④UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。 ⑤UTF-32编码中,世界上任何字符的存储都需要4个字节。

9. du和df工具:

du:统计目录或文件大小 -h:以人性化的方式查看 KB、MB、GB -s:显示总和 df:查看文件系统的使用情况 -h:以人性化的方式查看 KB、MB、GB -H:使用1000位进制单位,而不是1024 -T:显示文件系统类型 -i:列出inode信息

作业1:

分别截取IP;截取NETMASK;截取广播地址;截取MAC地址

作业2:

将系统中所有普通用户的用户名、密码和默认shell保存到一个文件中,要求用户名密码和默认shell之间用tab键分割