7.5 内存交换空间(swap)之创建

以前的年代因为内存不足,因此那个可以暂时将内存的程序拿到硬盘中暂放的内存交换空间 (swap) 就显的非常的重要! 否则,如果突然间某支程序用掉你大部分的内存,那你的系统恐怕有损毁的情况发生喔!所以,早期在安装 Linux 之前,大家常常会告诉你: 安装时一定需要的两个 partition ,一个是根目录,另外一个就是 swap(内存交换空间)。关于内存交换空间的解释在第三章安装 Linux 内的磁盘分区时有约略提过,请你自行回头瞧瞧吧!

一般来说,如果硬件的配备资源足够的话,那么 swap 应该不会被我们的系统所使用到, swap 会被利用到的时刻通常就是实体内存不足的情况了。从第零章的计算机概论当中,我们知道 CPU 所读取的数据都来自于内存, 那当内存不足的时候,为了让后续的程序可以顺利的运行,因此在内存中暂不使用的程序与数据就会被挪到 swap 中了。 此时内存就会空出来给需要执行的程序载入。由于 swap 是用磁盘来暂时放置内存中的信息,所以用到 swap 时,你的主机磁盘灯就会开始闪个不停啊!

虽然目前(2015)主机的内存都很大,至少都有 4GB 以上啰!因此在个人使用上,你不要设置 swap 在你的 Linux 应该也没有什么太大的问题。 不过服务器可就不这么想了~由于你不会知道何时会有大量来自网络的要求,因此最好还是能够预留一些 swap 来缓冲一下系统的内存用量! 至少达到“备而不用”的地步啊!

现在想像一个情况,你已经将系统创建起来了,此时却才发现你没有创建 swap ~那该如何是好呢? 通过本章上面谈到的方法,你可以使用如下的方式来创建你的 swap 啰!

  • 设置一个 swap partition
  • 创建一个虚拟内存的文件

不啰唆,就立刻来处理处理吧!

7.5.1 使用实体分区创建swap

创建 swap 分区的方式也是非常的简单的!通过下面几个步骤就搞定啰:

  1. 分区:先使用 gdisk 在你的磁盘中分区出一个分区给系统作为 swap 。由于 Linux 的 gdisk 默认会将分区的 ID 设置为 Linux 的文件系统,所以你可能还得要设置一下 system ID 就是了。
  2. 格式化:利用创建 swap 格式的“mkswap 设备文件名”就能够格式化该分区成为 swap 格式啰
  3. 使用:最后将该 swap 设备启动,方法为:“swapon 设备文件名”。
  4. 观察:最终通过 free 与 swapon -s 这个指令来观察一下内存的用量吧!

不啰唆,立刻来实作看看!既然我们还有多余的磁盘容量可以分区,那么让我们继续分区出 512MB 的磁盘分区吧! 然后将这个磁盘分区做成 swap 吧!

  • 1. 先进行分区的行为啰!
[root@study ~]# gdisk /dev/vda
Command (? for help): n
Partition number (6-128, default 6):
First sector (34-83886046, default = 69220352) or {+-}size{KMGTP}:
Last sector (69220352-83886046, default = 83886046) or {+-}size{KMGTP}: +512M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8200
Changed type of partition to 'Linux swap'

Command (? for help): p
Number  Start (sector)    End (sector)  Size       Code  Name
   6        69220352        70268927   512.0 MiB   8200  Linux swap  # 重点就是产生这东西!

Command (? for help): w

Do you want to proceed? (Y/N): y

