在探讨磁盘与文件系统管理前,我们先简单了解下磁盘结构:1)盘片,即记录数据的部分,数量与磁头数相同;2)磁头, 读写盘片上的数据;3)主轴马达,带动盘片旋转,家用级转速在5400rpm-7200rpm,企业级可达15000rpm;4)扇区,最小的物理存储单元,大小为512字节;5)磁道,磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道(Track);6)柱面,由不同盘片的面,但处于同一半径圆的多个磁道组成的一个圆柱面(Cylinder)。

    接下来是磁盘分区,所谓磁盘分区,就是标定数据块儿(blocks)的起止范围,以便操作系统快速对块儿内文件数据进行/读/写/查等操作。分区的好处是:优化I/O性能、实现磁盘空间配额限制、提高修复速度、隔离系统和程序、安装多个OS、采用不同文件系统等。常用的分区命令为fdisk:

 

-l /dev/sdX 查看指定块设备的分区信息
/dev/sdX 对指定硬盘修改分区
m: 帮助
o: 创建msdos分区label
n: 创建新的分区
d: 删除分区
p: 查看当前分区表
a: 添加/取消 启动标记
t: 转换分区类型ID
l/L: 显示分区类型ID表

    注意,操作系统所在的硬盘进行分区操作后需要通知内核重读分区表信息,centos5/7:partprobe /dev/sdX;centos6:partx -a /dev/sdX(新增分区)/partx -d --nr N /dev/sdX (删除分区)

    分区完成后需要进行格式化(format)操作,之所以格式化,是因为每种操作系统所设置的文件属性/权限不同,为了存放这些文件所需的数据,需要格式化分区。在传统的磁盘与文件系统应用中,一个分区只能被格式化为一个文件系统,因此可认为一个文件系统就是一个分区。 但随着新技术如LVM的发展,多个分区可以合成一个文件系统,我们称呼一个可被挂载的数据为一个文件系统,而不是一个分区。文件系统格式化命令为mkfs

mkfs.ext4/xfs /dev/sdX

格式化分区后可在命令行直接敲blkid命令查看所有文件系统名/文件系统类型;在ext系统下可用tune2fs命令查看及修改文件系统

tune2fs -l /dev/sdX 列出指定文件系统的详细信息,信息来源于超级块(superblock)

-L 设置label(卷标)

-m 设置预留百分比

-o acl/ ^acl开启或关闭文件系统ACL功能(尽在centos6中会用到此命令)

    接着我们讨论挂载(mount)。在Linux系统中,一切皆文件,mount命令博大精深。每个文件系统都有独立的inode、block、superblock等信息,这个文件系统要能够链接到目录树,才能被使用。将文件系统与目录树结合的操作我们称为挂载。挂载点必须是目录,而且是空目录。若将文件系统挂载到非空目录下,会暂时隐藏性覆盖该目录下的所有文件。如下图所示,若执行mount /dev/sda6 /命令,会导致整个系统崩溃,只能通过手动按电源按钮重启!好在系统做了保护,上述命令无效!

浅谈Linux磁盘与文件系统管理

mount:

-a 依照配置文件/etc/fstab中的数据对未被挂载的文件系统进行挂载;

-l 读/etc/mtab,显示当前挂载信息;

-n 强制不写入/etc/mtab,单用户维护模式常用,此时df或mount命令无法查看新增挂载信息,但可读/proc/mounts文件获取;

-L 指定卷标进行挂载;

-o 后接挂载的额外参数,比如账号、密码、读写权限等

    ro,rw 挂载文件系统成为只读,读写模式 default--rw

    async,sync 此文件系统是否使用同步写入(sync)或异步(async)的内存机制,default--async

    auto,noauto 允许/禁止分区以mount -a方式(auto)挂载,default--auto

    dev,nodev 是否允许此分区上可创建设备文件,default--dev

    suid,nosuid 是否允许此分区含有suid/sgid文件格式,default--suid

    exec,noexec 是否允许此分区拥有binary文件,default--exec

    user,nouser 是否允许普通用户执行mount命令,默认只有root可以mount,添加user参数后,普通用户也能mount

    defaults 默认所有默认值

    remount 不卸载的情况下,可直接更新挂载选项

    acl,noacl (centos6)开启或关闭acl功能,default--noacl

 umount:卸载设备文件

