새 컴퓨터에 Arch Linux를 설치하고 부트로더를 구성해야 하는 지점에 도달했지만 실패합니다.
# bootctl install
Failed to create EFI Boot variable entry: No space left on device
변수를 보면 문제가 있음을 알 수 있습니다.
# ls -la /sys/firmware/efi/efivars --sort=size --reverse
...
-rw-r--r-- 1 root root 6 May 17 17:50 BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c
-rw-r--r-- 1 root root 12 May 17 17:50 334-71db7b7e-4165-48fa-ac9d-f9af4cefc534
-rw-r--r-- 1 root root 36 May 17 17:50 2151678337-417acee0-6fa9-4a82-99d7-f9b1dd271e48
-rw-r--r-- 1 root root 124 May 17 17:50 Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
-rw-r--r-- 1 root root 2.3K May 17 17:50 2151678336-417acee0-6fa9-4a82-99d7-f9b1dd271e48
공간을 모두 차지하는 매우 큰 파일이 있습니다. /boot
몇 분 전에 날짜가 같은 이름의 폴더가 있는데 , 실패한 bootctl
시도 중 하나가 어떻게든 모든 공간을 차지하는 거대한 UEFI 변수를 생성한 것 같습니다. 이를 제거하면 시작 변수를 올바르게 설정할 수 있는 충분한 공간이 확보되는 것처럼 보였지만 안타깝게도 이는 불가능했습니다.
# rm 2151678336-417acee0-6fa9-4a82-99d7-f9b1dd271e48
rm: cannot remove '2151678336-417acee0-6fa9-4a82-99d7-f9b1dd271e48': Operation not permitted
루트로 해도 파일을 삭제할 수 없습니다. 삭제할 수 있게 되었습니다일부다른 변수는 있는데 원하는 변수를 제거할 수 없고, 가능한 모든 변수를 제거한 후에도 변수를 전혀 추가할 수 없습니다.
NVRAM 공간을 확보하기 위해 이 가짜 UEFI 변수를 삭제하는 방법은 무엇입니까?
답변1
그런데 UEFI 변수가 실수로 삭제되는 것을 방지하기 위해 기본적으로 화이트리스트에 있는 변수만 삭제할 수 있도록 허용되어 있는 것으로 나타났습니다. 다른 것들은 실수로 삭제되는 것을 방지하기 위해 불변으로 표시됩니다:
# lsattr
-------------------- ./BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c
----i--------------- ./334-71db7b7e-4165-48fa-ac9d-f9af4cefc534
----i--------------- ./2151678337-417acee0-6fa9-4a82-99d7-f9b1dd271e48
-------------------- ./Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
----i--------------- ./2151678336-417acee0-6fa9-4a82-99d7-f9b1dd271e48
rm -rf /
이는 일부 버그가 있는 펌웨어 구현의 부팅 실패를 일으키는 것으로 밝혀진 알 수 없는 UEFI 변수를 런타임에서 지우지 않도록 하기 위한 것입니다 . (사양에는 모든 UEFI 변수를 제거한 상태에서 시스템이 정상적으로 부팅되어야 한다고 명시되어 있지만 일부 시스템은 호환되지 않으며 이러한 방식으로 벽돌이 쌓일 수 있습니다.)
변경할 수 없는 속성을 먼저 제거해야 합니다.
# chattr -i 2151678336-417acee0-6fa9-4a82-99d7-f9b1dd271e48
그래도 변수를 삭제하거나 덮어쓸 수는 없지만 다른 변수를 삭제할 수는 있습니다. 여전히 새로운 변수를 추가할 수 없었지만 재부팅 후 Linux는 추가 공간을 확보하여 bootctl install
마침내 성공했습니다.
다른 동일한 기계와 비교해 보면 이 거대한 UEFI 변수가 실제로 있어야 할 곳에 있다는 것이 밝혀졌습니다! 따라서 Linux를 사용하는 이러한 시스템에서는 부팅 변수를 위한 여유 공간이 아주 적습니다(Linux는 사용 가능한 공간이 50% 미만인 경우 UEFI 변수 쓰기를 분명히 거부하기 때문입니다).
efi_no_storage_paranoia
편집: 유휴 EFI 가변 공간이 50 미만으로 떨어진 후 부팅에 실패한 이전 펌웨어 중 하나가 펌웨어가 아닌지 확인하는 한 매개 변수를 사용하여 커널을 부팅하여 이 제한을 비활성화하고 전체 EFI 저장 영역에 액세스할 수도 있습니다 . %.