이 메시지는 Grub 메뉴를 떠나거나 Ubuntu 스플래시 화면 전에 나타납니다.
메시지를 지우려면 문제를 어떻게 해결합니까?
그리고 그것은 무엇을 의미합니까?
error: Diskfilter writes are not supported
시스템 부팅 및 제대로 작동하는 것 같습니다.
이 메시지는 Grub 메뉴를 떠나거나 Ubuntu 스플래시 화면 전에 나타납니다.
메시지를 지우려면 문제를 어떻게 해결합니까?
그리고 그것은 무엇을 의미합니까?
error: Diskfilter writes are not supported
시스템 부팅 및 제대로 작동하는 것 같습니다.
답변:
LVM 또는 RAID 파티션 내에 부팅 파티션 (또는 부팅 파티션이없는 경우 루트 파티션)을 만들 때 최신 버전의 Ubuntu Server LTS (Ubuntu Server 14.04 LTS)에서 발생하는 버그입니다. .
Ubuntu Launchpad에서이 버그에 대한 자세한 정보를 얻을 수 있습니다. 버그 # 1274320 "오류 : diskfilter 쓰기가 지원되지 않습니다 . "
업데이트 : 이 버그는 Ubuntu Server 14.04 및 일부 최신 Ubuntu 버전에서 이미 수정되었습니다. 아마 당신은 실행해야합니다 apt-get upgrade
.
시스템이 부팅 될 때 GRUB은의 ( load_env
) 데이터를 읽습니다 /boot/grub/grubenv
. 이 파일은 GRUB Environment Block 입니다.
GRUB 매뉴얼에서 :
한 부팅에서 다음 부팅까지 적은 양의 정보를 기억할 수있는 것이 종종 유용합니다.
[...]
부팅시 load_env 명령 (load_env 참조)은 환경 변수를로드하고 save_env (sav_env 참조) 명령은 환경 변수를 저장합니다.
[...]
grub-mkconfig
이 기능을 사용하여 구현GRUB_SAVEDEFAULT
이 동작은 다음에서 찾을 수 있습니다 /etc/grub.d/00_header
( update-grub
이 파일을 사용하여 /boot/grub/grub.cfg
파일 생성 ).
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
문제는 save_env
명령문이 간단한 설치에서만 작동 한다는 것입니다 ( save_env
RAID 또는 LVM 디스크 에서는 실행할 수 없음 ). GRUB 매뉴얼에서 :
안전상의 이유로이 스토리지는 일반 디스크 (LVM 또는 RAID 없음), 비 체크섬 파일 시스템 (ZFS 없음) 및 BIOS 또는 EFI 기능 (ATA, USB 또는 IEEE1275 없음)을 사용하는 경우에만 사용할 수 있습니다.
GRUB recordfail 기능은 save_env
명령문을 사용하여 recordfail 상태를 업데이트합니다 ( Ubuntu 도움말 -Grub 2 , "마지막 부팅 실패 또는 복구 모드로 부팅"섹션 참조). 그러나 Ubuntu 14.04 (및 최신 데비안 버전)에서는 save_env
GRUB이 LVM 또는 RAID에 설치되어 있어도 (recordfail 기능 내부 ) 명령문이 사용됩니다.
104에서 124까지의 줄을 보자 /etc/grub.d/00_header
.
if [ "$quick_boot" = 1 ]; then
[...]
case "$FS" in
btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfs)
cat <<EOF
# GRUB lacks write support for $FS, so recordfail support is disabled.
[...]
if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
지원되지 않는 파일 시스템 (btrfs, zfs 등)을 사용하는 경우 GRUB은 recordfail 기능을 올바르게 건너 뛰지 만 LVM 및 RAID는 건너 뛰지 않습니다 .
파일 시스템에서 올바르게 읽고 쓰기 위해 GRUB은 적절한 모듈을로드합니다.
GRUB은 RAID 파티션 의 디스크 필터 모듈 ( insmod diskfilter
)과 LVM 파티션 의 lvm 모듈을 사용합니다.
디스크 필터 모듈 의 읽기 / 쓰기 구현을 보자 :
apt-get source grub2
vim grub2-2.02~beta2/grub-core/disk/diskfilter.c
여기에 코드를 붙여 넣습니다 (808에서 823 줄). 이 질문에 표시된 경고는 821 행에 나타납니다.
static grub_err_t
grub_diskfilter_read (grub_disk_t disk, grub_disk_addr_t sector,
grub_size_t size, char *buf)
{
return read_lv (disk->data, sector, size, buf);
}
static grub_err_t
grub_diskfilter_write (grub_disk_t disk __attribute ((unused)),
grub_disk_addr_t sector __attribute ((unused)),
grub_size_t size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"diskfilter writes are not supported");
}
이 grub_diskfilter_read
기능은 구현되었으며 GRUB은 RAID 파일 시스템을 읽을 수 있습니다. 그러나이 grub_diskfilter_write
함수는 GRUB_ERR_NOT_IMPLEMENTED_YET
오류를 발생시킵니다.
quick_boot=0
하여 문제 가 해결되는 이유는 무엇 입니까? 왜 잘못된 해결책입니까?/etc/grub.d/00_header
코드 에서 한 번 더 살펴보면 recordfail Featured가에서만 사용됨을 알 수 quick_boot=1
있습니다. 따라서 quick_boot
1에서 0으로 변경 하면 recordfail 기능이 비활성화되고 RAID / LVM 파티션에서 쓰기가 비활성화됩니다.
그러나 다른 많은 기능도 비활성화됩니다 (실행 grep \$quick_boot /etc/grub.d/*
하고 볼 수 있습니다). 그러나 언젠가 /boot/grub
디렉토리를 RAID / LVM 외부로 변경 하면 recordfail 기능이 여전히 비활성화됩니다.
요약하면이 솔루션은 불필요하게 기능을 비활성화하며 일반적인 것은 아닙니다.
올바른 솔루션은 save_env
GRUB이 LVM 또는 RAID 파티션 내에있을 때 명령문을 비활성화하는 것을 고려해야 합니다.
이 솔루션을 구현하기 위해 데비안 버그 추적기 시스템에서 하나의 패치가 제안되었습니다. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921 에서 찾을 수 있습니다.
이 패치의 기본 개념은 다음과 같습니다.
grub-probe --target=abstraction "${grubdir}"
GRUB이 /boot/grub
디렉토리 에서 파일을 읽고 쓰는 데 사용하는 추상화 모듈을 가져 오려면 명령을 실행하십시오 .diskfilter
또는 lvm
모듈을 사용하는 경우 recordfail save_env
문을 건너 뛰고 /boot/grub/grub.cfg
파일에 적절한 주석을 작성 하십시오.
# GRUB lacks write support for /dev/md0, so recordfail support is disabled.
공식 코드에서 우분투 / 데비안 사람들 이이 패치를 적용하기를 원하지 않는다면 내 패치를 사용할 수 있습니다 00_header
.
# Download
wget https://gist.githubusercontent.com/rarylson/da6b77ad6edde25529b2/raw/99f266a10e663e1829efc25eca6eddb9412c6fdc/00_header_patched
# Apply
mv /etc/grub.d/00_header /etc/grub.d/00_header.orig
mv 00_header_patched /etc/grub.d/00_header
# Disable the old script and enable the new one
chmod -x /etc/grub.d/00_header.orig
chmod +x /etc/grub.d/00_header
# Update Grub
update-grub
00_header
파일 을 편집해도 버그 보고서 또는 여기의 수정 사항이 없습니다 . 나는 quick_boot
그것을 없애기 위해 비활성화하지 않을 것입니다.
00_header
파일 (여기에서 권장 된)이 작동 하지 않는지 잘 모르겠습니다 . 나는 그것이 나를 위해 (그리고 Rarylson Freitas를 위해) 작동한다고해서 그것이 반드시 모든 사람에게 효과적이라는 것을 의미하지는 않습니다. 그러나 이전 및 신규에 대한 올바른 권한을 부여하고 00_header
실행 update-grub
했습니까? ( 00_header
제자리에서 편집 한 경우 chmod
필요하지는 않지만 update-grub
필요합니다.)
이 오류는 RAID 또는 LVM 파티션으로 인해 발생한다고 생각 합니다.
이 문제에 대한 임시 수정 사항 :
편집하다 :/etc/grub.d/10_linux
바꾸다 'quick_boot="1"' with 'quick_boot="0"'
그런 다음 :
sudo update-grub