首页 > 代码库 > 6.文件系统——什么是交换分区以及如何创建和使用交换分区(free,reboot,mkswap,swapon,swapoff)

6.文件系统——什么是交换分区以及如何创建和使用交换分区(free,reboot,mkswap,swapon,swapoff)

一、交换分区:swap

目前几乎所有的操作系统都是多任务多用户的,且使用了MMU完成了内存保护,以使得多进程得以完成。如此一来,每个进程都有自己的线性地址空间,其中的数据会被映射到物理地址空间中。


第一个进程使用第一个线性地址空间,第二个进程使用第二个线性地址空间,依此类推,而这些进程真正使用的内存会被放置到物理内存中。而物理内存被划分为单个的页框(可以存储页面数据的单元),于是第一个进程可能使用的是物理内存中的第三个页框,第二个进程使用的可能是第一个页框,第一个进程又开启了一块数据,使用的是第三个页框,因此这些进程使用的页框在真正的物理内存中很可能是离散的。

    wKioL1PJK16BB7o-AABcoLvowZA859.jpg

如果整个物理内存一共只有1G,使用的是32位的系统(32位系统的最高巡址空间为4G),那么每一个进程都会误认为自己有4G的内存空间,这样就会导致物理内存不足,一旦使用的内存超出了实际物理内存,就会导致系统无法运行,此时就需要引入虚拟内存的机制。

虚拟内存并不是真正的内存,它是在硬盘上划分出一块区域,将其格式化成物理内存相同的格式(其中的文件系统不再是文件和索引了,取而代之的是页框)以备后续使用。一旦发生了物理内存不足的情况(物理内存还没有用完,但已经接近总大小了),就可以将物理内存页框中的数据移动到虚拟内存上。而物理内存空间被重新释放后,又可以将虚拟内存页框中的数据移动回去。重新移动回去的数据可能已经不在原来的页框中了,这时只需将线性地址空间重新指向页框位置即可。这个过程就好像是在交换数据一样,故这一区域被称为交换分区(swap)。当然交换分区只是权宜之计,因为硬盘的数据处理能力远远低于内存。

Windows系统中交换分区(虚拟内存)直接放在系统磁盘上,且是自动管理的,但Linux则不同,它必须使用独立的分区(独立的文件系统)作为交换分区(swap)。在不同的情况下,交换分区的大小的设定机制是不同的:


1. 批处理类的服务器(科学计算类的服务器):交换分区尽可能大,比如为物理内存的2倍或4倍;

2. 应用程序类的服务器(提供web服务/数据库服务器):对性能要求较高,故交换分区尽可能小,比如1G

3. 如果无法确定是科学计算类还是应用程序类的服务器,当物理内存小于或等于2G,那么 swap = memory * 2

当物理内存大于2G,小于4G,那么 swap = memory * 1.5

当物理内存大于4G,那么 swap = 4G


使用free命令可以查看当前系统的内存使用状况:

   [root@localhost ~]# free

   —————————————运行结果———————————————

# 含义为:  总共      已用     空闲     共享大小     缓冲      缓存
          total    used     free    shared     buffers   cached
Mem:    1020348    543008   477340       0       45192   172724
-/+ buffers/cache: 325092   695256
Swap:   2064376    0        2064376
# 缓冲用于写操作,缓存用于读操作,缓冲和缓存空间可以被清除,当缓冲和缓存被清除后,它们原来占据的空间会腾出来变成空闲空间,故
# 已用空间used(543008)-(缓冲/缓存)buffers/cached(45192/172724)= 实际已用空间(325092)
# 空闲空间free(477340)+(缓冲/缓存)buffers/cached(45192/172724)= 实际空闲空间(695256)


这里是以字节为单位进行显示的,可以使用-m选项或-g选项改为MBGB单位来显示:

   [root@localhost ~]# free -m

—————————————运行结果———————————————

             total    used      free     shared    buffers     cached