-f 强制卸载,可用于NFS(网络文件系统无法读到的情况)

-n 不更新/etc/mtab

注意,当挂载点被占用(进入挂载点或者被某个进程占用)时,需要离开文件系统挂载点或者用命令fuser杀死进程后再做umount

fuser 挂载点 查看在指定挂载点上运行的程序,显示其进程号

-v 详细查看

-m 递归,如不加m,只查看挂载点自身,不查看子目录

-k 杀死

fuser通常搭配选项 -vmk

    以上对磁盘管理的内容进行了简单介绍,下面我们讨论Linux文件系统高级管理第一部分:Quota(磁盘配额)。简而言之,Quota就是对一般用户进行的限制文件系统使用空间的技术,常以下列3种方式实现

1>限制某一用户的最大磁盘配额(使用用户限制)

2>限制某一用户组可以使用的最大磁盘配额(使用用户附加组限制,常配合sgid命令进行)

3>以link方式使邮件可作为限制的配额(更改/var/spool/mail路径)

需要注意的是,quota针对整个文件系统进行限制,例如你的/dev/sda3 挂载在/home下,/home下所有的目录都会受到限制,具体设置分以下几个部分

1.限制容量或者文件数量(block或inode)

2.soft/hard(软限制和硬限制)通常硬限制值略高于软限制。当用户可支配额磁盘配额超出软限制但低于硬限制时,系统启动宽限期倒计时并发出警告,直到用户清理数据至soft值以下。若用户在宽限期未进行任何操作,硬限制值将回落到软限制值,此时用户的使用权会被锁定而无法新增文件。

ext系列文件系统的quota

1>预配置quota(ext、xfs)(下列操作将会在下次开机后仍然生效)

vim /etc/fstab,在需要开启quota的文件系统的挂载选项的defaults后加usrquota,grpquota如下

/dev/sda5  /app                    ext4    defaults,usrquota,grpquota        1 0

2>对指定文件系统生成quota数据库

quotacheck -cugm /app/

3>开启指定文件系统quota

quotaon /app

在命令行模式下,quota -v 显示当前用户自己的quota限额。root身份下,quota -v username用于显示指定用户的quota限额,repquota -v /app 显示指定挂载点所有用户的quota限额

4>设置普通用户quota

edquota -u/g username/groupname -u选项指定user,-g指定group

edquota -p usr1 usr2 将usr1的quota设置复制给usr2

xfs文件系统的quota

1>参考ext系列预配置quota

2>直接配置quota选项

xfs_quota -x -c "print" 查看当前系统中所有的xfs文件系统哪些开启了quota

xfs_quota -x -c "report -ugibh"  查看quota设置

-u 查看用户的quota设置

-g 查看组的quota设置

-i 查看inode的quota限制

-b 查看block的quota限制 (默认)

-h human-readable

xfs_quota -x -c "state" /app 查看quota状态,显示grace time时间

对用户设置quota

xfs_quota -x -c "limit -u bsoft=30M bhard=40M user1" /app

对用户组设置quota

xfs_quota -x -c "limit -g bsoft=80M bhard=200M group1" /app

    最后,我们讨论Linux文件系统高级管理第二部分:LVM(逻辑卷管理器),旨在以在线方式弹性调整文件系统容量!并非在性能与数据保全方面。LVM可以整合多个物理分区在一起,让这些分区看起来像一个磁盘一样,而且这个磁盘容量可变!实现过程大致为:物理磁盘或分区(未挂载的)-->PV(LVM的物理卷)-->VG(LVM的卷用户组)-->LV(逻辑卷),具体如下

1.分区或增加新的硬盘

如果是分区,注意用fdisk命令的-t选项将系统标识符改为8e

2.创建物理卷PV

pvscan,查询系统上有无PV

pvcreate /dev/sdaX

pvdisplay显示PV状态

3.创建用户卷组VG

vgcreate [-s xM](指定PE大小,默认4M)vgname /dev/sdX

vgscan

vgdisplay [vgname]

4.创建逻辑卷

lvcreate -L xM/G -n lvname vgname

lvscan

lvdisplay [/dev/vgname/lvname]

卸载LVM

1.umount /mnt/lvm

2.lvremove /dev/vgname/lvname

3.vgremove vgmage

4.pvremove /dev/sdX