Linux 配置与管理 SWAP(虚拟内存)
- 一、作用
- 二、创建交换文件(以创建一个2GB的交换文件为例)
- 1. 创建交换文件
- 2. 设置文件权限
- 2.1. **关于 `sudo chmod 600 /root/swapfile` 是否一定要执行**
- 2.2. **关于其他用户启动是否没权限用到交换分区**
- 3. 将文件格式化为交换文件
- 4. 启用交换文件
- 5. (可选)设置开机自动挂载
- 6. 验证交换区
- 三、创建交换分区(假设已经有一个未分区的磁盘空间,例如`/dev/sdb1`)
- 1. 格式化分区为交换分区
- 2. 启用交换分区
- 3. (可选)设置开机自动挂载
- 四、交换文件和交换分区的作用
- (一)共同作用
- (二)交换文件的特殊作用
- (三)交换分区的特殊作用
- 五、交换文件和交换分区的区别
- (一)存储形式
- (二)创建和管理方式
- (三)空间管理
- 六、删除交换文件的步骤:
- (一)、关闭交换文件
- (二)、删除交换文件
- (三)、(可选)从`/etc/fstab`中移除相关条目
- 七、交换文件可以清空,但需要遵循一定的步骤:
- (一)、关闭交换文件
- (二)、清空交换文件内容
- (三)、重新启用交换文件(可选)
- 八、 **是否设置swap**
以下以Linux系统为例说明配置swap(交换空间)的步骤、命令及作用:
一、作用
- 缓解内存不足
- 当系统的物理内存(RAM)不够用的时候,将一些不常用的内存数据临时存放到swap空间,从而为当前运行的程序腾出物理内存。例如,当同时运行多个大型应用程序,如数据库服务器、图形处理软件等,物理内存可能会被耗尽,swap空间就可以作为一种补充。
- 休眠功能支持
- 在支持休眠功能的系统中,系统会将当前的内存状态保存到swap分区,以便在唤醒时能够快速恢复到之前的状态。
二、创建交换文件(以创建一个2GB的交换文件为例)
1. 创建交换文件
- 使用
dd
命令创建一个指定大小的文件。例如:
sudo dd if=/dev/zero of=/root/swapfile bs=1M count=16384
- 这里的
if=/dev/zero
表示输入文件为/dev/zero
(一个特殊的设备文件,用于提供无限的空字符流),of=/root/swapfile
表示输出文件为/swapfile
(即将创建的交换文件),bs = 1M
表示块大小为1兆字节,count = 2048
表示总共创建16384个块,这样就创建了一个16GB(1M * 16384)的文件。
2. 设置文件权限
- 交换文件需要设置合适的权限,一般设置为只有根用户(root)可读写:
sudo chmod 600 /root/swapfile
- 数字
600
表示文件所有者(root)具有读写权限(6
:读权限4
+ 写权限2
),而所属组和其他用户没有任何权限(0
)。
2.1. 关于 sudo chmod 600 /root/swapfile
是否一定要执行
- 从安全性角度
- 在创建交换文件(
/swapfile
)时,执行sudo chmod 600 /swapfile
是一个良好的安全实践,但不是绝对必须执行的操作。这个命令将交换文件的权限设置为只有文件所有者(通常是root
)具有读写权限,其他用户没有任何权限。这样做可以防止普通用户对交换文件进行意外的修改或者读取其中可能包含的敏感信息(虽然交换文件中的数据是内存数据交换过来的,但仍然可能包含一些未加密的机密信息)。
- 在创建交换文件(
- 从系统功能角度
- 如果不执行这个命令,系统仍然可以使用交换文件来进行内存交换操作。交换文件的主要功能是作为虚拟内存的一部分,由操作系统内核来管理内存数据的交换,内核具有足够的权限来操作交换文件,与交换文件的用户权限设置关系不大。
2.2. 关于其他用户启动是否没权限用到交换分区
- 实际情况
- 其他用户不需要直接对交换文件(
/swapfile
)有特定的权限来使用交换分区。交换分区(或交换文件)的使用是由操作系统内核统一管理的。当系统内存不足时,内核会将内存中的数据交换到交换文件中,这个过程是内核级别的操作,与普通用户对交换文件的权限无关。普通用户在运行程序时,不需要关心交换文件的权限,他们只需要操作系统能够正常管理内存,包括在需要时使用交换文件来扩展虚拟内存。
- 其他用户不需要直接对交换文件(
- 举例说明
- 假设在一个多用户的Linux系统中,有用户
user1
和user2
,如果交换文件/swapfile
的权限被设置为600
,当user1
和user2
运行各自的程序时,如user1
运行一个占用大量内存的文本编辑程序,user2
运行一个数据库客户端程序。如果系统内存不足,内核会自动将这两个用户程序中暂时不使用的内存数据交换到/swapfile
中,即使这两个用户对/swapfile
没有直接的读写权限。
- 假设在一个多用户的Linux系统中,有用户
3. 将文件格式化为交换文件
- 使用
mkswap
命令将文件格式化为交换文件格式:
sudo mkswap /root/swapfile
- 这个命令会在
/root/swapfile
上创建交换文件系统。
4. 启用交换文件
- 使用
swapon
命令启用交换文件:
sudo swapon /root/swapfile
- 执行这个命令后,系统就开始使用
/root/swapfile
作为交换空间了。
5. (可选)设置开机自动挂载
- 编辑
/etc/fstab
文件,添加以下一行:
echo "/root/swapfile swap swap defaults 0 0" >> /etc/fstab
- 这样在系统启动时就会自动挂载交换文件。
6. 验证交换区
free -g
三、创建交换分区(假设已经有一个未分区的磁盘空间,例如/dev/sdb1
)
1. 格式化分区为交换分区
- 使用
mkswap
命令:
sudo mkswap /dev/sdb1
- 这会将
/dev/sdb1
格式化为交换分区。
2. 启用交换分区
- 使用
swapon
命令:
sudo swapon /dev/sdb1
3. (可选)设置开机自动挂载
- 编辑
/etc/fstab
文件,添加以下一行:
/dev/sdb1 none swap sw 0 0
四、交换文件和交换分区的作用
(一)共同作用
- 内存扩展
- 当系统物理内存(RAM)资源紧张时,交换文件和交换分区都能提供额外的“虚拟内存”空间。例如,在一个同时运行多个应用程序(如浏览器打开多个标签页、办公软件、多媒体播放器等)的Linux系统中,如果物理内存即将耗尽,系统会将一些暂时不使用的内存数据转移到交换空间(无论是交换文件还是交换分区),从而为正在运行的关键程序腾出物理内存,保证系统不会因为内存不足而崩溃。
- 支持系统休眠功能
- 在支持休眠功能的操作系统中,交换文件或交换分区用于保存系统休眠前的内存状态。当系统从休眠状态恢复时,可以从交换空间中读取之前保存的内存数据,快速恢复到休眠前的运行状态。
(二)交换文件的特殊作用
- 灵活性
- 交换文件可以方便地创建、调整大小或删除,不需要对磁盘进行重新分区操作。例如,在一个已经安装好操作系统并且磁盘分区布局固定的服务器上,如果发现需要增加交换空间,可以直接创建一个交换文件,而不用担心破坏现有的分区结构。这对于磁盘空间管理和系统配置的动态调整非常有用。
(三)交换分区的特殊作用
- 性能优势(在某些情况下)
- 交换分区在一些情况下可能具有更好的性能。因为它是一个独立的磁盘分区,磁盘I/O操作可能会更高效。例如,在一些对磁盘I/O性能要求较高的服务器环境中,如果交换空间的使用较为频繁,使用专门的交换分区可能会减少磁盘寻道时间等开销,相比于交换文件可能会有一定的性能提升。
- 传统兼容性
- 在一些较老的操作系统或者特定的系统安装和配置场景下,交换分区是一种传统的、被广泛支持的交换空间设置方式。例如,在一些嵌入式Linux系统或者基于传统BIOS的系统安装中,交换分区可能是默认或者更受推荐的交换空间设置方式。
五、交换文件和交换分区的区别
(一)存储形式
- 交换文件
- 交换文件是一个普通的文件,存储在现有的文件系统中。例如,在Linux系统中,可以创建在
ext4
、xfs
等文件系统的目录下。它的大小可以像普通文件一样进行灵活调整,只要所在的文件系统有足够的可用空间。
- 交换文件是一个普通的文件,存储在现有的文件系统中。例如,在Linux系统中,可以创建在
- 交换分区
- 交换分区是磁盘上一个独立的分区,在磁盘分区表中有专门的记录。它具有自己独立的分区格式(专门用于交换空间的格式),与文件系统分区(如
ext4
用于存储普通文件和目录的分区)是分开的。
- 交换分区是磁盘上一个独立的分区,在磁盘分区表中有专门的记录。它具有自己独立的分区格式(专门用于交换空间的格式),与文件系统分区(如
(二)创建和管理方式
- 交换文件
- 创建交换文件相对简单,只需要使用命令(如
dd
命令创建指定大小的文件,mkswap
命令格式化文件为交换文件格式,swapon
命令启用交换文件),不需要对磁盘进行重新分区操作。调整大小也可以通过一些文件操作命令来实现(虽然可能需要一些额外的步骤,如先禁用交换文件,调整大小后再重新启用)。
- 创建交换文件相对简单,只需要使用命令(如
- 交换分区
- 创建交换分区需要对磁盘进行分区操作,这通常需要使用磁盘分区工具(如
fdisk
、parted
等)。在分区创建后,再使用mkswap
命令格式化分区为交换分区格式,最后用swapon
命令启用。调整交换分区的大小相对复杂,可能需要重新分区、移动数据等操作,并且有一定的风险,如果操作不当可能会导致数据丢失。
- 创建交换分区需要对磁盘进行分区操作,这通常需要使用磁盘分区工具(如
(三)空间管理
- 交换文件
- 交换文件的空间管理依赖于所在的文件系统。如果所在文件系统的可用空间不足,可能无法创建足够大的交换文件或者无法调整交换文件的大小。例如,如果
/
分区(假设交换文件创建在/
分区下)只剩下1GB的可用空间,就无法创建一个2GB的交换文件。
- 交换文件的空间管理依赖于所在的文件系统。如果所在文件系统的可用空间不足,可能无法创建足够大的交换文件或者无法调整交换文件的大小。例如,如果
- 交换分区
- 交换分区有自己独立的空间,不受其他文件系统分区的影响。只要磁盘有未分配的空间,就可以创建合适大小的交换分区,并且在创建后其空间是固定的(除非重新分区调整),不会受到其他分区文件操作的影响。
六、删除交换文件的步骤:
(一)、关闭交换文件
- 查看正在使用的交换文件或分区
- 在Linux系统中,可以使用
swapon -s
命令查看当前正在使用的交换空间(包括交换文件和交换分区)。例如:
swapon -s
- 该命令会输出类似如下的结果:
Filename Type Size Used Priority /swapfile file 2097148 0 -1
- 这里显示了交换文件
/swapfile
的相关信息,如类型为file
,大小为2097148(以KB为单位,这里是2GB)等。
- 在Linux系统中,可以使用
- 关闭交换文件
- 如果要删除交换文件,首先需要使用
swapoff
命令关闭它。假设交换文件是/swapfile
,执行以下命令:
sudo swapoff /swapfile
- 如果要删除交换文件,首先需要使用
(二)、删除交换文件
- 删除文件本身
- 在关闭交换文件后,可以使用
rm
命令删除交换文件。例如:
sudo rm /swapfile
- 这样就删除了交换文件。
- 在关闭交换文件后,可以使用
(三)、(可选)从/etc/fstab
中移除相关条目
- 编辑
/etc/fstab
文件- 如果之前在
/etc/fstab
文件中添加了自动挂载交换文件的条目(例如/swapfile none swap sw 0 0
),需要编辑/etc/fstab
文件并删除该条目。可以使用文本编辑器(如vi
或nano
)来编辑。例如,使用nano
编辑:
sudo nano /etc/fstab
- 在文件中找到并删除关于交换文件的那一行,然后保存并退出(在
nano
中按Ctrl + O
保存,按Ctrl+X
退出)。
- 如果之前在
七、交换文件可以清空,但需要遵循一定的步骤:
(一)、关闭交换文件
- 查看交换文件使用情况
- 在Linux系统中,可以使用
swapon -s
命令查看当前正在使用的交换空间(包括交换文件)。例如:
swapon -s
- 这会显示类似如下的结果(如果存在交换文件的话):
Filename Type Size Used Priority /swapfile file 2097148 102400 -1
- 这里展示了交换文件的名称(
/swapfile
)、类型(file
)、大小(以KB为单位,这里是2GB)、已使用的空间(102400KB)等信息。
- 在Linux系统中,可以使用
- 关闭交换文件
- 使用
swapoff
命令关闭交换文件。假设交换文件为/swapfile
,执行以下命令:
sudo swapoff /swapfile
- 使用
(二)、清空交换文件内容
- 覆盖交换文件内容
- 一种方法是使用
dd
命令将交换文件内容覆盖为零。例如:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
- 这里的
if=/dev/zero
表示输入为全零的设备文件,of=/swapfile
表示输出到交换文件,bs = 1M
是块大小为1兆字节,count = 2048
表示总共2048个块(假设交换文件大小为2GB)。这样就将交换文件的内容清空了。
- 一种方法是使用
(三)、重新启用交换文件(可选)
- 重新格式化交换文件(如果需要)
- 在某些情况下,可能需要重新格式化交换文件。可以使用
mkswap
命令:
sudo mkswap /swapfile
- 在某些情况下,可能需要重新格式化交换文件。可以使用
- 重新启用交换文件
- 使用
swapon
命令重新启用交换文件:
sudo swapon /swapfile
- 使用
需要注意的是,在清空交换文件之前,确保系统有足够的物理内存来处理正在运行的程序,因为清空交换文件可能会导致系统在重新启用交换文件之前,可利用的虚拟内存减少。
八、 是否设置swap
-
需要设置swap的情况
- 内存有限的系统
- 对于物理内存较小的系统,如早期的嵌入式设备或者一些配置较低的服务器(例如只有1 - 2GB物理内存),设置swap是很有必要的。例如,在运行一些基本的服务器应用程序(如轻量级的Web服务器、DNS服务器等)时,可能会偶尔遇到内存压力,swap可以提供额外的虚拟内存来防止系统因内存不足而崩溃。
- 运行多种应用的系统
- 如果系统需要同时运行多种不同类型的应用程序,尤其是当这些应用程序的内存使用模式难以精确预测时。例如,在一个同时运行办公软件、数据库客户端和一些后台监控程序的桌面系统中,不同应用程序的内存需求可能会在不同时间达到峰值。swap可以在物理内存紧张时作为缓冲,确保系统的稳定运行。
- 支持休眠功能的系统
- 对于需要支持休眠功能的桌面系统或笔记本电脑,swap分区是必需的。在系统休眠时,内存中的数据会被保存到swap分区中,当系统唤醒时再从swap分区恢复到内存。例如,在Windows系统中,休眠功能依赖于类似swap分区(页面文件)的机制,在Linux系统中同样需要swap分区来实现休眠功能。
- 内存有限的系统
- 可以不设置swap的情况
- 内存充足且可预测的系统
- 在拥有大容量物理内存(如数十GB甚至数百GB)并且应用程序的内存使用模式非常稳定、可预测的系统中,可以考虑不设置swap。例如,在一些专门用于内存数据库(如Redis集群,并且为其分配了足够的物理内存)的服务器中,由于Redis会尽量使用内存来提高性能,并且内存分配是可精确控制的,如果系统有足够的冗余内存,不设置swap可以避免因磁盘I/O带来的性能损失。
- 对性能要求极高的内存密集型系统
- 对于一些对性能要求极高的内存密集型应用场景,如高性能计算(HPC)集群中的计算节点,这些节点主要用于运行大规模的数值模拟、基因测序等计算任务,需要尽可能减少磁盘I/O对计算性能的影响。如果系统已经配备了足够的物理内存来满足任务需求,不设置swap可以提高系统的整体性能。
- 内存充足且可预测的系统
- 设置swap大小及配置规则
- 根据物理内存大小确定
- 小容量物理内存(1 - 4GB)
- 如果物理内存较小,如1 - 4GB,可以按照传统的1.5 - 2倍物理内存来设置swap大小。例如,对于2GB物理内存的系统,可以设置3 - 4GB的swap。这样可以在内存不足时提供相对充足的虚拟内存支持,确保系统能够正常运行一些基本的应用程序。
- 中等容量物理内存(4 - 16GB)
- 对于4 - 16GB物理内存的系统,可以设置1 - 1.5倍物理内存大小的swap。例如,对于8GB物理内存的系统,可以设置8 - 12GB的swap。在这种情况下,系统有一定的物理内存基础,不需要过大的swap来补充,但仍然需要一定的虚拟内存来应对偶尔的内存压力。
- 大容量物理内存(16GB以上)
- 当物理内存达到16GB或更多时,可以根据系统的具体需求灵活设置swap大小。如果系统运行的应用程序内存使用相对稳定,可能只需要设置较小的swap,如4 - 8GB,甚至可以更小。但如果系统运行多种复杂的应用程序或者需要支持休眠功能等,可能需要设置相对较大的swap,如8 - 16GB。
- 小容量物理内存(1 - 4GB)
- 根据应用程序需求确定
- 内存需求波动大的应用
- 如果系统运行的应用程序内存需求波动较大,如视频编辑软件(在导入、编辑和渲染不同阶段内存需求差异很大)或者一些企业级的ERP系统(在不同业务流程操作时内存需求变化明显),需要设置相对较大的swap。例如,对于运行视频编辑软件的系统,即使有8GB物理内存,可能也需要设置8 - 12GB的swap来应对渲染等内存需求高峰阶段。
- 内存需求稳定的应用
- 对于内存需求非常稳定的应用程序,如一些简单的网络监控工具或者静态Web服务器,在有足够物理内存的情况下,可以设置较小的swap。例如,对于运行简单网络监控工具的系统,即使有4GB物理内存,可能只需要设置1 - 2GB的swap。
- 内存需求波动大的应用
- 根据物理内存大小确定
是否设置swap以及设置多大的swap需要综合考虑系统的物理内存大小、应用程序的内存使用特性、系统功能需求(如休眠)等多方面因素。