Mem:           996    530       466          0       44          168
-/+ buffers/cache:    317       679
Swap:         2015                0        2015


   [root@localhost ~]# free -g

—————————————运行结果———————————————

           total       used       free     shared    buffers     cached
Mem:          0           0          0         0         0            0
-/+ buffers/cache:        0          0
Swap:         1           0          1


二、创建交换分区

如果现有的swap不够用了,需要创建一个新分区作为交换分区,可以进行以下操作:


   [root@localhost ~]# fdisk /dev/sdb

# 在/dev/sdb上创建分区
WARNING: DOS-compatible mode is deprecated. It‘s strongly recommended to switch off the mode (command ‘c‘) and change display units to
sectors (command ‘u‘).


   Command (m for help): p

# 查看分区信息
Disk /dev/sdb: 102.0 GB, 102005473280 bytes
255 heads, 63 sectors/track, 12401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c2e31
Device Boot         Start         End      Blocks   Id  System
/dev/sdb3               1        1306    10490413+  83  Linux
/dev/sdb4            1307       12401    89120587+   5  Extended
/dev/sdb5            1307        1960     5253223+  83  Linux


   Command (m for help): n

Command action
l   logical (5 or over)
p   primary partition (1-4)
    l
First cylinder (1961-12401, default 1961):
Using default value 1961
Last cylinder, +cylinders or +size{K,M,G} (1961-12401, default 12401): +1G
# 创建逻辑分区,默认从1961号柱面开始,大小为1GB


   Command (m for help): p

# 再次查看分区信息
Disk /dev/sdb: 102.0 GB, 102005473280 bytes
255 heads, 63 sectors/track, 12401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c2e31
Device Boot         Start         End      Blocks   Id  System
/dev/sdb3               1        1306    10490413+  83  Linux
/dev/sdb4            1307       12401    89120587+   5  Extended
/dev/sdb5            1307        1960     5253223+  83  Linux
/dev/sdb6            1961        2092     1060258+  83  Linux
 # 发现新创建的分区系统ID为83,如果要创建为交换分区,系统ID号应该是82。


Command (m for help): t

# 使用t命令来调整系统ID

Partition number (1-6): 6

Hex code (type L to list codes): 82

Changed system type of partition 6 to 82 (Linux swap / Solaris)


Command (m for help): p

Disk /dev/sdb: 102.0 GB, 102005473280 bytes
255 heads, 63 sectors/track, 12401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c2e31
Device Boot         Start         End      Blocks    Id   System
/dev/sdb3               1        1306    10490413+  83  Linux
/dev/sdb4            1307       12401    89120587+   5  Extended
/dev/sdb5            1307        1960     5253223+  83  Linux
/dev/sdb6            1961        2092     1060258+  82  Linux swap / Solaris
# 再次查看分区信息,会发现/dev/sdb6的系统ID已经改为了82,swap


Command (m for help): w

The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

[root@localhost ~]# partx -a /dev/sdb6 /dev/sdb

/dev/sdb6: No such file or directory

[root@localhost ~]# partx /dev/sdb

# 1:         0-       -1 (        0 sectors,      0 MB)
# 2:         0-       -1 (        0 sectors,      0 MB)
# 3:        63- 20980889 ( 20980827 sectors,  10742 MB)
# 4:  20980890-199222064 (178241175 sectors,  91259 MB)
# 5:  20980953- 31487399 ( 10506447 sectors,   5379 MB)
# 6:  31487463- 33607979 (  2120517 sectors,   1085 MB)


[root@localhost ~]# cat /proc/partitions

major minor  #blocks  name
8        0   26214400 sda
8        1     512000 sda1
8        2   25701376 sda2
8       16   99614720 sdb
8       19   10490413 sdb3
8       20          1 sdb4
8       21    5253223 sdb5
253        0   23633920 dm-0
253        1    2064384 dm-1
# 查看/proc/patitions这个文件会发现/dev/sdb6还是没有被同步到内核中,
# 说明使用partx -a 命令来同步swap分区到内核中,不重启将无法成功。


