Linux 磁盘管理

查看磁盘或者目录的容量 df du

df 查看已挂载磁盘的总容量使用容量剩余容量等,可以不加任何参数,默认是按k为单位显示的

8_1.png.jpg

df常用参数有 –i -h -k –m

-i 使用inodes 显示结果

8_12.png.jpg

-h 使用合适的单位显示,例如G

8_13.png.jpg

-k -m 分别为使用KM为单位显示

8_14.png.jpg

简单介绍一下,你看到的相关数据。Filesystem 表示扇区,也就是你划分磁盘时所分的区;1K-blocks/1M-blocks表示以1K/1M为单位;Used Available 分别是已使用和剩余;Use% 就是已经使用的百分比,如果这个值大于90% 那么你就应该注意了,磁盘很有可能马上就会变满的;Mounted on 则表示该分区(扇区)所挂载的地方

du 用来查看某个目录所占空间大小

语法:du [-abckmsh] [文件或者目录名] 常用的参数有:

-a:全部文件与目录大小都列出来如果不加任何选项和参数只列出目录(包含子目录)大小

8_15.png.jpg

-b:列出的值以bytes为单位输出,默认是以Kbytes

8_16.png.jpg

-c:最后加总

8_17.png.jpg

-k:以KB为单位输出

-m:以MB为单位输出

-s:只列出总和

-h:系统自动调节单位,例如文件太小可能就几K,那么就以K为单位显示,如果大到几G,则就以G为单位显示笔者习惯用 du –sh filename 这样的形式

8_18.png.jpg

磁盘的分区和格式化

笔者经常做的事情就是拿一个全新的磁盘来分区并格式化这也说明了作为一个linux系统管理员,对于磁盘的操作必须要熟练所以请你认真学习该部分内容

fdisk linux下的硬盘分区工具

语法: fdisk [-l ] [设备名称]

-l :后边不跟设备名会直接列出系统中所有的磁盘设备以及分区表,加上设备名会列出该设备的分区表

8_19.png.jpg

8_20.png.jpg

如果不加-l 则进入另一个模式,在该模式下,可以对磁盘进行分区操作

8_21.png.jpg

刚进入该模式下,会有一个提示Command (m for help): 此时按m则会打印出帮助列表,如果你英文好,我想你不难理解这些字母的功能笔者常用的有p, n,d, w, q.

P:打印当前磁盘的分区情况

8_29.png.jpg

n:重新建立一个新的分区

w:保存操作

q:退出

d:删除一个分区

因为笔者的linux系统是安装在虚拟机上的,所以我可以增加一块新的磁盘然后笔者会把新的磁盘分成多个分区

8_30.png.jpg

当再次fdisk -l 查看时发现多了一个/dev/hdb 设备,并提示该设备没有可用的分区表那么下面就来分一下这个/dev/hdb.

8_31.png.jpg

首先用p查看一下,并没有任何分区信息

8_32.png.jpg

n创建一个新的分区,会提示要建立e extended 扩展分区)或者p primary partition主分区),这里笔者选择主分区,所以按了p回车后,又让输入First cylinder 你或者直接回车或者输入一个数字,因为这块磁盘是新的并没有任何分区,所以直接回车其实就是从1开始了你也可以自定义输入,但不要超过2080,笔者这里输入1回车此时会提示要分多大,可以写一个数值(2-2080),也可以输入+sizeK或者+sizeM,后者比较直观容易理解,所以笔者在这里输入+100M,即我分了一个100M的主分区再用p查看时,果真多出来一个分区然后笔者继续重复前面的操作,建立了4个主分区当笔者再次输入n创建分区时,结果提示错了

8_33.png.jpg

由此你会发现,在linux中最多只能创建4个主分区,那如果你想多创建几个分区如何做?很容易,在创建完第三个分区后,创建第四个分区时选择扩展分区

8_34.png.jpg先删除第四个主分区,然后建立一个扩展分区

8_35.png.jpg

在建立扩展分区时,会问你要分多少给这个扩展分区,笔者直接回车,即把所有空间都分给了这个扩展分区这个扩展分区/dev/hdb4并不能往里写数据,它只是一个空壳子,需要我们继续在这个空壳中继续创建分区

8_83.png.jpg

当建立完扩展分区,然后按n创建新分区时你会发现不再提示是要建立p还是e了,因为我们已经不能再创建p在这里需要你明白的是,hdb5 其实只是 hdb4 中的一个子分区,到目前为止可用的分区也才4个,那笔者就再创建第5个分区出来