[root@study ~]# partprobe
[root@study ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda             252:0    0   40G  0 disk
.....(中间省略).....
`-vda6          252:6    0  512M  0 part   # 确定这里是存在的才行!
# 鸟哥有简化输出喔!结果可以看到我们多了一个 /dev/vda6 可以使用于 swap 喔!
  • 2. 开始创建 swap 格式
[root@study ~]# mkswap /dev/vda6
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=6b17e4ab-9bf9-43d6-88a0-73ab47855f9d
[root@study ~]# blkid /dev/vda6
/dev/vda6: UUID="6b17e4ab-9bf9-43d6-88a0-73ab47855f9d" TYPE="swap"
# 确定格式化成功!且使用 blkid 确实可以抓到这个设备了喔!
  • 3. 开始观察与载入看看吧!
[root@study ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1275140      227244      330124        7804      717772      875536  # 实体内存
Swap:       1048572      101340      947232                                      # swap 相关
# 我有 1275140K 的实体内存,使用 227244K 剩余 330124K ,使用掉的内存有
# 717772K 用在缓冲/高速缓存的用途中。至于 swap 已经有 1048572K 啰!这样会看了吧?!

[root@study ~]# swapon /dev/vda6
[root@study ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1275140      227940      329256        7804      717944      874752
Swap:       1572856      101260     1471596   <==有看到增加了没?

[root@study ~]# swapon -s
Filename                 Type            Size    Used    Priority
/dev/dm-1                partition       1048572 101260  -1
/dev/vda6                partition       524284  0       -2
# 上面列出目前使用的 swap 设备有哪些的意思!

[root@study ~]# nano /etc/fstab
UUID="6b17e4ab-9bf9-43d6-88a0-73ab47855f9d"  swap  swap  defaults  0  0
# 当然要写入配置文件,只不过不是文件系统,所以没有挂载点!第二个字段写入 swap 即可。

7.5.2 使用文件创建swap

如果是在实体分区无法支持的环境下,此时前一小节提到的 loop 设备创建方法就派的上用场啦! 与实体分区不一样的,这个方法只是利用 dd 去创建一个大文件而已。多说无益,我们就再通过文件创建的方法创建一个 128 MB 的内存交换空间吧!

  • 1. 使用 dd 这个指令来新增一个 128MB 的文件在 /tmp 下面:
[root@study ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128
128+0 records in
128+0 records out
134217728 Bytes (134 MB) copied, 1.7066 seconds, 78.6 MB/s

[root@study ~]# ll -h /tmp/swap
-rw-r--r--. 1 root root 128M Jun 26 17:47 /tmp/swap

这样一个 128MB 的文件就创建妥当。若忘记上述的各项参数的意义,请回前一小节查阅一下啰!

  • 2. 使用 mkswap 将 /tmp/swap 这个文件格式化为 swap 的文件格式:
[root@study ~]# mkswap /tmp/swap
Setting up swapspace version 1, size = 131068 KiB
no label, UUID=4746c8ce-3f73-4f83-b883-33b12fa7337c
# 这个指令下达时请“特别小心”,因为下错字符控制,将可能使您的文件系统挂掉!
  • 3. 使用 swapon 来将 /tmp/swap 启动啰!
[root@study ~]# swapon /tmp/swap
[root@study ~]# swapon -s
Filename            Type            Size    Used    Priority
/dev/dm-1           partition       1048572 100380  -1
/dev/vda6           partition       524284  0       -2
/tmp/swap           file            131068  0       -3
  • 4. 使用 swapoff 关掉 swap file,并设置自动启用
[root@study ~]# nano /etc/fstab
/tmp/swap  swap  swap  defaults  0  0
# 为何这里不要使用 UUID 呢?这是因为系统仅会查询区块设备 (block device) 不会查询文件!
# 所以,这里千万不要使用 UUID,不然系统会查不到喔!

[root@study ~]# swapoff /tmp/swap /dev/vda6
[root@study ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       1048572 100380  -1
# 确定已经回复到原本的状态了!然后准备来测试!!

[root@study ~]# swapon -a
[root@study ~]# swapon -s
# 最终你又会看正确的三个 swap 出现啰!这也才确定你的 /etc/fstab 设置无误!

说实话,swap 在目前的桌面电脑来讲,存在的意义已经不大了!这是因为目前的 x86 主机所含的内存实在都太大了 (一般入门级至少也都有 4GB 了),所以,我们的 Linux 系统大概都用不到 swap 这个玩意儿的。不过, 如果是针对服务器或者是工作站这些常年上线的系统来说的话,那么,无论如何,swap 还是需要创建的。

因为 swap 主要的功能是当实体内存不够时,则某些在内存当中所占的程序会暂时被移动到 swap 当中,让实体内存可以被需要的程序来使用。另外,如果你的主机支持电源管理模式, 也就是说,你的 Linux 主机系统可以进入“休眠”模式的话,那么, 运行当中的程序状态则会被纪录到 swap 去,以作为“唤醒”主机的状态依据! 另外,有某些程序在运行时,本来就会利用 swap 的特性来存放一些数据段, 所以, swap 来是需要创建的!只是不需要太大!