swap分区,交换分区,在Windows里也有这个概念,不过它叫做虚拟内存,是在内存不够使用的时候,拿硬盘的一块区域充当内存的地方。
生产中,为了提高服务器性能,让swap分区当内存时候运行更快,需要将swap放到磁盘的外圈,或者让swap分区更大,需要加大swap……这里介绍一下新加硬盘,在上面设置swap分区,实现分区迁移。
一、迁移方法
我们的需求和实际环境不一样,所用的方法也不一样。总共swap添加也就
两种方法:
1、使用文件创建swap分区。
如果没有硬盘,或者没有额外的磁盘分区,我们也想要增大swap分区,那么就要使用到文件,将文件格式化为swap分区,最后加入到系统中
2、在硬盘上 创建分区,然后在上面格式化为swap分区,将其加入到系统中。
生产中,最好不要在文件上创建文件系统,因为此方法创建的swap文件系统,是依靠在已经存在的文件系统比如ext4,xfs,这样就经历了从 磁盘》分区》ext文件系统》swap文件系统,中间多了一个环节,当然性能将大大降低。
最好的是使用固态硬盘,不分区直接在上面进行创建swap文件系统,这样就更少了一个中间环节(磁盘》分区》文件系统),少了分区环节,这样讲更有效率。
不过没有最好,只有更好,如果有钱,可以直接加大内存,岂不是更好_
二、加入分区
本处的实验环境是CentOS7,在虚拟机中进行。
硬盘分区方式
加入硬盘,此处添加一个2G的硬盘如下图:
可是怎么让系统识别新加入的磁盘呢,重启可以尝试,但是在实际生产中能重启吗,重启一下可就是钱啊。。。
那肯定有办法了
[root@CentOS7 ~]# echo "- - -" > /sys/class/scsi_host/host2/scan
#如果不行把host2改成host0或者是host1
此处我新加的硬盘变为sdc而不是sdb,是因为我本来有一块硬盘,我把他去掉了,换掉了一块2G的磁盘,然后这里就没了sdb,而成了sdc。
文件分区方式
创建文件系统的方式,只需要使用dd命令,在某个目录下生成一个文件
dd if=/dev/zero of=/swapfile bs=1024 count=1M
#该命令将创建一个大小为1GB,文件名为swapfile的Swap空间文件;
#if=/dev/zero 代表从zero这个设备生成以0组成的文件
#of=/swapfile参数指定了文件的创建位置和文件名;
#count=1M指定了文件的大小。
后面的命令和使用硬盘分区当做swap,类似,只不过将分区名改为文件名即可,这里以硬盘分区来进行继续实验
创建分区
[root@CentOS7 ~]# fdisk /dev/sdc #fdisk 设备名
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 0xd5495c65.
Command (m for help): m #m选项可以查看帮助
Command (m for help): n #n选项创建分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p #p为创建一个主分区
Partition number (1-4, default 1): 1 #分区编号,可以设1-4直接任意数字
First sector (2048-4194303, default 2048): #因为是虚拟机,不知道为什么扇区数不是从1开始的
#直接回车就是默认数字
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-4194303, default 4194303):
Using default value 4194303
Partition 1 of type Linux and of size 2 GiB is set
Command (m for help): w
#最后写入修改,如果没有w,则分区数据是在内存中的,而没有写入到磁盘中
最后发现创建分区成功,如下图:
三、创建交换分区
创建swap文件系统
分区创建好之后,接下来就是格式化了,格式化可以设置文件系统类型等一些文件系统属性。
正常情况下,创建文件系统,可以使用fdisk 里面的t选项,可是我在这里发现,不需要在fdisk 里面指定分区id。任意格式即可。因为下面的命令并不关心原来的分区格式
[root@CentOS7 ~]# mkswap /dev/sdc1 -L sdc1-swap #-L选项指定设备标签
[root@CentOS7 ~]#blkid 显示设备分区情况
四、加入/etc/fstab启动文件
创建了swap分区之后就是挂载了,挂载要涉及到/etc/fstab文件,下面就修改/etc/fstab文件以挂载swap分区
#
# /etc/fstab
# Created by anaconda on Wed May 17 14:51:00 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=1486344f-499d-4423-9a88-00c2bec6dc94 / xfs defaults 0 0
UUID=e28148e7-17f5-4144-ba86-6b3852cce0d2 /app xfs defaults 0 0
UUID=6f590141-f3bb-4cb9-8265-36d23a373415 /boot xfs defaults 0 0
UUID=ef4b86a3-5732-4283-9635-0e69bc137773 swap swap defaults 0 0
UUID=e1fd56d3-7f6f-455d-b20c-0f3df04eee06 swap swap defaults 0 0
#最下面根据分区的UUID号,加入这个分区的挂载选项(这个id号要和上上面图片的UUID号一致)
#这里可以用UUID,或者设备标签,或者设备名称,但是不建议使用设备名称,因为设备名称是不稳定的(有时候添加硬盘,名字会发生改变)
#defaults:默认挂载参数。rw, nosuid, dev, exec, auto, nouser, async
#第一个0代表转储频率:0:不做备份 1:每天转储 2:每隔一天转储
#第二个0代表是否自检,不自检 1:首先自检;一般只有rootfs才用1
五、激活交换空间
接着就是激活交换分区swap了
使用swapon命令。很容易理解是swap on的连写。
[root@CentOS7 ~]# swapon /dev/sdc1 #指定设备名来激活是swap的设备
或者是
[root@CentOS7 ~]# swapon -a#根据/etc/fstab文件,来激活fstab文件中所以可激活的swap分区
六、移除原来的交换空间
可以选择是否移除原来的交换空间,如果移除,则实现了swap分区迁移的目的。
要是不移除,因为有多个swap分区,操作系统怎么知道先使用哪个来作为交换分区呢,那就是优先级的问题了,可以使用swapon -p来指定优先级。数越大,代表优先级越高。
此时查看一下swap情况:
[root@CentOS7 ~]# swapon
NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 0B -1
/dev/sdc1 partition 2G 0B -2 #sdc1优先级低,因为是后加入的。
下面我来禁用/dev/sda5
[root@CentOS7 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 97.7G 0 part /
├─sda3 8:3 0 48.8G 0 part /app
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 2G 0 part [SWAP] #注意这里的[swap]
sdc 8:32 0 2G 0 disk
└─sdc1 8:33 0 2G 0 part [SWAP]
sr0 11:0 1 7.7G 0 rom
[root@CentOS7 ~]# swapoff /dev/sda5
[root@CentOS7 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 97.7G 0 part /
├─sda3 8:3 0 48.8G 0 part /app
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 2G 0 part #发现已经没有swap了
sdc 8:32 0 2G 0 disk
└─sdc1 8:33 0 2G 0 part [SWAP]
sr0 11:0 1 7.7G 0 rom
这时已经禁用了/dev/sda5这个交换分区.
如果我sda5这个swap并不想禁用,我们来看一下启用的结果
[root@CentOS7 ~]# swapon /dev/sda5
[root@CentOS7 ~]# swapon
NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 0B -2
/dev/sdc1 partition 2G 0B -1 #sdc1优先级高,因为是后加入的
因此我们可以禁用启用来进行设置swap优先级。
也可以在/etc/fstab中设置优先级,如下:
这时我们进行mount是不行的,因为他们已经被挂载。所以要先禁用再启用,则可更改优先级。
[root@CentOS7 ~]# swapoff /dev/sdc1
[root@CentOS7 ~]# swapon -a
[root@CentOS7 ~]# swapon
NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 0B -1
/dev/sdc1 partition 2G 0B 10
发现已经成功更改了优先级。
六、测试
可以使用dd if=/dev/zero /dev/null bs=1G来测试,如果你的内存较大或者较小可以更改bs的值。(不要写的太大,可能会让你内存崩溃的,可以慢慢往上加)我指定1G,因为内存是1G的,就用了好多69M,如下:
在停止dd命令后,依然有占用,是因为内存是由缓存的,本来是0,现在是69.5M。发现上面的sd5并没有被使用,因为它的优先级不高,当sdc1不够使用时候,才使用它来当内存。
到此,测试结束,有错误,欢迎指正_