解锁加密 Linux 磁盘进行脱机修复

适用于:✔️ Linux VM

本文介绍如何解锁启用了 Azure 磁盘加密 (ADE) 的 OS 磁盘进行脱机修复。

Azure 磁盘加密可以应用于Microsoft认可的 Linux 虚拟机(VM)。 下面是在 Linux VM 中启用Azure 磁盘加密的一些基本要求:

现象

如果在 OS 磁盘上启用了 ADE,则尝试在修复 VM 上装载磁盘后,可能会收到以下错误消息:

mount: error fs type, bad option, bad superblock on /dev/sda2, missing codepage or helper program, or other error

mount:未知文件系统类型“LVM2_member”

准备

在解锁加密的 OS 磁盘进行脱机修复之前,请完成以下任务:

  1. 确认磁盘上已启用 ADE。
  2. 确定 OS 磁盘使用 ADE 版本 0(双通道加密)还是 ADE 版本 1(单传递加密)。
  3. 确定 OS 磁盘是托管还是非托管磁盘。
  4. 选择用于解锁加密磁盘的方法。

验证是否已在磁盘上启用 ADE

可以在 Azure 门户、PowerShell 或 Azure 命令行接口(Azure CLI)中执行此步骤。

Azure 门户

在Azure 门户中查看失败的 VM 的“概述”边栏选项卡。 在“磁盘”下Azure 磁盘加密条目将显示为“已启用”或“未启用”,如以下屏幕截图所示。

Azure 门户中 V M 的概述边栏选项卡的屏幕截图,其中显示了磁盘上启用了 A D E。

PowerShell

可以使用 Get-AzVmDiskEncryptionStatus cmdlet 来确定 VM 的 OS 或数据卷是使用 ADE 加密的。 以下示例输出指示 OS 卷上启用了 ADE 加密:

Get-AzVmDiskEncryptionStatus -ResourceGroupName "ResourceGroupName" -VMName "VmName" 

有关 cmdlet 的详细信息Get-AzureRmDiskEncryptionStatus,请参阅 Get-AzVMDiskEncryptionStatus (Az.Compute)。

Azure CLI

可以使用 az vm encryption show 该命令检查 VM 磁盘上是否启用了 ADE:

az vm encryption show --name MyVM --resource-group MyResourceGroup --query "disks[].encryptionSettings[].enabled"

有关命令的详细信息 az vm encryption show ,请参阅 az vm encryption show

注意

如果未在磁盘上启用 ADE,请参阅以下文章,了解如何将磁盘附加到修复 VM: 通过将 OS 磁盘附加到修复 VM 对 Linux VM 进行故障排除。

确定 OS 磁盘使用 ADE 版本 0(双传递加密)还是 ADE 版本 1(单传递加密)

可以通过打开 VM 的属性,然后选择“扩展”以打开“扩展边栏选项卡来标识Azure 门户中的 ADE 版本。 在“扩展”边栏选项卡上,查看 AzureDiskEncryptionForLinux版本号。

  • 如果版本号为 0.*,则磁盘使用双重传递加密。
  • 如果版本号为 1.* 或更高版本,则磁盘使用单传递加密。

如果磁盘使用 ADE 版本 0(双重传递加密),请使用 方法 3 解锁磁盘。

确定 OS 磁盘是托管磁盘还是非托管磁盘

如果不知道 OS 磁盘是托管磁盘还是非托管磁盘,请参阅 确定 OS 磁盘是托管还是非托管磁盘。

如果 OS 磁盘是非托管磁盘,请按照方法 3 中的步骤解锁磁盘。

选择解锁加密磁盘的方法

选择以下方法之一以解锁加密磁盘:

  • 如果使用 ADE 版本 1 管理并加密磁盘,并且基础结构和公司策略允许向修复 VM 分配公共 IP 地址,请使用 方法 1:使用 az vm repair 命令自动解锁加密的磁盘。
  • 如果磁盘是使用 ADE 版本 1 进行管理和加密的,但基础结构或公司策略会阻止向修复 VM 分配公共 IP 地址,请使用 方法 2:通过 BEK 卷中的密钥文件解锁加密的磁盘。 选择此方法的另一个原因是缺少在 Azure 中创建资源组的权限。
  • 如果上述任一方法失败,或者使用 ADE 版本 0(双传递加密)对磁盘进行非托管或加密,请按照方法 3 中的步骤解锁磁盘。

