内存与磁盘管理

内存查看命令

free命令

通过free命令可以查看当前内存的使用情况,使用方法: free [参数]

参数:

  • -m 将数据按以MB为单位进行显示

  • -g 将数据按以GB为单位进行显示

注意我们一般不用 -g 参数,因为例如我们内存使用了1990M,但是-g会显示1g,将超出的都舍去了,所以会显示的不精准

下面是使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1.直接查看
[root@iZm5ehzqow4ijp2ya2g2drZ ~]# free
total used free shared buffers cached
Mem: 1019980 838124 181856 160 142184 337192
-/+ buffers/cache: 358748 661232
Swap: 0 0 0

# 2.使用-m参数
[root@iZm5ehzqow4ijp2ya2g2drZ ~]# free -m
total used free shared buffers cached
Mem: 996 818 177 0 138 329
-/+ buffers/cache: 350 645
Swap: 0 0 0

# 3.使用-g参数
[root@iZm5ehzqow4ijp2ya2g2drZ ~]# free -g
total used free shared buffers cached
Mem: 0 0 0 0 0 0
-/+ buffers/cache: 0 0
Swap: 0 0 0

以上查询结果我们需要注意的是,buffers/cache 项目查询的结果,有的时候我们查看内存发现我们 used 的内存已经非常大,free 的内存就剩一点点这个时候我们先不要着急去想办法加内存,我们首先查看 buffers/cache 下的内存有多少,如果这里显示的内存使用了很多,那么我们就不需要加内存,因为这里使用的内存是缓冲剂缓存使用的,这些都是可以被回收的内存,所以当内存真的撑不住的时候,会回收这一部分,当然,CentOS6没有查询出 available 的内容,如果可以看到这个的占用,这里是汇总的所有可释放的占用,我们可以直接查看这一块的占用,来判断需不需要加内存

还有要注意的就是Swap,它是交换分区的意思,它占用的并不是实际的内存,而是使用的磁盘空间,这里一般查看都是0,如果我们发现查询的时候这里的占用不是0,那么就真的该加内存了,这里就跟Windows中虚拟内存是一样的,指的是内存本身不够用了,我们需要将一些超出的使用转移到硬盘上,将硬盘的一些容量当做内存使用,但是磁盘的读写速度比内存慢十倍,所以一般我们看到交换分区被使用了,就该加内存了。这个交换分区大小一般默认为2G,可以手动指定。

如果我们不指定swap分区,既超出内存占用后不使用交换分区,那么系统会随机杀掉一些占用内存较大的进程,当然这样是不安全的,所以我们一般还是保留swap存在。还有一些Redies了,Memcache等内存数据库,它们不会使用swap分区,内存超出后就停止新增数据了

top命令

top命令我们在进程管理中已经讲解完毕了,可以直接去进程管理章节查看

磁盘查看命令

fdisk命令

fdisk命令既可以查看磁盘的信息,又可以修改磁盘的分区,一般不要直接执行此命令进行分区,会有风险

使用方法: fdisk [参数]

  • -l 查询磁盘信息,使用示例如下:
1
2
3
4
5
6
7
8
9
10
11
[root@iZm5ehzqow4ijp2ya2g2drZ ~]# fdisk -l

Disk /dev/vda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 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: 0x0003a7b4

Device Boot Start End Blocks Id System
/dev/vda1 * 1 5222 41940992 83 Linux

Linux的磁盘都是用文件来表示的,磁盘文件所在的位置是:/dev目录下,vda表示是主机固有磁盘,我们有时候会见到很多 /dev/sda 的磁盘,这种表示的是可插拔的磁盘,类似于我们外接的移动硬盘等,磁盘一般表示都是 vda ~ vdb …这样按顺序往下排,同样挂载的硬盘也是,sda ~ sdb 等排列

上述命令查询出信息的第一行有磁盘总大小的表示方法,一种是以GB为单位,一种是换算为字节为单位,一般我们关注第一行的信息即可,还有就是最后的表格展示的项目,当我们有多快磁盘在机器中时,我们需要看到boot选项的 * 号在哪块磁盘上,* 号表示的就是我们系统启动的引导盘

我们可以直接进入 /dev 目录具体的查看硬盘的文件信息。如下示例:

1
2
3
4
5
[root@iZm5ehzqow4ijp2ya2g2drZ ~]# ls -l /dev/vd?
brw-rw---- 1 root disk 252, 0 Sep 14 09:44 /dev/vda

[root@iZm5ehzqow4ijp2ya2g2drZ ~]# ls -l /dev/vd??
brw-rw---- 1 root disk 252, 1 Sep 14 09:44 /dev/vda1

