Linux中的swap(内存交换空间)
对于服务器而言,由于不知道何时会有大量请求的到来,因此,需要预留一部分swap来缓冲一下系统的内存用量。对于实际解决方法主要有两个:
- 添加硬盘,对硬盘进行分区,并格式化后用于内存交换空间。(将添加的硬盘当做swap partition使用)
- 不需要使用额外的硬盘,在已有的文件系统中使用一部分移动硬盘用于交换空间。(创建一个虚拟内存文件)
使用实际磁盘创建swap分区
创建 swap 分区步骤:
-
分区:先使用
gdisk/fdisk
在磁盘中划分一个分区给系统作为swap
分区 -
格式化:利用
mkswap 设备文件名
格式化分区成为swap
格式 -
使用:使用
swapon 设备文件名
将该swap
设备挂载启动 -
观察:通过
free
与swapon -s
指令来观察一下内存用量
-
列出所有存储设备查看(
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),名字为sda1
,sda2
,sda3
;而对于磁盘sdb
而言,并未分区。如果想看其他信息,可以通过加加参数而查看:lsblk [-dfimpt] [device]
。name为loop的是回环设备,该设备是一种伪设备(相对真实的块设备(块设备包括磁盘等)来说),是使用文件来模拟块设备的一种技术。
-
查看磁盘分区方式(使用
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
指令也可以进行分区操作。 -
对磁盘进行分区处理(以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 核心的分区表信息。 -
然后通过
lsblk
命令查看一下分区是否成功:对于新磁盘sdb
存在一个分区名为sdb1
的分区。分区完成后,对该分区进行格式化:study@virtual-machine:~$ sudo mkswap /dev/sdb1 [sudo] study 的密码: 正在设置交换空间版本 1,大小 = 2 GiB (2146410496 个字节) 无标签, UUID=585afcd7-ccee-4eb6-be00-3f24495a08e4
-
通过
swapon
指令将磁盘分区载入为swap
,并通过free
与swapon -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
命令将交换空间取消使用。 -
设置开机自动设置:以上方式是一次性的,也就是说如果系统重启后,该交换分区就会消失。因此需要持久化操作使开关机都能使用该磁盘分区作为交换空间。也就是将该分区作为交换空间写入到文件
/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分区
-
创建一个交换空间文件
/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 1月 7 21:14 /tmp/swap
dd
指令用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。是相当好的数据备份工具,不过缺点就是慢很多。其中主要参数有:-
if
:input file,输入文件名,作为标准输入,指定源文件 -
of
:output file,输出文件名,作为标准输出,指定目的文件 -
bs
:同时设置读入/输出的块大小,上述设置一个数据块大小为1G -
count
:仅拷贝的数据块的个数。因此,bs*count就是文件的容量大小。
/dev/zero
是一个特殊的输入设备文件,该设备无穷尽的提供空数据流(特殊的数据格式流),其典型用法就是使用dd
指令根据该文件提供的字符流来覆盖信息,并产生特定大小的空白文件。 -
-
使用
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
-
使用
swapon
将/tmp/swap
启动文章来源:https://www.toymoban.com/news/detail-775036.htmlstudy@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
-
使用
swapoff
关掉swap file
,并设置自动启用文章来源地址https://www.toymoban.com/news/detail-775036.htmlstudy@virtual-machine:~$ sudo swapoff /tmp/swap # 关闭交换空间的使用
# 将内容写入到/etc/fstab中,内容如下: # 注意这里不要使用UUID,否则系统不会查询文件,而是仅查询区块设备(block device) /tmp/swap swap swap defaults 0 0
到了这里,关于Linux中内存交换空间(swap)之创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!