方法 1:使用 az vm repair 命令自动解锁加密磁盘

此方法依赖于 az vm repair 命令自动创建修复 VM,将失败的 Linux VM 的 OS 磁盘附加到该修复 VM,然后在磁盘加密时解锁磁盘。 此方法需要使用修复 VM 的公共 IP 地址,无论 ADE 密钥是解包还是使用密钥加密密钥(KEK)来解锁加密磁盘。

若要使用此自动化方法修复 VM,请使用 Azure 虚拟机修复命令执行修复 Linux VM 中的步骤。

如果基础结构和公司策略不允许分配公共 IP 地址,或者 az vm repair 命令未解锁磁盘,请转到下一种方法。

方法 2:通过 BEK 卷中的密钥文件解锁加密磁盘

若要手动解锁和装载加密磁盘,请执行以下步骤:

  1. 创建新的修复 VM,并在创建 VM 期间将加密磁盘附加到此 VM

    创建修复 VM 时,必须附加加密磁盘。 这是因为系统检测到附加的磁盘已加密。 因此,它会从 Azure 密钥保管库中提取 ADE 密钥,然后创建名为“BEK VOLUME”的新卷来存储密钥文件。

  2. 登录到修复 VM,然后在加密磁盘上卸载任何装载的分区。

  3. 标识 BEK 卷中的 ADE 密钥文件。

  4. 标识加密 OS 的启动分区中的头文件。

  5. 使用 ADE 密钥文件和头文件解锁加密磁盘。

  6. 装载分区: LVMRAW 或非 LVM