如上查询,disk后跟的数字252表示磁盘的主设备号,第二个数字表示磁盘的从设备号,我们第二条命令查询出来的发现是 vda1,其中1表示这块磁盘的分区为1分区,如同我们Windows中一块磁盘可以划分为CDE几块不同的分区,Linux也有分区的概念,如果有多个分区,就是从 1 … n,这样的表示方法

df命令

此命令也可以查询磁盘的具体大小,它可以作为fdsik命令的补充,因为fdisk命令只能查看到磁盘的大小,看不到磁盘具体挂载的目录以及目录的大小,这个时候我们就可以使用df命令来查看,一般我们会使用 -h 参数来具体查看,使用示例如下:

1
2
3
4
[root@iZm5ehzqow4ijp2ya2g2drZ ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 2.5G 35G 7% /
tmpfs 499M 0 499M 0% /dev/shm

如上我们就可以看到我们机器的分区挂载目录,以及此目录的大小,注意:此命令是我们最常用的

du命令

上述命令都是直接查看磁盘大小的,我们还可以通过du命令查看具体文件夹的大小,但是注意,我们同样可以是用ls -l命令查看文件的大小,但是ls命令查询出的文件大小可能与du命令查出的文件大小是不一样的,这是因为,ls查询出的文件包含了文件占用的全部大小,而这全部大小可能包含了很多空洞文件,空洞文件表示的是可以理解为一块磁盘空间,我们只给空间头和尾加了标记,其他位置全部都是空的,这样的文件就叫做空洞文件,我们可以使用dd命令来创建空洞命令,这里不做详细解释

在查看文件的具体大小时我们可以使用此两种命令查看文件的具体大小,使用示例如下:

1
2
3
4
5
[root@iZm5ehzqow4ijp2ya2g2drZ balyu]# ls -lh SparrowNet-1.0-SNAPSHOT.jar 
-rw-r--r-- 1 root root 51M Oct 19 14:27 SparrowNet-1.0-SNAPSHOT.jar

[root@iZm5ehzqow4ijp2ya2g2drZ balyu]# du -h SparrowNet-1.0-SNAPSHOT.jar
51M SparrowNet-1.0-SNAPSHOT.jar

以上两种命令所查出的文件大小是一样的,说明此文件中没有包含空洞文件

我们需要查看文件夹的大小时,我们就可以使用du命令,因为我们发现ls命令查看的文件夹大小并不包含文件夹中的内容,所以无法知道文件夹及其中内容的总大小,这时我们就可以使用 du -sh *命令,注意此命令是重点,要牢记,使用示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 首先使用 ls -lh 命令查看,这里只包含一级目录的大小,并没有包含子目录中文件的总大小
[root@iZm5ehzqow4ijp2ya2g2drZ balyu]# ls -lh
total 51M
drwxrwxrwx 2 root root 4.0K Nov 15 01:02 data
drwxr-xr-x 2 root root 4.0K Nov 17 00:07 logs
drwxr-xr-x 2 root root 4.0K Oct 19 14:28 package
drwxrwxrwx 5 root root 4.0K Sep 14 17:20 resources
-rw-r--r-- 1 root root 51M Oct 19 14:27 SparrowNet-1.0-SNAPSHOT.jar

# 使用 du 命令的 -sh 参数查询文件的总大小,包含了子目录中所有文件的大小
[root@iZm5ehzqow4ijp2ya2g2drZ balyu]# du -sh
84M .

# 使用 du -sh * 命令分别查看一级目录中所有文件及子目录的总大小
[root@iZm5ehzqow4ijp2ya2g2drZ balyu]# du -sh *
60K data
9.0M logs
4.0K package
24M resources
51M SparrowNet-1.0-SNAPSHOT.jar

通过上述示例我们很容易能看出区别,所以此命令我们需要牢记

常见文件系统

Linux支持多种文件系统,常见的有:

  1. ext4

  2. xfs

  3. NTFS(需要安装额外转件)

目前比较流行的是前两种,CentOS7使用的xfs文件系统,之前的版本使用的都是ext4文件系统,这两个操作系统都是足够稳定的,NTFS文件系统Windows使用的文件系统,我们将这种格式的磁盘挂载到Linux系统上的时候,它会是只读状态,因为这种文件系统是有版权的,需要额外安装一个软件才能操作它

这里我们介绍最常用的ext4文件系统,它分为四个部分:

  • 超级块

  • 超级块副本

  • I节点(iNode)

  • 数据块(datablock)

超级块是在文件系统最开始的部分的空间,它所存储的主要是磁盘的大小,磁盘中文件所占用的大小,包含了多少个文件,文件的总数,我们在使用df命令很快就能查看出文件的总数及大小,就是因为它查看的是超级块中的信息

超级块副本是超级块的备份,它不止有一份,当超级块出现故障的时候,可以在这里恢复

i节点记录的是每一个文件,它记录的是文件的大小,位置,创建时间,修改时间,文件的权限,编号等等信息,但是这里不包括文件的名称,注意:文件的名称是记录在自己文件的父目录的i节点中,当文件过多的时候,也会记录在父目录的数据块中

数据块就是记录的真实的文件数据,数据块是挂在i节点后的,我们只要能找到文件的i节点,就能找到文件的数据块,就可以通过挂的数据块的个数来知道文件的大小

所以我们使用ls查看文件的大小的时候,查看的是i节点里面文件的大小信息,而du统计的是i节点挂在的数据块的个数统计文件的大小信息,所以说du查看的是真实的文件大小

i节点和数据块操作

我们首先观察cp和mv命令

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
# 首先我们创建一个文件并查看文件信息,发现它占用0k大小
[root@iZm5ehzqow4ijp2ya2g2drZ test]# touch file1
[root@iZm5ehzqow4ijp2ya2g2drZ test]# ls -li
total 0
1179654 -rw-r--r-- 1 root root 0 Dec 1 14:34 file1

# 然后写入文件123字符,发现大小时4k
[root@iZm5ehzqow4ijp2ya2g2drZ test]# echo >file1 123
[root@iZm5ehzqow4ijp2ya2g2drZ test]# ls -li
total 4
1179657 -rw-r--r-- 1 root root 4 Dec 1 14:34 file1

# 然后copy这个文件,发现两个文件占用大小相同,复制的文件创建了一个新的i节点
[root@iZm5ehzqow4ijp2ya2g2drZ test]# cp file1 file2
[root@iZm5ehzqow4ijp2ya2g2drZ test]# ls -li
total 8
1179657 -rw-r--r-- 1 root root 4 Dec 1 14:34 file1
1179654 -rw-r--r-- 1 root root 4 Dec 1 14:35 file2

# 然后我们移动file2到当前目录修改名称为file3,发现file2的节点没有发生变化,只是文件名称发生变化
[root@iZm5ehzqow4ijp2ya2g2drZ test]# mv file2 file3
[root@iZm5ehzqow4ijp2ya2g2drZ test]# ls -li
total 8
1179657 -rw-r--r-- 1 root root 4 Dec 1 14:34 file1
1179654 -rw-r--r-- 1 root root 4 Dec 1 14:35 file3

通过上述示例,我们发现,复制名称是创建了一个新的i节点及文件,而移动操作并不会创建新的i节点及数据块,只是修改了目中的文件的信息,比如上述文件名

注意:上述移动我们只是移动到当前目录下,所以只需要修改名称,这个过程是非常快的。如果我们将文件移动到此分区的其他目录,我们发现移动也非常快,通过原理我们知道,移动到其他目录,我们也并不需要创建新的i节点及数据块等,只需要将目录链接做修改即可。但是如果我们将文件移动到其他分区,这里因为发生了文件系统的变换,从一个文件系统移动到另一个文件系统,这里就需要在创建新的i节点和数据块,所以这个过程就比较慢了。

注意:一般我们创建文件,默认大小就是4K的大小,虽然上述示例我们只写入了三个数字,只占用102位,也就是12个字节,但是文件的大小还是4K,所以我们要创建很多小文件的时候,需要注意一下浪费空间,这个当然有办法解决,可以自行google

上述我们给文件写入数据使用的是echo命令,注意的是,如果我们使用vim来修改文件内容的话,文件的i节点及数据块都会发生变化,这里在CentOS6、7版本都是这样。如果i节点发生变化,那么此文件就已经不是原来的文件,这里主要是vim对于文件一致性的考虑,所以会有这样的操作机制,vim打开的文件实际是一个交换文件,具体可以自行google

rm命令,其实也不是将文件直接删除,而是将i节点与数据块的链接给断开了,所以我们在删除文件的时候操作也是非常快,不管多大的文件

利用ext4和xfs文件系统的特性修改文件的权限

我们之前知道原始的文件的权限就三种,rwx,原始修改文件权限的方式是一改全改,但是当我们有特殊的业务场景,比如我们需要一个文件,user1有读权限,user2有写权限,user3有执行权限,这个时候我们原始的设置权限的方式就不能满足我们的需求了,这个时候我们就可以利用ext4和xfs文件系统的特性来满足此需求,这两个文件系统支持了一个文件访问控制列表,叫facl的功能

getfacl命令

我们可以使用getfacl命令来查看文件的控制访问列表,使用方法: getfacl 文件名,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 普通查看方式
[root@iZm5ehzqow4ijp2ya2g2drZ test]# ll file1
-rw-r--r-- 1 root root 4 Dec 1 14:34 file1

[root@iZm5ehzqow4ijp2ya2g2drZ test]# ls
file1
[root@iZm5ehzqow4ijp2ya2g2drZ test]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--

这里我们使用faclget命令查看的文件控制访问列表跟我们使用ll查询出的信息一致,这是基本的一些控制信息,那我们怎么赋予指定用户或用户组的一些权限呢?使用setfacl命令

setfacl命令

我们可以使用setfacl为指定的用户或用户组赋予权限,使用方法:setfacl -m u:用户名称:权限符号 文件名,具体使用示例如下:

1
2
3
4
5
6
# 设置
[root@iZm5ehzqow4ijp2ya2g2drZ test]# setfacl -m u:user01:r file1

# 查看文件权限
[root@iZm5ehzqow4ijp2ya2g2drZ test]# ls -l file1
-rw-r--r--+ 1 root root 4 Dec 1 14:34 file1

我们通过setfacl命令设置完权限之后,我们使用普通ll命令查看此文件权限的时候,发现权限列表中 -rw-r–r–+ 多了一个+号,这个+号表示除了我们标准权限之后,此文件还被设置了文件访问控制权限facl的权限,我们必须使用getfacl命令来查看,如下:

1
2
3
4
5
6
7
8
9
[root@iZm5ehzqow4ijp2ya2g2drZ test]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:user01:r--
group::r--
mask::r--
other::r--

我们发现此文件user01用户有了读的权限,我们还可以给user02设置读和写的权限,设置示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@iZm5ehzqow4ijp2ya2g2drZ test]# setfacl -m u:user02:rw file1

