首页 > 代码库 > 深入剖析linux磁盘管理

深入剖析linux磁盘管理

一、linux中常见的磁盘:

    无论什么操作系统,归根还是要落实与磁盘上的,对于磁盘的管理也是linux管理必备的一项技能。在linux中“一切皆文件”的思想贯彻整个linux的学习中,包括像是磁盘等的硬件也是在linux的/dev/目录下类似于文件形式的存放,常见的SATA口USB优盘或是SCSI口的硬盘在linux中是以/dev/sd[a-p]开头的文件,早期的IDE硬盘现在已经很少见了,这种硬盘在linux中是以/dev/hd[a-d],CDROM是以/dev/cdrom开头的文件,磁带机/dev/st0(SCSI口的),/dev/ht0(IDE口)。每一种设备都有特定的主设备号和次设备号,主设备号用来标识设备类型,次设备号标识同一类型设备的不同设备。

    不同类型的接口的设备速度也是有很大差别的,像是并口的IDE的接口理论值为133MB/s,SCSI硬盘速度为640MB/s 。串口的SATA和SAS口的硬盘速度都是6Gbps,在转化为同一单位的情况下后者的速度还是远远优于前者。串口的USB速度也能达到480MB/s

二、 磁盘结构与术语:

  硬盘的物理结构一般由磁头与盘片、电动机、主控芯片与排线等部件组成;当主电动机带动盘片旋转时,副电动机带动一组( 磁头)到相对应的盘片上并确定读取正面还是反面的碟面,磁头悬浮在碟面上画出一个与盘片同心的圆形轨道( 磁轨或称 柱面),这时由磁头的磁感线圈感应碟面上的磁性与使用硬盘厂商指定的读取时间或数据间隔定位 扇区,从而得到该扇区的数据内容; 技术分享技术分享

磁头(head):对磁盘的数据进行读写

磁道(track):当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。 磁盘上的磁道是一组记录密度不同的同心圆

扇区(sector):磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区。硬盘的第一个扇区,叫做引导扇区。 一个扇区的大小为512个字节。

柱面(cylinder):在有多个盘片构成的盘组中,由不同盘片的面,但处于同一半径圆的多个磁道组成的一个圆柱面。

三、分区类型:

1.  磁盘分区的优点:

    (1) 优化I/O性能

    (2)实现磁盘的空间配额限制

    (3)提高修复速度

    (4)隔离系统和程序

    (5)分区可以安装多个OS

2.  两种分区方式:MBR和GPT

MBR:(master  boot recorder )传统的分区都是以MBA的方式分区的使用32位作为扇区数,分区大小不差过2T,分区是按照柱面来分区(CHS:cylinder,head,sector),在MBR中有LBA地址用来和CHS转换,LBA地址是统一的逻辑区块地址作为寻址方式,这种寻址模式取代了原先 操作系统必须面对存储设备硬件构造的方式。在硬盘上的0磁道0扇区共512个字节存放MBR硬盘分区分区表和主引导程序,其中前446个字节存放引导程序,64个字节存放4个大小为16个字节的分区表,最后还有两个字节(0x55AA)是分区结束标志。

技术分享


(可以通过十六进制查看器查看,先通过dd命令将硬盘的前512个字节备份成一个二进制文件,在通过hexdump 查看)

