디스크 필터 쓰기가 지원되지 않습니다.>이 오류를 발생시키는 원인은 무엇입니까?


88

이 메시지는 Grub 메뉴를 떠나거나 Ubuntu 스플래시 화면 전에 나타납니다.

메시지를 지우려면 문제를 어떻게 해결합니까?

그리고 그것은 무엇을 의미합니까?

error:  Diskfilter writes are not supported

시스템 부팅 및 제대로 작동하는 것 같습니다.


1
아직 우분투 데스크탑 15.04 ...에 고정되어 있지
ThePiercingPrince

1
16.04에서 여전히 수정되지 않았습니다. 이러한 버그 수정 속도는 유지하기가 어렵습니다.
Paul Tomblin

답변:


145

버그입니다!

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_envRAID 또는 LVM 디스크 에서는 실행할 수 없음 ). GRUB 매뉴얼에서 :

안전상의 이유로이 스토리지는 일반 디스크 (LVM 또는 RAID 없음), 비 체크섬 파일 시스템 (ZFS 없음) 및 BIOS 또는 EFI 기능 (ATA, USB 또는 IEEE1275 없음)을 사용하는 경우에만 사용할 수 있습니다.

GRUB recordfail 기능은 save_env명령문을 사용하여 recordfail 상태를 업데이트합니다 ( Ubuntu 도움말 -Grub 2 , "마지막 부팅 실패 또는 복구 모드로 부팅"섹션 참조). 그러나 Ubuntu 14.04 (및 최신 데비안 버전)에서는 save_envGRUB이 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은 RAID 및 LVM 내부에 쓰지 않도록 어떻게 보호합니까?

파일 시스템에서 올바르게 읽고 쓰기 위해 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_boot1에서 0으로 변경 하면 recordfail 기능이 비활성화되고 RAID / LVM 파티션에서 쓰기가 비활성화됩니다.

그러나 다른 많은 기능도 비활성화됩니다 (실행 grep \$quick_boot /etc/grub.d/*하고 볼 수 있습니다). 그러나 언젠가 /boot/grub디렉토리를 RAID / LVM 외부로 변경 하면 recordfail 기능이 여전히 비활성화됩니다.

요약하면이 솔루션은 불필요하게 기능을 비활성화하며 일반적인 것은 아닙니다.

올바른 해결책은 무엇입니까?

올바른 솔루션은 save_envGRUB이 LVM 또는 RAID 파티션 내에있을 때 명령문을 비활성화하는 것을 고려해야 합니다.

이 솔루션을 구현하기 위해 데비안 버그 추적기 시스템에서 하나의 패치가 제안되었습니다. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921 에서 찾을 수 있습니다.

이 패치의 기본 개념은 다음과 같습니다.

  • grub-probe --target=abstraction "${grubdir}"GRUB이 /boot/grub디렉토리 에서 파일을 읽고 쓰는 데 사용하는 추상화 모듈을 가져 오려면 명령을 실행하십시오 .
  • 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

특히 버그 참조에 감사드립니다. 그래도 nux의 솔루션이 더 매력적 이라는 것을 이해하기를 바랍니다 . ;)
CMD

6
@ClassStacker 안녕하세요, 답변을 요약했습니다! 그것은 매우 크고 많은 사람들이 이해하기가 매우 어려웠습니다. 이제 관심있는 섹션에서만 볼 수 있습니다.
Rarylson Freitas

8
와. 감사합니다. "이 달의 답변"기능이 있다면 귀하의 투표에 동의합니다. 또한 "BS 없음"상을받을 자격이 있습니다. 이것은 실제로 가치를 제공하고 포럼과 비교할 때이 사이트 네트워크간에 큰 차이를 만드는 기사입니다.
CMD

1
슬프게도 나는이 버그의 영향을 받았으며 00_header파일 을 편집해도 버그 보고서 또는 여기의 수정 사항이 없습니다 . 나는 quick_boot그것을 없애기 위해 비활성화하지 않을 것입니다.
douggro

@douggro 왜 편집 된 00_header파일 (여기에서 권장 된)이 작동 하지 않는지 잘 모르겠습니다 . 나는 그것이 나를 위해 (그리고 Rarylson Freitas를 위해) 작동한다고해서 그것이 반드시 모든 사람에게 효과적이라는 것을 의미하지는 않습니다. 그러나 이전 및 신규에 대한 올바른 권한을 부여하고 00_header실행 update-grub했습니까? ( 00_header제자리에서 편집 한 경우 chmod필요하지는 않지만 update-grub필요합니다.)
Eliah Kagan

33

이 오류는 RAID 또는 LVM 파티션으로 인해 발생한다고 생각 합니다.

이 문제에 대한 임시 수정 사항 :

편집하다 :/etc/grub.d/10_linux

바꾸다 'quick_boot="1"' with 'quick_boot="0"'

그런 다음 :

sudo update-grub

고마워요, 완벽하게 작동했습니다. 예, 모든 볼륨에 LVM을 사용하고 있습니다.
RCF

이 솔루션에 감사드립니다. 그것은 많은 작업을 저장했습니다. 약간의 배경 정보도 있습니까?
CMD

@ClassStacker nux에서 추가 정보를 요청하는 경우 (@nux)로 시작하려면 주석을 편집해야합니다. 나에게 묻는다면 어떤 유형의 배경을 찾고 있습니까?
RCF

2
@ RCF-U14.04 1) 아니요, 필요 없습니다. "댓글 추가"-> "도움말"을 클릭하면 "게시물 작성자에게 항상 귀하의 의견을 알립니다"라는 것을 알 수 있습니다. 2) 특히 Rarylson Freitas의 광범위한 답변을 통해 왜 이것이 문제를 해결하는지 알고 싶습니다 (nux에서). 그러나 당신이 그것에 대답 할 수 있다면, 자유롭게 그렇게하십시오.
CMD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.