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

rdo*_*nko 6 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

zri*_*her 9

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

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

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

我应该在哪里设置它?

我也开始使用的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
Run Code Online (Sandbox Code Playgroud)

最后,我更喜欢,包括我的安装信息/etc/fstab,这是规定如何自动处理各种可用的设备在Ubuntu的系统文件.它也在启动时运行.

/dev/xvdb1      swap    swap    sw,nobootwait      0 0
/dev/xvdb2      /mnt2   ext4    defaults,nobootwait        0 0
Run Code Online (Sandbox Code Playgroud)

该nobootwait选择是确保Ubuntu的不开机挂有"为/ dev的磁盘驱动器/ xvdb(1/2)还没有准备好或不存在.继续等待,或按S键跳过安装或M手动复苏."

请确保您创建一个文件夹/mnt2或任何你计划使用的mkdir安装此.

如何调试我遇到的问题?

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

  • 仅供参考:默认配置Ubuntu AMI没有交换空间的原因是因为并非所有实例类型都带有免费的临时存储设备.例如[m3.xlarge不](http://aws.amazon.com/ec2/instance-types/#instance-details). (3认同)

ayu*_*hen 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
Run Code Online (Sandbox Code Playgroud)

有两点需要注意:

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