Linux中内存交换空间(swap)之创建

这篇具有很好参考价值的文章主要介绍了Linux中内存交换空间(swap)之创建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux中的swap(内存交换空间)

对于服务器而言,由于不知道何时会有大量请求的到来,因此,需要预留一部分swap来缓冲一下系统的内存用量。对于实际解决方法主要有两个:

  1. 添加硬盘,对硬盘进行分区,并格式化后用于内存交换空间。(将添加的硬盘当做swap partition使用)
  2. 不需要使用额外的硬盘,在已有的文件系统中使用一部分移动硬盘用于交换空间。(创建一个虚拟内存文件)

使用实际磁盘创建swap分区

创建 swap 分区步骤:

  • 分区:先使用 gdisk/fdisk 在磁盘中划分一个分区给系统作为 swap分区
  • 格式化:利用 mkswap 设备文件名 格式化分区成为 swap 格式
  • 使用:使用 swapon 设备文件名 将该 swap 设备挂载启动
  • 观察:通过 freeswapon -s 指令来观察一下内存用量
  1. 列出所有存储设备查看(lsblk,list block device)

    study@virtual-machine:~$ lsblk
    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
    loop0    7:0    0 155.6M  1 loop /snap/firefox/1232
    loop1    7:1    0 248.8M  1 loop /snap/gnome-3-38-2004/99
    loop2    7:2    0  81.3M  1 loop /snap/gtk-common-themes/1534
    loop3    7:3    0  43.6M  1 loop /snap/snapd/15177
    loop4    7:4    0     4K  1 loop /snap/bare/5
    loop5    7:5    0  61.9M  1 loop /snap/core20/1405
    sda      8:0    0    60G  0 disk 
    ├─sda1   8:1    0     1M  0 part 
    ├─sda2   8:2    0   513M  0 part /boot/efi
    └─sda3   8:3    0  59.5G  0 part /
    sdb      8:16   0     2G  0 disk  # 未分区
    

    通过分析,可以查看到有两块磁盘(disk),其中sda是系统本来就有的,而sdb是模拟添加了一块硬盘的磁盘名(其中NAME为loop*的可以先不用管,这个是虚拟设备)。在磁盘设备sda中,将该磁盘分为3个分区(partition),名字为sda1sda2sda3;而对于磁盘sdb而言,并未分区。如果想看其他信息,可以通过加加参数而查看:lsblk [-dfimpt] [device]

    name为loop的是回环设备,该设备是一种伪设备(相对真实的块设备(块设备包括磁盘等)来说),是使用文件来模拟块设备的一种技术。

  2. 查看磁盘分区方式(使用parted查看,其能列出磁盘的分区表类型和分区信息,但是需要root权限)

    study@virtual-machine:~$ sudo parted /dev/sda print
    [sudo] study 的密码: 
    型号:VMware, VMware Virtual S (scsi)
    磁盘 /dev/sda: 64.4GB
    扇区大小 (逻辑/物理):512B/512B
    分区表:gpt
    磁盘标志:
    
    编号  起始点  结束点  大小    文件系统  名称                  标志
     1    1049kB  2097kB  1049kB                                  bios_grub
     2    2097kB  540MB   538MB   fat32     EFI System Partition  启动, esp
     3    540MB   64.4GB  63.9GB  ext4
    

    通过parted查看磁盘sda设备的分区格式为GPT,那么将此作为参考,将添加的设备分区为GPT类型。并且由于磁盘设备sdb仅仅作为交换空间,所以只分一个有用分区。

    这里需要注意:对于MBR格式分区使用fdisk来处理,而GPT分区一般使用gdisk 处理。需要root权限。当然使用parted指令也可以进行分区操作。

  3. 对磁盘进行分区处理(以GPT为例,MBR格式类似)

    study@virtual-machine:~$ sudo gdisk /dev/sdb 
    GPT fdisk (gdisk) version 1.0.8
    
    Partition table scan:
      MBR: not present
      BSD: not present
      APM: not present
      GPT: not present
    
    Creating new GPT entries in memory.
    
    Command (? for help): ?  # <== 这里可以输入指令动作,按问号(?)查看可用指令
    b	back up GPT data to a file
    c	change a partition's name
    d	delete a partition          # 删除一个分区
    i	show detailed information on a partition
    l	list known partition types
    n	add a new partition         # 增加一个分区
    o	create a new empty GUID partition table (GPT)
    p	print the partition table   # 印出分区表 (常用)
    q	quit without saving changes # 不储存分区就直接离开 gdisk
    r	recovery and transformation options (experts only)
    s	sort partitions
    t	change a partition's type code
    v	verify disk
    w	write table to disk and exit # 储存分区操作后离开 gdisk
    x	extra functionality (experts only)
    ?	print this menu
    
    Command (? for help): p  # <== 输出目前磁盘的状态
    Disk /dev/sdb: 4194304 sectors, 2.0 GiB  # 磁盘文件名/扇区数与总容量
    Model: VMware Virtual S
    Sector size (logical/physical): 512/512 bytes # 单一扇区大小为 512 Bytes
    Disk identifier (GUID): D8EC9BFC-B0F3-4DD7-899D-2111BDC1E752 # 磁盘的 GPT 识别码
    Partition table holds up to 128 entries
    Main partition table begins at sector 2 and ends at sector 33
    First usable sector is 34, last usable sector is 4194270
    Partitions will be aligned on 2048-sector boundaries
    Total free space is 4194237 sectors (2.0 GiB)
    
    # 分区编号 开始扇区号码 结束扇区号码 容量大小
    Number  Start (sector)    End (sector)  Size       Code  Name
    # 这里内容为空,因为还没有使用,所以没有分区
    
    Command (? for help): n # <== 增加分区的指令
    Partition number (1-128, default 1): 1 # 默认就是 1 号,所以直接按 enter 也行
    First sector (34-4194270, default = 2048) or {+-}size{KMGTP}: 
    Last sector (2048-4194270, default = 4194270) or {+-}size{KMGTP}: 
    Current type is 8300 (Linux filesystem)
    Hex code or GUID (L to show codes, Enter = 8300):  # 使用默认值即可,这里让你选择未来这个分区预计使用的文件系统!默认都是 Linux 文件系统的 8300
    Changed type of partition to 'Linux filesystem'
    
    Command (? for help): w # <== 保存分区并退出
    
    Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
    PARTITIONS!!
    
    Do you want to proceed? (Y/N): y
    OK; writing new GUID partition table (GPT) to /dev/sdb.
    The operation has completed successfully.
    

    这里是对新添加的磁盘进行分区处理,由于是新磁盘,因此并没有使用,但是如果是在电脑原有磁盘上进行新增加一个分区的话,在保存分区的时候会出现警告:Warning: The kernel is still using the old partition table.表示该磁盘目前正在使用中,系统无法立即载入新的分区表。可以通过partprobe -s 命令更新 Linux 核心的分区表信息。

  4. 然后通过lsblk命令查看一下分区是否成功:对于新磁盘sdb存在一个分区名为sdb1的分区。分区完成后,对该分区进行格式化:

    study@virtual-machine:~$ sudo mkswap /dev/sdb1
    [sudo] study 的密码:
    正在设置交换空间版本 1,大小 = 2 GiB (2146410496  个字节)
    无标签, UUID=585afcd7-ccee-4eb6-be00-3f24495a08e4
    
  5. 通过swapon 指令将磁盘分区载入为swap,并通过 freeswapon -s 这个指令来观察一下内存的用量。

    study@virtual-machine:~$ free
             total        used        free      shared  buff/cache   available
    内存:    3983244     1217424     1730200    24784     1035620     2506652
    交换:    2097148           0     2097148
    # 实际内存有3983244K,使用了1217424K,剩余1730200K,使用掉的内存有1035620K用于在缓冲/高速缓存。至于swap空间有2097148K,目前没有被使用。
    
    
    study@virtual-machine:~$ sudo swapon /dev/sdb1 # 载入磁盘分区为交换内存swap
    
    study@virtual-machine:~$ swapon -s  # 列出目前使用的 swap 设备
    Filename		Type		Size		Used	Priority
    /swapfile       file		2097148		0		-2
    /dev/sdb1 		partition	2096104		0		-3
    

    通过free命令查看目前系统实际内存大小与交换空间内存大小。通过swapon 分区设备名将格式化后的交换分区进行加载使用。通过swapon -s 列出目前使用的所有swap设备。其中发现类型有两种,一种是以文件形式的(原本的),一种是以分区形式存在的(partition)。

    当然可以通过swapoff命令将交换空间取消使用。

  6. 设置开机自动设置:以上方式是一次性的,也就是说如果系统重启后,该交换分区就会消失。因此需要持久化操作使开关机都能使用该磁盘分区作为交换空间。也就是将该分区作为交换空间写入到文件/etc/fstab中。需要填写的字段有:

    [设备/UUID等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
    
    # 追加内容如下:由于不是文件系统,所以没有挂载点,第二个字段写入swap即可
    UUID=585afcd7-ccee-4eb6-be00-3f24495a08e4 swap swap defaults 0 0
    

    这个UUID名字来自于格式化磁盘操作所提供的,表示设备的全域单一识别码(universally unique identifier)。其值可通过lsblk -f或者 blkid查看。

    做了一个实验,也就是在/etc/fstab文件中存在swap分区记录的情况下,将新磁盘移除。电脑还能正常运行。

使用文件创建swap分区

  1. 创建一个交换空间文件/tmp/swap

    study@virtual-machine:~$ dd if=/dev/zero of=/tmp/swap bs=1G count=2 # 创建一个2G大小的文件,需要等一段时间。。
    记录了2+0 的读入
    记录了2+0 的写出
    2147483648字节(2.1 GB,2.0 GiB)已复制,25.5939 s,83.9 MB/s
    
    
    study@virtual-machine:~$ ll -h /tmp/swap  # 查看文件大小
    -rw-r--r-- 1 root root 2.0G  17 21:14 /tmp/swap
    

    dd 指令用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。是相当好的数据备份工具,不过缺点就是慢很多。其中主要参数有:

    • if:input file,输入文件名,作为标准输入,指定源文件
    • of:output file,输出文件名,作为标准输出,指定目的文件
    • bs:同时设置读入/输出的块大小,上述设置一个数据块大小为1G
    • count:仅拷贝的数据块的个数。因此,bs*count就是文件的容量大小。

    /dev/zero是一个特殊的输入设备文件,该设备无穷尽的提供空数据流(特殊的数据格式流),其典型用法就是使用dd指令根据该文件提供的字符流来覆盖信息,并产生特定大小的空白文件。

  2. 使用mkswap将文件/tmp/swap格式化为swap文件格式

    study@virtual-machine:~$ sudo mkswap /tmp/swap 
    mkswap: /tmp/swap: insecure permissions 0644, fix with: chmod 0600 /tmp/swap
    正在设置交换空间版本 1,大小 = 2 GiB (2147479552  个字节)
    无标签, UUID=afacff1f-c390-4dc9-9552-c054968a2d62
    
  3. 使用swapon/tmp/swap启动

    study@virtual-machine:~$ sudo swapon /tmp/swap # 启动作为交换空间
    swapon: /tmp/swap:不安全的权限 0644,建议使用 0600。
    
    study@virtual-machine:~$ swapon -s # 查看swap空间
    Filename				Type		Size		Used	Priority
    /swapfile               file		2097148		0		-2
    /tmp/swap               file		2097148		0		-3
    
  4. 使用 swapoff 关掉 swap file,并设置自动启用文章来源地址https://www.toymoban.com/news/detail-775036.html

    study@virtual-machine:~$ sudo swapoff /tmp/swap # 关闭交换空间的使用
    
    # 将内容写入到/etc/fstab中,内容如下:
    # 注意这里不要使用UUID,否则系统不会查询文件,而是仅查询区块设备(block device)
    /tmp/swap swap swap defaults 0 0
    

到了这里,关于Linux中内存交换空间(swap)之创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何给Linux开启swap虚拟内存

    查看系统内存资源 free -h 创建swap分区 创建一个新的交换文件,将交换文件swapfile格式化为swap分区文件 修改swap分区文件权限 挂载并激活分区 使用vim编辑器编辑配置文件/etc/fstab,设置开机自动挂载该swap分区 在文件内追加以下内容 配置swap分区的使用机制

    2024年02月13日
    浏览(26)
  • ubuntu20.04 扩大交换空间swap

    检查当前swap情况 关闭现有的swap 创建一个新的swap文件 设定正确的权限 下面这个指令会把我们的空间变成可用的swap空间 启用swap文件 检查是否设置成功 参考: https://www.8kiz.cn/archives/11147.html

    2024年01月16日
    浏览(33)
  • linux系统创建新的Swap分区

    先执行 查看现在的swap分配情况  执行 查看swap的分区文件 执行 取消已经挂上的swap文件 现在扩充swap到4G,并将swap文件挂到/vm_memory/swapfile上 先创建/vm_memory/swapfile,依次执行 这时候就创建了/vm_memory目录和swapfile文件 然后执行 说明下     if是啥我也不知道,好像是个只写0的东

    2024年02月09日
    浏览(28)
  • Ubuntu 20.04设置虚拟内存 (交换内存swap)解决内存不足

    数据库服务器程序在运行起来之后,系统内存不足。 在系统监控中发现,当数据库服务程序启动后,占用了大量内存空间,导致系统的剩余的内存往往只有几十MB。 在ubuntu系统中,swap空间就是虚拟内存,所以考虑在磁盘空间富余的目录下设置虚拟内存swap文件,用来缓解内存

    2024年02月06日
    浏览(41)
  • 配置swap交互内存解决centos7服务器内存不足问题

    在系统物理内存不足时,将部分数据暂时移动到硬盘上的交换分区(或称为交换文件、页交换文件),从而释放出物理内存空间供其他程序使用。当需要访问被移动到硬盘上的数据时,操作系统会将其重新加载到物理内存中。这个过程被称为“页面置换”。 (1)例如,要在

    2024年03月27日
    浏览(37)
  • linux运维(二)内存占用分析

    1.1: free 命令是 free最常规的查看内存占用情况的命令 1.2: 参数说明 top命令经常用来监控linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令。 按 q 退出 top命令也可以用来查内存 输入top命令 按x,高亮排序列,默认应该是%CPU,按CPU占用排序。 按shift +M (或 按

    2024年02月09日
    浏览(33)
  • Linux多进程数据交换--共享内存

    个人博客地址: https://cxx001.gitee.io 在linux系统开发当中,时常需要在多个进程之间交换数据,在多个进程之间交换数据,有很多方法,但最高效的方法莫过于共享内存。 linux共享内存是通过tmpfs这个文件系统来实现的,tmpfs文件系的目录为/dev/shm,/dev/shm是驻留在内存 RAM 当中的

    2024年02月12日
    浏览(34)
  • Linux扩容和删除运行内存(swapfile 交换文件)

    Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。Android是基于Linux的操作系统,所以也可以使用Swap分区来提升系统运行效率。 通常情况下,Swap空间应大于或等于物理内存的大小

    2024年02月12日
    浏览(43)
  • Linux创建交换分区

    Welcome to fdisk (util-linux 2 .32.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): Using default response p. Partition number (2-4, default 2 ): F

    2023年04月23日
    浏览(20)
  • [Linux]环境变量 进程地址空间(虚拟内存与物理内存的关系)

    hello,大家好,这里是bang_bang,今天我们来讲一下语言层级上的程序地址空间和系统层级上的进程地址空间的区别,在下面中我举的例子会设计到环境变量,所以开篇我先讲讲环境变量。 目录 1️⃣环境变量 🍙 基本概念 🍙环境变量相关命令 🍥查看环境变量echo 🍥添加全局环

    2024年02月15日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包