以前的年代因为内存不足,因此那个可以暂时将内存的程序拿到硬盘中暂放的内存置换空间 (swap) 就显的非常的重要! 否则,如果突然间某支程序用掉你大部分的内存,那你的系统恐怕有损毁的情 况发生喔!所以,早期在安装 Linux 之前,大家常常会告诉你: 安装时一定需要的两个 partition , 一个是根目录,另外一个就是 swap(内存置换空间)。关于内存置换空间的解释在第三章安装 Linux 内的磁盘分区时有约略提过,请你自行回头瞧瞧吧!
一般来说,如果硬件的配备资源足够的话,那么 swap 应该不会被我们的系统所使用到, swap 会 被利用到的时刻通常就是物理内存不足的情况了。从第零章的计算器概论当中,我们知道 CPU 所读 取的数据都来自于内存, 那当内存不足的时候,为了让后续的程序可以顺利的运作,因此在内存中 暂不使用的程序与数据就会被挪到 swap 中了。 此时内存就会空出来给需要执行的程序加载。由于 swap 是用磁盘来暂时放置内存中的信息,所以用到 swap 时,你的主机磁盘灯就会开始闪个不停啊! 虽然目前(2015)主机的内存都很大,至少都有 4GB 以上啰!因此在个人使用上,你不要设定 swap 在 你的 Linux 应该也没有什么太大的问题。 不过服务器可就不这么想了~由于你不会知道何时会有大 量来自网络的要求,因此最好还是能够预留一些 swap 来缓冲一下系统的内存用量! 至少达到『备 而不用』的地步啊!
现在想象一个情况,你已经将系统建立起来了,此时却才发现你没有建置 swap ~那该如何是好呢? 透过本章上面谈到的方法,你可以使用如下的方式来建立你的 swap 啰!
设定一个 swap partition
建立一个虚拟内存的文件
不啰唆,就立刻来处理处理吧!

使用实体分区构建swap

回到顶部

建立 swap 分区槽的方式也是非常的简单的!透过底下几个步骤就搞定啰:
1. 分区:先使用 gdisk 在你的磁盘中分区出一个分区槽给系统作为 swap 。由于 Linux 的 gdisk 预设会将分 区槽的 ID 设定为 Linux 的文件系统,所以你可能还得要设定一下 system ID 就是了。
2. 格式化:利用建立 swap 格式的『mkswap 装置文件名』就能够格式化该分区槽成为 swap 格式啰
3. 使用:最后将该 swap 装置启动,方法为:『swapon 装置文件名』。
4. 观察:最终透过 free 与 swapon -s 这个指令来观察一下内存的用量吧!不啰唆,立刻来实作看看!既然我们还有多余的磁盘容量可以分区,那么让我们继续分区出 512MB 的 磁盘分区槽吧! 然后将这个磁盘分区槽做成 swap 吧!

