UEFI

出自 Arch Linux 中文维基

統一可擴展固件接口(Unified Extensible Firmware Interface,簡稱 UEFI,EFI 的後繼者)是作業系統和固件之間的接口。UEFI 提供了啟動作業系統或運行預啟動程序的標準環境。

UEFI 有別於傳統 BIOS 系統所使用的「MBR 引導代碼」。二者的區別和使用 UEFI 啟動的過程見 Arch 的啟動流程。要配置 UEFI 引導加載程序,請參見 Arch 的啟動流程#引導加載程序

注意: 早期主板製造商的 UEFI 實現可能相比 BIOS 有着更多的錯誤。如果遇到無法解決的問題,請考慮對這類系統使用傳統 BIOS 引導。

UEFI 版本[編輯 | 編輯原始碼]

  • 1.x 版本的 UEFI 起始於 Intel 的 EFI。
  • 後來,一個名為 UEFI Forum 的公司組織接管了其開發工作,他們從 2.0 版本起將其更名為 Unified EFI。
  • 除非特別指明是 EFI 1.x,EFI 和 UEFI 均指代 UEFI 2.x 固件。
  • Apple 的 EFI 實現既不是 EFI 1.x 版本也不是 UEFI 2.x 版本,而是這兩者的混合體。這類固件不被歸入到任何 (U)EFI 規格中,因而不是標準的 UEFI 固件。除非特別指明,以下説明可通用,但部分內容在 Apple Macs 上可能無效或有所不同。

最新的 UEFI 標準位於 https://uefi.org/specifications

UEFI 固件架構[編輯 | 編輯原始碼]

UEFI 下每一個程序,無論它是某個 OS 引導器還是某個內存測試或數據恢復的工具,都要兼容於 EFI 固件位數或體系結構。

目前主流的 UEFI 固件,包括近期的 Apple Macs,都採用了 x86_64 EFI 固件。目前還在用 IA32 即 32 位的 EFI 的已知設備只有於 2008 年前生產的 Apple Macs,一些 Intel Cloverfield 超級本和採用 EFI 1.10 固件的 Intel 伺服器主板。

x86_64 EFI 不能兼容 32 位 EFI 程序。所以 UEFI 應用程式必須依固件處理器位數/體系結構編譯而成。

注意: 這種平台需要一個支持 IA32 UEFI的啟動加載器,比如帶有i386-efi模塊的GRUB

檢查系統位數[編輯 | 編輯原始碼]

Linux 系統[編輯 | 編輯原始碼]

在運行Linux 4.0及以上內核的發行版中,可以通過 sysfs 接口查看 UEFI 系統位數。試着運行:

$ cat /sys/firmware/efi/fw_platform_size

如果返回 64 則代表 64 位(x86_64) UEFI 系統,如果返回 32 則代表 32 位(IA32) UEFI 系統。如果文件不存在,那麼代表並沒有進入 UEFI 模式。

macOS 系統[編輯 | 編輯原始碼]

2008年以前的 Mac 大都使用 i386-efi 固件, 2008年以後大都使用 x86_64-efi 。有能力運行 Mac OS X Snow Leopard 64位內核的 Mac 都是 x86_64 EFI 1.x 版的固件。 在 Mac OS 下輸入以下命令可以找出該 Mac 的 efi 固件:

$ ioreg -l -p IODeviceTree | grep firmware-abi

如果命令返回 EFI32 則對應的是 i386 EFI 1.x 版本的固件,返回 EFI64 對應的則是 x86_64 EFI 1.x 版的固件. Mac 沒有 UEFI 2.x 固件,Apple的 EFI 實現也不完全跟 UEFI 標準兼容。

Windows 系統[編輯 | 編輯原始碼]

64 位的 Windows 系統不支持在 32 位 UEFI 上啟動。所以如果你在 UEFI 模式下啟動了 32 位 Windows,那麼你使用的是 32 位 UEFI。

可以通過運行 msinfo32.exe來查看系統位數。請看 系統摘要 條目下「系統類型」和「BIOS模式」對應的值。

如果是 64 位 UEFI 上的 64 位 Windows,則會有 系統類型:基於x64的電腦BIOS 模式:UEFI ;如果是 32 位 UEFI 上的 32 位 Windows,則會有 系統類型:基於x86的電腦BIOS 模式:UEFI.如果「BIOS」模式不是 UEFI ,那麼 Windows 並沒有用 UEFI 模式啟動.

