Копайте ошибку 'несовместимой лицензии'

Можно использовать join команда для выполнения этой задачи:

join -1 1 -2 1 sample.log sample.log.1 -o 1.1,1.2,1.3,2.2

Вывод будет разделенным 'одиночным пробелом', но можно использовать awk для переформатирования его, чтобы быть выровненным столбцом.

Обратите внимание что join входные файлы должны быть отсортированы.

6
01.05.2013, 01:43
2 ответа

Update2:

Забыл, что Вы отправили шар 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, не зафиксировал.


Update1: хорошо. Зафиксированный. Должен работать и на 32 и на 64-разрядный ELF.


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

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

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

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

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

Имел другую проблему с модулями, где я должен был проверить на различный, извлек части того кода и превратил его в быстрый тестер лицензии. Вы могли протестировать каждого *.mod файл в /boot/grub/* видеть, какой (s) поврежден.

Этот код не проверяет ELF или что-либо еще. Только попытайтесь определить местоположение строки лицензии и проверить это. Далее это только тестируется под i386/32-bit. Исходный код, где это извлечено из обработанного для 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;
}
6
27.01.2020, 20:27
  • 1
    я не вспоминаю тонкую настройку моей установки Личинки. Спасибо за то, что провели время для соединения того кода тестирования модуля. –   30.04.2013, 15:06
  • 2
    Ваш ответ непосредственно не отвечал на мой исходный вопрос, таким образом, я изменил свой вопрос немного. После того как этот вопрос имеет право на щедрость, я отправлю еще 50 репутациям Ваш способ возместить Вам в течение Вашего времени. Еще раз спасибо. –   01.05.2013, 01:36
  • 3
    @EvanTeitelman: Большое спасибо, но никакая потребность в точках щедрости. Сохраните свои твердые заработанные очки в течение дождливого дня ;). Когда дело доходит до GPT это чтение могло бы заинтересовать Вас. –  Runium 01.05.2013, 04:57

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

    ss of Boot-Repair

1
27.01.2020, 20:27
  • 1
    После наблюдения изображения Вы отправили, я переустановил Личинку. К сожалению, переустанавливание, казалось, не имело никакого эффекта. –   30.04.2013, 15:43

Теги

Похожие вопросы