[root@iZm5ehzqow4ijp2ya2g2drZ test]# ll
total 4
-rw-rw-r--+ 1 root root 4 Dec 1 14:34 file1

[root@iZm5ehzqow4ijp2ya2g2drZ test]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:user01:r--
user:user02:rw-
group::r--
mask::rw-
other::r--

如上我们就设置成功了,user02有了读写权限

我们还可以为指定的组赋予权限,使用的还是setfacl命令,使用方法:setfacl -m g:组名称:权限 文件名,使用示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@iZm5ehzqow4ijp2ya2g2drZ test]# setfacl -m g:group01:x file1

[root@iZm5ehzqow4ijp2ya2g2drZ test]# ll
total 4
-rw-rwxr--+ 1 root root 4 Dec 1 14:34 file1

[root@iZm5ehzqow4ijp2ya2g2drZ test]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:user01:r--
user:user02:rw-
group::r--
group:group01:--x
mask::rwx
other::r--

如上我们就为新建组group01分配了执行权限

收回权限我们只需要将setfacl命令参数中的 -m 修改为 -x,使用方法:setfacl -x u:用户名称 文件名,使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 收回
root@iZm5ehzqow4ijp2ya2g2drZ test]# setfacl -x u:user02 file1

[root@iZm5ehzqow4ijp2ya2g2drZ test]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:user01:r--
group::r--
group:group01:--x
mask::r-x
other::r--

