如何将交换添加到运行 Ubuntu 12.04 LTS 的 Amazon EC2 实例



默认的Ubuntu 12.04 LTS由于某种原因不会创建交换。安装后是否有"适当"的添加方法?

root@aux3:/根# df -h使用的文件系统大小 可用 使用百分比 挂载/dev/xvda1 8.0G 1.4G 6.3G 18%/udev 1.9G 12K 1.9G 1%/devTMPFS 751M 188K 750M 1%/运行无 5.0M 0 5.0M 0%/运行/锁定无 1.9G 0 1.9G 0%/运行/SHM/dev/xvdb 394G 79G 296G 21%/mntroot@aux3:/root# swapon -s文件名root@aux3:/root# free -m             缓存的可用共享缓冲区已用总数内存: 3750 3730 20 0 75 3433-/+ 缓冲区/缓存: 221 3528交换: 0 0 0root@aux3:/根#

更新:通过交换文件找到临时解决方案:

(不过我仍在寻找"适当"的方式)

dd if=/dev/zero of=/mnt/swap1 bs=1024 count=4Mmkswap/mnt/swap1chown root.root/mnt/swap1CHMOD 600/MNT/swap1swapon/mnt/swap1

因为我花了大半天的时间为自己理解这个问题,并且因为拉出阿育吟辰的链接需要谷歌缓存搜索,我想我会发布一个稍微更详细的演练,借鉴阿育吟辰非常有用的答案。

什么是交换空间,为什么要使用它?

交换空间是 Linux(和大多数其他操作系统)在实际物理内存开始变得拥挤时用于存储内存中的对象的磁盘空间。由于磁盘通常比内存慢,因此 Linux 首先存储交换最近最少使用的对象,并在内存中保留尽可能多的对象。如果可能,通常建议使用与内存大小相等的交换空间。在此处查看有关交换空间的更多详细信息。

我应该在哪里设置?

Ubuntu 12.04 LTS AMI 也是我开始使用的,最初配置没有交换空间,因为存储设备的大小和数量可能会有所不同。但大多数都自动带有一个大型免费临时存储设备。由于 S3 存储受成本限制,因此临时驱动器是交换文件的好地方。Mine 的设备名称与问题中提到的设备名称相同,/dev/xvdb ,但您可以在实例启动期间对其进行配置。

如何在临时存储驱动器上设置交换空间?

交换空间可以在单个文件或设备的分区上设置。文件可以由磁盘上的非相邻块表示,而分区是一组预定义的相邻块。由于磁盘读写速度更快,因此您不必一直长距离移动读头,因此使用分区可以获得更好的性能。(这就是为什么上面的问题会打折使用文件作为临时解决方案的原因。

Linux附带了许多程序来管理磁盘分区,包括fdisk,sfdisk,parted等。我们将使用 sfdisk ,因为它可以接受来自 shell 脚本的所有必要参数。这很重要,因为每次我们"停止"实例时,临时存储都会丢失。因此,我们在文件中设置了一个脚本,该脚本在每次启动实例时自动运行,/etc/rc.local .

# Unmount the drive in-case it is already mounted. Umount throws an error if
# it wasn't mounted, so we add || : to continue the script in that case
umount /dev/xvdb || :
# Each line below is a partition (4 maximum master partitions for this partition 
# type). Can can generally use the default arguments, supplying only the amount
# of space we want in blocks (512 came out to ~4gb for me), and the partition
# type (82 for swap, 83 for general linux is default). This will create:
# dev/xvdb1 with 1024 blocks
# dev/xvdb2 with the remainder of the disk
sfdisk /dev/xvdb << EOF
,512,82
;
;
;
EOF
# Now we format the swap partition:
mkswap /dev/xvdb1
# And the remainder. You can choose amoung the various filesystem types, but
# make sure you have the necessary formatter installed. To check, ls /sbin/mk*
mkfs.ext4 /dev/xvdb2

最后,我更喜欢在 /etc/fstab 中包含我的挂载信息,这是 Ubuntu 上的一个系统文件,规定了如何自动处理各种可用设备。它也在启动时运行。

/dev/xvdb1      swap    swap    sw,nobootwait      0 0
/dev/xvdb2      /mnt2   ext4    defaults,nobootwait        0 0

nobootwait 选项是为了确保 Ubuntu 不会在启动时挂起"/dev/xvdb(1/2) 的磁盘驱动器尚未准备好或不存在。继续等待,或按 S 跳过装载,或按 M 手动恢复。

确保在/mnt2或计划使用 mkdir 安装此文件夹的任何位置创建一个文件夹。

如何调试我遇到的问题?

您可以使用sudo /etc/rc.local运行 rc.local 脚本,以观察它运行以查找问题。 sudo fdisk -l应该在运行后显示您的新分区。如果看起来没问题,请尝试使用 sudo mount /dev/xvdb1 安装设备。这将使用您在 fstab 中保存的配置。如果失败,请尝试使用安装参数并相应地调整 fstab。

也许你正在寻找这个:http://inprvt.com/index.php/blogs/entry/how-to-add-swap-space-on-a-linux-based-ec2-server

请参阅第二种方法。您需要对临时存储设备重新分区。我会把这些东西放到/etc/rc.local 上:

umount /dev/xvdb # in case it is already mounted
sfdisk /dev/xvdb << EOF
,1024,82
,
;
;
EOF
mkswap /dev/xvdb1 && swapon /dev/xvdb1
mkfs.xfs -f /dev/xvdb2 && mount /dev/xvdb2 /mnt

需要注意的两件事:

  • 上面的 1024 是以块为单位的大小(82 是 Linux 交换分区类型)。似乎对于不同的实例,块大小可以不同(就像设备名称一样)。因此,请先进行实验或计算适合您的内容在 SFDISK 输出上。
  • mkfs.xfs 通常需要几秒钟。mkfs.ext4 可能需要半小时(在 1TB 卷上)。YMMV 取决于您选择的文件系统。
找到交换

空间守护程序,负责按需创建和删除交换文件。它只需要很少的调整即可将交换文件保存在临时驱动器上。

在我看来,这是最优雅的解决方案:

DEBIAN_FRONTEND=noninteractive apt-get -y install swapspace
echo 'swappath="/mnt"' >> /etc/swapspace.conf
service swapspace restart

我首先设置了swapspace(必须从源代码构建一个),但后来决定回退到手动解决方案,因为我更喜欢在生产环境中对内存进行更多控制

我假设 2 个实例块设备的挂载已经在 /etc/fstab 中配置为 /.inst0/.inst1

/etc/rc.local中添加类似以下内容:

setup_swap()
{
  for D in /.inst0 /.inst1; do
    findmnt $D || continue
    cd $D || continue
    test -r swapfile || dd if=/dev/zero of=swapfile bs=1M count=12292
    chmod 600 swapfile
    mkswap swapfile
    swapon swapfile
  done
}
setup_swap

该代码与 EC2 实例存储(又名 SSD,又名"临时",每次停止实例时都会销毁)完全兼容,并且易于重启。

请记住,创建和/或启用交换文件需要一段时间,因此请在重新启动后给它一点时间,看看它是否有效。 :)

要在引导时启用交换(按照上述说明创建交换文件后),请将以下条目添加到/etc/fstab:

/mnt/swap1 swap swap defaults 0 0

最新更新