8_84.png.jpg

然后按w保存,该模式自动退出,如果你不想保存分区信息直接按q即可退出

8_85.png.jpg

下面我们把刚分好的分区删除,重新建立分区如何删除你还记得吧,对了就是直接按d然后选择合适的数字删除完所有分区后,这块磁盘就恢复如初了

8_86.png.jpg

8_87.png.jpg

第一个分区,我们就建立成扩展分区并且分给它200M。

8_88.png.jpg

当再次新建分区时,发生了变化,不再是p或者e了,而是p或者l(逻辑分区),这是为什么呢?在上面也提到了,一个扩展分区只是一个空壳,在扩展分区下才可以继续划分小的分区,这个小的分区其实就是逻辑分区了

8_89.png.jpg

而且这个逻辑分区默认都是从字数5开始的,因为前面的数字要么给主分区留着,要么给扩展分区留着由此我们也可以得到,在linux中最多可以创建4个主分区,一旦创建4个主分区后就不能增加任何分区了另外最多也只能创建一个扩展分区扩展分区下的逻辑分区最多可以创建多少呢?IDE的硬盘(类似于hda, hdb, hdc 等)最多可以创建10个(hdb5-hdb15),这是笔者试验出来的结果有的资料说linux下的逻辑分区是没有限制的,也有的说最大可以到64,至于对不对,需要你去近一步考察了,我们没有必要多么深入的研究这个问题,也没有什么意义

通过以上操作,相信你也学会了用fdisk 来分区了吧值得提出的是,不要闲着没事分区玩儿,这操作的危险性是很高的,一不留神就把你服务器上的数据全部给分没有了如果有分区的操作,那么请保持百分之二百的细心,切记切记!

mkfs.ext2 / mkfs.ext3 /mke2fs 格式化linux硬盘分区

当用man查询这三个命令的帮助文档时,你会发现我们看到了同一个帮助文档,这说明三个命令是一样的常用的选项有:

-b:分区时设定每个数据区块占用空间大小,目前支持1024, 2048 以及4096 bytes每个块

-i:设定inode大小

-N:设定inode数量,有时使用默认的inode数不够用,所以要自定设定inode数量。

-c:在格式化前先检测一下磁盘是否有问题,加上这个选项后会非常慢

-L:预设该分区的标签label

-j:建立ext3格式的分区,如果使用mkfs.ext3 就不用加这个选项了

8_90.png.jpg

不加任何选项,直接格式化/dev/hdb1

8_91.png.jpg

上例中更改了block size4096 默认是1024,而inode大小设定为4096。

下面的例子分区时自定义分区的label(标签)名

8_92.png.jpg

