一、交换分区:swap
目前几乎所有的操作系统都是多任务多用户的,且使用了MMU完成了内存保护,以使得多进程得以完成。如此一来,每个进程都有自己的线性地址空间,其中的数据会被映射到物理地址空间中。
第一个进程使用第一个线性地址空间,第二个进程使用第二个线性地址空间,依此类推,而这些进程真正使用的内存会被放置到物理内存中。而物理内存被划分为单个的页框(可以存储页面数据的单元),于是第一个进程可能使用的是物理内存中的第三个页框,第二个进程使用的可能是第一个页框,第一个进程又开启了一块数据,使用的是第三个页框,因此这些进程使用的页框在真正的物理内存中很可能是离散的。
如果整个物理内存一共只有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选项改为MB或GB单位来显示:
[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 [email protected] (/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 # 通过卷标指定需要挂载的设备 挂载点 文件系统类型 默认 不备份 不自检