💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 7.5 内存交换空间(swap)之创建 以前的年代因为内存不足,因此那个可以暂时将内存的程序拿到硬盘中暂放的内存交换空间 (swap) 就显的非常的重要! 否则,如果突然间某支程序用掉你大部分的内存,那你的系统恐怕有损毁的情况发生喔!所以,早期在安装 Linux 之前,大家常常会告诉你: 安装时一定需要的两个 partition ,一个是根目录,另外一个就是 swap(内存交换空间)。关于内存交换空间的解释在[第三章安装 Linux 内的磁盘分区](../Text/index.html)时有约略提过,请你自行回头瞧瞧吧! 一般来说,如果硬件的配备资源足够的话,那么 swap 应该不会被我们的系统所使用到, swap 会被利用到的时刻通常就是实体内存不足的情况了。从[第零章的计算机概论](../Text/index.html)当中,我们知道 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 的文件就创建妥当。若忘记上述的各项参数的意义,请回[前一小节](../Text/index.html#dd)查阅一下啰! * 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 来是需要创建的!只是不需要太大!