Linux 內核中有關 UEFI 的配置選項[編輯 | 編輯原始碼]

UEFI 系統所要求的 Linux 內核配置選項[1]如下:

CONFIG_RELOCATABLE=y
CONFIG_EFI=y
CONFIG_EFI_STUB=y
CONFIG_X86_SYSFB=y
CONFIG_FB_SIMPLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y

UEFI 運行時變量支持(efivarfs 文件系統 —— /sys/firmware/efi/efivars)。該選項十分重要,因為它是使用如 /usr/bin/efibootmgr 的工具操作 UEFI 運行時變量所必須的。下面的選項已添加進了 3.10 及更新版本的內核中。

CONFIG_EFIVAR_FS=y

UEFI 運行時變量支持(老式 efivars sysfs 接口 —— /sys/firmware/efi/vars))。應當禁用該選項來避免同時啟用 efivarfs 和 sysfs-efivars 所導致的潛在問題。

CONFIG_EFI_VARS=n

GUID 分區表 (GPT) 配置選項 —— UEFI 支持的強制需求

CONFIG_EFI_PARTITION=y

EFI 混合模式支持 —— 在 IA32 UEFI 上啟動 x86_64 內核。

CONFIG_EFI_MIXED=y
注意: 以上所有選項都已在官方支持的內核中設置。

UEFI 變量[編輯 | 編輯原始碼]

UEFI 定義了變量,通過它們作業系統可以與固件進行交互。 UEFI 引導變量只在早期系統啟動時由引導加載程序和作業系統使用。UEFI運行時變量允許作業系統來管理固件的某些設置(如UEFI引導管理器)或 UEFI Secure Boot 協議的密鑰。你可通過下面的命令來獲得變量列表:

$ efivar -l

Linux 內核中的 UEFI 變量支持[編輯 | 編輯原始碼]

Linux 內核通過兩個接口來把 EFI 變量數據傳遞給用户空間:

  • 老式 sysfs-efivars 接口 (CONFIG_EFI_VARS) - 由位於 /sys/firmware/efi/vars 的內核模塊 efivars 生成 - 每個變量數據最大大小為1024B, 不支持 UEFI Secure Boot 變量(由於大小限制),並再也不被上游推薦使用。現仍被上游支持但在 Arch 官方內核中已完全禁用
  • 新式 efivarfs (EFI VARiable FileSystem) 接口 (CONFIG_EFIVAR_FS) - 由位於 /sys/firmware/efi/efivarsefivarfs 內核模塊掛載使用 - 老式 sysfs-efivars 接口的替代品,不限制變量數據大小,支持 UEFI Secure Boot 變量並被上游推薦使用。在3.8版的內核中引入,新的 efivarfs 模塊在3.10版內核中從舊的 efivars 內核模塊中分離。

efivarfs 和 sysfs-efivars 的不一致[編輯 | 編輯原始碼]

