在启动 Amazon EC2 Linux 实例时自动挂载 EBS 卷

Posted

技术标签:

【中文标题】在启动 Amazon EC2 Linux 实例时自动挂载 EBS 卷【英文标题】:Automatically mount an EBS volume upon starting an Amazon EC2 Linux instance 【发布时间】:2011-08-25 19:05:13 【问题描述】:

我有一个 EBS 卷(例如 /dev/sdf)已附加到 EC2 实例(从不同的 EBS 卷引导),并且我已安装该卷(通过 mount /dev/sdf /data)。当我停止并重新启动实例时,该卷仍然附加但不再安装,我必须再次手动安装它。

有没有办法让卷/dev/sdf 在启动实例时自动挂载到/data

【问题讨论】:

您可以将其放置到 /etc/fstab 但必须先附加 EBS 卷。另一种选择是编写一个将附加卷并将其挂载到实例上的初始化脚本。 有人可以解释如何编写这样的初始化脚本以及如何使其在系统启动时可执行吗?根据标题,这仍然是主要问题的一部分:)谢谢,如果有人可以回答。 【参考方案1】:

似乎官方 ec2 文档现在建议使用 nofail 的普通旧 fstab 条目 -

/dev/xvdf       /data   ext4    defaults,nofail        0       2

参考-http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-using-volumes.html

【讨论】:

...Debian/Ubuntu 用户需要注意的一点:Debian 衍生产品,例如 Ubuntu,还必须添加 nobootwait 挂载选项。 @havelock 关于nobootwait 选项...解决了什么问题? 如果您的 EBS 卷由于某种原因无法挂载,如果没有该选项,您的实例可能无法启动。 unix.stackexchange.com/questions/53456/… nobootwait 掉入 ubuntu 16.04 askubuntu.com/questions/786928/…【参考方案2】:

进入/etc/fstab

条目如下:

/dev/sdf    /data   ext3    defaults    1 1

这将在重新启动期间自动挂载卷。

【讨论】:

虽然可行,但 Amazon 支持对此事的说法如下:我建议考虑使用 RC 初始化脚本,而不是为此使用 fstab(对于 EC2 实例)。如果 fstab 中列出的设备无法挂载,那么这将停止引导过程,您将无法 ssh 进入实例。相反,使用 RC 脚本可能会导致“软故障”发生,因此您仍然可以通过 ssh 登录然后修复问题。请参阅此处的完整主题:forums.aws.amazon.com/message.jspa?messageID=304528#304528 两全其美 - 使用 fstab 条目但指定默认值,noauto 告诉它不要在启动时自动挂载。然后使用 rc 脚本挂载文件系统。这可以解决挂载失败停止引导并将驱动器挂载点保留在 fstab 中的问题。 可能是个好主意 /dev/sdf /data ext3 defaults 0 0 最后两个标志设置为 0 表示: 启用或禁用设备/分区的备份(命令转储)。该字段通常设置为 0,即禁用它。 控制 fsck 在引导时检查设备/分区是否有错误的顺序。根设备应为 1。其他分区应为 2,或 0 以禁用检查。 (来自help.ubuntu.com/community/Fstab) 正如@chrismarx 下面的注释,现在推荐使用 nofail 选项。【参考方案3】:

我建议使用 /etc/init conf 文件来执行此操作:

用root登录 创建一个新文件(不可执行),将其命名为:mountec2vol.conf 把这段代码粘贴进去:
# /etc/init/mountec2vol.conf
#
# description: Mounts the EBS Volume
#
start on net-device-up
exec mount /dev/xvdf1 /myVolume`
如果要测试,请重新启动

这就是你所要做的!

【讨论】:

EBS 卷实际上并不依赖于 EC2 实例中的网络设备初始化,它们作为本地块设备呈现给它。 谢谢。它适用于我的情况,虽然它似乎是非标准的【参考方案4】:

可证明的证明是official doc

你需要这样一段代码:

DEVICE=/dev/$(lsblk -rno NAME | awk 'FNR == 3 print')
MOUNT_POINT=/data/

cp /etc/fstab /etc/fstab.orig
UUID=$(blkid | grep $DEVICE | awk -F '\"' 'print $2')
echo -e "UUID=$UUID     $MOUNT_POINT      xfs    defaults,nofail   0   2" >> /etc/fstab
umount /data
mount -a

如果您要使用 Terraform 启动实例,带有附加和安装功能的 EBS,您可以使用我的备忘单中的所有代码AWS-EBS-Attach-Mount

【讨论】:

以上是关于在启动 Amazon EC2 Linux 实例时自动挂载 EBS 卷的主要内容,如果未能解决你的问题,请参考以下文章

Amazon EC2 密钥对

EC2 上的 LAMP 服务器(Amazon Linux 微实例)

启动 Amazon EC2 实例时如何自动启动 Web 服务?

自动关闭和启动 Amazon EC2 实例

如何在 .NET 中以编程方式启动 Amazon EC2 实例

如何在 Java 中以编程方式启动和停止 Amazon EC2 实例