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

45

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

是否有一种方法可以使卷/dev/sdf在启动实例时自动挂载到/data


3
你可以将其放置在 /etc/fstab 中,但必须先附加 EBS 卷。另一个选项是编写初始化脚本,该脚本将附加卷并将其挂载到实例上。 - Rodney Quillo
有人可以解释一下如何编写这样的初始化脚本以及如何在系统启动时使其可执行吗?根据标题,这仍然是主要问题的一部分 :) 如果有人能回答,谢谢。 - Anton Babenko
4个回答

40

3
对于Debian/Ubuntu用户需要注意一件事:Debian的派生版,如Ubuntu,也必须添加 nobootwait 挂载选项。 - havelock
@havelock 关于 nobootwait 选项... 它解决了什么问题? - william_grisaitis
如果由于某种原因您的EBS卷无法挂载,那么您的实例可能会在没有该选项的情况下无法启动。http://unix.stackexchange.com/questions/53456/what-is-the-difference-between-nobootwait-and-nofail-in-fstab - havelock
1
nobootwait在Ubuntu 16.04中已被删除。https://askubuntu.com/questions/786928/ubuntu-16-04-fstab-fails-with-nobootwait - Doron Cohen

30

创建一个在 /etc/fstab 文件中的条目。

该条目应类似于:

/dev/sdf    /data   ext3    defaults    1 1

这将会在重启时自动挂载该卷。


31
虽然这种方法可以行得通,但以下是亚马逊支持的建议: 我建议您使用RC init脚本来代替 fstab 来挂载存储设备(EC2 实例)。如果在 fstab 中列出的某个设备无法挂载,则会停止启动过程,您将无法通过ssh连接到实例。相反,使用RC脚本可以允许“软故障”发生,这样您仍然可以ssh登录并解决问题。在此处查看完整线程:https://forums.aws.amazon.com/message.jspa?messageID=304528#304528 - Achilles
4
最佳方案 - 使用 fstab 条目,但指定 defaults,noauto,告诉它不要在启动时自动挂载。然后使用 rc 脚本来挂载文件系统。这可以解决挂载失败导致启动停止的问题,并保持 fstab 中驱动器的挂载点。 - Robert Brown
可能做/dev/sdf /data ext3 defaults 0 0是个好主意。 最后两个标志设置为0的含义是: <dump> 启用或禁用设备/分区的备份(命令dump)。该字段通常设置为0,表示禁用。 <pass num> 控制fsck在启动时检查设备/分区错误的顺序。根设备应为1。其他分区应为2,或者为0以禁用检查。(来自https://help.ubuntu.com/community/Fstab) - Ayush Gupta
1
正如@chrismarx在下面指出的那样,现在建议使用nofail选项。 - Jim Meyer

9

我建议使用一个/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实例中的网络设备初始化,它们被呈现为本地块设备。 - Josip Rodin
谢谢。在我的情况下它有效,尽管它似乎不是标准的。 - Hoang Tran

5

可验证的证明,请查看官方文档

你需要这样一段代码:

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 的速查表中的所有代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接