e2label 用来查看或者修改分区的标签(label

这个命令很简单,后边直接跟分区编号,即可查看该分区的label,当想要修改标签名时,分区编号后边跟想要的标签名即可

8_93.png.jpg

fsck 检查硬盘有没有坏道

语法: fsck [-Aar] [分区]

-A :加该参数时,后不需要跟分区名作为参数它会自动检查/etc/fstab 文件下的所有分区(开机过程中就会执行一次该操作);

-a :自动修复检查到有问题的分区;

-r :当检查到有坏道的分区时会让用户决定是否修复

8_94.png.jpg

当你使用fsck检查磁盘有无坏道时,会提示用户跑这个任务可能会导致某些挂载的文件系统损坏,所以这个命令不要轻易运行否则真的遇到问题,系统甚至都不能启动了

8_95.png.jpg

挂载/卸载磁盘

在上面的内容中讲到了磁盘的分区和格式化,那么格式化完了后,如何去用它呢?这就涉及到了挂载这块磁盘格式化后的磁盘其实是一个块设备文件,类型为b,也许你会想,既然这个块文件就是那个分区,那么直接在那个文件中写数据不就写到了那个分区中么?当然不行

在挂载某个分区前需要先建立一个挂载点,这个挂载点是以目录的形式出现的一旦把某一个分区挂载到了这个挂载点(目录)下,那么再往这个目录写数据使,则都会写到该分区中这就需要你注意一下,在挂载该分区前,挂载点(目录)下必须是个空目录其实目录不为空并不影响所挂载分区的使用,但是一旦挂载上了,那么该目录下以前的东西就不能看到了只有卸载掉该分区后才能看到

mount 挂载设备

8_96.png.jpg

先建立/test1 /test2 目录,然后在/test1目录下建立一个1.txt文件

8_97.png.jpg

/dev/hdb1分区挂载到/test1目录,然后再查看/test1目录发下,1.txt不存在了此时往/test1目录下写数据,则会写到/dev/hdb1分区中在讲mount-a选项时,我们有必要先了解一下这个文件 /etc/fstab

8_98.png.jpg

这个文件是系统启动时,需要挂载的各个分区第一列就是分区的label;第二列是挂载点;第三列是分区的格式;第四列则是mount的一些挂载参数,等下会详细介绍一下有哪些参数,一般情况下,直接写defaults即可;第五列的数字表示是否被dump备份,是的话这里就是1,否则就是0;第六列是开机时是否自检磁盘,就是刚才讲过的那个fsck检测。12都表示检测,0表示不检测,在Redhat中,这个12还有个说法,/ 分区必须设为1,而且整个fstab中只允许出现一个1,这里有一个优先级的说法。12优先级高,所以先检测1,然后再检测2,如果有多个分区需要开机检测那么都设置成2吧,1检测完了后会同时去检测2。下面该说说第四列中常用到的参数了

async/sync async表示和磁盘和内存不同步,系统每隔一段时间把内存数据写入磁盘中,而sync则会时时同步内存和磁盘中数据;

auto/noauto :开机自动挂载/不自动挂载;

default:按照大多数永久文件系统的缺省值设置挂载定义,它包含了rw, suid, dev, exec, auto, nouser,async

ro:按只读权限挂载

rw:按可读可写权限挂载

exec/noexec :允许/不允许可执行文件执行,但千万不要把根分区挂载为noexec,那就无法使用系统了,连mount命令都无法使用了,这时只有重新做系统了;

user/nouser :允许/不允许root外的其他用户挂载分区,为了安全考虑,请用nouser

suid/nosuid :允许/不允许分区有suid属性,一般设置nosuid

usrquota :启动使用者磁盘配额模式,磁盘配额相关内容在后续章节会做介绍;

grquota :启动群组磁盘配额模式;

学完这个/etc/fstab后,我们就可以自己修改这个文件,增加一行来挂载新增分区例如,笔者增加了这样一行

/dev/hdb1 /test1 ext3 defaults 0 0

那么系统再重启时就会挂载这个分区了

讲完了/etc/fstab 我们继续回来讲这个mountmout -a 如果运行了这个命令,则会把/etc/fstab中出现的所有磁盘分区挂载上所以当你在/etc/fstab文件中增加一行后,你完全可以直接运行mount -a 来挂载你增加的那行,这样就不用重启啦

你可以使用mount -o 选项来重新挂载一个分区,并同时指定你想要的选项(即上边介绍fstab第六列中那些)

8_99.png.jpg

看到了吧,使用了ro选项,则不能新建文件了

8_100.png.jpg

再重新挂载一次就恢复正常了,如果不加任何其他选项,则就是defaults。

笔者在日常的运维工作中遇到过这样的情况,一台服务器上新装了亮块磁盘,磁盘a(在服务器上显示为sdc)和磁盘b(在服务器上显示为sdd),有一次把这两块磁盘都拔掉了,然后再重新插上,重启机器,结果磁盘编号调换了,a变成了sddb变成了sdc(这是因为把磁盘插错了插槽),问题来了通过上边的学习,你挂载磁盘是通过/dev/hdb1 这样的分区名字来挂载的,如果先前加入到了/etc/fstab 中,结果系统启动后则会挂载错分区那么怎么样避免这样的情况发生?

blkid 这个命令是用来显示磁盘分区uuid的,uuid其实就是一大串字符,在linux系统中每一个分区都会有唯一的一个uuid。说到这,聪明的你想到了吧,没有错,我们就用这唯一的uuid来挂载磁盘分区

8_101.png.jpg

这个命令笔者只是用来显示uuid,没有其他用途所以不做详细介绍,当然你也可以在命令后边跟某一个分区,只显示该分区的uuid。

8_102.png.jpg

看到了吧,其实是很好用的那么怎么让它也开机启动?很简单,把刚才敲的mount 磁盘的命令直接写到 /etc/rc.d/rc.local 文件即可对了,笔者到现在还没有给你讲过这个rc.local文件的作用简单点说,系统启动完后会执行这个文件中的命令所以只要你想开机后运行什么命令统统写入到这个文件下面吧

8_103.png.jpg

其实这个文件就是一个shell 脚本,以后笔者会单独用一章来介绍它行开头的”#”是注释的意思,代表这行在这个脚本中不生效你想让系统开机后运行什么命令,就把什么命令写到这里面来就比如刚才笔者挂载的那条命令你可以这样实现:

8_104.png.jpg

mount 还有一个比较常用的选项就是-t ,后边指定文件系统的类型,比如挂载软盘时就需要指定 vfat,而挂载光盘时就需要指定iso9660,但在笔者多年来的经验,目前的系统都是智能识别所要挂载分区的系统格式类别的也就是说,用不着你去指定,它会自动判断的

8_105.png.jpg

umount 卸载设备

现在你学会了如何挂载一个设备,那么如何去卸载一个设备呢,这就要用到umount了,这个命令也简单的很,后边可以跟挂载点,也可以跟分区名(/dev/hdb1)

8_106.png.jpg

有时也许你会遇到比较难卸载的设备,就像在windows下无法删除U盘一样,教你一个特管用的方法就是 umount -l /dev/hdb1 ,这个-l选项有强制卸载的意思,你一定要记住哦,非常有用的

建立一个swap文件

从装系统时就接触过这个swap了,前面也说过它类似与windows的虚拟内存,分区的时候一般大小为内存的2倍,如果你的内存超过4G,那么你分8G似乎是没有必要了4G足够日常交换了然而,还会有虚拟内存不够用的情况发生如果真遇到了,莫非还要重新分一下磁盘?当然不能!那我们就增加一个虚拟的磁盘出来

基本的思路就是:建立swapfile 格式化为swap格式启用该虚拟磁盘

8_107.png.jpg

利用dd 来创建一个419M的文件/tmp/newdisk出来,其中if代表从哪个文件读,/dev/zerolinux下特有的一个0生成器,of表示输出到哪个文件,bs即块大小,count则定义有多少个块

8_108.png.jpg

mkswap 这个命令是专门格式化swap格式的分区的,这个命令用的时候一定要看清楚了,否则把其他分区给格式化错了就只有哭了

8_109.png.jpg

free 是用来查看系统内存以及虚拟内存使用情况的,-m选项是以M的形式查看可以看到当前系统的swapon 是启用我们新建的swap文件,启用后再用free查看发现多了400M。

8_110.png.jpg

我们还可以用swapoff 关闭启用的swap文件

磁盘配额

磁盘配合其实就是给每个用户分配一定的磁盘额度,只允许他使用这个额度范围内的磁盘空间linux系统中,是多用户多任务的环境,所以会有很多人共用一个磁盘的情况针对每个用户去限定一定量的磁盘空间是有必要的,这样才显得公平

linux中,用来管理磁盘配额的东西就是quota如果你的linux上没有quota,则需要你安装这个软件包 quota-3.13-5.el5.RPM (其实版本是多少无所谓了,关键是这个软件包)。quota在实际应用中是针对整个分区进行限制的如果你的/dev/hda3 是挂载在/home 目录下的,那么/home 所有目录都会受到限制

quota 这个模块主要分为quota quotacheck quotaoff quotaon quotastats edquota setquota warnquota repquota这几个命令,下面就分别介绍这些命令

quota 用来显示某个组或者某个使用者的限额

语法:quota [-guvs] [user,group]

-g :显示某个组的限额

-u :显示某个用户的限额

-v :显示的意思

-s :选择inod或硬盘空间来显示

quotacheck 用来扫描某一个磁盘的quota空间

语法:quotacheck [-auvg] /path

-a :扫描所有已经mount的具有quota支持的磁盘

-u :扫描某个使用者的文件以及目录

-g :扫描某个组的文件以及目录

-v :显示扫描过程

-m :强制进行扫描

edquota 用来编辑某个用户或者组的quota

语法:edquota [-u user] [-g group] [-t]

edquota -p user -u user

-u :编辑某个用户的quota

-g :编辑某个组的quota

-t :编辑宽限时间

-p :拷贝某个用户或组的quta到另一个用户或组

当运行edquota -u user 时,系统会打开一个文件,你会看到这个文件中有7列,它们分别代表的含义是:

Filesystem :磁盘分区,如/dev/hda3

blocks :当前用户在当前的Filesystem中所占用的磁盘容量,单位是Kb。该值请不要修改

soft/hard :当前用户在该Filesystem内的quota值,soft指的是最低限额,可以超过这个值,但必须要在宽限时间内将磁盘容量降低到这个值以下。hard指的是最高限额,即不能超过这个值当用户的磁盘使用量高于soft值时,系统会警告用户,提示其要在宽限时间内把使用空间降低到soft值之下

inodes :目前使用掉的inode的状态,不用修改

quotaon 启动quta,在编辑好quota后,需要启动才能是quta生效

语法:quotaon [-a] [-uvg directory]

-a :全部设定的quota启动

-u :启动某个用户的quota

-g :启动某个组的quota

-s :显示相关信息

quotaoff 关闭quota

该命令常用只有一种情况 quotaoff -a 关闭全部的quota

以上讲了很多quota的相关命令,那么接下来笔者教你如何在实践应用中去做这个磁盘配额整个执行过程如下:

首先先确认一下,你的/home目录是不是单独的挂载在一个分区下,用df 查看即可如果不是则需要你跟我一起做否则这一步即可省略

8_111.png.jpg

笔者的linux系统中,/home并没有单独占用一个分区所以需要把/home目录挂载在一个单独的分区下,因为quota是针对分区来限额的

8_112.png.jpg

笔者用fdisk -l 查看目前/dev/hdb 磁盘有5个可用分区,所以笔者打算把/dev/hdb1挂载在/home 目录下

8_113.png.jpg

看到了吧,目前笔者的/home目录已经是一个单独的分区了

1)建立测试用户