[root@localhost ~]# reboot

Broadcast message from root@localhost.localdomain
(/dev/pts/1) at 13:35 ...
The system is going down for reboot NOW!
# 重启系统


[root@localhost ~]# cat /proc/partitions

major minor  #blocks  name
8        0   26214400 sda
8        1     512000 sda1
8        2   25701376 sda2
8       16   99614720 sdb
8       19   10490413 sdb3
8       20          1 sdb4
8       21    5253223 sdb5
8       22    1060258 sdb6
253        0   23633920 dm-0
253        1    2064384 dm-1
# 这时可以看到交换分区 /dev/sdb6已经同步到内核中了


三、启用交换分区

当新分区被创建成功后,首先需要将该分区指定为swap分区,使用的命令如下:

mkswap DEVICE

mkswap -l label                --为交换分区指定卷标


启用交换分区,不使用mount命令,而是使用如下命令:

swapon DEVICE            -- 启用指定交换分区

swapon -a                       -- 启用所有交换分区


禁用交换分区,使用如下命令:

        swapoff DEVICE         -- 禁用指定交换分区

        swapoff -a                    --  禁用所有交换分区


如果需要开机自动启用交换分区,可以修改/etc/fstab文件,增加如下内容:

  DEVICE         swap    swap   defaults     0       0
# 要挂载的文件系统  挂载点   文件系统类型   默认   不备份   不自检



下面来举个例子演示一下启用交换分区的过程:

[root@localhost ~]# free -m

            total     used      free    shared   buffers     cached
Mem:          996      449       546         0        25        153
-/+ buffers/cache:               270       725
Swap:        2015       0       2015
# 当前的交换分区为 2015MB



[root@localhost ~]# mkswap -L NEWSWAP /dev/sdb6

# 将设备 /dev/sdb6指定为交换分区,其卷标为 NEWSWAP
Setting up swapspace version 1, size = 1060252 KiB
LABEL=NEWSWAP, UUID=9f4eea81-3e66-415b-9f80-c31f1b2a092b


[root@localhost ~]# swapon /dev/sdb6

# 启用交换分区 /dev/sdb6


[root@localhost ~]# free -m

             total     used       free     shared    buffers   cached
Mem:           996      450       546           0         25      153
-/+ buffers/cache:      271       725
Swap:         3051       0        3051
# 查看当前的交换分区,会发现大小变为 3051MB了


[root@localhost ~]# swapoff /dev/sdb6

# 禁用交换分区 /dev/sdb6


[root@localhost ~]# free -m

           total       used       free     shared    buffers   cached
Mem:         996        449       546         0         25        153
-/+ buffers/cache:      270       725
Swap:       2015          0      2015
# 再次查看当前的交换分区,会发现大小又变为了 2015MB了


[root@localhost ~]# vim /etc/fstab

# 编辑 /etc/fstab文件,使新创建的交换分区开机就自动挂载
#
# /etc/fstab
# Created by anaconda on Wed Jul  9 21:21:40 2014
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root               /      ext4  defaults 1 1
UUID=d9512fb3-8dd6-4613-ae55-8e99ba0ef627 /boot   ext4  defaults 1 2
/dev/mapper/VolGroup-lv_swap               swap   swap  defaults 0 0
tmpfs                                  /dev/shm   tmpfs defaults 0 0
devpts                          /dev/pts   devpts gid=5,mode=620 0 0
sysfs                                      /sys   sysfs defaults 0 0
proc                                      /proc   proc  defaults 0 0
/dev/sdb3                       /mydata   ext4  defaults,noatime 0 0

LABEL="NEWSWAP"          swap       swap    defaults    0      0
# 通过卷标指定需要挂载的设备  挂载点  文件系统类型   默认     不备份    不自检



本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1440084

6.文件系统——什么是交换分区以及如何创建和使用交换分区(free,reboot,mkswap,swapon,swapoff)