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,并设置自动启用

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值