1. 先进行分区的行为啰!

              [root@initroot ~]# gdisk /dev/vda
              Command (? for help): n
              Partition number (6-128, default 6):
              First sector (34-83886046, default = 69220352) or {+-}size{KMGTP}:
              Last sector (69220352-83886046, default = 83886046) or {+-}size{KMGTP}: +512M
              Current type is 'Linux filesystem'
              Hex code or GUID (L to show codes, Enter = 8300): 8200
              Changed type of partition to 'Linux swap'
              Command (? for help): p
              Number
              6
              Start (sector)
              End (sector)
              69220352
              70268927
              Size
              512.0 MiB
              Code Name
              8200 Linux swap
              # 重点就是产生这东西!
              Command (? for help): w
              Do you want to proceed? (Y/N): y
              [root@initroot ~]# partprobe
              [root@initroot ~]# lsblk
              NAME MAJ:MIN RM
              vda 252:0
              SIZE RO TYPE MOUNTPOINT
              0 40G 0 disk
              0 512M 0 part
              .....(中间省略).....
              `-vda6
              252:6
              
# 确定这里是存在的才行! # 有简化输出喔!结果可以看到我们多了一个 /dev/vda6 可以使用于 swap 喔!

2. 开始建置 swap 格式

              [root@initroot ~]# mkswap /dev/vda6
              Setting up swapspace version 1, size = 524284 KiB
              no label, UUID=6b17e4ab-9bf9-43d6-88a0-73ab47855f9d
              [root@initroot ~]# blkid /dev/vda6
              /dev/vda6: UUID="6b17e4ab-9bf9-43d6-88a0-73ab47855f9d" TYPE="swap"
              
# 确定格式化成功!且使用 blkid 确实可以抓到这个装置了喔!

3. 开始观察与加载看看吧!

              [root@initroot ~]# free
              total
              used
              free
              shared
              buff/cache
              availableMem: 1275140 227244 330124
              Swap: 1048572 101340 947232
              7804
              717772
              875536
              
# 物理内存 # swap 相关 # 我有 1275140K 的物理内存,使用 227244K 剩余 330124K ,使用掉的内存有 # 717772K 用在缓冲/快取的用途中。至于 swap 已经有 1048572K 啰!这样会看了吧?!
              [root@initroot ~]# swapon /dev/vda6
              [root@initroot ~]# free
              total used free shared buff/cache available
              Mem: 1275140 227940 329256 7804 717944 874752
              Swap: 1572856 101260 1471596

              #有看到增加了没?
              [root@initroot ~]# swapon -s
              Filename Type Size
              Used
              /dev/dm-1 partition 1048572 101260 -1
              /dev/vda6 partition 524284 -2
              0
              Priority
              # 上面列出目前使用的 swap 装置有哪些的意思!
              [root@initroot ~]# nano /etc/fstab
              UUID="6b17e4ab-9bf9-43d6-88a0-73ab47855f9d"
              swap
              swap
              defaults
              0
              0
              
# 当然要写入配置文件,只不过不是文件系统,所以没有挂载点!第二个字段写入 swap 即可。

使用文件建置 swap

回到顶部

如果是在实体分区槽无法支持的环境下,此时前一小节提到的 loop 装置建置方法就派的上用场啦! 与实体分区槽不一样的,这个方法只是利用 dd 去建置一个大文件而已。多说无益,我们就再透过文 件建置的方法建立一个 128 MB 的内存置换空间吧!
1. 使用 dd 这个指令来新增一个 128MB 的文件在 /tmp 底下:

              [root@initroot ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128
              128+0 records in
              128+0 records out
              134217728 bytes (134 MB) copied, 1.7066 seconds, 78.6 MB/s
              [root@initroot ~]# ll -h /tmp/swap
              -rw-r--r--. 1 root root 128M Jun 26 17:47 /tmp/swap
              
这样一个 128MB 的文件就建置妥当。若忘记上述的各项参数的意义,请回前一小节查阅一下啰! 2. 使用 mkswap 将 /tmp/swap 这个文件格式化为 swap 的文件格式:
              [root@initroot ~]# mkswap /tmp/swapSetting up swapspace version 1, size = 131068 KiB
              no label, UUID=4746c8ce-3f73-4f83-b883-33b12fa7337c
              
# 这个指令下达时请『特别小心』,因为下错字元控制,将可能使您的文件系统挂掉! 3. 使用 swapon 来将 /tmp/swap 启动啰!
              [root@initroot ~]# swapon /tmp/swap
              [root@initroot ~]# swapon -s
              o
              Filename Type Size
              Used
              Priority
              /dev/dm-1 partition 1048572 100380 -1
              /dev/vda6 partition 524284 0 -2
              /tmp/swap file 131068 0 -3
              
4. 使用 swapoff 关掉 swap file,并设定自动启用
              [root@initroot ~]# nano /etc/fstab
              /tmp/swap
              swap
              swap
              defaults
              0
              0
              
# 为何这里不要使用 UUID 呢?这是因为系统仅会查询成组设备 (block device) 不会查询文件! # 所以,这里千万不要使用 UUID,不然系统会查不到喔!
              [root@initroot ~]# swapoff /tmp/swap /dev/vda6
              [root@initroot ~]# swapon -s
              Filename Type Size
              Used
              /dev/dm-1 partition 1048572 100380
              Priority
              -1
              
# 确定已经回复到原本的状态了!然后准备来测试!!
              [root@initroot ~]# swapon -a
              [root@initroot ~]# swapon -s
              
# 最终你又会看正确的三个 swap 出现啰!这也才确定你的 /etc/fstab 设定无误! 说实话,swap 在目前的桌面计算机来讲,存在的意义已经不大了!这是因为目前的 x86 主机所含的 内存实在都太大了 (一般入门级至少也都有 4GB 了),所以,我们的 Linux 系统大概都用不到 swap 这个玩意儿的。不过, 如果是针对服务器或者是工作站这些常年上线的系统来说的话,那么,无论 如何,swap 还是需要建立的。
因为 swap 主要的功能是当物理内存不够时,则某些在内存当中所占的程序会暂时被移动到 swap 当中,让物理内存可以被需要的程序来使用。另外,如果你的主机支持电源管理模式, 也就是说, 你的 Linux 主机系统可以进入『休眠』模式的话,那么, 运作当中的程序状态则会被纪录到 swap 去, 以作为『唤醒』主机的状态依据! 另外,有某些程序在运作时,本来就会利用 swap 的特性来存放 一些数据段, 所以, swap 来是需要建立的!只是不需要太大!
7.6 文件系统的特殊观察与操作 文件系统实在是非常有趣的东西,学了好几年还是很多东西不很懂呢!在学习的过程中很多朋友 在讨论区都有提供一些想法! 这些想法将他归纳起来有底下几点可以参考的数据呢!

7.6.1 磁盘空间之浪费问题
我们在前面的 EXT2 data block 介绍中谈到了一个 block 只能放置一个文件, 因此太多小文件将会 浪费非常多的磁盘容量。但你有没有注意到,整个文件系统中包括 superblock, inode table 与其他中 介数据等其实都会浪费磁盘容量喔!所以当我们在 /dev/vda4, /dev/vda5 建立起 xfs/ext4 文件系统时, 一挂载就立刻有很多容量被用掉了!
另外,不知道你有没有发现到,当你使用 ls -l 去查询某个目录下的数据时,第一行都会出现一个『total』 的字样! 那是啥东西?其实那就是该目录下的所有数据所耗用的实际 block 数量 * block 大小的值。 我们可以透过 ll -s 来观察看看上述的意义:

              [root@initroot ~]# ll -sh
              total 12K
              4.0K -rw-------. 1 root root 1.8K May
              4.0K -rw-r--r--. 2 root root
              0 lrwxrwxrwx. 1 root root
              4 17:57 anaconda-ks.cfg
              451 Jun 10
              2014 crontab
              12 Jun 23 22:31 crontab2 -> /etc/crontab
              4.0K -rw-r--r--. 1 root root 1.9K May
              4 18:01 initial-setup-ks.cfg
              0 -rw-r--r--. 1 root root 0 Jun 16 01:11 test1
              0 drwxr-xr-x. 2 root root 6 Jun 16 01:11 test2
              0 -rw-rw-r--. 1 root root 0 Jun 16 01:12 test3
              0 drwxrwxr-x. 2 root root 6 Jun 16 01:12 test4
              
从上面的特殊字体部分,那就是每个文件所使用掉 block 的容量!举例来说,那个 crontab 虽然仅 有 451bytes , 不过他却占用了整个 block (每个 block 为 4K),所以将所有的文件的所有的 block 加总就得到 12Kbytes 那个数值了。 如果计算每个文件实际容量的加总结果,其实只有不到 5K 而 已~所以啰,这样就耗费掉好多容量了!未来大家在讨论小磁盘、 大磁盘,文件容量的损耗时,要 回想到这个区块喔! ^_^

initroot编辑整理,转载请注明www.initroot.com