Last Updated on

前言

Swap是linux的交换分区,即常说的虚拟内存,是通过在磁盘上划分一块区域,将其当作内存来使用,但是并没有正常内存那样的数据,而是限制于磁盘速度,在正常内存够用时,是不会使用的,当正常内存已经沾满,不够用时,系统就会使用虚拟内存,以缓解服务器压力,避免崩溃,增强稳定性。但是其速度有限,常只是作为突发情况的缓冲。

但是,很多时候我们安装系统的时候并没有考虑到,并不会划分swap分区,而当需要用到时,可以通过命令手动增加,删除,修改swap虚拟内存。下面就详细记录介绍一下如何操作虚拟内存。

正文

我们知道要新增swap虚拟内存,就需要在磁盘上划分一段空间,如果划分,有两种方式:

  • 磁盘上新增一个分区,用分区作为swap。
  • 磁盘上新增一个固定大小的文件,用于作为swap。

推荐: 使用分区方式,新增一个分区,然后挂载这个分区为swap虚拟内存。

使用分区的方式更好,但是会比较复杂一些,需要对linux系统更熟悉,当然也可以使用文件,比较方便简单,适用性强,下面两种方案都会详细说明。根据实际情况,选择其一即可。

说明一下,swap是可以叠加的,可以设置多个swap分区,其大小会叠加,总大小为swap的大小,也就是说使用分区新增的swap和使用文件新增的swap是可以叠加一起使用的。就是说有Aswap分区为1G,B swap分区为1G,那么总swap大小为2G。

所以若要增大减少swap的大小,可以直接对swap分区的大小做增大或减小。也可以再新增或删除swap,叠加的总大小就会相应的增大减小。

使用分区方式

使用分区作为swap的话,首先是需要创建分区,创建分区的话,根据linux磁盘管理方式不同又不同,常见的如果是基于lvm的磁盘管理,则非常方便的可以创建逻辑卷,然后挂载成swap即可。如果没有使用lvm磁盘管理,而是普通的挂载,那么就需要在磁盘中,分出一小快,创建物理卷,然后直接挂载成swap。

创建分区

根据是否使用lvm磁盘管理,创建分区方式不同:

使用lvm:

创建分区为逻辑分区,查看卷组中还剩余多少空间,然后创建一个逻辑卷并将其设为swap即可。不熟悉lvm的,请先看另一篇相关介绍了解lvm,才能明白:

《Centos7 lvm磁盘管理详解》

# 查看卷组,剩余空间, 大小为VSize,剩余空间为VFree
$ vgs
  VG     #PV #LV #SN Attr   VSize  VFree 
  centos   1   0   0 wz--n- 20.00g 20.00g


# 通过卷组,创建逻辑卷, -L指定大小,-n指定逻辑卷姓名,最后跟卷组名
$ lvcreate -L 10G -n centos-swap centos
Logical volume "centos-swap" created.

# 创建成功后,查看逻辑卷的信息
$ lvdisplay
--- Logical volume ---
  LV Path                /dev/centos/centos-swap
  LV Name                centos-swap
  VG Name                centos
  LV UUID                q28J4r-YpT6-BGRw-u66G-zdTr-NxqF-S9X9Ef
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2019-08-05 00:48:04 -0700
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0



# 创建完成后,将逻辑卷格式化为swap,使用LV Path。
$ mkswap /dev/centos/centos-swap
Setting up swapspace version 1, size = 10485756 KiB
no label, UUID=f01a8b5c-bb3f-4dc2-85d2-27fff1d00eb3

# 开启此swap
$ swapon /dev/centos/centos-swap

# 将此swap分区写入到/etc/fstab,开启启动
$ echo "/dev/centos/centos-swap  swap  swap  defaults  0  0" >> /etc/fstab

到此就完成了基于lvm磁盘管理的新增swap虚拟内存。

不使用lvm,直接使用物理分区

直接使用物理分区的话,需要看看你的磁盘是否还有剩余空间。使用fdisk命令查看磁盘情况,如果没有剩余空间则只能使用文件方式创建swap。如果有剩余空间,则创建一个物理分区,如下:

