在正在运行的EC2实例上,如何识别EBS卷和本地磁盘? 我想从shell中找出它们。
fdisk,lsblk只能帮助查明EBS卷。
比方说,我总共有20个磁盘,20个识别ebs商店。
有什么build议么?
每个EC2实例都可以访问链接本地地址http://169.254.169.254处的REST端点,从而提供对该实例的元数据的访问。
EBS和实例存储卷的块设备映射是那里可用的几个属性之一,并且可以使用类似“curl”的工具从shell和脚本轻松访问数据。
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
这可能是发现你要找的东西的“最正确”的方法。
更新:我敲出了一个快速和非常肮脏的单线程来演示这个function。 我不打算暗示这是生产质量代码,也不是特别有据可查的,但它绝对有效。
上面的terminal似乎提供了几个接口的“版本”,其中大部分使用版本发布date,或者您可以使用“最新版本”。 因此,即使界面发生变化,此示例代码也将继续工作,我将select版本“2012-01-12”。
我们将在shellvariables$ METAURL中存储一个链接,然后用curl检索可用的映射列表,然后遍历每个使用bash for / do / done循环(再次使用curl )的映射来查找块设备…然后使用perl使它更整洁,并将“sdX”重写为“xvdX”,就像我的特定实例使用它的设备名称一样,最后sort词汇顺序sorting。
bash$ METAURL="http://169.254.169.254/2012-01-12/meta-data/block-device-mapping/" bash$for bd in `curl -s $METAURL`; do curl -s $METAURL$bd | \ perl -pe 'BEGIN { $d = shift } s/^(\/dev\/)?(sd)?(.*)$/\/dev\/xvd$3 is $d\n/' $bd; \ done | sort
示例输出:
/dev/xvda1 is ami /dev/xvda1 is root /dev/xvdb is ephemeral0 /dev/xvdf is ebs2 /dev/xvdg is ebs1 /dev/xvdh is ebs5
这是相当光滑,相对无痛。
但是,我的答案有一个小问题 。
块的设备映射/ ebsN
与Amazon EBS卷关联的虚拟设备(如果存在)。 如果此值在启动时存在,则此值仅在元数据中可用。
此解决scheme不会告诉您有关实例启动后安装的EBS卷。 这可能是好的,因为临时卷信息总是可用的,因为临时磁盘只能在启动时添加,不能晚于…所以如果一个卷是短暂的,你应该总是能够通过这种方法发现它。 如果不在这里,它不是一个短暂的磁盘。
鉴于此,如果您确实需要了解所有与实例相关的内容,则EC2 API或aws cli实用程序(将调用EC2 API)将是您需要使用的。 这里有更多的数据,但是在脚本中使用会更有趣。 经典的折衷,我想。
Michael的回答显示,似乎没有办法在AWS实例中区分实例磁盘和EBS卷。 实际上,除了写统计信息和设备名称之外,实例和EBS磁盘的内核信息(可以与diff -r /sys/block/xvd{f,g} )是相同的。 而磁盘不响应smartctl 。
不过,我注意到:
新的EBS卷似乎没有任何分区表。
新的临时磁盘似乎是ext格式化的,并且“mount count”超级块参数设置为0,以反映它们从未被安装在任何地方的事实。
使用它,一种方法是在机器第一次启动时运行一个脚本,查找ext格式化的设备
tune2fs -l $dev | grep "Mount count"
返回0.保存实例上某个位置的磁盘列表,并将所有其他磁盘视为EBS。
亚马逊当然有责任随时更改所有这一切,恕不另行通知。 但现在似乎工作。