注意:收回只能按照用户级别或者用户组级别,而不能收回单个权限编码,例如只收回某个用户的读权限,上述命令收回组权限使用用法与收回用户一样,直降u改为g即可,使用用法:setfacl -x g:用户组名称 文件名

这样我们就可以非常细粒度及灵活的设置文件的具体权限

磁盘分区和挂载

这里我们不详细描述磁盘的分区和挂载,因为用的不会太多,即使使用可以网上自行百度一下,这里只列举一下步骤

首先第一种情况是需要分区的磁盘容量小于2T:

首先使用:fdisk 分区设备 命令,然后输入 m 查看帮助命令,这里我们输入 n 选择分区类型,一般我们都是将一个磁盘划分为一个主分区,所以这里再选择输入 p,这是会提示我们输入分区号及分区大小,选择完成后,我们就可以选择输入命令,选择是保存还是不保存删除刚才输入的分区信息,保存使用 w ,保存后,我们就可以使用 fdisk -l 查看我们刚才创建的分区了

注意:上述命令中分区设备示例: /dev/sdd 分好区后,路径是 /dev/sdd1

接下来使用:mkfs. 命令来格式化分区的文件系统类型,使用方法:mkfs.文件系统类型 分区位置,这里我们一般选择ext4文件系统,这样我们就给分区格式化好了磁盘格式