8_114.png.jpg

首先建立一个test用户,则同时建立了一个test可以在/etc/passwd中有以test为开头的行,其中uidgid都为500 ,然后又建立一个test1账号,使其加入test组,查看/etc/passwd文件发现testtest1用户的gid都为500。(也许你对/etc/passwd文件增加一个用户以及uidgid等概念不熟悉,没有关系,在以后的章节中会做介绍,在这里只需要你明白即可)

2)打开磁盘的quota功能

默认linux并没有对任何分区做quota的支持,所以需要我们手动打开磁盘的quota功能,你是否记得,在前面内容中分析/etc/fstab文件的第四列时讲过这个quota选项(usrquota, grpquota没错,要想打开这个磁盘的quota支持就是需要修改这个第四列的vim编辑/etc/fstab 加入一行,如下图:

8_115.png.jpg

vim命令将会在后续章节详细介绍,前面介绍过如何进入编辑模式以及如何保存文件如果你的linux系统已经有/home这一行,那么直接修改第四列,加上usrquota,grpguota(中间没有空格)接下来需要重新挂载/home。

8_116.png.jpg

另外你也可以这样实现重新挂载/home

8_117.png.jpg

如何查看是否启用了quota呢?

8_118.png.jpg

只要查看/etc/mtab文件中/home所在那行是否有usrguota,grpquota即可笔者的/dev/hdb1现在已经支持了quota

3)扫描磁盘的使用者使用状况,并产生重要的aquota.groupaquota.user

