交换空间是虚拟内存的关键。
当系统的RAM不足时,它可以将磁盘空间用作临时内存。
磁盘至少比物理内存慢一个数量级,但可以帮助弥补暂时的短缺。
一个古老的经验法则认为,平均程序80%的时间花在20%的代码上,剩余的代码包含错误处理、启动和关闭过程等。
如果需要大量交换空间,且有多个磁盘,建议在各磁盘上平均分配交换空间。
FreeBSD系统最好是在四个不同的磁盘上有四个交换分区。
添加更多的内存,就不要那么多交换空间了。
在许多系统中,大量的交换空间对系统性能没有帮助。
如果系统因内存耗尽而发生故障,大量的交换空间可能会使机器的故障时间更长。与其说是快速崩溃和快速重启,不如说是缓慢而持久的死亡,伴随着大量的不适和糟糕的性能,然后是同样的崩溃和重启。
使用swpainfo命令查看当前系统有多少交换空间:
xxxxxxxxxx
# swapinfo
Device 1K-blocks Used Avail Capacity
/dev/gpt/swap1 8388608 0 8388608 0%
/dev/gpt/swap0 8388608 0 8388608 0%
Total 16777216 0 16777216 0%
此系统有两个交换分区,/dev/gpt/swap0和/dev/gpt/swap1。
使用glabel list命令可以查看到这些分区位于ada0和ada1磁盘上。
最后一行现实这台机器的交换空间未被使用。显然,服务器负担很轻。
许多服务器级系统有可以热插拔的硬盘驱动器。如果驱动器遇到错误,需要在错误变得更严重之前更换它。
卸载分区很容易,但如何停用交换空间呢?
使用swapoff关闭交换分区:
xxxxxxxxxx
# swapoff /dev/gpt/swap0
必须等待内核将所有占用的交换空间从该驱动器移动到剩余的交换分区上。
如果系统没有足够的交换空间来处理所占用的交换,它将拒绝释放交换分区。
如果一个有两个8GB交换分区的系统使用了超过8GB的交换,FreeBSD不会分离任何一个交换分区。必须先添加交换空间,然后才能删除其中一个正在使用的交换分区。
使用swapon命令和新分区的设备节点来添加交换分区:
xxxxxxxxxx
# swapon /dev/gpt/swap0
这使您可以在不关闭系统的情况下更换发生故障的驱动器——前提是您有足够的备用交换空间来处理临时短缺。
如果需要更多的交换空间,但又没有多余的设备,可以使用一个文件作为交换空间。
使用文件作为交换空间并不理想,以为虚拟内存系统会受到文件系统带来的额外开销的影响。仅建议在弥补临时短缺时使用文件作为交换空间,例如更换故障驱动器时。
首先创建一个交换文件。此文件不需要任何内容,但确实需要正确的大小。以下示例创建一个包含一大堆零的文件。有人建议使用稀疏文件(使用seek选项,而不是count选项),但FFS会碎片化稀疏文件。
xxxxxxxxxx
# dd if=/dev/zero of=/tmp/tempswap.swp bs=1 count=8g
以上操作告诉dd命令将/dev/zero设备复制到/tmp/tempswap.swp文件。块大小为1,因此dd以1个扇区为单位写入。直到文件达到8GB。
现在将交换文件附加到内存设备:
xxxxxxxxxx
# mdconfig -a -t vnode -f tempswap.swp
md0
tempswap.swp文件将被附加到设备md0。使用swapon命令激活此交换空间:
xxxxxxxxxx
# swapon /dev/md0
现在有了更多的交换空间。更换驱动器。
建议添加更多内存。
对于FreeBSD9或更早的系统,需要在/etc/rc.conf中指定swapfile值:
xxxxxxxxxx
swapfile=”/tmp/tempswap.swp”
对于FreeBSD10或更新的系统,需要编辑/etc/fstab文件,加入以下行,用file挂载指定路径中的交换文件:
xxxxxxxxxx
md0 none swap sw,file=/tmp/tempswap.swp 0 0
内存可以包含敏感信息,如密码、密码短语、信用卡号码等。
如果这些信息被写入磁盘,恶意用户可能会读取它。
交换空间中的信息甚至在系统重启后仍然存在。
加密交换空间是一种明智而明显的预防措施。
在/etc/fstab文件中对应条目的交换设备的名称尾部添加.eli或.bde:
xxxxxxxxxx
/dev/gpt/swap0.eli none swap sw 0 0
/dev/gpt/swap1.eli none swap sw 0 0
swapon程序识别这些标记,并自动使用一次性密钥对其加密。
虽然写入磁盘的数据可能会在重启后留在磁盘上,但一次性密钥肯定不会。
即使是系统管理员也无法在重启后从一次性密钥加密的交换空间中恢复数据。