Ошибка «несовместимой лицензии» Grub

Ошибка «несовместимой лицензии» Grub

На днях я использовал ноутбук для обычных настольных задач, когда его клавиатура начала барахлить. Большинство клавиш на правой стороне клавиатуры полностью перестали работать, а комбинации клавиш, например, Ctrluзаставляли появляться символы, которые не должны были появляться. Клавиша backspace вела себя крайне странно; она каким-то образом могла вызывать появление символов удаления в командной строке.

Я не смог перезагрузить компьютер чисто, поэтому я сделал жесткое выключение. Когда я снова включил компьютер, я получил это сообщение от Grub:

GRUB loading.
Welcome to GRUB!

incompatible license
Aborted. Press any key to exit.

Я нажал любую клавишу, и Grub ответил:

Operating System Not Found.

Нажатие другой клавиши снова приводит к появлению первого сообщения. Нажатие другой клавиши после этого приводит к появлению второго сообщения... и так далее.

Если я оставлю ноутбук включенным на несколько минут, его вентилятор значительно ускорится, как будто на ноутбуке запущена программа, интенсивно использующая процессор.

Я вынул жесткий диск из ноутбука, установил его на сервер и осмотрелся. Ничего странного в нем не увидел /boot.

На ноутбуке установлена ​​ОС Arch Linux. Диск разбит на разделы с помощью GPT. Ноутбук отлично работает с жестким диском с другой машины. А другие машины не работают с жестким диском ноутбука.

Я не уверен, что проблемы с клавиатурой напрямую связаны с проблемами Grub.

Что может быть причиной проблем, которые у меня есть? Или что мне следует сделать, чтобы выяснить или сузить список потенциальных причин?

На всякий случай, если это актуально, вот(удаленный)это tarball с /bootи /etc/grub.dвот моя конфигурация Grub:

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
insmod part_gpt
insmod part_msdos
if [ -s $prefix/grubenv ]; then
  load_env
fi
set default="0"

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_gpt
insmod ext2
set root='hd0,gpt1'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1  d44f2a2f-c369-456b-81f1-efa13f9caae2
else
  search --no-floppy --fs-uuid --set=root d44f2a2f-c369-456b-81f1-efa13f9caae2
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=en_US
  insmod gettext
fi
terminal_input console
terminal_output gfxterm
set timeout=5
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'Arch GNU/Linux, with Linux PARA kernel' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-PARA kernel-true-d44f2a2f-c369-456b-81f1-efa13f9caae2' {
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root='hd1,gpt1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt1 --hint-efi=hd1,gpt1 --hint-baremetal=ahci1,gpt1  b4fbf4f8-303c-49bd-a52f-6049e1623a26
    else
      search --no-floppy --fs-uuid --set=root b4fbf4f8-303c-49bd-a52f-6049e1623a26
    fi
    echo    'Loading Linux PARA kernel ...'
    linux   /boot/vmlinuz-linux-PARA root=UUID=d44f2a2f-c369-456b-81f1-efa13f9caae2 ro  quiet
    echo    'Loading initial ramdisk ...'
    initrd  /boot/initramfs-linux-PARA.img
}
menuentry 'Arch GNU/Linux, with Linux core repo kernel' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-core repo kernel-true-d44f2a2f-c369-456b-81f1-efa13f9caae2' {
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root='hd1,gpt1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt1 --hint-efi=hd1,gpt1 --hint-baremetal=ahci1,gpt1  b4fbf4f8-303c-49bd-a52f-6049e1623a26
    else
      search --no-floppy --fs-uuid --set=root b4fbf4f8-303c-49bd-a52f-6049e1623a26
    fi
    echo    'Loading Linux core repo kernel ...'
    linux   /boot/vmlinuz-linux root=UUID=d44f2a2f-c369-456b-81f1-efa13f9caae2 ro  quiet
    echo    'Loading initial ramdisk ...'
    initrd  /boot/initramfs-linux.img
}
menuentry 'Arch GNU/Linux, with Linux core repo kernel (Fallback initramfs)' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-core repo kernel-fallback-d44f2a2f-c369-456b-81f1-efa13f9caae2' {
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root='hd1,gpt1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt1 --hint-efi=hd1,gpt1 --hint-baremetal=ahci1,gpt1  b4fbf4f8-303c-49bd-a52f-6049e1623a26
    else
      search --no-floppy --fs-uuid --set=root b4fbf4f8-303c-49bd-a52f-6049e1623a26
    fi
    echo    'Loading Linux core repo kernel ...'
    linux   /boot/vmlinuz-linux root=UUID=d44f2a2f-c369-456b-81f1-efa13f9caae2 ro  quiet
    echo    'Loading initial ramdisk ...'
    initrd  /boot/initramfs-linux-fallback.img
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" --class memtest86 --class gnu --class tool {
  insmod part_gpt
  insmod ext2
  set root='hd1,gpt1'
  if [ x$feature_platform_search_hint = xy ]; then
    search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt1 --hint-efi=hd1,gpt1 --hint-baremetal=ahci1,gpt1  b4fbf4f8-303c-49bd-a52f-6049e1623a26
  else
    search --no-floppy --fs-uuid --set=root b4fbf4f8-303c-49bd-a52f-6049e1623a26
  fi
  linux16 ($root)/boot/memtest86+/memtest.bin
}
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

