适用于:✔️ Linux VM
总结
为 Azure Linux 虚拟机(VM)部署Azure 磁盘加密(ADE),则通过编辑文件修改与启动过程和系统组件相关的各种基本设置。 如果 ADE 部署失败或中断,则 VM 可能停滞在紧急模式或不可用,尤其是在作系统(OS)磁盘加密时。
本文列出了 Linux VM 在 ADE 部署后无法启动的常见方案,并提供解决问题的步骤。
先决条件
在所有情况下,应在加密磁盘之前 创建快照 或创建备份。 备份确保在加密过程中发生任何意外故障时可以使用恢复选项。 有关如何备份和还原加密 VM 的详细信息,请参阅 Azure 备份。
扩展日志
若要排查 Linux VM 启动问题,请检查Azure串行控制台中的扩展日志或扩展日志文件 /var/log/azure/Microsoft.Azure.Security.AzureDiskEncryptionForLinux/extension.log。
方案 1:initramfs 映像中缺少 ADE 模块
如果 OS 磁盘使用逻辑卷管理器(LVM),并且会看到如下文本所示的警告消息,则初始 RAM 磁盘映像中不包含所需的模块:
Warning: /dev/mapper/rootvg-rootlv does not exist
...
Entering emergency mode. Exit the shell to continue.
dracut:/#
若要解决此问题,请执行以下步骤:
-
从备份还原 VM ,然后再次尝试加密。
-
如果还原不可行,请使用 Azure CLI 扩展 az vm repair 创建修复 VM,或使用 manual 方法创建救援 VM。 然后,将故障 VM 的 OS 磁盘附加到该修复/救援 VM 并解锁。
-
进入 chroot 后,执行以下命令:
注释
在以下命令中相应地替换内核和扩展版本。
RHEL 8 和 9
-
将以下文件从扩展配置目录复制到 initramfs 脚本目录:
```bash sudo cp /var/lib/waagent/Microsoft.Azure.Security.AzureDiskEncryptionForLinux-X.X.X.X/main/oscrypto/91adeOnline /usr/lib/dracut/modules.d/ ```-
重新生成 initramfs 镜像:
sudo dracut -f -v /boot/initramfs-X.XX.X-XXX.XX.X.x86_64.img <kernel version> -
通过从中启动 VM 来测试修改的内核。 如果有效,请重新生成任何剩余的 initramfs 文件。
-
Ubuntu
注释
此过程还可能适用于从 Ubuntu 18 升级到 Ubuntu 20 VM 后发生的启动问题。
1. 将以下文件从扩展配置目录复制到 initramfs 脚本目录:
```bash
sudo cd /var/lib/waagent/Microsoft.Azure.Security.AzureDiskEncryptionForLinux-X.X.X.X/main/oscrypto/ubuntu_2004/encryptscripts
sudo cp crypt-ade-boot /usr/share/initramfs-tools/scripts/init-premount/
sudo cp crypt-ade-hook /usr/share/initramfs-tools/hooks/
```
2. `crypt-ade-boot`文件复制后,通过通用唯一标识符 (UUID) 从 `/dev/disk/by-partuuid/` 中列出 OS 分区。
```bash
sudo ls -l /dev/disk/by-partuuid/ | grep -w <partition containing the OS>
lrwxrwxrwx 1 root root 10 May 18 17:33 <ROOTPARTUUID> -> ../../sda1
```
3. 运行以下命令解锁根分区。 将 `ROOTPARTUUID` 变量替换为在上一步中获取的变量。
```bash
cryptsetup luksOpen /dev/disk/by-partuuid/ROOTPARTUUID osencrypt --header /boot/luks/osluksheader -d /mnt/azure_bek_disk/LinuxPassPhraseFileName
```
4. 重新生成 initramfs 镜像:
```bash
update-initramfs -u -k all
```
预期输出类似于以下文本:
```output
update-initramfs: Generating /boot/initrd.img-5.15.0-1038-azure
cryptsetup: WARNING: target 'osencrypt' not found in /etc/crypttab
+ PREREQS=udev
+ mount -a
+ cryptsetup luksOpen /dev/disk/by-partuuid/<ROOTPARTUUID> osencrypt --header /boot/luks/osluksheader -d /mnt/azure_bek_disk/LinuxPassPhraseFileName
Device osencrypt already exists.
+ exit 0
```
-
将失败的 OS 磁盘与包含修补程序的磁盘交换。
-
查看扩展日志和串行控制台日志,确保加密过程成功完成:
[AzureDiskEncryption] 3670: [Info] ======= MACHINE STATE: completed ======= [AzureDiskEncryption] 3670: [Info] Encryption succeeded for all volumes [AzureDiskEncryption] 3670: [Info] Executing: lvs --noheadings --nameprefixes --unquoted -o lv_name,vg_name,lv_kernel_major,lv_kernel_minor [AzureDiskEncryption] 3670: [Info] OS PV is encrypted [AzureDiskEncryption] 3670: [Info] found one ide with vmbus: <GUID> and the sdx path is: sda [AzureDiskEncryption] 3670: [Info] found one ide with vmbus: <GUID> and the sdx path is: sdb [AzureDiskEncryption] 3670: [Info] found one ide with vmbus: <GUID> and the sdx path is: sdc [AzureDiskEncryption] 3670: [Info] Executing: pvs [AzureDiskEncryption] 3670: [Info] Found OS block device: /dev/mapper/osencrypt -
查看 initramfs 文件,确保正确添加 ADE 模块:
注释
在以下命令中相应地替换 initramfs 文件名。
RHEL 8 和 9
sudo lsinitrd /boot/initramfs-4.18.0-553.45.1.el8_10.x86_64.img | egrep -w "ade|adeOnline"
```
预期输出类似于以下输出:
```output
-rwxr--r-- 1 root root 1126 Jan 15 2024 usr/lib/dracut/hooks/cmdline/30-parse-crypt-ade.sh
-rwxr--r-- 1 root root 681 Jan 15 2024 usr/sbin/crypt-run-generator-ade
```
# [Ubuntu](#tab/ubuntu)
```bash
lsinitramfs /boot/initrd.img-5.15.0-1082-azure | egrep -i ade
```
预期输出类似于以下输出:
```output
boot/luks/osluksheader
conf/conf.d/cryptheader
scripts/init-premount/crypt-ade-boot
```
---
## 方案 2:加密中断
对中断的加密进行故障排除的步骤取决于进程中断的位置。 在某些情况下, [从备份还原](/zh-cn/azure/backup/restore-azure-encrypted-virtual-machines) 可能是唯一的选项。
1. 检查串行控制台日志中是否有任何错误消息。
扩展部署问题通常表现为Python错误。 例如:
```output
[AzureDiskEncryption] 7293: [Info] Command /sbin/e2fsck -f -y /dev/korn-fromme failed with return code 8
stdout:
Possibly non-existent device?
stderr:
e2fsck 1.46.5 (30-Dec-2021)
/sbin/e2fsck: No such file or directory while trying to open /dev/korn-fromme
[AzureDiskEncryption] 7293: [Error] check shrink fs failed with code 8 for /dev/korn-fromme
[AzureDiskEncryption] 7293: [Info] Your file system may not have enough space to do the encryption or file System may not support resizing
[AzureDiskEncryption] 7293: [Error] Failed to encrypt data volumes with error: Encryption failed for name:korn-fromme type:lvm fstype:ext4 mountpoint:/someone label: model: size:6442450944 majmin:None device_id:, stack trace: Traceback (most recent call last):
File '/var/lib/waagent/Microsoft.Azure.Security.AzureDiskEncryptionForLinux-1.4.0.7/main/handle.py', line 2172, in daemon_encrypt
while not daemon_encrypt_data_volumes(encryption_marker=encryption_marker,
File '/var/lib/waagent/Microsoft.Azure.Security.AzureDiskEncryptionForLinux-1.4.0.7/main/handle.py', line 2438, in daemon_encrypt_data_volumes
raise Exception(message)
Exception: Encryption failed for name:korn-fromme type:lvm fstype:ext4 mountpoint:/someone label: model: size:6442450944 majmin:None device_id:
```
2. 确保满足所有 [扩展先决条件](/zh-cn/azure/virtual-machines/linux/disk-encryption-overview#additional-vm-requirements) 。
3. 如有必要,请使用救援 VM 并分析故障磁盘。 对于 OS 磁盘,请确保满足以下条件:
- 所需的分区已到位,数据正常。
- [OS LUKS 头文件](unlock-encrypted-linux-disk-offline-repair#identify-the-header-file)`osluksheader`单独存储在启动分区下。 如果磁盘已加密且此文件丢失或损坏,则无法在没有工作备份的情况下恢复 VM。
- initramfs 包含所需的 ADE 模块。 如果缺少所需的模块,请按照 ADE 模块在 initram 映像中缺失章节里的步骤操作。
- BEK 卷包含 [ADE 密钥文件](unlock-encrypted-linux-disk-offline-repair#identify-the-ade-key-file)。
4. 如果 ADE 密钥文件缺失,请创建一个测试 VM,使用用于加密故障 VM 的原始加密设置来对其进行加密(卷类型数据)。 加密后,请执行以下步骤:
1. 在测试 VM 上的 BEK 卷中复制 ADE 密钥文件。
2. 启动有故障的 VM。
3. 在紧急模式下,[标识 ADE 密钥文件](unlock-encrypted-linux-disk-offline-repair#identify-the-ade-key-file) 和 [头文件](unlock-encrypted-linux-disk-offline-repair#identify-the-header-file)。
4. 根据磁盘布局(LVM 或原始), [手动从加密中打开磁盘](unlock-encrypted-linux-disk-offline-repair#unlock-by-files)。
5. 启动 VM。
6. 如果 ADE 密钥文件仍然缺失且 BEK 卷已装载,请手动创建一个文件,并将 ADE 密钥文件内容编写到其中,文件命名为 `/mnt/azure_bek_disk/LinuxPassPhraseFileName`。
7. 重启 VM。
8. 重新部署 VM。
## 方案 3:启动分区中没有足够的空间(Ubuntu)
注释
从 [Ubuntu 24](https://azuremarketplace.microsoft.com/marketplace/apps/canonical.ubuntu-24_04-lts?tab=Overview) 开始,映像具有至少 1 GB 的独立启动分区。
ADE 需要单独的启动分区。 在扩展部署期间,它将创建 `/boot` 为单独的分区并还原原始文件。 此过程结束时,将创建新的初始 RAM 磁盘文件。 如果空间不足,此步骤将失败。 由于许多变体,此方案很复杂。 当 OS 磁盘使用 ADE 时,不支持 [调整 OS 磁盘的大小](/zh-cn/azure/virtual-machines/linux/how-to-resize-encrypted-lvm#scenarios) 。 目前,只有 Ubuntu 映像可能属于此启动拆分过程。
若要防止此问题,请执行以下步骤:
1. 删除未使用的旧内核。
2. 确保只有必要的文件位于 `/boot` 下。
## 方案 4:VFAT 内核模块已禁用
必须启用 VFAT 内核模块才能挂载 BEK 卷。 否则,ADE 密钥文件不可用,这会阻止磁盘解锁。 若要继续加密, [请启用 VFAT 模块](vfat-disabled-boot-issues#ade-encrypted-vm-is-unable-to-access-root-volume)。
## 方案 5:所需的包无法安装
如果默认情况下未安装,ADE 扩展会安装所需的包。 如果此包安装失败,加密将失败。
若要确定包安装失败的原因,请执行以下步骤:
1. 从Azure串行控制台查看扩展日志,并找到如下所示的消息:
```output
[Info] Installing pre-requisites
```
2. 确保已成功安装所有包。
有关基于 Linux 发行版的所需包的完整列表,请参阅 [包管理](/zh-cn/azure/virtual-machines/linux/disk-encryption-isolated-network#package-management)。
3. 如果包安装出现问题,请确定哪个包失败以及原因。
4. 确保有故障的 VM 有权访问包存储库。
如果故障 VM 具有特定的网络要求,请转到隔离网络上的 [Azure 磁盘加密](/zh-cn/azure/virtual-machines/linux/disk-encryption-isolated-network)。
有关排查存储库问题的详细信息,请参阅 [适用于 Linux 的 yum 和 dnf 包管理工具中的常见问题](yum-dnf-common-issues) ,以及 [排查 Ubuntu 上的 APT 的常见问题](apt-common-issues-in-ubuntu)。
## 方案 6:GRUB 配置中缺少参数
在加密过程中,扩展会将多个参数添加到文件中的 `/etc/default/grub` 内核选项。 这些参数与启动和根分区的 UUID 相关: `rd.luks.ade.partuuid` 以及 `rd.luks.ade.bootuuid`。
参数必须正确设置为 UUID。 否则,请使用 [脱机故障排除](unlock-encrypted-linux-disk-offline-repair) 方法手动添加参数。 可以在`chroot`环境中使用`blkid`命令获取UUID。
有关重新生成 GRUB 文件的详细信息,请参阅 [重新安装 GRUB 并手动重新生成 GRUB 配置文件](troubleshoot-vm-boot-error#reinstall-grub-regenerate-grub-configuration-file)。
## 方案 7:缺少或损坏的 osluksheader 文件
LUKS 将其加密元数据存储在加密分区开头的 LUKS 标头中。 此标头包括密码、模式、哈希函数和密钥槽等重要信息。 分区是使用主密钥加密的。
在 OS 磁盘中使用 ADE 时,标头存储在名为 `osluksheader`(位于启动分区)的文件中。 如果此文件已损坏或缺失,则只能从备份还原该文件。 使用[脱机故障排除](unlock-encrypted-linux-disk-offline-repair)方法来挂载受影响磁盘的启动分区,并将备份中的`osluksheader`文件放置到该分区。
## 资源
- 适用于 Linux VM 的 [Azure 磁盘加密](/zh-cn/azure/virtual-machines/linux/disk-encryption-overview)
- 适用于 Linux VM 的 [Azure 磁盘加密 故障排除指南](/zh-cn/azure/virtual-machines/linux/disk-encryption-troubleshooting)
- 适用于 Linux 虚拟机的 [Azure 磁盘加密 常见问题解答](/zh-cn/azure/virtual-machines/linux/disk-encryption-faq)