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,才能明白:
# 查看卷组,剩余空间, 大小为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虚拟内存的操作就记录到这里
有任何问题,欢迎留言