创建修复 VM

  1. 拍摄加密 OS 磁盘的快照。

  2. 从快照创建磁盘。 对于新磁盘,请选择与要修复的问题 VM 相同的位置和可用性区域。

  3. 创建基于以下准则的 VM:

    • 在Azure 市场中,为用于失败的 VM 的修复 VM 选择相同的映像。 (OS 版本应相同。
    • 选择至少为 VM 分配 8 GB 内存的大小。
    • 将此新 VM 分配给在步骤 2 中创建的新磁盘所用的同一资源组、区域和可用性设置。
  4. “创建虚拟机”向导的“磁盘”页上,附加新磁盘(刚刚从快照创建)作为数据磁盘。

重要

由于仅在创建 VM 期间检测到加密设置,因此请确保在创建 VM 时附加磁盘。 这允许包含要自动添加到 VM 的 ADE 密钥文件的卷。

卸载加密磁盘上装载的任何已装载分区

  1. 创建修复 VM 后,通过 SSH 登录到修复 VM,使用相应的凭据登录,然后将帐户提升到根目录:

    sudo -s 
    
  2. 使用 lsblk 命令列出附加的设备。 在输出中,应会看到多个附加磁盘。 这些磁盘包括活动 OS 磁盘和加密磁盘。 它们可以按任意顺序显示。

  3. 使用以下信息标识加密磁盘:

    • 磁盘将有多个分区
    • 磁盘不会将根目录(“/”)列为其任何分区的装入点。
    • 磁盘将与从快照创建磁盘时记录的大小相匹配。

    在以下示例中,输出指示“sdd”是加密磁盘。 这是唯一具有多个分区且未将“/”列为装入点的磁盘。

    有关第一个示例的图像

  4. 卸载已在文件系统中装载的加密数据磁盘上的任何分区。 例如,在前面的示例中,必须卸载“/boot/efi”* 和“/boot”。

    umount /boot/efi 
    
    umount /boot 
    

标识 ADE 密钥文件

必须同时具有密钥文件和头文件才能解锁加密磁盘。 密钥文件存储在 BEK 卷中,头文件位于加密 OS 磁盘的启动分区中。

  1. 确定哪个分区是 BEK 卷:

    lsblk -fs | grep -i bek 
    

    以下示例输出指示 sdb1 是 BEK 卷:

    >sdb1  vfat   BEK VOLUME      04A2-FE67 
    

    如果不存在 BEK 卷,请通过附加加密磁盘重新创建修复 VM。 如果 BEK 卷仍未自动附加, 请尝试方法 3 检索 BEK 卷。

  2. 在“/mnt”文件夹下创建名为“azure_bek_disk”的目录:

    mkdir /mnt/azure_bek_disk 
    
  3. 将 BEK 卷装载到“/mnt/azure_bek_disk”目录中。 例如,如果 sdb1 是 BEK 卷,请输入以下命令:

    mount /dev/sdb1 /mnt/azure_bek_disk 
    
  4. 再次列出可用设备:

    lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT  
    

    注意: 你将看到确定为 BEK 卷的分区现在装载在“/mnt/azure_bek_disk”。

  5. 查看“/mnt/azure_bek_disk/”目录中的内容:

    ls -l /mnt/azure_bek_disk
    

    输出中应看到以下文件(ADE 密钥文件为“LinuxPassPhraseFileName”):

    >total 1 
    
     -rwxr-xr-x 1 root root 148 Aug  4 01:04 CRITICAL_DATA_WARNING_README.txt 
     -r-xr-xr-x 1 root root 172 Aug  4 01:04 LinuxPassPhraseFileName
    

    如果多个磁盘附加到加密的 VM,可能会看到多个“LinuxPassPhraseFileName”。 “LinuxPassPhraseFileName”将按其逻辑单元数(LUN)相同的顺序枚举磁盘数。

标识头文件

加密磁盘的启动分区包含头文件。 你将使用此文件以及“LinuxPassPhraseFileName”密钥文件来解锁加密的磁盘。

  1. 使用以下命令显示可用磁盘和分区的选定属性:

    lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT
    
  2. 在加密磁盘上,标识 OS 分区(根分区)。 这是加密磁盘上最大的分区。 在前面的示例输出中,OS 分区为“sda4”。运行解锁命令时,必须指定此分区。

  3. 在文件结构的根目录(“/”)中创建一个目录,用于装载加密磁盘的根分区。 稍后将在磁盘解锁后使用此目录。 若要将其与修复 VM 的活动 OS 分区区区分开来,请为其命名为“调查根”。

    mkdir /{investigateboot,investigateroot}
    
  4. 在加密磁盘上,标识包含头文件的启动分区。 在加密磁盘上,启动分区是第二大分区,在 LABEL 或 PARTLABEL 列中不显示任何值。 在前面的示例输出中,加密磁盘的启动分区为“sda2”。

  5. 将步骤 4 中标识的启动分区装载到 /investigateboot/ 目录中。 在以下示例中,加密磁盘的启动分区为 sda2。 但是,系统上的位置可能会有所不同。

    mount /dev/sda2 /investigateboot/ 
    

    如果装载分区失败并返回“错误的 fs 类型、错误选项、错误的超级锁”错误消息,请使用以下命令重试 mount -o nouuid ,如以下示例所示:

    mount -o nouuid /dev/sda2 /investigateboot/ 
    
  6. 列出 /investigateboot/ 目录中的文件。 “luks”子目录包含必须解锁磁盘的头文件。

  7. 列出 /investigateboot/luks/ 目录中的文件。 头文件名为“osluksheader”。

    ls -l /investigateboot/luks 
    

使用 ADE 密钥文件和头文件解锁磁盘

  1. cryptsetup luksOpen使用命令解锁加密磁盘上的根分区。 例如,如果包含加密 OS 的根分区的路径为 /dev/sda4,并且要将名称“osencrypt”分配给解锁的分区,请运行以下命令:

    cryptsetup luksOpen --key-file /mnt/azure_bek_disk/LinuxPassPhraseFileName --header /investigateboot/luks/osluksheader /dev/sda4 osencrypt 
    
  2. 解锁磁盘后,请从 /investigateboot/ 目录卸载加密磁盘的启动分区:

    umount /investigateboot/ 
    

    注意: 稍后必须将此分区装载到另一个目录。

    下一步是装载刚刚解锁的分区。 用于装载分区的方法取决于磁盘使用的设备映射器框架(LVM 或非 LVM)。

  3. 将设备信息与文件系统类型一起列出:

    lsblk -o NAME,FSTYPE 
    

    你将看到已解锁分区和分配给它的名称(在我们的示例中,该名称为“osencrypt”):

装载解锁分区并输入 chroot 环境(仅限 LVM)

如果磁盘使用 LVM 设备映射器框架,则必须采取额外的步骤来装载磁盘并输入 chroot 环境。 若要将 chroot 工具与加密磁盘一起使用,必须将解锁的分区(“osencrypt”)及其逻辑卷识别为名为 rootvg 的卷组。 但是,默认情况下,修复 VM 的 OS 分区及其逻辑卷已分配给名为 rootvg 的卷组。 我们必须解决此冲突,然后才能继续。

  1. pvs使用命令显示 LVM 物理卷的属性。 你可能会看到警告消息,如以下示例所示,指示解锁的分区(“/dev/mapper/osencrypt”)和其他设备正在使用重复的通用唯一标识符(UUID)。 或者,你可能会看到分配给 rootvg 的两个分区。

    注意

    你只希望将解锁的分区(“osencrypt”)分配到 rootvg 卷组,以便可以通过 chroot 实用工具访问其逻辑卷。 若要解决此问题,你将暂时将分区导入其他卷组,并激活该卷组。 接下来,重命名当前 rootvg 卷组。 只有在输入 chroot 环境后,才会将加密磁盘的卷组重命名为“rootvg”。

分配解锁分区(示例)

  1. 将新解锁的分区导入到新的卷组中。 在此示例中,我们将临时命名新的卷组“rescuemevg”。 将新解锁的分区导入到新的卷组中。 在此示例中,我们将临时命名新的卷组“rescuemevg”。

  2. 激活新的卷组:

    vgimportclone -n rescuemevg /dev/mapper/osencrypt
    vgchange -a y rescuemevg
    
  3. 重命名旧的 rootvg 卷组。 在此示例中,我们将使用名称“oldvg”。

    vgrename rootvg oldvg 
    
  4. 运行 lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT 以查看可用的设备。 现在应会看到分配给它们的名称列出的这两个卷组。

  5. 将 rescuemevg/rootlv 逻辑卷装载到 /investigateroot/ 目录,而无需使用重复的 UUID:

    umount /investigateboot
    mount -o nouuid /dev/rescuemevg/rootlv /investigateroot/ 
    

    现在,失败的 VM 的根分区已解锁并装载,应该能够访问根分区来排查问题。 有关详细信息,请参阅 排查 Linux 虚拟机启动问题,因为文件系统错误

    但是,如果要使用 chroot 实用工具进行故障排除,请继续执行以下步骤。

  6. 将加密磁盘的启动分区装载到目录 /investigateroot/boot/,而不使用重复的 UUID。 (请记住,加密磁盘的启动分区是未分配分区标签的第二大分区。在我们的当前示例中,加密磁盘的启动分区为 sda2。

    mount -o nouuid /dev/sda2 /investigateroot/boot
    
  7. 将加密磁盘的 EFI 系统分区装载到 /investigateroot/boot/efi 目录。 可以通过其标签标识此分区。 在我们的当前示例中,EFI 系统分区为 sda1。

    mount /dev/sda1 /investigateroot/boot/efi
    
  8. 将加密磁盘卷组中剩余的卸载逻辑卷装载到“/investigateroot/”的子目录中:

    mount -o nouuid /dev/mapper/rescuemevg-varlv /investigateroot/var
    mount -o nouuid /dev/mapper/rescuemevg-homelv /investigateroot/home
    mount -o nouuid /dev/mapper/rescuemevg-usrlv /investigateroot/usr
    mount -o nouuid /dev/mapper/rescuemevg-tmplv /investigateroot/tmp
    mount -o nouuid /dev/mapper/rescuemevg-optlv /investigateroot/opt
    
  9. 将 Active Directory 更改为加密磁盘上装载的根分区:

    cd /investigateroot
    
  10. 输入以下命令以准备 chroot 环境:

    mount -t proc proc proc
    mount -t sysfs sys sys/
    mount -o bind /dev dev/
    mount -o bind /dev/pts dev/pts/
    mount -o bind /run run/
    
  11. 输入 chroot 环境:

    chroot /investigateroot/
    
  12. 将 rescuemevg 卷组重命名为“rootvg”,以避免 grub 和 initramfs 出现冲突或可能的问题。 重新生成 initramfs 时,请保留相同的命名约定。 由于 vg 名称更改,因此在救援 VM 上工作。 如果重新启动它,它将不再有用。 应将救援 VM 视为临时 VM。

    vgrename rescuemevg rootvg
    
  13. 排查 chroot 环境中的问题。 例如,可以读取日志或运行脚本。 有关详细信息,请参阅 在 chroot 环境中执行修补程序。

  14. 退出 chroot 并交换 OS 磁盘

装载解锁的磁盘,并输入 chroot 环境(RAW/非 LVM)

  1. 在文件结构的根目录(“/”)中创建一个目录,用于装载加密磁盘的根分区。 稍后将在磁盘解锁后使用此目录。 若要将其与修复 VM 的活动 OS 分区区区分开来,请将其命名为“调查根”。

    mkdir /{investigateboot,investigateroot}
    
  2. 将新解锁的分区(“osencrypt”)装载到 /investigateroot/ 目录:

    mount /dev/mapper/osencrypt /investigateroot/ 
    

    如果装载分区失败并返回“错误的 fs 类型、错误选项、错误的超级锁”错误消息,请使用装载 -o nouuid 命令重试:

    mount -o nouuid /dev/mapper/osencrypt /investigateroot/ 
    
  3. 尝试显示 /investigateroot/ 目录的内容,以验证装载的分区现在是否已解锁:

    ls /investigateroot/ 
    
  4. 现在,失败的 VM 的根分区已解锁并装载,可以访问根分区来排查问题。 有关详细信息,请参阅 排查 Linux 虚拟机启动问题,因为文件系统错误

    但是,如果要使用 chroot 实用工具进行故障排除,请转到下一步。

  5. 使用命令 lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT 查看可用的设备。 将加密磁盘上的启动分区标识为未分配任何标签的第二大分区。

  6. 将加密磁盘上的启动分区装载到“/investigateroot/boot/”目录,如以下示例所示:

    mount /dev/sdc2 /investigateroot/boot/ 
    
  7. 将 Active Directory 更改为加密磁盘上装载的根分区:

    cd /investigateroot 
    
  8. 输入以下命令以准备 chroot 环境:

    mount -t proc proc proc 
    
    mount -t sysfs sys sys/ 
    
    mount -o bind /dev dev/ 
    
    mount -o bind /dev/pts dev/pts/ 
    
    mount -o bind /run run/ 
    
  9. 输入 chroot 环境:

    chroot /investigateroot/ 
    
  10. 排查 chroot 环境中的问题。 可以读取日志或运行脚本。 有关详细信息,请参阅 在 chroot 环境中执行修补程序。

  11. 退出 chroot 并交换 OS 磁盘

方法 3:重新加密磁盘以检索密钥文件,并解锁加密的磁盘

  1. 创建修复 VM,并将锁定磁盘的副本附加到修复 VM:

  2. 将加密磁盘作为数据磁盘附加到修复 VM 后,请使用用于原始 VM 重新加密此数据磁盘的密钥库和密钥加密密钥(KEK)。 此过程将使用修复 VM 中的 BKE 密钥文件自动生成和装载 BEK 卷。 不能使用 EncryptFormatAll 选项,因为 ADE 扩展可以加密数据磁盘上的启动扇区。

    • 如果原始 VM 通过 包装的 BEK 进行加密,请运行以下命令。

       az vm encryption enable -g "resource group" --name "VMName" --disk-encryption-keyvault "keyvault"  --key-encryption-key "kek" --volume-type "data"
      
    • 如果原始 VM 由 BEK 加密,请运行以下命令:

      az vm encryption enable -g "resource group" --name "VMName" --disk-encryption-keyvault "keyvault"  --volume-type "data"
      

      若要确定磁盘加密密钥保管库密钥加密密钥的值,请运行以下命令:

      az vm encryption show --name "OriginalVmName" --resource-group "ResourceGroupName"
      

      在下表中,查找输出中的值。 如果 keyEncryptionKey 值为空,则 VM 由 BEK 加密。

      参数 输出中的值 示例
      disk-encryption-keyvault diskEncryptionKey:id /subscriptions/deb73ff9-0000-0000-0000-0000c7a96d37/resourceGroups/Thomas/providers/Microsoft.KeyVault/vaults/ContosoKeyvault
      key-encryption-key keyEncryptionKey:KeyURI https://ContosoKeyvault.vault.azure.net/keys/mykey/00000000987145a3b79b0ed415fa0000
  3. 运行以下命令,检查是否附加了新磁盘:

    lsblk -f
    

    如果附加了新磁盘,请转到 BEK 卷中的 ADE 密钥文件,然后继续按照提供的步骤解锁磁盘。

后续步骤

如果在连接到 VM 时遇到问题,请参阅 排查与 Azure VM 的 SSH 连接问题。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区