LINUX.ORG.RU

debian/ubuntu uefi

 , ,


0

2

Чем различаются процессы установки legacy/uefi? Если я выключу поддержку legacy (т.е. uefi будет пропускаться при загрузке), то как потом зайти в uefi из ubuntu/debian?

Если я выключу поддержку legacy (т.е. uefi будет пропускаться при загрузке), то как потом зайти в uefi из ubuntu/debian?

что-то типа:

systemctl reboot --firmware-setup

...но только НЕ в этой версии Debian/Ubuntu , а потом в следущей (или через-следущей) какой-нибудь там в будущей :-) ..

текущая версия Debian/Ubuntu — думаю ещё не умеет.

хотя быть может тебе кто-то подскажет как можно вручную поменять нужную переменную в ``/sys/firmware/efi/``

user_id_68054 ★★★★★ ()
Последнее исправление: user_id_68054 (всего исправлений: 3)

Не понял, зачем заходить в UEFI из системы? Как это вообще? Туда, насколько я понимаю, заходят перед моментом загрузки по какой-нибудь клавише вроде Del. А поддержку legacy в UEFI смело вырубай.

fludardes ★★ ()

а вот пока-что ты можешь поглядеть — как реализовано это в исходниках:

http://cgit.freedesktop.org/systemd/systemd/tree/src/shared/efivars.c

int efi_set_reboot_to_firmware(bool value) {
        int r;
        uint64_t b, b_new;

        r = get_os_indications(&b);
        if (r < 0)
                return r;

        if (value)
                b_new = b | EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
        else
                b_new = b & ~EFI_OS_INDICATIONS_BOOT_TO_FW_UI;

        /* Avoid writing to efi vars store if we can due to firmware bugs. */
        if (b != b_new)
                return efi_set_variable(EFI_VENDOR_GLOBAL, "OsIndications", &b_new, sizeof(uint64_t));

        return 0;
}

...в свою очередь --

static int get_os_indications(uint64_t *os_indication) {
        int r;
        size_t s;
        _cleanup_free_ void *v = NULL;

        r = efi_reboot_to_firmware_supported();
        if (r < 0)
                return r;

        r = efi_get_variable(EFI_VENDOR_GLOBAL, "OsIndications", NULL, &v, &s);
        if (r < 0)
                return r;
        else if (s != sizeof(uint64_t))
                return -EINVAL;

        *os_indication = *(uint64_t *)v;
        return 0;
}

эта функция [``efi_set_reboot_to_firmware()``] выполняется, когда logind получает dbus-сообщение [см функцию ``method_set_reboot_to_firmware_setup()``] — тут:

http://cgit.freedesktop.org/systemd/systemd/tree/src/login/logind-dbus.c

а systemctl как раз занимается отправкой этого dbus-сообщения [см функцию ``prepare_firmware_setup()``]  — тут:

http://cgit.freedesktop.org/systemd/systemd/tree/src/systemctl/systemctl.c

user_id_68054 ★★★★★ ()
Последнее исправление: user_id_68054 (всего исправлений: 4)

вобщем говоря — если тебе так нужно — то мы сможем тебе набросать простенький Python-скрипт который будет это же делать :-)

user_id_68054 ★★★★★ ()

ну вот ..

так как ты ОЧЕНЬ просил — вот тебе Python-скрипт --

#!/usr/bin/env python3
# -*- mode: python; coding: utf-8 -*-

assert str is not bytes

import os
import struct

EFI_VAR_PATH = '/sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c'
EFI_OS_INDICATIONS_BOOT_TO_FW_UI = 0x0000000000000001
REAL_REBOOT_CMD = 'reboot'

def reboot_to_firmware():
    with open(EFI_VAR_PATH, mode='rb') as fd:
        raw_efi_value = fd.read()
    
    efi_struct_format = '=IQ'
    efi_prefix, efi_value = struct.unpack(efi_struct_format, raw_efi_value)
    new_efi_value = efi_value | EFI_OS_INDICATIONS_BOOT_TO_FW_UI
    new_raw_efi_value = struct.pack(efi_struct_format, efi_prefix, new_efi_value)
    
    with open(EFI_VAR_PATH, mode='wb') as fd:
        fd.write(new_raw_efi_value)
    
    os.system(REAL_REBOOT_CMD)

if __name__ == '__main__':
    reboot_to_firmware()

сохрани его, сделай права на выполнение

chmod +x reboot-to-firmware.py

и радостно перезагружайся в UEFI :-)

./reboot-to-firmware.py

# P.S.: к сожалению мой ноутбук не умеет перезагружаться в UEFI , так как слишком старый, так что всё это слегка экспериментально :)

user_id_68054 ★★★★★ ()
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от chrisred

однако скрипт НЕ сработает в ситуациях если EFI-переменной ``OsIndications-...`` — по какой либо причине ещё-покачто не существует :-)

по хорошему нужно было БЫ в такой ситуации самому создать эту переменную...

...но я решил не заморачиваться.. так как всё равно — рано или поздно в дистрибутивах выйдет новая версия systemd в которой — debian/ubuntu uefi (комментарий)

user_id_68054 ★★★★★ ()
20 июля 2015 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.