Linux 配置与管理 SWAP(虚拟内存)


以下以Linux系统为例说明配置swap(交换空间)的步骤、命令及作用:

一、作用

  1. 缓解内存不足
    • 当系统的物理内存(RAM)不够用的时候,将一些不常用的内存数据临时存放到swap空间,从而为当前运行的程序腾出物理内存。例如,当同时运行多个大型应用程序,如数据库服务器、图形处理软件等,物理内存可能会被耗尽,swap空间就可以作为一种补充。
  2. 休眠功能支持
    • 在支持休眠功能的系统中,系统会将当前的内存状态保存到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系统中,有用户 user1user2,如果交换文件 /swapfile 的权限被设置为 600,当 user1user2 运行各自的程序时,如 user1 运行一个占用大量内存的文本编辑程序,user2 运行一个数据库客户端程序。如果系统内存不足,内核会自动将这两个用户程序中暂时不使用的内存数据交换到 /swapfile 中,即使这两个用户对 /swapfile 没有直接的读写权限。

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

四、交换文件和交换分区的作用

(一)共同作用

  1. 内存扩展
    • 当系统物理内存(RAM)资源紧张时,交换文件和交换分区都能提供额外的“虚拟内存”空间。例如,在一个同时运行多个应用程序(如浏览器打开多个标签页、办公软件、多媒体播放器等)的Linux系统中,如果物理内存即将耗尽,系统会将一些暂时不使用的内存数据转移到交换空间(无论是交换文件还是交换分区),从而为正在运行的关键程序腾出物理内存,保证系统不会因为内存不足而崩溃。
  2. 支持系统休眠功能
    • 在支持休眠功能的操作系统中,交换文件或交换分区用于保存系统休眠前的内存状态。当系统从休眠状态恢复时,可以从交换空间中读取之前保存的内存数据,快速恢复到休眠前的运行状态。

(二)交换文件的特殊作用

  1. 灵活性
    • 交换文件可以方便地创建、调整大小或删除,不需要对磁盘进行重新分区操作。例如,在一个已经安装好操作系统并且磁盘分区布局固定的服务器上,如果发现需要增加交换空间,可以直接创建一个交换文件,而不用担心破坏现有的分区结构。这对于磁盘空间管理和系统配置的动态调整非常有用。

(三)交换分区的特殊作用

  1. 性能优势(在某些情况下)
    • 交换分区在一些情况下可能具有更好的性能。因为它是一个独立的磁盘分区,磁盘I/O操作可能会更高效。例如,在一些对磁盘I/O性能要求较高的服务器环境中,如果交换空间的使用较为频繁,使用专门的交换分区可能会减少磁盘寻道时间等开销,相比于交换文件可能会有一定的性能提升。
  2. 传统兼容性
    • 在一些较老的操作系统或者特定的系统安装和配置场景下,交换分区是一种传统的、被广泛支持的交换空间设置方式。例如,在一些嵌入式Linux系统或者基于传统BIOS的系统安装中,交换分区可能是默认或者更受推荐的交换空间设置方式。

五、交换文件和交换分区的区别

(一)存储形式

  1. 交换文件
    • 交换文件是一个普通的文件,存储在现有的文件系统中。例如,在Linux系统中,可以创建在ext4xfs等文件系统的目录下。它的大小可以像普通文件一样进行灵活调整,只要所在的文件系统有足够的可用空间。
  2. 交换分区
    • 交换分区是磁盘上一个独立的分区,在磁盘分区表中有专门的记录。它具有自己独立的分区格式(专门用于交换空间的格式),与文件系统分区(如ext4用于存储普通文件和目录的分区)是分开的。

(二)创建和管理方式

  1. 交换文件
    • 创建交换文件相对简单,只需要使用命令(如dd命令创建指定大小的文件,mkswap命令格式化文件为交换文件格式,swapon命令启用交换文件),不需要对磁盘进行重新分区操作。调整大小也可以通过一些文件操作命令来实现(虽然可能需要一些额外的步骤,如先禁用交换文件,调整大小后再重新启用)。
  2. 交换分区
    • 创建交换分区需要对磁盘进行分区操作,这通常需要使用磁盘分区工具(如fdiskparted等)。在分区创建后,再使用mkswap命令格式化分区为交换分区格式,最后用swapon命令启用。调整交换分区的大小相对复杂,可能需要重新分区、移动数据等操作,并且有一定的风险,如果操作不当可能会导致数据丢失。

