# 内存交换空间(swap)之建置

早期年代因为内存不足,因此可以暂时将内存的程序拿到硬盘中暂放的内存置换空间(swap)就显得非常重要,所以之前老见到说安装 linux 一定需要两个 partition,一个是根目录,另一个就是 swap 了

一般来说,如果硬件资源配置足够的话,swap 应该不会被系统使用到。会被用到的时候,通常就是物理内存不足的情况了。在用到 swap 时,你的主机磁盘灯就会开始闪个不停

但是你不能预估不会存在物理内存不够用的情况,所以预留 swap 是有必要的,特别是在服务器上,不知道什么时候会有大量的网络请求。

假如现在有这样一种情况:系统已经建立起来了,但是却发现没有建立 swap,那么可以通过如下的方式来做

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

# 使用实体分区槽建立 swap

步骤如下

  1. 分区:使用 gdisk 在磁盘中分区出一个分区槽给系统作为 swap。
  2. 格式化:利用建立 swap 格式的 「mkswap 装置文件名」就能够格式化该分区槽成为 swap 格式
  3. 使用:最后将该 swap 装置启动,方法为「swapon 装置文件名」
  4. 观察:通过 free 与 swapon -s 指令来观察内存的用量

# 1. 分区

[root@study ~]# gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): n
Partition number (6-128, default 6): 
First sector (34-85491678, default = 69220352) or {+-}size{KMGTP}: 
Last sector (69220352-85491678, default = 85491678) or {+-}size{KMGTP}: +512M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8200

Command (? for help): p
Disk /dev/sda: 85491712 sectors, 40.8 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 67038DBF-B66A-4D0F-92B2-BFBF0744CD1D
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 85491678
Partitions will be aligned on 2048-sector boundaries
Total free space is 15224765 sectors (7.3 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02  
   2            6144         2103295   1024.0 MiB  0700  
   3         2103296        65026047   30.0 GiB    8E00  
   4        65026048        67123199   1024.0 MiB  8300  Linux filesystem
   5        67123200        69220351   1024.0 MiB  0700  Microsoft basic data
   6        69220352        70268927   512.0 MiB   8200  Linux swap

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

# 刷新分区
[root@study ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0 40.8G  0 disk 
├─sda1            8:1    0    2M  0 part 
├─sda2            8:2    0    1G  0 part /boot
├─sda3            8:3    0   30G  0 part 
│ ├─centos-root 253:0    0   10G  0 lvm  /
│ ├─centos-swap 253:1    0    1G  0 lvm  [SWAP]
│ └─centos-home 253:2    0    5G  0 lvm  /home
├─sda4            8:4    0    1G  0 part /data/xfs
├─sda5            8:5    0    1G  0 part 
└─sda6            8:6    0  512M  0 part   	# 出现了
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

# 2. 建立 swap 格式

[root@study ~]# mkswap /dev/sda6
正在设置交换空间版本 1,大小 = 524284 KiB
无标签,UUID=89727d5b-a222-4878-be50-19bbb61cabb0

# 确实可以抓到该装置了
[root@study ~]# blkid /dev/sda6
/dev/sda6: UUID="89727d5b-a222-4878-be50-19bbb61cabb0" TYPE="swap" PARTLABEL="Linux swap" PARTUUID="5fff6d01-b73a-45c2-be69-8fc4a67e0788" 
1
2
3
4
5
6
7

# 3. 开始观察看看

[root@study ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1190952      389504       83364       10916      718084      640164
Swap:       1048572           0     1048572
[root@study ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.1G        380M         81M         10M        701M        625M
Swap:          1.0G          0B        1.0G

# 列出目前使用的 swap 装置有哪些
[root@study ~]# swapon -s
文件名                          类型            大小    已用    权限
/dev/dm-1                               partition       1048572 0       -2

# 使用 swapon 指令挂载 swap 分区槽
[root@study ~]# swapon /dev/sda6
[root@study ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1190952      389848       82492       10916      718612      639820
Swap:       1572856           0     1572856
[root@study ~]# swapon -s
文件名                          类型            大小    已用    权限
/dev/dm-1                               partition       1048572 0       -2
/dev/sda6                               partition       524284  0       -3
# 可以看到这里 sda6 被用上了

# 建立永久挂载
nano /etc/fstab
# 这里是文件系统,所以没有挂载点,第二个字段写 swap
UUID="89727d5b-a222-4878-be50-19bbb61cabb0" swap swap defaults 0 0

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
26
27
28
29
30
31

# 使用文件建立 swap

如果是在四题分区槽无法支持的环境下,可以使用上一小节中提到的 loop 装置来建立

[root@study ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128
记录了128+0 的读入
记录了128+0 的写出
134217728字节(134 MB)已复制,0.0852543 秒,1.6 GB/秒
[root@study ~]# ll -h /tmp/swap 
-rw-r--r--. 1 root root 128M 1027 21:22 /tmp/swap

# 格式化的时候一定要特别注意,路径不要错,否则有可能搞垮你的文件系统
[root@study ~]# mkswap /tmp/swap 
正在设置交换空间版本 1,大小 = 131068 KiB
无标签,UUID=977e598a-ff20-4be9-bc28-7792c19bfe32

[root@study ~]# swapon /tmp/swap
swapon: /tmp/swap:不安全的权限 0644,建议使用 0600。
[root@study ~]# swapon -s
文件名                          类型            大小    已用    权限
/dev/dm-1                               partition       1048572 0       -2
/dev/sda6                               partition       524284  0       -3
/tmp/swap                               file    131068  0       -4

# 使用 swapoff 指令关掉刚才手动挂载的两个挂载点,并配置自动挂载
# 建立永久挂载
nano /etc/fstab
# 增加配置
/tmp/swap swap swap defaults 0 0

# 关闭手动挂载的挂载点
[root@study ~]# swapoff /dev/sda6 /tmp/swap
[root@study ~]# swapon -s
文件名                          类型            大小    已用    权限
/dev/dm-1                               partition       1048572 0       -2

# 手动挂载所有,再查看下,配置正确
[root@study ~]# swapon -a
swapon: /tmp/swap:不安全的权限 0644,建议使用 0600。
[root@study ~]# swapon -s
文件名                          类型            大小    已用    权限
/dev/dm-1                               partition       1048572 0       -2
/dev/sda6                               partition       524284  0       -3
/tmp/swap                               file    131068  0       -4


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

swap 主要功能是当物理内存不够时,则某些在内存中所占的程序会暂时被移动到 swap 中,让物理内存可以被需要的程序来使用。另外,如果主机支持电源管理模式,也就是说使用「休眠」功能的话,运行中的程序状态则会被记录到 swap 中去,以作为「唤醒」主机的状态依据。另外某些程序会利用 swap 的特性来存放一些数据,所以 swap 需要建立,只是不需要太大