VFAT 檔案系統類型停用後,Azure Linux 虛擬機器無法開機
適用於:✔️ Linux VM
注意
本文所參考的 CentOS 是一種 Linux 發行版,且將到達生命周期結束(EOL)。 請據以考慮您的使用和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指引。
本文提供在停用虛擬檔案配置資料表 (VFAT) 檔案系統類型之後,Azure Linux 虛擬機 (VM) 無法開機的問題解決方案。
下列案例需要 VFAT:
Azure VM 上背書的 Linux 散發套件會掛接 /boot/efi 文件系統。
Linux Gen2 VM(以 UEFI 為基礎)需要 /boot/efi 文件系統,但它包含在 Gen1(BIOS 型)Linux 映射中。
使用 Azure 磁碟加密(ADE)加密 Azure Linux VM 的 OS 和數據磁碟。
停用 VFAT 會導致 Azure Linux VM 無法開機。 數個強化工具可以停用 VFAT。 若要避免這類問題,請確定 VFAT 已從強化中排除並啟用。
必要條件
請確定 已在Linux VM中啟用序列主控台 並正常運作。
如何識別開機問題
若要識別開機問題,請使用 AZ CLI 或 Azure 入口網站,在開機診斷窗格或序列控制檯窗格中檢視 VM 的序列控制台記錄輸出。 如果 VFAT 已停用,您將會遇到下列問題:
無法掛接 /boot/efi
當 /boot/efi 檔案系統無法掛接時,會顯示下列一或多個輸出:
輸出 1
[[1;31mFAILED[0m] Failed to mount /boot/efi. See 'systemctl status boot-efi.mount' for details. [[1;33mDEPEND[0m] Dependency failed for Local File Systems. [[1;33mDEPEND[0m] Dependency failed for Relabel all filesystems, if necessary. [[1;33mDEPEND[0m] Dependency failed for Migrate local... structure to the new structure. [[1;33mDEPEND[0m] Dependency failed for Mark the need to relabel after reboot.
輸出 2
[FAILED] Failed to mount /boot/efi. See 'systemctl status boot-efi.mount' for details. [DEPEND] Dependency failed for Local File Systems. [DEPEND] Dependency failed for Mark the need to relabel after reboot.
輸出 3
[ 17.707983] ------------[ cut here ]------------ [ 17.714144] request_module fs-vfat succeeded, but still no fs? [ 17.714426] RPC: Registered named UNIX socket transport module. [ 17.721163] WARNING: CPU: 1 PID: 933 at fs/filesystems.c:275 get_fs_type+0xcd/0xe0 [ 17.738587] RPC: Registered udp transport module. [ 17.722103] Modules linked in: fat sunrpc(+) rdma_ucm ib_srpt ib_isert iscsi_target_mod target_core_mod intel_rapl_msr intel_rapl_common isst_if_mbox_msr isst_if_common ib_iser libiscsi nfit scsi_transport_iscsi ib_umad libnvdimm rdma_cm ib_ipoib iw_cm ib_cm kvm_intel kvm irqbypass mlx5_ib crct10dif_pclmul crc32_pclmul ib_uverbs ghash_clmulni_intel rapl pcspkr ib_core i2c_piix4 hv_balloon hv_utils joydev ip_tables xfs libcrc32c mlx5_core mlxfw tls pci_hyperv pci_hyperv_intf ata_generic sd_mod t10_pi sg hv_storvsc hv_netvsc hyperv_keyboard scsi_transport_fc hid_hyperv hyperv_fb ata_piix libata hv_vmbus crc32c_intel serio_raw dm_mod [ 17.766462] RPC: Registered tcp transport module. [ 17.722103] CPU: 1 PID: 933 Comm: mount Not tainted 4.18.0-305.17.1.el8_4.x86_64 #1 [ 17.722103] Hardware name: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS 090008 12/07/2018 [ 17.722103] RIP: 0010:get_fs_type+0xcd/0xe0 [ 17.722103] Code: 5d 41 5c c3 80 3d 6a 7a 49 01 00 75 ec 48 89 da 44 89 e6 48 89 04 24 48 c7 c7 c8 47 ce b7 c6 05 50 7a 49 01 01 e8 6c 67 da ff <0f> 0b 48 8b 04 24 e9 66 ff ff ff 0f 1f 84 00 00 00 00 00 0f 1f 44 [ 17.722103] RSP: 0018:ffffabd68394fe70 EFLAGS: 00010282 [ 17.722103] RAX: 0000000000000000 RBX: ffffa04a1e6879e0 RCX: 0000000000000000 [ 17.722103] RDX: ffffa04a37d267a0 RSI: ffffa04a37d167c8 RDI: ffffa04a37d167c8 [ 17.722103] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000092 [ 17.722103] R10: 00000000ff000000 R11: ffffabd682fec020 R12: 0000000000000004 [ 17.722103] R13: ffffa04a1d80f920 R14: ffffa04a1e6879e0 R15: 0000000000000000 [ 17.722103] FS: 00007fb0630e1080(0000) GS:ffffa04a37d00000(0000) knlGS:0000000000000000 [ 17.722103] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 17.722103] CR2: 00007fb86bb7a0c0 CR3: 000000029bfe4004 CR4: 00000000003706e0 [ 17.722103] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 17.722103] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 17.722103] Call Trace: [ 17.722103] do_mount+0x1f2/0x950 [ 17.722103] ksys_mount+0xb6/0xd0 [ 17.722103] __x64_sys_mount+0x21/0x30 [ 17.722103] do_syscall_64+0x5b/0x1a0 [ 17.722103] entry_SYSCALL_64_after_hwframe+0x65/0xca [ 17.874253] RPC: Registered tcp NFSv4.1 backchannel transport module. [ 17.722103] RIP: 0033:0x7fb06211192e [ 17.722103] Code: 48 8b 0d 5d 15 2c 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 49 89 ca b8 a5 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 2a 15 2c 00 f7 d8 64 89 01 48 [ 17.722103] RSP: 002b:00007fff02a92b78 EFLAGS: 00000246 ORIG_RAX: 00000000000000a5 [ 17.722103] RAX: ffffffffffffffda RBX: 00005626752f3460 RCX: 00007fb06211192e [ 17.722103] RDX: 00005626752f36e0 RSI: 00005626752f3700 RDI: 00005626752f53d0 [ 17.722103] RBP: 00007fb062ebe184 R08: 00005626752f3670 R09: 0000000000000003 [ 17.722103] R10: 00000000c0ed0000 R11: 0000000000000246 R12: 0000000000000000 [ 17.722103] R13: 00000000c0ed0000 R14: 00005626752f53d0 R15: 00005626752f36e0 [ 17.722103] ---[ end trace 910fa795ff1c6c89 ]--- [[0;1;31mFAILED[0m] Failed to mount /boot/efi. See 'systemctl status boot-efi.mount' for details.
ADE 加密的 VM 無法存取根磁碟區
當操作系統已加密且 VFAT 停用的 VM 無法開機時,會顯示對應的輸出,如下所示。 系統逾時之後,dracut 或 initramfs 殼層會顯示在序列控制台記錄的結尾。
已加密 OS 磁碟且已停用 VFAT 的 Ubuntu VM:
[ 24.062228] dracut-initqueue[261]: +++ '[' -z 0 ']' [ 24.065039] dracut-initqueue[261]: + luksname=osencrypt [ 24.068026] dracut-initqueue[261]: + ask_passphrase=1 [ 24.070498] dracut-initqueue[261]: + '[' /dev/sda2 '!=' /dev/sda2 ']' [ 24.073528] dracut-initqueue[261]: + device=/dev/sda2 [ 24.076046] dracut-initqueue[261]: + numtries=1 [ 24.078410] dracut-initqueue[261]: + info 'luksOpen /dev/sda2 osencrypt' [ 24.081822] dracut-initqueue[261]: + check_quiet [ 24.084663] dracut-initqueue[261]: + '[' -z no ']' [ 24.087067] dracut-initqueue[261]: + '[' no '!=' yes ']' [ 24.089711] dracut-initqueue[261]: + echo 'luksOpen /dev/sda2 osencrypt' [ 24.092857] dracut-initqueue[261]: luksOpen /dev/sda2 osencrypt [ 24.095737] dracut-initqueue[261]: + ls '/mnt/azure_bek_disk/LinuxPassPhraseFileName*' [ 24.099506] dracut-initqueue[261]: ls: cannot access /mnt/azure_bek_disk/LinuxPassPhraseFileName*: No such file or directory [ 24.104460] dracut-initqueue[261]: + mkdir -p /mnt/azure_bek_disk/ [ 24.107648] dracut-initqueue[261]: + mount -L 'BEK VOLUME' /mnt/azure_bek_disk/ [ 24.111029] dracut-initqueue[261]: mount: unknown filesystem type 'vfat' [ 24.114456] dracut-initqueue[261]: ++ ls '/mnt/azure_bek_disk/LinuxPassPhraseFileName*' [ 24.118570] dracut-initqueue[261]: ls: cannot access /mnt/azure_bek_disk/LinuxPassPhraseFileName*: No such file or directory [ 24.124108] dracut-initqueue[261]: + cryptsetupopts='--header /osluksheader' [ 24.127630] dracut-initqueue[261]: + '[' -n '' -a '' '!=' none -a -e '' ']' [ 24.131265] dracut-initqueue[261]: + '[' 1 -eq 0 ']' [ 24.134614] dracut-initqueue[261]: + sleep 1 [ 24.817478] dracut-initqueue[261]: + info 'No key found for /dev/sda2. Will try 1 time(s) more later.' [ 24.823243] dracut-initqueue[261]: + check_quiet
RHEL 7.x VM,OS 磁碟已加密且 VFAT 已停用:
%G%G[[32m OK [0m] Found device Virtual_Disk BEK_VOLUME. Mounting /bek... [[1;31mFAILED[0m] Failed to mount /bek. See 'systemctl status bek.mount' for details.
RHEL 8.x VM,OS 磁碟已加密且 VFAT 已停用:
[ 11.592932] dracut-initqueue[470]: + systemctl start bek.mount [ 11.600362] dracut-initqueue[470]: Bus n/a: changing state UNSET → OPENING Mounting /bek... [ 11.611171] dracut-initqueue[470]: Bus n/a: changing state OPENING → AUTHENTICATING [ 11.616206] dracut-initqueue[470]: Executing dbus call org.freedesktop.systemd1.Manager StartUnit(bek.mount, replace) [ 11.622972] dracut-initqueue[470]: Bus n/a: changing state AUTHENTICATING → RUNNING [ 11.628048] dracut-initqueue[470]: Sent message type=method_call sender=n/a destination=org.freedesktop.systemd1 path=/org/freedesktop/systemd1 interface=org.freedesktop.systemd1.Manager member=StartUnit cookie=1 reply_cookie=0 signature=ss error-name=n/a error-message=n/a [ 11.639221] dracut-initqueue[470]: Got message type=method_return sender=org.freedesktop.systemd1 destination=n/a path=n/a interface=n/a member=n/a cookie=1 reply_cookie=1 signature=o error-name=n/a error-message=n/a[[0;1;31mFAILED[0m] Failed to mount /bek. See 'systemctl status bek.mount' for details.
在某些舊系統中,您可能會在 Azure 序列控制台中看到下列錯誤:
未知的檔案系統類型 'vfat' 錯誤。
所有有此問題的 VM 最終都會卡在 dracut/initramfs,並顯示在序列控制台記錄的結尾:
RHEL/CentOS/SLES:
///lib/dracut/hooks/emergency/80-\x2fdev\x2fmapper\x2frootvg-rootlv.sh@1(source): warn '/dev/mapper/rootvg-rootlv does not exist' //lib/dracut-lib.sh@79(warn): echo 'Warning: /dev/mapper/rootvg-rootlv does not exist' Warning: /dev/mapper/rootvg-rootlv does not exist /bin/dracut-emergency@19(main): echo ... /bin/dracut-emergency@29(main): '[' -f /run/dracut/fsck/fsck_help_auto.txt ']' /bin/dracut-emergency@30(main): '[' -f /etc/profile ']' /bin/dracut-emergency@30(main): . /etc/profile //etc/profile@1(source): PS1='dracut:${PWD}# ' /bin/dracut-emergency@31(main): '[' -z 'dracut:${PWD}# ' ']' /bin/dracut-emergency@32(main): exec sh -i -l dracut:/#
Ubuntu:
Gave up waiting for root file system device. Common problems: - Boot args (cat /proc/cmdline) - Check rootdelay= (did the system wait long enough?) - Missing modules (cat /proc/modules; ls /dev) ALERT! /dev/mapper/osencrypt does not exist. Dropping to a shell! BusyBox v1.27.2 (Ubuntu 1:1.27.2-2ubuntu3.4) built-in shell (ash) Enter 'help' for a list of built-in commands. (initramfs)
注意
如果未加密 OS 磁碟,而且只有使用 ADE 來加密資料檔案系統,ADE 加密的數據磁碟將無法掛接,因為 VFAT 已停用。 在此情況下,請遵循在線疑難解答或離線疑難解答中的相同步驟來解決此問題。
在線疑難解答
提示
如果您在停用 VFAT 之前有 VM 的最新備份, 請從備份 還原 VM 以修正開機問題。
序列主控台是解決此問題最快的方法。 它可讓您直接修正問題,而不需要將系統磁碟呈現至復原 VM。 請確定您符合散發套件的必要條件。 如需詳細資訊,請參閱 適用於Linux的虛擬機序列主控台。
非加密的 VM 無法掛接 /boot/efi
使用 Azure 序列主控台以單一使用者模式開機 VM。 如需詳細資訊,請參閱使用序列主控台來存取 GRUB 與單一使用者模式。
若要以單一使用者模式開機 VM,請中斷 GRUB 功能表層級的開機程式,並編輯主要核心專案,以在以 開頭
linux
的 GRUB 行中新增init=/bin/bash
核心選項。請確定已掛接所有必要的文件系統,且根目錄處於讀取和寫入模式。
如果您使用核心選項開機系統
init=/bin/bash
,請執行下列命令來準備必要的檔案系統:mount -o rw,remount / mount -a
重新啟動系統。
注意
如果 VM 是 Gen1 且未加密,您也可以直接將 /etc/fstab /boot/efi
中的專案批注化/boot/efi
為 Gen1 VM 中不需要的專案。 如需詳細資訊,請參閱 針對Linux VM啟動問題進行疑難解答,因為 fstab 錯誤。
ADE 加密的 VM 無法開機
已加密 OS 磁碟的 VM:
當 OS 磁碟加密時,您無法從 Azure 序列主控台針對此問題進行疑難解答。
只有加密資料磁碟的 VM 因為 /etc/fstab 問題而無法開機:
如果只有 VM 數據磁碟已加密(OS 磁碟未加密),若要啟動系統,請使用 Azure 序列控制台,將掛接選項新增
nofail
至 /etc/fstab 中的對應專案。 如需詳細資訊,請參閱 針對Linux VM啟動問題進行疑難解答,因為 fstab 錯誤。VM 開機後, 請重新啟用 VFAT 並重新啟動 VM。
離線疑難解答
提示
如果您在停用 VFAT 之前有 VM 的最新備份, 請從備份 還原 VM 以修正開機問題。
如果 Azure 序列主控台無法在特定 VM 中運作,或不是訂用帳戶中的選項,請使用救援/修復 VM 針對此問題進行疑難解答。
非加密的 VM 無法掛接 /boot/efi
使用 VM 修復命令 來建立修復 VM,該 VM 具有鏈接受影響 VM 的 OS 磁碟復本。 使用 chroot 掛接修復 VM 中的 OS 檔案系統複本。
注意
或者,您可以使用 Azure 入口網站手動建立救援 VM。 如需詳細資訊,請參閱使用 Azure 入口網站將 OS 磁碟連結至復原 VM,以針對 Linux VM 進行疑難排解。
重新啟用 VFAT 之後,請執行下列動作:
結束 chroot,並從救援/修復 VM 卸除文件系統的複本。
az vm repair restore
執行 命令,將修復的OS磁碟與VM的原始OS磁碟交換。 如需詳細資訊,請參閱使用 Azure 虛擬機修復命令修復 Linux VM 中的步驟 5。查看 Azure 序列主控台或嘗試連線到 VM,驗證 VM 是否能夠開機。
注意
如果 VM 是 Gen1 且未加密,您也可以直接將 /etc/fstab /boot/efi
中的專案批注化/boot/efi
為 Gen1 VM 中不需要的專案。 如需詳細資訊,請參閱 針對Linux VM啟動問題進行疑難解答,因為 fstab 錯誤。
ADE 加密的 VM 無法開機
使用 VM 修復命令 來建立修復 VM,該 VM 具有鏈接受影響 VM 的 OS 磁碟復本。
使用 ADE 加密 VM 時, Azure VM 修復命令 會為您處理解除鎖定和掛接加密檔案系統。 加密的檔案系統會掛接為
/investigateroot/*
和/investigateboot
。 您可以使用 chroot 登入修復 VM,並將檔案系統重新掛接至所需的裝入點。注意
或者,您可以使用 Azure 入口網站,並在 VM 建立時附加加密 OS 磁碟的復本,手動建立救援 VM。 如需詳細資訊,請參閱使用 Azure 入口網站將 OS 磁碟連結至復原 VM,以針對 Linux VM 進行疑難排解。
重新啟用 VFAT 之後,請執行下列動作:
結束 chroot,並從救援/修復 VM 卸除文件系統的複本。
az vm repair restore
執行 命令,將修復的OS磁碟與VM的原始OS磁碟交換。 如需詳細資訊,請參閱使用 Azure 虛擬機修復命令修復 Linux VM 中的步驟 5。查看 Azure 序列主控台或嘗試連線到 VM,驗證 VM 是否能夠開機。
重新啟用 VFAT
執行下列命令來識別停用 VFAT 和對應行號的檔案:
grep -nr vfat /etc/modprobe.d/
修改對應的檔案並批注化或刪除 VFAT 專案。 專案最常是:
install vfat /bin/true
。vi /etc/modprobe.d/disable.conf
注意
將取代
disable.conf
為已停用 VFAT 的對應檔名。使用下列對應的命令重新產生 initramfs 檔案:
從 Azure 序列主控台執行 命令:
RHEL/CentOS/Oracle Linux 7/8
dracut -f /boot/initramfs-$(uname -r).img $(uname -r)
SLES 12/15
dracut -f /boot/initrd-$(uname -r) $(uname -r)
Ubuntu 18.04
mkinitramfs -k -o /boot/initrd.img-$(uname -r)
從修復/救援 VM 執行命令:
RHEL/CentOS/Oracle Linux 7/8
dracut -f /boot/initramfs-3.10.0-1160.59.1.el7.x86_64.img 3.10.0-1160.59.1.el7.x86_64
重要
將取代
3.10.0-1160.59.1.el7.x86_64
為對應的核心版本。SLES 12/15
dracut -f /boot/initrd-5.3.18-150300.38.53-azure 5.3.18-150300.38.53-azure
重要
將取代
5.3.18-150300.38.53-azure
為對應的核心版本。Ubuntu 18.04
mkinitramfs -k -o /boot/initrd.img-5.4.0-1077-azure
重要
將取代
5.4.0-1077-azure
為對應的核心版本。
下一步
如果特定開機錯誤不是 VFAT 停用的問題,請參閱針對 Azure Linux 虛擬機器 開機錯誤進行疑難解答,以取得進一步的疑難解答選項。
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。