[root@centos7 ~]# dd if=/dev/sdc  of=sdc  count=512  bs=1
512+0 records in
512+0 records out
512 bytes (512 B) copied, 0.00509351 s, 101 kB/s
[root@centos7 ~]# hexdump -C sdc
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  91 83 ce 77 00 00 00 20  |...........w... |
000001c0  21 00 83 9d 11 4c 00 08  00 00 00 c0 12 00 00 9d  |!....L..........|
000001d0  12 4c 83 db 29 72 00 c8  12 00 00 60 09 00 00 00  |.L..)r.....`....|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200
[root@centos7 ~]# dd if=sdc_head  of=/dev/sdc bs=1 count=64 skip=446 seek=446 //skip表示源文件跳过多少开始复制,seek表示目标跳过多少开始
64+0 records in
64+0 records out
64 bytes (64 B) copied, 0.0170671 s, 3.7 kB/s

    注释:其中4个分区最多可以建立4个主分区,或者3个主分区加一个扩展分区,主分区结构如上,第一个字节表示此分区是否处于活动分区状态,80表示活动,00表示非活动,活动分区可以用来存放操作系统。第二个字节表示磁头号,第3和4字节存放扇区号第5个字节表示分区类型,0表示分区未使用。5,6,7字节表示分区结束的磁头号,扇区和柱面号。后面的八个字节用来存放LBA地址,用来做CHS和LBA地址转化用的。

  扩展分区中存放着逻辑分区的地址,在逻辑分区的第一个扇区也是存放着EBR表,结构与MBR类似,只不过前面的446字节都空着,存放64字节的表中第一个表项的16个字节指向本个逻辑分区,下一个16个字节的表项中存放指向下一个扩展分区的EBR,接下来便是两个空白的表项和类似于MBR的结束标志0x55AA。

3.GPT分区:

  GPT分区是新一代的分区方式,可支持多分区(最多128个分区)和大分区(磁盘块大小为512字节时可支持8Z,4096字节的块大小时可以达到64Z。注Z的数量级为270)。GPT使用128位的UUID作为磁盘和分区的同一唯一标识符,并且在GPT分区表自动备份在头尾两部分,并伴有CRC校验位,在GPT分区的首部有一个伪MBR,用于向下兼容MBR,因为MBR是不能理解GPT分区的,在GPT分区首部放置一个伪MBR首部可以防止MBR认为当前磁盘没有分区,而将GPT分区覆盖。

技术分享


四、几种分区工具:

1.图形化工具gnome-disks使用简单,在此不在赘述。

2.fdisk使用:

fdisk支持MBR,也支持GPT分区,对于一块硬盘最多只能理解15个分区,一般使用fdisk做MBR分区,gdisk做GPT分区。下面为fdisk分区示例:

[root@centos7 ~]# fdisk /dev/sde
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xf734a8be.
Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition  //删除分区
   g   create a new empty GPT partition table  //创建GPT分区表
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu  //打印菜单
   n   add a new partition  //新建分区
   o   create a new empty DOS partition table
   p   print the partition table  //打印分区表
   q   quit without saving changes  //不保存退出
   s   create a new empty Sun disklabel
   t   change a partition‘s system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit  //保存退出
   x   extra functionality (experts only) 
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):
Using default value 2048
Last&n

五、文件系统的挂载mount:

1. 挂载命令mount使用:

(1)挂载: 将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为,挂载点下原有文件在挂载完成后会被临时隐藏

(2) 卸载:为解除此关联关系的过程,可使用设备,也可以使用挂载点

(3) 用法:

         mount 设备 挂载点

    设备类型:

        1) 可以使用设备文件如/dev/sda;

        2) 可以使用卷标如SDA_LABEL;

        3) 可以使用UUID;

        4) 伪文件系统;proc,sysfs……

        5) dd创建的image文件使用loop选项

        6) 目录挂载至目录,使用bind或-B,fstab配置文件分区类型为none

(4) mount 常用选项:

         -t  指定文件系统类型

         -r  只读挂载

         -w 读写挂载

         -n 不更新/etc/mtab,通过mount看不到挂载的文件系统,只有cat /proc/mounts

                   才可以看到

         -a 自动挂载所有支持自动挂载的设备。定义在/etc/fstab中且支持auto功能

         -L 以卷标指定的设备挂载

         -U 以UUID指定的挂载设备

         -B --bind 绑定一个目录到另一个目录

[root@centos7 mnt]# mount -B /root/ /mnt/root

配置文件写法:

[root@centos7 smb]# tail -n1 /etc/fstab
/root/        /mnt/root      none      bind,defaults   0 0
[root@centos7 mnt]# mount |grep "root"
/dev/sda2 on /mnt/root type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

挂载windows的共享文件夹:

[root@centos7 mnt]# mount -o username=administrator,password=admin -t cifs  //10.1.1.88/f   /mnt/smb

挂载loop设备:

[root@cnode6_8 /]# dd if=/dev/zero of=/testdir/loopdev bs=1M count=50 //dd创建一个文件
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 2.04763 s, 25.6 MB/s
[root@cnode6_8 /]# mkfs.ext4 /testdir/loopdev //将改文件格式化为ext4
mke2fs 1.41.12 (17-May-2010)
/testdir/loopdev is not a block special device.
Proceed anyway? (y,n) y   ====> 回答y开始格式化
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
12824 inodes, 51200 blocks
2560 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=52428800
7 block groups
8192 blocks per group, 8192 fragments per group
1832 inodes per group
Superblock backups stored on blocks:
         8193, 24577, 40961
 
Writing inode tables: done                           
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
 
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@cnode6_8 /]# mkdir /mnt/loopdev //创建挂载点
[root@cnode6_8 /]# mount  -o loop /testdir/loopdev /mnt/loopdev //手动挂载
[root@cnode6_8 /]# mount |grep loop //检验是否成功
/testdir/loopdev on /mnt/loopdev type ext4 (rw,loop=/dev/loop0)
[root@cnode6_8 /]# umount /mnt/loopdev //卸载,尝试写入文件永久挂载
[root@cnode6_8 /]# vim /etc/fstab
[root@cnode6_8 /]# tail -n1 /etc/fstab //配置文件添加的部分
/testdir/loopdev       /mnt/loopdev             ext4      loop,defaults  0 0
 [root@cnode6_8 /]# mount -a
[root@cnode6_8 /]# mount |grep loop //配置文件生效
/testdir/loopdev on /mnt/loopdev type ext4 (rw,loop=/dev/loop0)
[root@cnode6_8 /]# losetup -a 
/dev/loop0: [0803]:11 (/testdir/loopdev)

注释:通过losetup查看loop设备与分区的关联情况,也可以手工指定哪一个loop设备关联某一个分区,losetup   /dev/loop2 /testdir/partfile就是关联loop2和分区关联。可以写loop设备到目录的挂载,分区其实是关联了一个loop设备,在rhel6中有8个loop设备,在rhel7中是动态建立的

使用mknod创建block或者字符设备其中b是指block,7是loop设备的编号,67是第多少个loop设备,可以先查看一下系统的loop设备编号到多少

[root@cnode6_8 testdir]# mknod loopd b 7 67
[root@cnode6_8 testdir]# ll loopd
brw-r--r--. 1 root root 7, 67 Jul 27 19:46 loopd

-o 常用选项(多个选项之间用逗号分割,在配置文件/etc/fstabdefaults的位置写)

       async:异步模式,加载到内存的文件修改之后不会立即同步到硬盘,能提高性能

       sync:同步模式,内存更改立即保存至文件,提高文件可靠性

       atime/moatime: 目录访问时间戳,例如web的目录时间戳没必要更新时可禁用

       auto/noauto: 是否支持自动挂载,automount -a 自动可挂载

       exec/noexec: 是否支持在文件系统上运行应用程序

       dev/nodev: 因为设备文件也是文件,dev表示支持在此目录上建立dev设备

suid/nosuid: 是否支持suidsgid权限

remount :重新挂载

ro:只读

rw:读写模式

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

defaults:相当于rwsuiddevexecautonouserasync

2. 查看与卸载命令:因为一个文件系统有可能不止一个用户访问,所以有可能不能卸载

findmnt 查看挂载情况;

[root@cnode6_8 ~]# findmnt /
TARGET SOURCE    FSTYPE OPTIONS
/      /dev/sda2 ext4   rw,relatime,seclabel,barrier=1,data=http://www.mamicode.com/ordered>

 

lsof 或fuser -v 查看访问指定文件系统的进程


[root@cnode6_8 ~]#lsof /root
014657 /root
lsof    3440 root  cwd    DIR   8,2  4096 3014657 /root
[root@cnode6_8 ~]# fuser -v /root
 USER   PID ACCESS COMMAND
/root:   root  2292 ..c.. bash
root       3357 ..c.. bash


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

[root@cnode6_8 ~]# umount /testdir  //设备忙,无法卸载
umount: /testdir: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
[root@cnode6_8 ~]# fuser -v /testdir //查看到user jack在使用
                     USER        PID ACCESS COMMAND
/testdir:            jack       3535 ..c.. bash
[root@cnode6_8 ~]# fuser -km /testdir //强制杀掉在使用分区的进程
/testdir:             3535c
[root@cnode6_8 ~]# umount /testdir
[root@cnode6_8 ~]#     //再次卸载已经成功

 

3. 永久挂载的配置文件/etc/fstab


    /etc/fstab配置文件是在系统重启时文件系统挂载要读的配置文件,一旦写错可能致使操作系统无法启动,所以操作一定要小心!!!如在rhel6中挂载的设备名字写错,在检测的选项又设置了开机检测文件系统,那么此时在开机时将一直卡在输入ctrl+D或者输入root密码继续,此时可以输入密码重新挂载 / 文件系统,因为此时的 / 文件系统是只读的,需要重新挂载为可读可写的,然后编辑/etc/fstab 文件修改开机检测项为0,即不检测,然后继续,最后继续(ctrl +D)继续开机,等到开机检查哪一项除了问题,修改即可。rhel7不需要重新挂载 / 文件系统,可以直接编辑文件过程与rhel6类似,如果任然无法启动可以输入root密码,重新启动(systemctl reboot


  /etc/fstab 文件格式:

技术分享

(1)要挂载的设备或伪文件系统:可以是设备名,UUIDLABEL,伪文件系统,目录等

(2) 挂载点:设备要挂载的目录,一般要放在/mnt下面

(3)  文件系统类型:一般的文件系统类型,还有none(目录)

(4)挂载选项default-o指定的各种项

(5)  转储频率0表示不备份,1表示每天转储,2表示隔天转储

(6) 自检次序0表示不自检,1一般用来表示根文件系统自检顺序

4. 挂载的文件系统的查看:


df :查看文件系统的挂载情况,可以加-T选项,在设备名比较长可以对其显示,方便编写脚本对数据进行处理

du:查看目录的大小情况

mount:可以查看到包括目录等的挂载情况,但是在挂载时加-n就查看不到了

cat  /proc/mounts  可以看到系统实时文件系统生效的挂载项

free :可以看到所有内存交换分区信息

cat  /proc/swaps 可以看到交换分区信息,包括使用哪个分作作为交换分区

六、usb设备和CD-ROM的使用

1. usb设备的使用:

usb设备使用时可事先查看当前系统的分区和磁盘信息,方便知道插入usb设备后多了那些设备便于管理,usb设备同其它分区一样也需要挂载和卸载,数据写完后可以多次输入sync保证数据确实已经全部保存至usb设备

2. CD-ROM设备使用:

使用eject可以弹出光驱,eject -t弹入。linux中自带打包iso后缀文件的工具,如果是文件可以直接使用cp命令目标文件带有iso后缀即可,如果是目录,可以使用mkisofs 打包。iso文件挂载后可以使用

[root@cnode6_8 image]# touch {a..f}.txt
[root@cnode6_8 image]# ls
a.txt  b.txt  c.txt  d.txt  e.txt  f.txt
[root@cnode6_8 image]# cd ..
[root@cnode6_8 ~]# mkisofs -r -o img.iso  image  //给image目录建立镜像文件,-r递归,-o是输入文件
I: -input-charset not specified, using utf-8 (detected in locale settings)
Total translation table size: 0
Total rockridge attributes bytes: 631
Total directory bytes: 946
Path table size(bytes): 10
Max brk space used 0
175 extents written (0 MB)
[root@cnode6_8 ~]# ls
img.iso    image

七、交换分区的建立与启用:

    交换分区是作为内存的一个辅助分区,在内存吃紧时,交换分区会作为内存的一部分使用,但是效率比起内存来说会很低下,在一个硬盘分区时最好使用柱面较小的 柱面作为交换分区,因为在机械硬盘转速一定的情况下,越靠近外面的磁道,线速度越大,读取到的扇区越多,一定程度上有利于提高性能

     交换分区需要在分区时指定分区类型为82,分区结束要同步磁盘,最后更改配置文件永久挂载,更改配置文件时可以给指定的分区指定优先级系统默认的优先级为 -1开始每增加一个分区,新增加的分区优先级就-1,并且优先级越大,优先级越高,手工指定的优先级可以是0-32768,在配置文件当中default 的位置写优先级pri=#

分区类型和挂载点都是swap,其他的设置与普通分区使用没有区别。最后改完配置,格式化为swap分区,并激活;

详细步骤如下:

[root@cnode6_8 ~]# fdisk /dev/sdb  //开始新建分区
WARNING: DOS-compatible mode is deprecated. It‘s strongly recommended to
         switch off the mode (command ‘c‘) and change display units to
         sectors (command ‘u‘).
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (15-2610, default 15):
Using default value 15
Last cylinder, +cylinders or +size{K,M,G} (15-2610, default 2610): +100M
 
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 82  //改变分区hex dode为82swap分区
Changed system type of partition 2 to 82 (Linux swap / Solaris)
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x4340940f
   Device Boot   Start End   Blocks   Id  System
/dev/sdb1        1   14    112423+   fd  Linux raid autodetect
/dev/sdb2       15   28     112455   82  Linux swap / Solaris
Command (m for help): w  //保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.   //磁盘报警,分区表不同步需要手动同步分区表
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@cnode6_8 ~]# partx -a /dev/sdb  //通知内核新增分区
BLKPG: Device or resource busy
error adding partition 1
 [root@cnode6_8 ~]# mkswap -L new_swap1 /dev/sdb2 //设定label,格式化分区
Setting up swapspace version 1, size = 112448 KiB
LABEL=new_swap1, UUID=15c17561-d356-42f4-a5ba-b05d62d6260a
[root@cnode6_8 ~]# vim /etc/fstab  //添加配置信息永久添加swap
[root@cnode6_8 ~]# tail -n1 /etc/fstab
UUID=15c17561-d356-42f4-a5ba-b05d62d6260a swap swap defaults,pri=100  0 0
[root@cnode6_8 ~]# mount -a
[root@cnode6_8 ~]# free -h
        total   used    free  shared   buffers  cached
Mem:  980M  294M   686M     216K  30M    119M
-/+ buffers/cache:    143M     836M
Swap:      2.0G     0B    2.0G
注:buffer存放元数据,cache存放普通缓冲数据
[root@cnode6_8 ~]# swapon -a  //激活所有swap分区
[root@cnode6_8 ~]# free -h
      total     used    free   shared    buffers   cached
Mem:    980M    294M    685M    216K     30M      119M
-/+ buffers/cache:   144M    836M
Swap:    2.1G          0B       2.1G
[root@cnode6_8 ~]# cat /proc/swaps   //可以看到指定的优先级100生效
Filename   Type        Size   Used      Priority
/dev/sda5  partition   2097148  0    -1
/dev/sdb2  partition   112448   0    100
[root@cnode6_8 ~]# swapoff /dev/sdb2 //关闭新建的交换分区
[root@cnode6_8 ~]# cat /proc/swaps
Filename     Type    Size  Used    Priority
/dev/sda5    partition 2097148  0       -1
[root@cnode6_8 ~]# vim /etc/fstab  //删除添加的表项
[root@cnode6_8 ~]# fdisk /dev/sdb
WARNING: DOS-compatible mode is deprecated. It‘s strongly recommended to
         switch off the mode (command ‘c‘) and change display units to
         sectors (command ‘u‘).
Command (m for help): d   //删除交换分区的分区
Partition number (1-4): 2
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@cnode6_8 ~]# partx -d /dev/sdb  //通知内核同步分区
error deleting partition 1: BLKPG: Device or resource busy
error deleting partitions 3-256: BLKPG: No such device or address
[root@cnode6_8 ~]# lsblk /dev/sdb  //已经彻底删除分区
NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sdb       8:16   0    20G  0 disk 
└─sdb1    8:17   0 109.8M  0 part 
  └─md0   9:0    0   217M  0 raid5
[root@cnode6_8 ~]# swapon -s  //通过swapon -s查看交换分区信息
Filename   Type     Size  Used   Priority
/dev/sda5  partition  2097148  0     -1

八、磁盘配额:

    quota就是限额的意思,对于linux来说,linux系统是多任务多用户的操作系统,如果一个用户使用磁盘过多,必然会导致其他用户使用磁盘额度收到限制,quota就是针对这种情况应用而生的,但是quota对配额时必须是一个独立的分区才可以,并且是仅仅针对普通用户有效,对于root是无效的。

下面将针对家目录不是某一个独立的分区,新建分区后对家目录进行迁移至独立分区。quota的限制既可以针对用户,也可以针对针对组来做,可以限制总文件的大小,也可以限制iNode数量来限制。在配置文件当中,有一个soft和hard,这两个值软限制值一般小于应限制值,当用户数据大于soft小于hard时,系统会在用户每次登陆系统都报警,提示用户清理磁盘,默认有一个宽限值7天,如果在这7天,用户都没有进行清理,soft的值将会取代hard值,用户将无法建立新文件。主要用途一般被用来例如网页服务器的每个人需要一定的空间。邮件服务器每个人邮箱都有固定的大小等。


  具体示例:(关于分区格式化再次不在赘述格式化分区为/dev/sdb2) 

[root@cnode6_8 ~]# mkdir /mnt/home  //创建临时挂载点,提供将原来/home数据复制至新建的分区
 [root@cnode6_8 ~]# mount /dev/sdb2  /mnt/home //挂载临时挂载点
[root@cnode6_8 ~]# cp -Rp /home/*  /mnt/home/  //递归保留权限复制数据
[root@cnode6_8 ~]# ll /mnt/home/
total 8
drwx------. 4 jack jack 4096 Jul 25 17:22 jack
drwx------. 4 rose rose 4096 Jul 25 17:24 rose
[root@cnode6_8 ~]# vim /etc/fstab
[root@cnode6_8 ~]# tail -n1 /etc/fstab
UUID="424b6201-3ee2-4a3b-a288-75e91f52f71b" /home ext4 defaults,usrquota,grpquota 0 0  //fstab文件配置
[root@cnode6_8 ~]# mount -a  //挂载分区
[root@cnode6_8 ~]# mount |grep "sdb2"
/dev/sdb2 on /home type ext4 (rw,usrquota,grpquota)
 [root@cnode6_8 ~]# mount |grep "sdb2"
/dev/sdb2 on /home type ext4 (rw,usrquota,grpquota)
[root@cnode6_8 ~]# quotacheck -cug /home/
quotacheck: Mountpoint (or device) /home not found or has no quota enabled.
quotacheck: Cannot find filesystem to check or filesystem not mounted with quota option.  //提示挂载选项没有生效
 [root@cnode6_8 ~]# mount -o remount /home  //重新挂载
[root@cnode6_8 ~]# mount |grep sdb2
/dev/sdb2 on /home type ext4 (rw,usrquota,grpquota)
[root@cnode6_8 ~]# quotacheck -cug /home  //重新生成配额数据库文件
quotacheck: Cannot create new quotafile /home/aquota.user.new: Permission denied  //因为selinux的原因创建数据库文件失败
quotacheck: Cannot initialize IO on new quotafile: Permission denied
quotacheck: Cannot create new quotafile /home/aquota.group.new: Permission denied
quotacheck: Cannot initialize IO on new quotafile: Permission denied
[root@cnode6_8 ~]# setenforce 0  //临时关闭selinux       
[root@cnode6_8 ~]# vim /etc/selinux/config  //永久改变selinux状态
[root@cnode6_8 ~]# grep disable /etc/selinux/config
#     disabled - No SELinux policy is loaded.
SELINUX=disabled   //selinux配置文件修改项
[root@cnode6_8 ~]# quotacheck -cug /home
[root@cnode6_8 ~]# ll /home   //查看用户和组数据库文件,是否已经建立
total 24
-rw-------. 1 root root 7168 Jul 28 01:16 aquota.group
-rw-------. 1 root root 7168 Jul 28 01:16 aquota.user
drwx------. 4 jack jack 4096 Jul 25 17:22 jack
drwx------. 4 rose rose 4096 Jul 25 17:24 rose
[root@cnode6_8 ~]# quotaon /home  //启用磁盘配额功能,如需关闭quotaoff
[root@cnode6_8 ~]# edquota jack  //编辑jack的quota限制,此处进入配后有两个状态值
                                     是不能修改的分别是blocks和inodes 本别表示当前系统
                                     使用了多少k(此处的blocks是以kb为单位!切记)和使用
                                     了多少iNode,iNodes设置为0 0表示没有设置iNode限制
[root@cnode6_8 ~]# edquota -p jack rose //可以使用jack为模板为rose设置quota,也可以使用setquota 加用户名设置
 [root@cnode6_8 ~]# setquota user1 100000 200000 0 0 /home
[root@cnode6_8 ~]# quota jack  //查看jack的quota设置
Disk quotas for user jack (uid 500):
 Filesystem  blocks quota  limit  grace   files  quota   limit   grace
/dev/sdb2   40   50000  100000  11     0    0       
[root@cnode6_8 ~]# repquota /home  //查看/home分区设置的用户磁盘限制
*** Report for user quotas on device /dev/sdb2
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User  used    soft    hard   grace  used  soft  hard  grace
----------------------------------------------------------------------
root  --        4        0     0    1    0    0      
jack   --       40       50000  100000    11   0    0      
rose   --       32        50000  100000   8    0    0      
user1 --       32        100000  200000    8    0    0      
[root@cnode6_8 ~]# su - jack
[jack@cnode6_8 ~]$ cd /home/home //进入jack家目录做测试
 [jack@cnode6_8 ~]$ dd if=/dev/zero of=jack_zero bs=1M count=50
sdb2: warning, user block quota exceeded.  //超过50M报警
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 1.22038 s, 43.0 MB/s
[jack@cnode6_8 ~]$ dd if=/dev/zero of=jack_zero2 bs=1M count=50
sdb2: write failed, user block limit reached.  //再次创建50M提示失败
dd: writing `jack_zero2‘: Disk quota exceeded
48+0 records in
47+0 records out
49930240 bytes (50 MB) copied, 0.685798 s, 72.8 MB/s
[jack@cnode6_8 ~]$ quota jack  //查看jack的quota,宽限期已经变为6天
Disk quotas for user jack (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
 /dev/sdb2  100000*  50000  100000   6days      13       0       0       
[jack@cnode6_8 ~]$ du -sh  //jack的家目录一共有的数据
98M   .


或许在linux磁盘管理上面这只是冰山一角,需要你我共同努力!



本文出自 “jackcui” 博客,转载请与作者联系!

深入剖析linux磁盘管理