一分钟学会Linux交换分区

华子目录

前言

  • Linux系统中,swap交换分区的作用类似于Windows系统中"虚拟内存"。当有程序被调入内存后,但是该程序不是常被CPU所取用时,那么这些不常被使用程序将会被放到硬盘swap交换分区当中,而将速度较快内存空间释放给真正需要的程序使用,以避免由于物理内存不足而造成的系统效能低的问题。如果系统没有swap交换分区,或者现有交换分区容量不够用时,可扩展swap交换分区。

管理交换分区的命令

mkswap

  • mkswap 命令在 Linux 系统中用于将指定的分区格式化为swap交换文件系统交换空间硬盘上的一个区域,当系统的物理内存(RAM)不足时,系统会使用交换空间来存储暂时不使用的内存页面,从而允许系统继续运行而不会耗尽内存。

命令语法

bash 复制代码
mkswap [选项]... [设备]
  • 设备 :指定要创建为交换空间的设备或分区,如 /dev/sda2/swapfile

常用选项(一般不会带选项

  • -c:在创建交换空间之前,先执行一个坏的块检查。
  • -f强制创建交换空间,即使该设备似乎已经包含文件系统。
  • -L 标签:设置交换空间的标签
  • -p 优先级:设置交换空间的优先级(0 到 32767,0 为最低)。
  • -s 大小:指定交换空间的大小(以字节为单位)。这主要用于文件交换空间。
  • -U UUID:为交换空间设置 UUID
  • -v:显示详细信息,执行时更详细地输出操作。

示例

  1. 为分区创建交换空间

    假设 /dev/sdb1 是一个未使用的硬盘分区,你可以使用以下命令将其格式化为交换空间:

    bash 复制代码
    mkswap /dev/sdb1

    然后,你需要启用这个交换空间:

    bash 复制代码
    swapon /dev/sdb1

    如果你想在启动时自动启用这个交换空间,可以编辑 /etc/fstab 文件并添加相应的行。

  2. 为文件创建交换空间

    首先,创建一个文件作为交换空间(这里以 2GB 为例):

    bash 复制代码
    fallocate -l 2G /swapfile

    或者,如果你的系统不支持 fallocate,可以使用 dd 命令(但会比较慢):

    bash 复制代码
    dd if=/dev/zero of=/swapfile bs=1G count=2
    • 创建一个文件/swapfile,从无限零资源去读,每一块大小为1G,一共有2块,不能用cat去查看,不然会卡死

    然后,将文件格式化为交换空间:

    bash 复制代码
    mkswap /swapfile

    启用交换空间:

    bash 复制代码
    swapon /swapfile

    设置权限

    bash 复制代码
    chmod 0600 /swapfile

    查看当前虚拟内存

    bash 复制代码
    swapon -s

    写入/etc/fstab,实现开机挂载

    bash 复制代码
    vim /etc/fstab

swapon命令

swapon 命令在 Linux 系统中用于启用或激活交换空间(swap space)。

命令语法

bash 复制代码
swapon [选项]... [设备]
  • 设备 :指定要启用的交换设备或文件的路径,如 /dev/sda2/swapfile

常用选项

  • -a:从 /etc/fstab 文件中读取所有标记为"swap"的行,并启用它们。这是启动系统时常用的选项,用于自动启用所有配置的交换空间
  • -h:显示帮助信息。
  • -p 优先级:设置交换设备的优先级(0 到 32767,其中 0 是最低优先级)。如果未指定,swapon 将使用默认值。
  • -s:显示当前启用交换设备和它们的统计信息,如总大小、已用空间等。这个选项不会启用任何交换设备,只是显示信息

示例

  1. 启用一个交换分区

    假设 /dev/sdb1 是一个已经被格式化交换空间的分区,你可以使用以下命令来启用它:

    bash 复制代码
    swapon /dev/sdb1
  2. 启用一个交换文件

    如果你已经创建了一个名为 /swapfile交换文件,并且想要启用它,可以使用:

    bash 复制代码
    swapon /swapfile
  3. /etc/fstab 自动启用所有交换空间

    在系统启动时,通常不需要手动运行 swapon 命令来启用交换空间,因为 /etc/fstab 文件中的配置会自动处理这一过程。但是,如果你需要手动执行这一操作(比如,在 /etc/fstab 配置错误后),可以使用:

    bash 复制代码
    swapon -a

    这将读取 /etc/fstab 文件中所有标记为"swap"的行,并启用它们。

  4. 查看当前启用的交换空间

    要查看当前系统启用了哪些交换空间以及它们的统计信息,可以使用:

    bash 复制代码
    swapon -s

swapoff命令

swapoff 命令在 Linux 系统中用于关闭(禁用)交换空间(swap space)。当系统不再需要某个交换分区或文件作为虚拟内存时,可以使用 swapoff 命令来停用它。

命令语法

bash 复制代码
swapoff [选项]... [设备]
  • 设备 :指定要禁用的交换设备或文件的路径,如 /dev/sda2/swapfile

常用选项

  • -a:从 /etc/fstab 文件中读取所有标记为"swap"的行,并尝试禁用它们。注意,这个选项在实际使用中可能并不常见,因为 /etc/fstab 通常用于启动时的自动挂载,而不是禁用。

示例

  1. 禁用一个交换分区

    假设 /dev/sdb1 是一个已经启用的交换分区,你可以使用以下命令来禁用它:

    bash 复制代码
    swapoff /dev/sdb1
  2. 禁用一个交换文件

    如果你之前启用了一个名为 /swapfile 的交换文件,并希望现在禁用它,可以使用:

    bash 复制代码
    swapoff /swapfile
  3. 查看交换空间状态

    在禁用交换空间之前或之后,你可能想要查看当前系统的交换空间状态。虽然 swapoff 命令本身不直接显示这些信息,但你可以使用 swapon -s 命令来查看当前启用的交换空间列表,或者使用 free -h 命令来查看系统的总体内存和交换空间使用情况。

    bash 复制代码
    swapon -s  # 查看当前启用的交换空间
    free -h         # 查看内存和交换空间使用情况

free命令

free命令是Linux系统中用于查看内存使用情况的工具,它提供了系统总内存、已使用内存、空闲内存、缓存以及交换空间(swap)等关键信息。

命令格式与参数

free命令的基本格式如下:

bash 复制代码
free [选项]...

常用的参数包括:

  • -b:以字节(Byte)为单位显示内存使用情况。
  • -k:以千字节(KB)为单位显示内存使用情况(默认)。
  • -m:以兆字节(MB)为单位显示内存使用情况。
  • -g:以吉字节(GB)为单位显示内存使用情况。
  • -h:以人类可读的方式(如KB、MB、GB)显示内存大小。
  • -o:不显示缓冲区调节列。
  • -s [间隔秒数]:以指定的间隔时间持续观察内存使用状况。
  • -t:显示内存总和列。
  • -V:显示版本信息。

输出信息解释

free命令的输出通常包含几行关键信息,每行代表不同的内存使用情况:

  1. Mem行(物理内存)

    • total:物理内存总量。
    • used:已使用的物理内存量。
    • free:空闲的物理内存量。
    • shared:被多个进程共享的内存量(现代Linux系统中此值通常为0)。
    • buffers/cached:被内核用作缓冲和缓存的内存量。这部分内存虽然被标记为"已用",但实际上当应用程序需要更多内存时,这些缓冲和缓存可以被回收。
  2. -/+ buffers/cache行

    • 这行从应用程序的角度重新计算了内存的使用情况。它考虑了缓冲和缓存是可回收的,因此将它们视为可用内存的一部分。
  3. Swap行(交换空间)

    • total:交换空间总量。
    • used:已使用的交换空间量。
    • free:空闲的交换空间量。

使用实例

  1. 查看内存使用情况(以MB为单位)

    bash 复制代码
    free -m
  2. 持续观察内存使用情况(每5秒刷新一次)

    bash 复制代码
    free -s 5
  3. 以人类可读的方式显示内存使用情况

    bash 复制代码
    free -h

实验1:扩展交换空间

1.查看之前的交换空间

  • 查看之前交换空间
bash 复制代码
[root@rhel9 ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           1.9Gi       1.1Gi       358Mi        21Mi       573Mi       760Mi
Swap:          2.0Gi          0B       2.0Gi
  • 或使用swapon -s查看
bash 复制代码
[root@rhel9 ~]# swapon -s
Filename                                Type            Size            Used            Priority
/dev/nvme0n1p2                          partition       2097148         0               -2
  • 或使用lsblk
bash 复制代码
[root@rhel9 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda           8:0    0   10G  0 disk
sr0          11:0    1  8.4G  0 rom
nvme0n1     259:0    0  100G  0 disk
├─nvme0n1p1 259:1    0  500M  0 part /boot
├─nvme0n1p2 259:2    0    2G  0 part [SWAP]  #表示交换分区
└─nvme0n1p3 259:3    0 97.5G  0 part /

2.创建磁盘分区

  • 先使用fdisk -l查看
bash 复制代码
[root@rhel9 ~]# fdisk -l
Disk /dev/nvme0n1:100 GiB,107374182400 字节,209715200 个扇区
磁盘型号:VMware Virtual NVMe Disk
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x1c83a586

设备           启动    起点      末尾      扇区  大小 Id 类型
/dev/nvme0n1p1 *       2048   1026047   1024000  500M 83 Linux
/dev/nvme0n1p2      1026048   5220351   4194304    2G 82 Linux swap / Solaris
/dev/nvme0n1p3      5220352 209715199 204494848 97.5G 83 Linux


Disk /dev/sda:10 GiB,10737418240 字节,20971520 个扇区
磁盘型号:VMware Virtual S
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
  • 我们发现/dev/nvm0n1这个磁盘已经没有空间可用了,/dev/sda这个磁盘还没有使用过
  • 使用fdisk创建2G大小的磁盘分区
bash 复制代码
[root@rhel9 ~]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.37.4)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

设备不包含可识别的分区表。
创建了一个磁盘标识符为 0xa447abfd 的新 DOS 磁盘标签。

命令(输入 m 获取帮助):n
分区类型
   p   主分区 (0 primary, 0 extended, 4 free)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):p
分区号 (1-4, 默认  1):
第一个扇区 (2048-20971519, 默认 2048):
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (2048-20971519, 默认 20971519): +2G

创建了一个新分区 1,类型为"Linux",大小为 2 GiB。

命令(输入 m 获取帮助):p
Disk /dev/sda:10 GiB,10737418240 字节,20971520 个扇区
磁盘型号:VMware Virtual S
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa447abfd

设备       启动  起点    末尾    扇区 大小 Id 类型
/dev/sda1        2048 4196351 4194304   2G 83 Linux
bash 复制代码
[root@rhel9 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda           8:0    0   10G  0 disk
└─sda1        8:1    0    2G  0 part  #发现创建成功
sr0          11:0    1  8.4G  0 rom
nvme0n1     259:0    0  100G  0 disk
├─nvme0n1p1 259:1    0  500M  0 part /boot
├─nvme0n1p2 259:2    0    2G  0 part [SWAP]
└─nvme0n1p3 259:3    0 97.5G  0 part /
bash 复制代码
[root@rhel9 ~]# fdisk -l
Disk /dev/nvme0n1:100 GiB,107374182400 字节,209715200 个扇区
磁盘型号:VMware Virtual NVMe Disk
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x1c83a586

设备           启动    起点      末尾      扇区  大小 Id 类型
/dev/nvme0n1p1 *       2048   1026047   1024000  500M 83 Linux
/dev/nvme0n1p2      1026048   5220351   4194304    2G 82 Linux swap / Solaris
/dev/nvme0n1p3      5220352 209715199 204494848 97.5G 83 Linux


Disk /dev/sda:10 GiB,10737418240 字节,20971520 个扇区
磁盘型号:VMware Virtual S
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa447abfd

设备       启动  起点    末尾    扇区 大小 Id 类型
/dev/sda1        2048 4196351 4194304   2G 83 Linux

3.创建交换空间

  • 使用mkswap命令
bash 复制代码
[root@rhel9 ~]# mkswap /dev/sda1
正在设置交换空间版本 1,大小 = 2 GiB (2147479552  个字节)
无标签,UUID=5fce9557-a964-4ff1-9e44-8cf89ca57c5d
  • 创建完发现交换空间没有变
bash 复制代码
[root@rhel9 ~]# swapon -s
Filename                                Type            Size            Used            Priority
/dev/nvme0n1p2                          partition       2097148         0               -2
bash 复制代码
[root@rhel9 ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           1.9Gi       728Mi       1.0Gi        11Mi       347Mi       1.2Gi
Swap:          2.0Gi          0B       2.0Gi

4.启动交换空间

  • 使用swapon命令
bash 复制代码
[root@rhel9 ~]# swapon /dev/sda1
  • 启动完发现,交换空间扩大了
bash 复制代码
[root@rhel9 ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           1.9Gi       728Mi       1.0Gi        11Mi       347Mi       1.2Gi
Swap:          4.0Gi          0B       4.0Gi

实验2:禁用交换空间

  • 禁用之前需要使用swapon -slsblk查看交换空间位于哪个分区
bash 复制代码
[root@rhel9 ~]# swapon -s
Filename                                Type            Size            Used            Priority
/dev/nvme0n1p2                          partition       2097148         0               -2
/dev/sda1                               partition       2097148         0               -3
bash 复制代码
[root@rhel9 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda           8:0    0   10G  0 disk
└─sda1        8:1    0    2G  0 part [SWAP]
sr0          11:0    1  8.4G  0 rom
nvme0n1     259:0    0  100G  0 disk
├─nvme0n1p1 259:1    0  500M  0 part /boot
├─nvme0n1p2 259:2    0    2G  0 part [SWAP]
└─nvme0n1p3 259:3    0 97.5G  0 part /
  • 使用swapoff命令禁用/dev/sda1
bash 复制代码
[root@rhel9 ~]# swapoff /dev/sda1
  • 验证
bash 复制代码
[root@rhel9 ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           1.9Gi       728Mi       1.0Gi        11Mi       347Mi       1.2Gi
Swap:          2.0Gi          0B       2.0Gi
  • 发现交换空间少了,但是分区还在
bash 复制代码
[root@rhel9 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda           8:0    0   10G  0 disk
└─sda1        8:1    0    2G  0 part
sr0          11:0    1  8.4G  0 rom
nvme0n1     259:0    0  100G  0 disk
├─nvme0n1p1 259:1    0  500M  0 part /boot
├─nvme0n1p2 259:2    0    2G  0 part [SWAP]
└─nvme0n1p3 259:3    0 97.5G  0 part /
相关推荐
LKAI.17 分钟前
搭建Elastic search群集
linux·运维·elasticsearch·搜索引擎
正在走向自律1 小时前
阿里云ESC服务器一次性全部迁移到另一个ESC
服务器·阿里云·云计算
gywl2 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
青木沐2 小时前
Jenkins介绍
运维·jenkins
WTT00112 小时前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
苹果醋33 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
了一li3 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
日记跟新中3 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器
唐小旭3 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python