mkswap -p 参数用于显式地指定交换分区的页面大小,在绝大多数现代 Linux 系统上,你不需要使用这个参数,因为 mkswap 能够自动检测到正确的页面大小,但在某些特定场景下,手动指定是必要的。

什么是页面大小?
在操作系统中,内存管理不是以字节为单位,而是以固定大小的“块”或“页面”为单位来进行的,当系统需要将内存中的数据换出到硬盘(交换空间)时,就是以一个页面为单位进行读写的。
- 页面大小 是由 CPU 架构和操作系统内核共同决定的。
- 在 x86_64 (64位) 架构上,最常见的页面大小是 4096 字节 (4KB)。
- 在一些较新的架构(如 x86_64 的
huge pages或 ARM64)上,也可能使用 2MB (2MB) 或其他大小的页面。
mkswap -p 参数的作用
mkswap 命令在格式化一个分区或文件为交换空间时,需要在其中写入特定的元数据,这些元数据就包含了页面大小的信息。
- 语法:
mkswap -p <pagesize> <filename_or_device> - 作用: 它强制
mkswap命令使用你指定的<pagesize>来创建交换空间,而不是去自动检测。
什么时候需要使用 -p 参数?
虽然通常可以省略,但在以下几种情况下,使用 -p 是一个好习惯甚至是必需的:
a) 跨平台创建交换文件
当你在一台机器上创建一个交换文件,但计划在另一台具有不同页面大小的机器上使用它时,必须使用 -p 参数。

- 示例: 你在一台页面大小为 4KB 的笔记本上创建了一个交换文件,但需要将它挂载到一台使用 2MB 页面大小的服务器上,如果不指定
-p 2M,创建的交换文件将无法在服务器上正常工作。
b) 为大页面创建交换空间
Linux 支持使用“巨大页面”(Huge Pages),2MB,如果你需要创建一个用于配合大页面机制的交换空间,你必须明确告诉 mkswap 使用这个更大的页面大小。
- 示例: 为 NUMA 架构的服务器优化时,可能会用到巨大的交换页面。
# 创建一个 1GB 的交换文件,并指定页面大小为 2MB sudo fallocate -l 1G /swapfile_huge sudo mkswap -p 2M /swapfile_huge
c) 在非标准或嵌入式系统上
一些特殊的硬件架构或定制的 Linux 内核可能使用了非标准的页面大小,在这种情况下,mkswap 的自动检测可能会失败或给出错误,此时就需要手动指定。
d) 明确指定,避免歧义
即使系统可以自动检测,你也可以使用 -p 来确保你创建的交换空间具有你所期望的页面大小,这是一种更明确的做法。
如何查看当前系统的页面大小?
在手动指定之前,你需要知道目标系统应该使用什么页面大小,你可以通过以下几种方式查看:

查看 /proc/meminfo
这是最直接的方法。
$ grep -i 'pagesize' /proc/meminfo PageSize: 4096
这里的 PageSize 就是系统当前使用的页面大小,单位是字节。
使用 getconf 命令
getconf 命令可以获取系统配置变量。
$ getconf PAGESIZE 4096
使用 dmesg 命令
系统启动时内核日志会包含页面大小的信息。
$ dmesg | grep -i 'page size' [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-78-generic root=UUID=... ro quiet splash [ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-78-generic root=UUID=... ro quiet splash [ 0.000000] Memory: 16277984K/16777216K available (16384K kernel code, 5452K rwdata, 9960K rodata, 2048K init, 716K bss, 138644K reserved, 0K cma-reserved) [ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' [ 0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' [ 0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' [ 0.000000] x86/fpu: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'compacted' format. [ 0.000000] Linux version 5.15.0-78-generic (buildd@lcy01-amd64-013) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #85-Ubuntu SMP Mon Apr 3 03:01:26 UTC 2025 (Ubuntu 5.15.0-78.85-generic 5.15.78) [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-78-generic root=UUID=... ro quiet splash [ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-78-generic root=UUID=... ro quiet splash [ 0.000000] Dentry cache hash table entries: 1048576 (order: 10, 4194304 bytes, linear) [ 0.000000] Inode-cache hash table entries: 524288 (order: 9, 2097152 bytes, linear) [ 0.000000] Memory: 16277984K/16777216K available (16384K kernel code, 5452K rwdata, 9960K rodata, 2048K init, 716K bss, 138644K reserved, 0K cma-reserved) [ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' [ 0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' [ 0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' [ 0.000000] x86/fpu: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'compacted' format.
你可能需要更精确的过滤,dmesg | grep -i 'page size' | grep -v 'command line',但通常直接用 grep 或 getconf 更简单。
-p 参数的值格式
mkswap 的 -p 参数接受多种格式的输入,非常方便:
- 以字节为单位:
4096 - 以 KB 为单位:
4K - 以 MB 为单位:
4M或4m - 以 GB 为单位:
4G或4g
示例:
# 使用 4KB 页面大小 (默认行为) sudo mkswap -p 4096 /swapfile sudo mkswap -p 4K /swapfile # 使用 2MB 页面大小 sudo mkswap -p 2M /swapfile sudo mkswap -p 2097152 /swapfile
最佳实践
- 日常使用: 在标准的 x86_64 桌面或服务器上,直接运行
sudo mkswap /dev/sdXN或sudo mkswap /swapfile即可,让系统自动检测是最好的选择。 - 跨平台/特殊需求: 如果你明确知道需要创建一个非标准的交换空间(用于 ARM64 或大页面),或者你正在为另一台机器准备交换文件,务必先使用
getconf PAGESIZE或grep PageSize /proc/meminfo查目标系统的页面大小,然后使用mkswap -p来精确创建。 - 验证: 创建完成后,你可以使用
swapon -s或free -h来激活交换空间并观察其是否正常工作。
| 特性 | 描述 |
|---|---|
| 功能 | 显式指定交换分区的页面大小。 |
| 必要性 | 在大多数现代 Linux 系统上非必需,mkswap 会自动检测。 |
| 使用场景 | 跨平台创建交换文件、为“大页面”(Huge Pages) 创建交换空间、在非标准架构上使用。 |
| 常用值 | 4K (x86_64 默认), 2M (大页面)。 |
| 如何获取值 | getconf PAGESIZE 或 grep PageSize /proc/meminfo。 |
-p 参数是一个强大的工具,用于处理标准的、自动检测无法满足的特殊情况,对于 99% 的日常使用,你可以忘记它的存在,但在你需要它的那 1% 的情况下,它会变得至关重要。
