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

时间:2012-07-05 19:12:23

标签: ubuntu-12.04

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

root@aux3:/root# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      8.0G  1.4G  6.3G  18% /
udev            1.9G   12K  1.9G   1% /dev
tmpfs           751M  188K  750M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            1.9G     0  1.9G   0% /run/shm
/dev/xvdb       394G   79G  296G  21% /mnt

root@aux3:/root# swapon -s
Filename
root@aux3:/root# free -m
             total       used       free     shared    buffers     cached
Mem:          3750       3730         20          0         75       3433
-/+ buffers/cache:        221       3528
Swap:            0          0          0
root@aux3:/root# 

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

(我仍在寻找“正确”的方式)

dd if=/dev/zero of=/mnt/swap1 bs=1024 count=4M
mkswap /mnt/swap1
chown root.root /mnt/swap1
chmod 600 /mnt/swap1
swapon /mnt/swap1

5 个答案:

答案 0 :(得分:9)

因为我花了大部分时间为自己理解这个问题,并且因为拉起ayurchen的链接需要谷歌缓存搜索,我想我会发布一个稍微更详细的演练,从ayurchen的非常有用的答案中提取

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

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

我应该在哪里设置它?

我开始使用的Ubuntu 12.04 LTS AMI最初配置时没有交换空间,因为存储设备的大小和数量可能会有所不同。但大多数都会自动带有一个大型的免费短暂的存储设备。由于S3存储受成本限制,因此短暂驱动器是交换文件的好地方。我的问题/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。

答案 1 :(得分:3)

也许您正在寻找: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取决于您选择的文件系统。

答案 2 :(得分:1)

找到 swapspace 守护程序,负责根据需要创建和删除交换文件。 它只需要很少的调整就可以在短暂的驱动器上保存交换文件。

这似乎是我最优雅的解决方案:

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

答案 3 :(得分:1)

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

我假设已在/etc/fstab/.inst0/.inst1配置了2个实例块设备的安装。

/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,又名“ephemeral”,每次停止实例时都会被销毁),并且可以重新启动。

请注意需要一段时间来创建和/或启用交换文件,因此给它一点时间一旦重新启动以查看它是否有效。 :)

答案 4 :(得分:0)

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

/mnt/swap1 swap swap defaults 0 0