接下来:使用mkdir命令,创建一个目录

接下来:使用mount命令将刚刚分好区的磁盘挂载到此目录上,使用方法:mount 分区路径 目录

这样我们就可以使用mount来查看磁盘的挂载情况,发现我们新添加分好区的磁盘就挂载到了指定的目录上,这样我们操作此目录中的内容,最后就落在了我们挂载的磁盘上

第二种情况磁盘容量大有2T:

这时我们就不能使用fdisk命令来为磁盘分区了,我们需要使用parted命令来操作,同样我们可以对标fdisk来操作,使用help来查看具体使用,当然具体流程是一样的,只不过分区的命令不一样,其他流程及命令都一样

以上我们的操作都是保存在内存中的,如果我们的机器重启,配置就会丢失,如果我们需要固化下来,就需要修改一个配置文件,在此配置文件中进行指定挂载的配置,配置文件的位置:/etc/fstab,

配置说明: 磁盘分区 挂载目录 文件系统格式 default 0 0

示例:

1
/dev/sdc1 /mnt/sdc1 ext4 default 0 0

将以上配置信息写入文件,就可以完成永久的挂载配置

创建交换分区

swap是在硬盘中开辟的一块区域,之前我们介绍过,它的作用是临时的扩充内存的区域

新添加磁盘挂载为交换分区

注意这种方式我们很少用,因为很少用新添加的磁盘作为内存使用。上面我们讲述了如何新添加磁盘然后分区、挂载,现在我们讲述如何新添加磁盘然后分区挂载为交换分区

查看交换分区大小使用free -m命令

  1. 首先我们对新添加的硬盘进行分区,命令与上述一样,首先使用:fdisk 分区设备 命令,然后我们输入 n 选择分区类型,然后输入 p 表示将一个磁盘划分为一个主分区,这是会提示我们输入分区号及分区大小,分区编号一般选择 1 ,从1开始,分区大小可以不选择,直接默认使用全部,选择完成后,我们 w 保存配置,这样我们就可以查看我们的分区了

  2. 如同使用正常的文件系统一样,我们将磁盘分区为交换分区,也需要对它进行格式化,格式化命令:mkswap 分区位置, 格式化命令使用示例: mkswap /dev/sdd1

  3. 格式化完成就需要对此分区进行挂载了,如果是文件系统使用的是mount命令,挂载为内存分区使用的是:swapon 分区位置,挂载命令使用示例:swapon /dev/sdd1

  4. 这样我们就对内存分区扩展完成,可以使用 free -m 命令查看了

如果我们想将此新挂载的swap分区关闭掉,使用命令:swapoff 分区位置,使用示例:swapoff /dev/sdd1,这是使用 free -m 命令再次查看,发现就已经被关闭掉了

使用文件挂载为交换分区

上述我们是新添加了一块磁盘作为交换分区,但是一般很不常用,一般我们是在已有磁盘开辟一块空间,作为交换分区,挂载方式如下:

  1. 首先创建一个文件,文件创建未空洞文件形式,使用命令示例:dd if=/dev/zero bs=4M count=1024 of=/swapfile, 这里我们创建了一个每块为4M。一共1024块的大小的文件

  2. 下面我们需要格式化此文件,但是首先我们需要将此文件的权限处理好,负责可能会报关于权限的错误,所以这里首先:chmod 600 /swapfile

  3. 然后格式化此文件,使用命令:mkswap /swapfile

  4. 打开挂载此文件,使用命令:swapon /swapfile

这样我们就可以使用 free -m 命令来查看了

上述创建挂载方式跟我们普通磁盘文件系统挂载步骤差不多,所以一样都是保存在内存中的,如果我们的机器重启,配置就会丢失,如果我们需要固化下来,就需要修改一个配置文件,在此配置文件中进行指定挂载的配置,配置文件的位置:/etc/fstab

配置说明: 磁盘分区 挂载目录 文件系统格式 default 0 0

写入示例:

1
2
3
4
## 上述磁盘挂载配置
/dev/sdc1 swap swap default 0 0
## 上述文件挂载配置
/swapfile swap swap default 0 0

将以上配置信息写入文件,就可以完成永久的挂载配置

最后更新: 2019年12月15日 13:02

原始链接: https://jjw-story.github.io/2019/11/10/内存与磁盘管理/

× 请我吃糖~
打赏二维码