Linux 系统中指定的 EBS 卷名和实际设备名之间的链接

Posted

技术标签:

【中文标题】Linux 系统中指定的 EBS 卷名和实际设备名之间的链接【英文标题】:Link between specified EBS volume name and actual device name in Linux system 【发布时间】:2017-02-26 20:54:06 【问题描述】:

我有附有 EBS 卷的 EC2 实例,因此 describe-instances 命令打印:

     "DeviceName": "/dev/sdf",
     "Ebs":    "Status": "attached",
                "DeleteOnTermination": false,
                "VolumeId": "vol-04bfa2fab8e57a3dc",
                "AttachTime": "2016-09-26T09:39:08.000Z"   

根据文档:

根据内核的块设备驱动程序,设备的附加名称可能与您指定的名称不同

在我的例子中,这个卷的实际名称是/dev/xvdf

是否可以从实例中知道在 Amazon 控制台中为卷指定了哪个名称?

反之亦然 - 要知道 linux 将使用哪个实际名称来表示实例外部的卷?

【问题讨论】:

【参考方案1】:

这让我对基于 Nitro 的实例感到抓狂,其中实例上的设备名称可能与 AWS 控制台中显示的顺序不同。幸运的是,根据AWS documentation,实例上设备的序列号设置为 EBS 卷 ID。所以就跑吧

lsblk -o +SERIAL

它会为您提供控制台中显示的卷 ID。

【讨论】:

这就是答案。【参考方案2】:

正在回复here

您在 Xen VPS(或虚拟机)上; xvd* 就是 Xen 磁盘存储设备(Xen Virtual block Device)。当您使用更高效的半虚拟化 Xen 磁盘驱动程序而不是直接 SCSI 磁盘仿真时,它们会出现而不是 sda 等。如果您在 Xen HVM 上列出已安装的模块(驱动程序),该驱动程序将显示为 blkfront(或 xen_blk,如果您在非常旧的 Xen 版本上运行 - 非常罕见)。

简而言之,就像对待普通 PC 上的 sda1 一样对待 xvda1

AWS docs中也提到过

根据内核的块设备驱动程序,设备的附加名称可能与您指定的名称不同。例如,如果您指定设备名称为 /dev/sdh,您的设备可能会被内核重命名为 /dev/xvdh 或 /dev/hdh;在大多数情况下,尾随字母保持不变。在 Red Hat Enterprise Linux 的某些版本(及其变体,例如 CentOS)中,甚至尾随字母也可能更改(其中 /dev/sda 可能变为 /dev/xvde)。在这些情况下,每个设备名称的尾随字母都会增加相同的次数。例如,/dev/sdb 会变成 /dev/xvdf,/dev/sdc 会变成 /dev/xvdg。 Amazon Linux AMI 使用您在启动时指定的名称创建一个符号链接,指向重命名的设备路径,但其他 AMI 的行为可能不同。

【讨论】:

【参考方案3】:

从 AWS 控制台您永远无法知道,因为此映射是由操作系统完成的。 在 Amazon AMI 中,它可能具有不同的设备,但始终存在从您请求的原始设备到系统上实际设备的链接,因此您始终可以将 DeviceName 用作实际设备。 在 RedHat 中是不同的,但保持顺序是合乎逻辑的。

【讨论】:

您能否进一步澄清一下-您提到从原始设备到系统上的实际设备始终存在链接-但是如何获取此链接?在我的系统中,与 fs 相关的命令只显示实际名称,而不是原始名称。 只有 Amazon Linux 创建链接,并非所有 Linux 发行版【参考方案4】:

正如defined in the aws documentation 和@YairCarel 所暗示的,设备驱动程序映射是特定于操作系统的。

但是对于一个特定的发行版,它总是一样的。因此,如果您知道您正在开发的 linux 发行版,您可以计算出来。

例如 Amazon Linux 将在 AWS 控制台上保留该名称(或至少为其创建一个符号链接)。 Ubuntu 将使用不同的前缀 /dev/xvd? 而不是 /dev/sd?。 而 Redhat 系列通常会以固定偏移量递增尾随字母,因此 /dev/xvdf 映射到 /dev/sdb

【讨论】:

【参考方案5】:

使用亚马逊提供的命令来做到这一点:

$ sudo /sbin/ebsnvme-id /dev/nvme1n1
Volume ID: vol-031dbe1a58ac242cc
/dev/sdg

看起来 Windows 也有。

更多详情:https://medium.com/@ripon.banik/how-to-find-ebs-volume-id-for-nvme-volume-1148d7499dc

【讨论】:

【参考方案6】:

这是我的 bash 脚本,用于为 Ubuntu-18.04 上的 EBS 卷创建正确的符号链接。它可以在启动时在 UserData 中运行,因此已经以多行格式呈现。

echo "--- Create symlinks ---"
disks=$(lsblk | grep "^nvme" | cut -d" " -f1)
for disk in $disks; \
do name=$(nvme id-ctrl --output binary /dev/$disk | cut -c3073-3104 | tr -d '\0'); \
    if [ -z "$name" ]; then name="xvdz"; fi; \
    ln -s /dev/$disk /dev/$name; \
done

echo "--- Mount SSD disk ---"
echo "/dev/sdz1 /opt/ephemeral ext4 errors=remount-ro 1 2" >> /etc/fstab
mkfs.ext4 /dev/xvdz

echo "--- Mount EBS disk created as xvdf ---"
echo "/dev/xvdf /opt/persist ext4 errors=remount-ro 1 2" >> /etc/fstab
mkfs.ext4 /dev/xvdf

mount -a

您必须安装nvme-cli 工具才能工作。请注意 SSD 类型实例的特殊情况。 nvme内存中没有别名,所以我们手动定义为xvdz。

对于所有其他 EBS 卷,它可以使用在 AWS 控制台/CloudFormation/Terraform 中定义的别名,例如 xvdf 在这种情况下

Reference

【讨论】:

以上是关于Linux 系统中指定的 EBS 卷名和实际设备名之间的链接的主要内容,如果未能解决你的问题,请参考以下文章

linux 挂载光驱命令mount /mnt/cdrom是啥意思?

linux系统中使用mount命令挂载文件系统的格式中设备名和安装点分别是啥?

linux下如何提取日志中指定的一段内容?100分急求!!!

kalilinux系统怎么装

如何获取设备数据?

如何限制SSH用户访问Linux中指定的目录