这一步就需要用到quotacheck了,aquota.groupaqouta.user分别是组以及用户磁盘配额需要的配置文件如果没有这两个文件,则磁盘配额是不会生效的

8_119.png.jpg

当首次使用quotacheck命令时,会提示“cannot stat old user quota file ……”其实这是在提示你在/home目录下没有aquota.user以及aquota.group两个文件没有关系,因为以前并没有配置过磁盘配额,当然没有这两个文件了当执行完quotacheck命令后,会在/home目录下生成这两个文件的

4)启动quota配额

8_120.png.jpg

5)编辑用户磁盘配额

先来设定test账户的配额,然后直接把test的配额拷贝给test1即可这里就需要用到edquota

8_121.png.jpg

讲上面内容修改为

8_122.png.jpg

其中单位是Kb,所以soft 值大约为20Mbhard值为30Mb,保存这个文件,保存的方式跟vim一个文件的方式一样的

8_123.png.jpg

test的配额复制给test1。下面继续设定宽限时间

8_124.png.jpg

默认是7days 在这里我们改为1days。下面查看一下test以及test1用户的配额吧

8_125.png.jpg

6)编辑组磁盘配额

8_126.png.jpg

设定组testsoft配额值为40Mhard值为50M。下面查看组test的配额

8_127.png.jpg

7)设定开机启动

前面已经讲到启动磁盘配额的命令是quotaon -aug ,所以要想开机启动,只需将这条命令加入到 /etc/rc.d/rc.local文件即可

8_128.png.jpg