(三)空间管理

  1. 交换文件
    • 交换文件的空间管理依赖于所在的文件系统。如果所在文件系统的可用空间不足,可能无法创建足够大的交换文件或者无法调整交换文件的大小。例如,如果/分区(假设交换文件创建在/分区下)只剩下1GB的可用空间,就无法创建一个2GB的交换文件。
  2. 交换分区
    • 交换分区有自己独立的空间,不受其他文件系统分区的影响。只要磁盘有未分配的空间,就可以创建合适大小的交换分区,并且在创建后其空间是固定的(除非重新分区调整),不会受到其他分区文件操作的影响。

六、删除交换文件的步骤:

(一)、关闭交换文件

  1. 查看正在使用的交换文件或分区
    • 在Linux系统中,可以使用swapon -s命令查看当前正在使用的交换空间(包括交换文件和交换分区)。例如:
    swapon -s
    
    • 该命令会输出类似如下的结果:
    Filename                Type        Size    Used    Priority
    /swapfile               file        2097148 0       -1
    
    • 这里显示了交换文件/swapfile的相关信息,如类型为file,大小为2097148(以KB为单位,这里是2GB)等。
  2. 关闭交换文件
    • 如果要删除交换文件,首先需要使用swapoff命令关闭它。假设交换文件是/swapfile,执行以下命令:
    sudo swapoff /swapfile
    

(二)、删除交换文件

  1. 删除文件本身
    • 在关闭交换文件后,可以使用rm命令删除交换文件。例如:
    sudo rm /swapfile
    
    • 这样就删除了交换文件。

(三)、(可选)从/etc/fstab中移除相关条目

  1. 编辑/etc/fstab文件
    • 如果之前在/etc/fstab文件中添加了自动挂载交换文件的条目(例如/swapfile none swap sw 0 0),需要编辑/etc/fstab文件并删除该条目。可以使用文本编辑器(如vinano)来编辑。例如,使用nano编辑:
    sudo nano /etc/fstab
    
    • 在文件中找到并删除关于交换文件的那一行,然后保存并退出(在nano中按Ctrl + O保存,按Ctrl+X退出)。

七、交换文件可以清空,但需要遵循一定的步骤:

(一)、关闭交换文件

  1. 查看交换文件使用情况
    • 在Linux系统中,可以使用swapon -s命令查看当前正在使用的交换空间(包括交换文件)。例如:
    swapon -s
    
    • 这会显示类似如下的结果(如果存在交换文件的话):
    Filename                Type        Size    Used    Priority
    /swapfile               file        2097148 102400   -1
    
    • 这里展示了交换文件的名称(/swapfile)、类型(file)、大小(以KB为单位,这里是2GB)、已使用的空间(102400KB)等信息。
  2. 关闭交换文件
    • 使用swapoff命令关闭交换文件。假设交换文件为/swapfile,执行以下命令:
    sudo swapoff /swapfile
    

(二)、清空交换文件内容

  1. 覆盖交换文件内容
    • 一种方法是使用dd命令将交换文件内容覆盖为零。例如:
    sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
    
    • 这里的if=/dev/zero表示输入为全零的设备文件,of=/swapfile表示输出到交换文件,bs = 1M是块大小为1兆字节,count = 2048表示总共2048个块(假设交换文件大小为2GB)。这样就将交换文件的内容清空了。

(三)、重新启用交换文件(可选)

  1. 重新格式化交换文件(如果需要)
    • 在某些情况下,可能需要重新格式化交换文件。可以使用mkswap命令:
    sudo mkswap /swapfile
    
  2. 重新启用交换文件
    • 使用swapon命令重新启用交换文件:
    sudo swapon /swapfile
    

需要注意的是,在清空交换文件之前,确保系统有足够的物理内存来处理正在运行的程序,因为清空交换文件可能会导致系统在重新启用交换文件之前,可利用的虚拟内存减少。

八、 是否设置swap

  1. 需要设置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可以提高系统的整体性能。
  1. 设置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。
    • 根据应用程序需求确定
      • 内存需求波动大的应用
        • 如果系统运行的应用程序内存需求波动较大,如视频编辑软件(在导入、编辑和渲染不同阶段内存需求差异很大)或者一些企业级的ERP系统(在不同业务流程操作时内存需求变化明显),需要设置相对较大的swap。例如,对于运行视频编辑软件的系统,即使有8GB物理内存,可能也需要设置8 - 12GB的swap来应对渲染等内存需求高峰阶段。
      • 内存需求稳定的应用
        • 对于内存需求非常稳定的应用程序,如一些简单的网络监控工具或者静态Web服务器,在有足够物理内存的情况下,可以设置较小的swap。例如,对于运行简单网络监控工具的系统,即使有4GB物理内存,可能只需要设置1 - 2GB的swap。

是否设置swap以及设置多大的swap需要综合考虑系统的物理内存大小、应用程序的内存使用特性、系统功能需求(如休眠)等多方面因素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值