同時啟用老式的 sysfs-efivars 和新式的 efivarfs 會導致數據不一致的問題(更多信息見 https://lore.kernel.org/lkml/1366148520-29954-4-git-send-email-matt@console-pimps.org/ )。由於(自從 core/linux-3.11core/linux-lts-3.10)老式的 sysfs-efivars 在 Arch 官方內核中已完全禁用,新式的 efivarfs 將會被繼續地啟用/支持下去。自2013年10月1日起,在官方源中所有與 UEFI 變量相關的工具都支持 efivarfs.

注意: 作為禁用老式 sysfs-efivars 的副作用,efi_pstore 在 Arch 官方內核中也被禁用,因為 EFI pstore 功能依賴老式 sysfs-efivars 支持。

如果在使用任何用户空間工具訪問 EFI VAR 數據前你同時開啟了這兩者,請禁用其中之一併重新開啟另一個接口 (為了刷新數據和防止不一致) :

禁用 sysfs-efivars 並刷新 efivarfs:

# modprobe -r efivars

# umount /sys/firmware/efi/efivars
# modprobe -r efivarfs

# modprobe efivarfs
# mount -t efivarfs efivarfs /sys/firmware/efi/efivars

禁用 efivarfs 並刷新 sysfs-efivars:

# umount /sys/firmware/efi/efivars
# modprobe -r efivarfs

# modprobe -r efivars
# modprobe efivars

UEFI 變量正常工作的需求[編輯 | 編輯原始碼]

  1. 內核處理器的位數應該與 EFI 處理器的位數相符。
  2. 內核應以 EFI 模式(通過 EFISTUBEFI 引導器,而不是 BIOS/CSM 或者同為 BIOS/CSM 的"bootcamp")啟動。
  3. EFI 運行時服務支持應出現在內核中 (CONFIG_EFI=y, 運行 zgrep CONFIG_EFI /proc/config.gz 來核對是否共存 ).
  4. EFI 運行時服務在內核命令行中不應被禁用,即不應使用內核參數 noefi.
  5. efivarfs 文件系統應被掛載在 /sys/firmware/efi/efivars, 否則參考下文 #掛載 efivarfs 部分。
  6. efivar 應無錯列出 (選項 -l) EFI 變量。參見輸出內容 #UEFI 變量.

如果 EFI 變量支持在滿足以上條件後仍有問題,嘗試以下解決方案:

  1. 如果所有的用户空間工具都不能修改 EFI 變量數據,檢查 /sys/firmware/efi/efivars/dump-* 文件是否存在。如果是,刪掉,重啟,再試一次。
  2. 如果上面的步驟沒有解決問題,嘗試以內核參數 efi_no_storage_paranoia 啟動以禁用內核 EFI 變量存儲空間來防止對 EFI 變量的寫入/修改。
注意: efi_no_storage_paranoia 僅當需要時使用且不應留下作為正常啟動參數。該內核參數的效果是關閉正在實施的安全保護,來避免 NVRAM 過滿時機器故障。

掛載 efivarfs[編輯 | 編輯原始碼]

如果 efivarfs 啟動時並沒有被 systemd 自動掛載在 /sys/firmware/efi/efivars, 你需要手動掛載來把 EFI 變量支持傳遞給像 efibootmgr 等的用户空間工具:

# mount -t efivarfs efivarfs /sys/firmware/efi/efivars
注意: 這個命令即使要運行的話也要在 chroot 之外(之前)和之內都運行一次。

如下通過 /etc/fstab 來自動掛載 efivarfs 也是極好的:

/etc/fstab
efivarfs    /sys/firmware/efi/efivars    efivarfs    defaults    0    0

用户空間工具[編輯 | 編輯原始碼]

只有少量工具能夠訪問/修改 UEFI 變量,即

  • efivar — 操作 UEFI 變量的庫和工具 (被 efibootmgr 用到)
https://github.com/vathpela/efivar || efivar,efivar-gitAUR
  • efibootmgr — 操作 UEFI 固件啟動管理器設置的工具
https://github.com/rhboot/efibootmgr || efibootmgr
  1. uefivars — 轉儲 UEFI 變量和 PCI 相關信息 (內部使用 efibootmgr 源碼)
https://github.com/fpmurphy/Various/tree/master/uefivars-2.0 || uefivars-gitAUR
  1. efitools — 創建與設置自己的 UEFI Secure Boot 證書,密鑰和簽名過的程序的工具 (需要 efivarfs)
https://git.kernel.org/cgit/linux/kernel/git/jejb/efitools.git || efitools-gitAUR
  1. Ubuntu的固件測試套件 — 固件檢查工具
https://wiki.ubuntu.com/FirmwareTestSuite/ || fwts-gitAUR

efibootmgr[編輯 | 編輯原始碼]

注意:
  • 如果 efibootmgr 完全無效,你可以重啟進入 UEFI Shell 使用 bcfg 命令來給引導器創建一個啟動條目。
  • 如果你不能使用 efibootmgr, 某些 UEFI 固件允許用户用內建的啟動時界面管理啟動條目。例如,某些華碩機有 "Add New Boot Option" 選項,能讓你選擇本地 EFI 系統分區並手動進入 EFI 存根位置 (例如 \EFI\refind\refind_x64.efi).
  • 下面的命令用 rEFInd 引導器作為例子。

要通過 efibootmgr 添加新的啟動參數,需要確認:

  1. 包含 ESP 的磁盤編號: /dev/sdX
  2. ESP 在第幾個分區 /dev/sdXY 中的 Y
  3. UEFI 程序相對 ESP 根目錄的路徑

假設要啟動的引導器文件是 /boot/efi/EFI/refind/refind_x64.efi,/boot/efi 是 ESP 的掛載目錄

$ findmnt /boot/efi
TARGET SOURCE  FSTYPE OPTIONS
/boot/efi /dev/sda1  vfat   rw,flush,tz=UTC

上面結果説明 ESP 位於 /dev/sda,分區編號是 1. UEFI 程序相對於 ESP 根的路徑是/EFI/refind/refind_x64.efi. 應該用下面 efibootmgr 語句創建:

# efibootmgr --create --disk /dev/sda --part 1 --loader /EFI/refind/refind_x64.efi --label "rEFInd Boot Manager"

參考efibootmgr(8)efibootmgr README

注意: UEFI 使用反斜槓 \ 作為路徑分隔符 (類似於 Windows 路徑),Efibootmgr 解析路徑之前內部會把 / 轉換為 \.

UEFI Shell[編輯 | 編輯原始碼]

UEFI Shell 是固件的終端,可用於啟動包括引導器的 UEFI 程序。除此之外, Shell也可用於採集固件和系統的各種信息,例如內存映射 (memmap), 修改啟動管理器變量 (bcfg), 運行分區程序 (diskpart), 加載 UEFI 驅動,編輯文本文件 (edit), 十六進制編輯等等。

獲取 UEFI Shell[編輯 | 編輯原始碼]

你可從 Intel 的 Tianocore UDK/EDK2 Sourceforge.net 工程下載以 BSD 許可證發佈的 UEFI Shell.

Shell v2 在 UEFI 2.3+ 系統上表現最好,並比 Shell v1 優先推薦。Shell v1 應該在所有 UEFI 系統上有效並且與它們遵循的 UEFI 標準版本無關。更多信息見 ShellPkg

啟動 UEFI Shell[編輯 | 編輯原始碼]

部分基於 AMI Aptio x86_64 UEFI 固件的主板 (從 Sandy Bridge 起,尤其是華碩) 提供了一個叫做 "Launch EFI Shell from filesystem device" 的選項。對於這些主板,下載 x86_64 UEFI Shell ,複製進 EFI 系統分區,命名為 <EFI_SYSTEM_PARTITION>/shellx64.efi (大部分是 /boot/efi/shellx64.efi) .

Phoenix SecureCore Tiano UEFI 固件已內嵌 UEFI Shell, 可按 F6, F11F12 鍵來啟動。

注意: 如果你用以上方法不能啟動 UEFI Shell, 創建一個 FAT32 格式的 USB 並把 Shell.efi 複製到 (USB)/efi/boot/bootx64.efi. 這個 USB 會出現在固件的啟動菜單裏。啟動它就會啟動到 UEFI Shell.

重要 UEFI Shell 命令[編輯 | 編輯原始碼]

UEFI Shell 命令通常支持 -b 選項,它在輸出的每頁末尾暫停. 運行 help -b 來列出所有可用命令。

更多信息見 https://software.intel.com/en-us/articles/efi-shells-and-scripting/

bcfg[編輯 | 編輯原始碼]

bcfg 命令用於修改 UEFI NVRAM 條目,它能讓用户改變啟動條目或驅動器選項。在[https://www.uefi.org/sites/default/files/resources/UEFI_Shell_Spec_2_0.pdf

UEFI Shell Specification 2.0] PDF 文档的 83 页(Section 5.3) 有详细说明。
注意:
  • 僅當 efibootmgr 無法創建啟動條目時才推薦嘗試 bcfg.
  • UEFI Shell v1 官方二進制文件不支持 bcfg 命令。你可以下載一個 modified UEFI Shell v2 二進制文件[失效連結 2020-08-06 ⓘ],它在 UEFI 2.3前的固件有效。

轉儲當前啟動條目:

Shell> bcfg boot dump -v

為 rEFInd (作為例子) 添加一個啟動菜單條目,在啟動菜單裏是第4個 (從0開始計數) 選項:

Shell> bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd"

fs0: 映射到 EFI 系統分區,fs0:\EFI\refind\refind_x64.efi i是要啟動的文件。

To add an entry to boot directly into your system without a bootloader, configure a boot option using your kernel as an EFISTUB}:

Shell> bcfg boot add N fsV:\vmlinuz-linux "Arch Linux"	
Shell> bcfg boot -opt N "root=/dev/sdX# initrd=\initramfs-linux.img"

where N is the priority, V is the volume number of your EFI partition, and /dev/sdX# is your root partition.

刪除第4個啟動選項:

Shell> bcfg boot rm 3

把第3個啟動選項移動到第0 (也就是説第1個是 UEFI 啟動菜單的默認啟動選項):

Shell> bcfg boot mv 3 0

bcfg 幫助文檔:

Shell> help bcfg -v -b

或:

Shell> bcfg -? -v -b

map[編輯 | 編輯原始碼]

map displays a list of device mappings i.e. the names of available file systems (fs0) and storage devices (blk0).

Before running file system commands such as cd or ls, you need to change the shell to the appropriate file system by typing its name:

 Shell> fs0:
 fs0:\> cd EFI/

edit[編輯 | 編輯原始碼]

EDIT 命令提供了類似於 nano 界面的基本編輯器,但是功能略少一點。它以 UTF-8 編碼並且行尾結束符兼容 LF 和 CRLF.

本例中,編輯在固件 EFI 系統分區 (fs0: 中 rEFInd 的 refind.conf

 Shell> edit FS0:\EFI\refind\refind.conf

輸入 Ctrl-E 以獲得幫助。

UEFI 可啟動介質[編輯 | 編輯原始碼]

從 ISO 創建 UEFI 可啟動 USB[編輯 | 編輯原始碼]

教程見 USB flash installation medium#Using the ISO as is (BIOS and UEFI).

從光學介質裡移除 UEFI 啟動支持[編輯 | 編輯原始碼]

注意: 本部分提及的是給 CD/DVD only (光學介質)而不是 USB 閃存移除 UEFI 啟動支持。

大部分32位 EFI Mac 機和部分64位 EFI Mac 機無法從 UEFI(X64)+BIOS 可啟動 CD/DVD 啟動。如果希望使用光學介質完成安裝,可能首先需要移除 UEFI 啟動支持。

  • 掛載官方安裝介質並如前所述獲取 archisolabel .
# mount -o loop input.iso /mnt/iso
  • 然後重建 ISO, 使用 libisoburnxorriso 移除 UEFI 光學介質啟動支持。確認已設置正確的 archisolabel, 例如 "ARCH_201411"或類似的:
$ xorriso -as mkisofs -iso-level 3 \
    -full-iso9660-filenames\
    -volid "archisolabel" \
    -appid "Arch Linux CD" \
    -publisher "Arch Linux <https://archlinux.org>" \
    -preparer "prepared by $USER" \
    -eltorito-boot isolinux/isolinux.bin \
    -eltorito-catalog isolinux/boot.cat \
    -no-emul-boot -boot-load-size 4 -boot-info-table \
    -isohybrid-mbr "/mnt/iso/isolinux/isohdpfx.bin" \
    -output output.iso /mnt/iso/
  • output.iso 燒制進光學介質並照常完成安裝。

原生無支持情況下測試 UEFI[編輯 | 編輯原始碼]

虛擬機使用 OVMF[編輯 | 編輯原始碼]

OVMF 是一個將 UEFI 添加到虛擬機的 tianocore 項目。OVMF 包含了一個 QEMU 使用的示例 UEFI 固件。

安裝 edk2-ovmf.

建議先將虛擬機的非易逝變量本地保存一份。

$ cp /usr/share/ovmf/ovmf_vars_x64.bin my_uefi_vars.bin

然後在 QEME 命令中加入:

-drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/ovmf_code_x64.bin \
-drive if=pflash,format=raw,file=my_uefi_vars.bin

示例:

 $ qemu-system-x86_64 -enable-kvm -m 1G -drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/ovmf_code_x64.bin -drive if=pflash,format=raw,file=efi_vars.bin …

僅 BIOS 的系統使用 DUET[編輯 | 編輯原始碼]

DUET 是一個 tianocore 工程用以從 BIOS 啟動到完整 UEFI 環境,這與 BIOS 啟動作業系統相似。在 https://www.insanelymac.com/forum/topic/186440-linux-and-windows-uefi-boot-using-tianocore-duet-firmware/ 裡有廣泛討論。預建立的 DUET 鏡像可從其中一個源 https://gitorious.org/tianocore_uefi_duet_builds[失效連結 2020-08-06 ⓘ] 下載。教程見 https://gitorious.org/tianocore_uefi_duet_builds/tianocore_uefi_duet_installer/blobs/raw/master/Migle_BootDuet_INSTALL.txt[失效連結 2020-08-06 ⓘ].

也可考慮 https://sourceforge.net/projects/cloverefiboot/ , 它提供的 DUET 鏡像可能包含了一些系統的專用補丁,並且比 gitorious 源更新得更頻繁。

疑難問題[編輯 | 編輯原始碼]

困在 Windows 時啟動到 Arch Linux[編輯 | 編輯原始碼]

當被困在 Windows 時,要啟動到 Arch Linux,可以通過 Windows PowerShell 命令 shutdown /r /o 或者通過設置 > 更新與安全 > 恢復 > 高級啟動,選擇現在重啟 到達 Windows 的高級啟動。當你到達高級啟動菜單時,選擇使用設備,這個菜單實際上包含你的 UEFI 啟動選項(不限於 USB 或 CD,也可以啟動硬盤中的作業系統),並選擇「Arch Linux」。

Windows 7 無法以 UEFI 模式啟動[編輯 | 編輯原始碼]

如果你把 Windows 安裝進了另一個 GPT 格式的硬盤並且你電腦裡還有一個 MBR 格式的硬盤,那麼可能 UEFI 固件啟動了 CSM 支持(為從 MBR 分區啟動的支持) 因而 Windows 無法啟動。為解決問題,把 MBR 硬盤的內容合併到 GPT 硬盤中並禁用 MBR 硬盤使用的 SATA 接口或者直接把硬盤拔下來。

有此類問題的主板:

Gigabyte Z77X-UD3H rev. 1.1 (UEFI 版本 F19e)

- 固件啟動選項 "UEFI Only" 並不妨礙以 CSM 啟動。

Windows 改變了啟動次序[編輯 | 編輯原始碼]

例如你升級 Windows 後直接啟動了Windows而不是選擇啟動菜單:

  • 確定UEFI固件設置中的"安全啟動"(Secure Boot) 和 Windows 中的"快速啟動" 選項沒有啟用.
  • 確定UEFI固件設置的啟動順序中Linux Boot Manager 先於 Windows Boot Manager.
注意: Windows 8.x+,和 Windows 10,可能會覆蓋你在UEFI固件設置中設置的啟動順序並把自己設置成第一啟動選項. 所以你應該知道如何修改"一次性啟動選項".

你可以通過組策略和一個批處理文件(".bat")來阻止Windows更改啟動設置,在Windows上這樣做:

  1. 以管理員身份打開命令提示符,運行 bcdedit /enum firmware
  2. 尋找描述中帶有"linux"的啟動選項,例如 "Linux Boot Manager"
  3. 複製帶大括號的描述符, 例如 {31d0d5f4-22ad-11e5-b30b-806e6f6e6963}
  4. 創建一個批處理文件 (例如 bootorder.bat) ,包含下列的內容: bcdedit /set {fwbootmgr} DEFAULT {這裏是你在第三步中獲得的描述符} (例如 bcdedit /set {fwbootmgr} DEFAULT {31d0d5f4-22ad-11e5-b30b-806e6f6e6963}).
  5. 運行 gpedit (組策略對象編輯器)本地計算機策略 > 計算機設置 > Windows 設置 > 腳本(啟動/關機)中,選擇"啟動,會打開一個名為"啟動選項:的對話框.
  6. 添加第四步中創建的批處理文件到"腳本"列表中.

或者讓Windows 啟動管理器加載systemd-boot的EFI應用程式,要這樣做的話在Windows上以管理員身份運行:

bcdedit /set {bootmgr} path \EFI\systemd\systemd-bootx64.efi

USB 介質卡在黑屏界面[編輯 | 編輯原始碼]

可能是 KMS 的問題。從 USB 啟動時嘗試 Disabling KMS.

參見[編輯 | 編輯原始碼]