# 查看磁盘情况, 比如我这里,还有一个盘(/dev/sdb)有空间可以用。于是使用这个盘创建物理分区
# 我这是是在虚拟机上新增的磁盘方便给大家演示,正常生产环境中,一般很少会有剩余的磁盘空间。
# fdisk -l
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00040406

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448     4810751     2097152   82  Linux swap / Solaris
/dev/sda3         4810752    41943039    18566144   83  Linux

在/dev/sdb磁盘上创建物理分区

# 在/dev/sdb磁盘上创建物理分区
$ fdisk /dev/sdb
# 用fisk操作磁盘,n创建新分区
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p    # 选择p为创建主分区
Partition number (1-4, default 1): 
First sector (2048-41943039, default 2048):    # 这里直接回车默认
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): 20000000     # 根据你要设置的swap大小,设置你创建的分区大小
Partition 1 of type Linux and of size 9.5 GiB is set

# 命令p为输出分区情况
Command (m for help): p   

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xdb5c4c82

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20000000     9998976+  83  Linux

# w为保存操作
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

然后查看fdisk -l 就可以发现新创建的物理分区/dev/sdb1:

$ fdisk -l
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xdb5c4c82

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20000000     9998976+  83  Linux

现在将这个分区设为swap分区:

# 格式化分区为swap
$ mkswap /dev/sdb1
Setting up swapspace version 1, size = 9998972 KiB
no label, UUID=5efc72c8-595e-40aa-a53c-806a20b96da8

# 开启swap分区
$ swapon /dev/sdb1

# 将分区写入/etc/fstab
$ echo "/dev/sdb1  swap  swap  defaults  0  0" >> /etc/fstab

# 完成添加swap,查看
$ free

到此就完成了直接用物理分区新增为swap

删除swap

删除swap非常简单,根据你swap的实现方式,做反操作就行了。这里以/dev/sb1物理分区做演示,如果是逻辑分区,也一样,最后删除此逻辑分区即可。

# 关闭swap分区
$ swapoff /dev/sdb1

# 删除或注释掉/etc/fstab中的分区信息
$ vim /etc/fstab
---------------------------------------------------
# /dev/sdb1  swap  swap  defaults  0  0
---------------------------------------------------

# 删除此物理分区
$ fdisk /dev/sdb
# d命令删除主分区
Command (m for help): d
Selected partition 1
Partition 1 is deleted

# w命令保存操作
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

OK,到此就完全删除了swap分区了。so easy,有什么问题,欢迎留言交流。

使用文件方式

新增swap

# 使用dd命令创建名为swapfile的swap交换文件,文件路径为/var/swapfile,可以自定义
# bs=1024,则count的单位为kb,那么这是创建大小为2G的swap交换文件
$ dd if=/dev/zero of=/var/swapfile bs=1024 count=2097152

# 将交换文件格式化并转换为swap分区
$ mkswap /var/swapfile

# 挂载并激活分区
$ swapon /var/swapfile

# 修改 fstab 配置,设置开机自动挂载该分区
$ echo "/var/swapfile   swap  swap  defaults  0  0" >> /etc/fstab

ok,这样就增加完成了,用free 命令即可看到swap分区了。

删除swap

删除swap分区的话,反着来就行了

# 查看交换分区文件
$ cat /proc/swaps

# 关闭分区,将上面查出来的文件路径写上即可。
$ swapoff /var/swapfile

# 删除文件
$ rm -rf /var/swapfile

# 编辑fstab 文件,删除或注释掉我们之前在fstab文件里追加的开机自动挂载配置内容
$ vim /etc/fstab
-------------------------------------------------------------
#/var/swapfile   swap  swap  defaults  0  0
-------------------------------------------------------------

ok,这样就删除掉了swap,如果要修改的话,也可以先删除然后重新创建。

结束

OK,swap虚拟内存的操作就记录到这里

有任何问题,欢迎留言