Обновлять

После установки LILO вчера вечером компьютер нормально загрузился по крайней мере один раз. Когда я загрузил компьютер сегодня утром, я столкнулся с kernel panic:

Initramfs unpacking failed: junk in compressed archive
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,1)
Pid: 1, comm: swapper/0 Not tainted 3.8.7-1-ARCH #1
Call Trace:
...

Здесьэто картина паники ядра.

Обновление 2

Я переустановил LILO и больше не получаю ошибку ядра при загрузке.

решение1

Обновление2:

Забыл, что ты выложил tar-шар. Жаль. В любом случае, сделал тест на твоих .modфайлах, используя код ниже и:

./grum_lic_test32 evan_teitelman/boot/grub/i386-pc/*.mod

что привело к следующей ошибке:

...
bufio.mod                 License: LICENSE=GPLv3+            OK
cacheinfo.mod             License: LICENSE=NONE_FOUND        ERR
cat.mod                   License: LICENSE=GPLv3+            OK
chain.mod                 License: LICENSE=GPLv3+            OK
...

но этот файл идентичен файлу из загрузки Archlinux, так что это не должно быть проблемой. Другими словами, это не было причиной.

Также, во-первых, обратите внимание, что вы установили LILO, – и угадайте, что дело закрыто. Если нет, всегда есть вопрос о GPT и BIOS + другие проблемы. Вы установили его в первый раз? Может быть, при первой установке были какие-то изменения, которые переустановка GRUB не исправила.


Обновление1:ОК. Исправлено. Должно работать как для 32-, так и для 64-битных ELF'ов.


Когда GRUBдоходит до фазы загрузки модулей, он проверяет лицензию, встроенную в ELFфайл для каждого модуля. Если обнаруживается недействительный модуль, он игнорируется – и выводится эта конкретная ошибка. Возможно, один или несколько модулей повреждены.

Если это существенный модуль, то все пойдет не так. Например, part_gpt.mod или part_msdos.mod.

Принятые лицензии: GPLv2+, GPLv3и GPLv3+.

Конечно, могут быть и другие причины, но одной из многих может быть поврежденный файл(ы) модуля.

Похоже, что модули являются допустимыми ELFфайлами, поскольку они проверяются как таковые перед лицензионным тестом. Например: если ELFтест не пройден, лицензионный тест не выполняется.

Была еще одна проблема с модулями, где мне нужно было проверить различные, извлек части этого кода и сделал из него быстрый тестер лицензий. Вы могли бы проверить каждый *.modфайл, /boot/grub/*чтобы увидеть, какие из них повреждены.

Этот код не проверяет ELFи ничего больше. Только попробуйте найти строку лицензии и проверить ее. Кроме того, он тестируется только под i386/32-бит. Исходный код, из которого он извлечен, работал и под x86-64 – но здесь многое урезано и взломано, так что я не уверен в результате. Если он не работает под 64-бит, он, скорее всего, должен только печатать License: LICENSE=NONE_FOUND.

(Как отмечено в редактировании выше, я теперь протестировал 32- и 64-битную версию Intel.)

В качестве отдельного теста можно было бы сделать что-то вроде:

xxd file.mod | grep -C1 LIC

Не самый красивый код, но для быстрой и грубой проверки подойдет.

(То есть, можно попробовать.)

Составьте инструкции, например:

gcc -o grub_lic_test32 source.c         # 32-bit variant
gcc -o grub_lic_test64 source.c -DELF64 # 64-bit variant

Бегать:

./grub_lic_test32 /path/to/mods/*.mod

Распечатывает каждый файл и лицензию, например:

./grub_lic_test32 tar.mod gettext.mod pxe.mod
tar.mod                   License: LICENSE=GPLv1+            BAD
gettext.mod               License: LICENSE=GPLv3+            OK
pxe.mod                   License: LICENSE=GPLv3+            OK

Код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>

#ifdef ELF64
struct ELF_hdr
{
    unsigned char dummy0[16];
    uint32_t dummy1[6];
    uint64_t sh_off;
    uint16_t dummy2[5];
    uint16_t sh_entsize;
    uint16_t sh_num;
    uint16_t sh_strndx;
};
struct ELF_sect_hdr
{
    uint32_t sh_name;
    uint32_t dummy0[5];
    uint64_t sh_offset;
};
#else
struct ELF_hdr
{
    unsigned char dummy0[16];
    uint32_t dummy1[4];
    uint32_t sh_off;
    uint16_t dummy2[5];
    uint16_t sh_entsize;
    uint16_t sh_num;
    uint16_t sh_strndx;
};
struct ELF_sect_hdr
{
    uint32_t sh_name;
    uint32_t dummy[3];
    uint32_t sh_offset;
};
#endif

enum {
    ERR_FILE_OPEN = 1,
    ERR_FILE_READ,
    ERR_MEM,
    ERR_BAD_LICENSE,
    ERR_ELF_SECT_CORE_BREACH
};

int file_size(FILE *fh, size_t *fs)
{
    size_t cp;

    cp = ftell(fh);
    fseek(fh, 0, SEEK_END);
    *fs = ftell(fh);
    fseek(fh, cp, SEEK_SET);

    return 0;
}

static const char *valid_licenses[] = {
    "LICENSE=GPLv2+",
    "LICENSE=GPLv3",
    "LICENSE=GPLv3+",
    NULL
};

int grub_check_license(struct ELF_hdr *e)
{
    struct ELF_sect_hdr *s;
    const char *txt;
    const char *lic;
    unsigned i, j = 0;

    s = (struct ELF_sect_hdr *)
        ((char *) e + e->sh_off + e->sh_strndx * e->sh_entsize);

    txt = (char *) e + s->sh_offset;

    s = (struct ELF_sect_hdr *) ((char *) e + e->sh_off);

    for (i = 0; i < e->sh_num; ++i) {
        if (strcmp (txt + s->sh_name, ".module_license") == 0) {
            lic = (char*) e + s->sh_offset;

            if (j)
                fprintf(stdout, "%25s", "");
            fprintf(stdout, "License: %-25s ", lic);

            for (j = 0; valid_licenses[j]; ++j) {
                if (!strcmp (lic, valid_licenses[j])) {
                    fprintf(stdout, "OK\n");
                    return 0;
                }
            }
            fprintf(stdout, "BAD\n");
        }
        s = (struct ELF_sect_hdr *) ((char *) s + e->sh_entsize);
    }

    if (!j)
        fprintf(stdout, "License: %-25s ERR\n", "LICENSE=NONE_FOUND");

    return ERR_BAD_LICENSE;
}

int grub_check_module(void *buf, size_t size, int verbose)
{
    struct ELF_hdr *e = buf;

    /* Make sure that every section is within the core.  */
    if (e->sh_off + e->sh_entsize * e->sh_num > size) {
        fprintf(stderr, "ERR: Sections outside core\n");
        if (verbose)
            fprintf(stderr,
                "  %*s: %u bytes\n"
#ifdef ELF64
                "  %*s  %u < %llu\n"
                "  %*s: %llu\n"
#else
                "  %*s  %u < %u\n"
                "  %*s: %u\n"
#endif
                "  %*s: %u\n"
                "  %*s: %u\n"
                ,
                -25, "file-size", size,
                -25, "",
                size, e->sh_off + e->sh_entsize * e->sh_num,
                -25, "sector header offset", e->sh_off,
                -25, "sector header entry size", e->sh_entsize,
                -25, "sector header num", e->sh_num
            );
        return ERR_ELF_SECT_CORE_BREACH;
    }

    return grub_check_license(e);
}

int grub_check_module_file(const char *fn, int verbose)
{
    FILE *fh;
    void *buf;
    size_t fs;
    int eno;
    char *base_fn;

    if (!(base_fn = strrchr(fn, '/')))
        base_fn = (char*)fn;
    else
        ++base_fn;

    fprintf(stderr, "%-25s ", base_fn);

    if (!(fh = fopen(fn, "rb"))) {
        fprintf(stderr, "ERR: Unable to open `%s'\n", fn);
        perror("fopen");
        return ERR_FILE_OPEN;
    }
    file_size(fh, &fs);
    if (!(buf = malloc(fs))) {
        fprintf(stderr, "ERR: Memory.\n");
        fclose(fh);
        return ERR_MEM;
    }
    if (fread(buf, 1, fs, fh) != fs) {
        fprintf(stderr, "ERR: Reading `%s'\n", fn);
        perror("fread");
        free(buf);
        fclose(fh);
        return ERR_FILE_READ;
    }
    fclose(fh);

    eno = grub_check_module(buf, fs, verbose);
    free(buf);

    return eno;
}


int main(int argc, char *argv[])
{
    int i = 1;
    int eno = 0;
    int verbose = 0;

    if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'v') {
        verbose = 1;
        ++i;
    }

    if (argc - i < 1) {
        fprintf(stderr, "Usage: %s [-v] <FILE>[, FILE[, ...]]\n", argv[0]);
        return 1;
    }


    for (; i < argc; ++i) {
        eno |= grub_check_module_file(argv[i], verbose);
        if (eno == ERR_MEM)
            return eno;
    }

    return eno;
}

решение2

Взгляните на эту ветку на ubuntugeek.com под названием:Boot-Repair – Простой инструмент для устранения частых проблем с загрузкой. Этот инструмент может помочь исправить то, что не так с вашим жестким диском. Если посмотреть на список функций, то это кажется самым простым способом попытаться восстановить загрузочный раздел, не слишком пачкая руки.

    ss из Boot-Repair

Связанный контент