[gelost] grub timeout ohne interrupt

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Mentore
Beiträge: 51
Registriert: 09.10.2007 20:42:38
Wohnort: berlin

[gelost] grub timeout ohne interrupt

Beitrag von Mentore » 15.10.2017 17:31:48

Hallo Gemeinde

ich bin gerade dabei debian auf meinen tablet einzurichten.. es laeuft ganz gut :)
Es ist debian testing installiert und ich habe in der /etc/default/grub datei die werte GRUB_TIMEOUT=10 und GRUB_RECORDFAIL_TIMEOUT=10 hinzugefuegt.

Was ist eigentlich das Problem :?
Ich habe einen dualboot in grub windows/debian. Noch ist windows voreingestellt. Wenn ich nun boote wird der countdown gestartet und nach 5 sek windows gebootet.
Wenn ich nun mit meinen seiten tasten des tablets up/down etwas anderes auswaehle bricht der countdown ab und ich muss eine externe tastatur anschliessen um enter zu druecken :(

Gibt es irgentwie eine moeglichkeit eine art GRUB_TIMEOUT_FORCE_NO_INTERUPT anzulegen ich habe leider nur GRUB_RECORDFAIL_TIMEOUT gefunen und das greift leider nicht...

mfg mentore
Zuletzt geändert von Mentore am 22.10.2017 16:55:23, insgesamt 1-mal geändert.

Benutzeravatar
smutbert
Moderator
Beiträge: 8315
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: grub timeout ohne interrupt

Beitrag von smutbert » 15.10.2017 22:34:11

Meines Wissens gibt es das nicht.

Das einzige was es afaik gibt ist die Möglichkeit unter Debian vor dem Herunterfahren festzulegen was gebootet werden soll (grub-set-default). Nachdem das in »/boot/grub/grubenv« gespeichert wird, solltest du dasselbe gegebenenfalls auch unter Windows machen können, zumindest wenn die Datei auf einem Dateisystem liegt, das Windows lesen kann und jemand hat zu dem Zweck offensichtlich sogar ein grafisches Programm geschrieben, das sowohl unter GNU/Linux als auch Windows läuft:
http://de.mcbf.net/david/grubchoosedefault/

Mentore
Beiträge: 51
Registriert: 09.10.2007 20:42:38
Wohnort: berlin

Re: grub timeout ohne interrupt

Beitrag von Mentore » 17.10.2017 17:59:34

Hi

super idee bin ich garnicht drauf gekommen :)

nur geb ich noch nicht so schnell auf ... ich habe in den sources von grub folgendes entdeckt

Code: Alles auswählen


  /* Initialize the time.  */
  saved_time = grub_get_time_ms ();

  timeout = grub_menu_get_timeout ();

  if (timeout > 0)
    menu_print_timeout (timeout);
  else
    clear_timeout ();

  while (1)
    {
      int c;
      timeout = grub_menu_get_timeout ();

      if (grub_normal_exit_level)
	return -1;

      if (timeout > 0 && has_second_elapsed (&saved_time))
	{
	  timeout--;
	  grub_menu_set_timeout (timeout);
	  menu_print_timeout (timeout);
	}

      if (timeout == 0)
	{
	  grub_env_unset ("timeout");
          *auto_boot = 1;
	  menu_fini ();
	  return default_entry;
	}

      c = grub_getkey_noblock ();

      if (c != GRUB_TERM_NO_KEY)
	{
	  if (timeout >= 0)
	    {
	      grub_env_unset ("timeout");
	      grub_env_unset ("fallback");
	      clear_timeout ();
	    }

	  switch (c)
	    {
	    case GRUB_TERM_KEY_HOME:
	    case GRUB_TERM_CTRL | 'a':
	      current_entry = 0;
	      menu_set_chosen_entry (current_entry);
	      break;

	    case GRUB_TERM_KEY_END:
	    case GRUB_TERM_CTRL | 'e':
	      current_entry = menu->size - 1;
	      menu_set_chosen_entry (current_entry);
	      break;

	    case GRUB_TERM_KEY_UP:
	    case GRUB_TERM_CTRL | 'p':
	    case '^':
	      if (current_entry > 0)
		current_entry--;
	      menu_set_chosen_entry (current_entry);
	      break;

	    case GRUB_TERM_CTRL | 'n':
	    case GRUB_TERM_KEY_DOWN:
	    case 'v':
	      if (current_entry < menu->size - 1)
		current_entry++;
	      menu_set_chosen_entry (current_entry);
	      break;

	    case GRUB_TERM_CTRL | 'g':
	    case GRUB_TERM_KEY_PPAGE:
	      if (current_entry < GRUB_MENU_PAGE_SIZE)
		current_entry = 0;
	      else
		current_entry -= GRUB_MENU_PAGE_SIZE;
	      menu_set_chosen_entry (current_entry);
	      break;

	    case GRUB_TERM_CTRL | 'c':
	    case GRUB_TERM_KEY_NPAGE:
	      if (current_entry + GRUB_MENU_PAGE_SIZE < menu->size)
		current_entry += GRUB_MENU_PAGE_SIZE;
	      else
		current_entry = menu->size - 1;
	      menu_set_chosen_entry (current_entry);
	      break;

	    case '\n':
	    case '\r':
	    case GRUB_TERM_KEY_RIGHT:
	    case GRUB_TERM_CTRL | 'f':
	      menu_fini ();
              *auto_boot = 0;
	      return current_entry;

	    case '\e':
	      if (nested)
		{
		  menu_fini ();
		  return -1;
		}
	      break;

	    case 'c':
	      menu_fini ();
	      grub_cmdline_run (1, 0);
	      goto refresh;

	    case 'e':
	      menu_fini ();
		{
		  grub_menu_entry_t e = grub_menu_get_entry (menu, current_entry);
		  if (e)
		    grub_menu_entry_run (e);
		}
	      goto refresh;

	    default:
	      {
		int entry;

		entry = get_entry_index_by_hotkey (menu, c);
		if (entry >= 0)
		  {
		    menu_fini ();
		    *auto_boot = 0;
		    return entry;
		  }
	      }
	      break;
	    }
	}
    }

  /* Never reach here.  */
}

ich hab keine ahnung von code und kann nur zwischen den zeilen lesen :(
aber ich glaube wenn ich den "break" hier entferne muesste der timeout weiterlaufen :?

Code: Alles auswählen

	    case GRUB_TERM_KEY_UP:
	    case GRUB_TERM_CTRL | 'p':
	    case '^':
	      if (current_entry > 0)
		current_entry--;
	      menu_set_chosen_entry (current_entry);
	      break;

	    case GRUB_TERM_CTRL | 'n':
	    case GRUB_TERM_KEY_DOWN:
	    case 'v':
	      if (current_entry < menu->size - 1)
		current_entry++;
	      menu_set_chosen_entry (current_entry);
	      break;
leider finde ich die datei "grub-master/grub-core/normal/menu.c" nicht ich denke das liegt daran das das C zu binaer kompeliert wurde und nun nichtmehr als datei besteht :?
das heisst um es zu testen muesste ich grub selbst kompellieren und erneu installieren ?

mfg

Benutzeravatar
smutbert
Moderator
Beiträge: 8315
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: grub timeout ohne interrupt

Beitrag von smutbert » 18.10.2017 00:26:00

Ja, das müsstest du. Wenn du das Quellcodepaket herunterlädst, kannst du dir aber auch recht einfach selbst das Paket mit dem geänderten Quellcode bauen (vermute bzw. hoffe ich zumindest).

Ich habe keinen Link parat, aber Anleitungen wie man Pakete mit eigenen Patches oder anderen Anpassungen baut sollten sich im Internet leicht finden lassen und wenn ich mich nicht irre auch hier im Forum. Ich hab auch schon einmal am Beispiel irgendeines Paketes beschrieben wie ich es gemacht habe - wenn ich es finde poste ich noch einen Link.

Mentore
Beiträge: 51
Registriert: 09.10.2007 20:42:38
Wohnort: berlin

Re: grub timeout ohne interrupt

Beitrag von Mentore » 19.10.2017 17:27:48

Hi

gott sei dank gibt es ev einen anderen weg... grub2 zu kompilieren macht kein spass
soviele abhaengigkeiten..... und fehler ...

ich glaube du meintest viewtopic.php?f=27&t=164536 mit deinem thread bei ueber 5000 beitraegen ist die suchfunktion hier gold wert xD

also ich hab das erstmal nach deiner anleitung gemacht, allerdings muss man nach dem patchen noch ein

Code: Alles auswählen

dpkg-source --commit
ausfuehren

enden tut es nach deiner anleitung dann mit

Code: Alles auswählen

dpkg-deb: building package 'grub-coreboot-bin' in '../grub-coreboot-bin_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-coreboot-dbg' in '../grub-coreboot-dbg_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-coreboot' in '../grub-coreboot_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-efi-ia32-bin' in '../grub-efi-ia32-bin_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-efi-ia32-dbg' in '../grub-efi-ia32-dbg_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-efi-ia32' in '../grub-efi-ia32_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-efi-amd64-bin' in '../grub-efi-amd64-bin_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-efi-amd64-dbg' in '../grub-efi-amd64-dbg_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-efi-amd64' in '../grub-efi-amd64_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-ieee1275-bin' in '../grub-ieee1275-bin_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-ieee1275-dbg' in '../grub-ieee1275-dbg_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-ieee1275' in '../grub-ieee1275_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-firmware-qemu' in '../grub-firmware-qemu_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-xen-bin' in '../grub-xen-bin_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-xen-dbg' in '../grub-xen-dbg_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-xen' in '../grub-xen_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-xen-host' in '../grub-xen-host_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-theme-starfield' in '../grub-theme-starfield_2.02-2_amd64.deb'.
dpkg-deb: building package 'grub-mount-udeb' in 'debian/.debhelper/scratch-space/build-grub-mount-udeb/grub-mount-udeb_2.02-2_amd64.deb'.
	Renaming grub-mount-udeb_2.02-2_amd64.deb to grub-mount-udeb_2.02-2_amd64.udeb
make[1]: Leaving directory '/home/penis/Downloads/grub2-2.02'
 dpkg-genbuildinfo
 dpkg-genchanges  >../grub2_2.02-2_amd64.changes
dpkg-genchanges: info: not including original source code in upload
 dpkg-source --after-build grub2-2.02
dpkg-buildpackage: info: binary and diff upload (original source NOT included)
root@debian:/home/penis/Downloads/grub2-2.02# 

die ganze ausgabe ist riesig und es hat auch ewig gedauert

danach habe ich folgende dateien im verzeichniss

Code: Alles auswählen


grub2-2.02			      grub-efi-ia32-dbg_2.02-2_amd64.deb
grub2_2.02-2_amd64.buildinfo	      grub-emu_2.02-2_amd64.deb
grub2_2.02-2_amd64.changes	      grub-emu-dbg_2.02-2_amd64.deb
grub2_2.02-2_amd64.deb		      grubentpacktausdsc
grub2_2.02-2.debian.tar.xz	      grub-firmware-qemu_2.02-2_amd64.deb
grub2_2.02-2.dsc		      grub-ieee1275_2.02-2_amd64.deb
grub2_2.02.orig.tar.xz		      grub-ieee1275-bin_2.02-2_amd64.deb
grub2-common_2.02-2_amd64.deb	      grub-ieee1275-dbg_2.02-2_amd64.deb
grub2-common-dbgsym_2.02-2_amd64.deb  grub-linuxbios_2.02-2_amd64.deb
grub-common_2.02-2_amd64.deb	      grub-mount-udeb_2.02-2_amd64.udeb
grub-common-dbgsym_2.02-2_amd64.deb   grub-pc_2.02-2_amd64.deb
grub-coreboot_2.02-2_amd64.deb	      grub-pc-bin_2.02-2_amd64.deb
grub-coreboot-bin_2.02-2_amd64.deb    grub-pc-bin-dbgsym_2.02-2_amd64.deb
grub-coreboot-dbg_2.02-2_amd64.deb    grub-pc-dbg_2.02-2_amd64.deb
grub-efi_2.02-2_amd64.deb	      grub-rescue-pc_2.02-2_amd64.deb
grub-efi-amd64_2.02-2_amd64.deb       grub-theme-starfield_2.02-2_amd64.deb
grub-efi-amd64-bin_2.02-2_amd64.deb   grub-xen_2.02-2_amd64.deb
grub-efi-amd64-dbg_2.02-2_amd64.deb   grub-xen-bin_2.02-2_amd64.deb
grub-efi-ia32_2.02-2_amd64.deb	      grub-xen-dbg_2.02-2_amd64.deb
grub-efi-ia32-bin_2.02-2_amd64.deb    grub-xen-host_2.02-2_amd64.deb
root@debian:

auf dem tablet sind folge grub packtete installiert

Code: Alles auswählen


ii  grub-common                             2.02-2                            amd64        GRand Unified Bootloader (common files)
ii  grub-efi-amd64                          2.02-2                            amd64        GRand Unified Bootloader, version 2 (EFI-AMD64 version)
ii  grub-efi-amd64-bin                      2.02-2                            amd64        GRand Unified Bootloader, version 2 (EFI-AMD64 binaries)
ii  grub-firmware-qemu                      2.02-2                            amd64        GRUB firmware image for QEMU
ii  grub2-common                            2.02-2                            amd64        GRand Unified Bootloader (common files for version 2)
welches muesste ich jetzt deinstallieren und dann per .deb installieren um den "patch" zu haben?

Danke

Mentore
Beiträge: 51
Registriert: 09.10.2007 20:42:38
Wohnort: berlin

Re: grub timeout ohne interrupt

Beitrag von Mentore » 19.10.2017 18:09:40

hi

auf der vm war es

Code: Alles auswählen

dpkg -i grub-pc_2.02-2_amd64.deb 
also wird es auf dem tablet grub-efi-amd64 sein.

das packet konnte ich vorher nur mit

Code: Alles auswählen

dpkg --force-depends --remove grub-pc
entfernen

der patch ist allerdings kaese xD da werd ich wohl mal wegen den code fragen muessen, aber impakt hatte er :) also die vorgehensweise geht so ! super danke der code kommt bestimmt auch noch

Benutzeravatar
smutbert
Moderator
Beiträge: 8315
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: grub timeout ohne interrupt

Beitrag von smutbert » 19.10.2017 20:28:10

Das entfernen wäre wohl nicht notwendig gewesen, du kannst einfach das eigene Paket installieren und damit das vorhandene ersetzen. Der bereits im MBR, Bootsektor oder auf der EFI System Partition installierte grub wird dann beim nächsten grub-install (das gegebenenfalls bereits beim Konfigurieren des Pakets aufgerufen wird) ersetzt.

Mentore
Beiträge: 51
Registriert: 09.10.2007 20:42:38
Wohnort: berlin

Re: [gelost] grub timeout ohne interrupt

Beitrag von Mentore » 22.10.2017 16:57:05

das hat etwas gedauert ...der timout zaehlt runter ich kann klicken wie ich will letzte position wird gestartet

also es geht jetzt :) vielen Dank. ich wette, ich wuerde ohne dich immer noch versuchen es normal zu kompilieren.
dennoch war es etwas buggy, mal gab es fehler, mal nicht... ohne aenderungen...einfach dran bleiben

So hier mal die schritte hab alles als root ausgefuehrt oft wird verlangt noch weitere pakete zu installieren mit anzeige welcher

als erstes die sources besorgen

Code: Alles auswählen

auf der seite rechts
https://packages.debian.org/buster/grub2
und mit dpkg-source -x grub2_2.*.dsc entpacken 
oder lieber gleich die sources ueber apt beziehen

Code: Alles auswählen

nano /etc/apt/sources.list

deb http://ftp.de.debian.org/debian/ stable main contrib non-free
deb-src http://ftp.de.debian.org/debian/ stable main contrib non-free
deb http://security.debian.org/ stable/updates main contrib non-free
deb-src http://security.debian.org/ stable/updates main contrib non-free

apt-get update
apt-get source grub2
cd grub2-2.02~beta3/
nano grub-core/normal/menu.c 
es gibt hier viele arten den startprozess zu lenken auch key remapping geht ich hab mich hierfuer entschieden...
der fallback koennte im ersten if drin bleiben aber fuer mich ist das thema abgeschlossen :)
also in zeile ca 660 default_entry--; und default_entry++; hinzufuegen klammern nicht vergessen und den timeout rausloeschen grub_env_unset ("timeout"); grub_env_unset ("fallback"); clear_timeout ();
der timeout wird eh bei ablauf auf unset und clear gesetzt weiter oben in der eigentlichen timeout funktion

Code: Alles auswählen

	  if (timeout >= 0)
	    {
	    }


	    case GRUB_TERM_KEY_UP:
	    case GRUB_TERM_CTRL | 'p':
	    case '^':
	      if (current_entry > 0)
	        {
	        current_entry--;
	        default_entry--;
	        }
	      menu_set_chosen_entry (current_entry);
	      break;

	    case GRUB_TERM_CTRL | 'n':
	    case GRUB_TERM_KEY_DOWN:
	    case 'v':
	      if (current_entry < menu->size - 1)
	        {
	        current_entry++;
	        default_entry++;
	        }
	      menu_set_chosen_entry (current_entry);
	      break;
		  
dpkg-source --commit
dpkg-buildpackage -uc -us
als entfernen kann ich das empfehlen die version mit der eigenen abgleichen! und beide pakete muessen scheinbar getauscht werden

Code: Alles auswählen

dpkg --force-depends --remove grub-pc grub-pc-bin
cd ..
dpkg -i grub-pc_2.02~beta3-5_amd64.deb grub-pc-bin_2.02~beta3-5_amd64.deb 
muss nicht sein

Code: Alles auswählen

nano /etc/default/grub
GRUB_DISABLE_SUBMENU=y
GRUB_DEFAULT=1
GRUB_TIMEOUT=9
das ende

Code: Alles auswählen

update-grub
reboot 

Antworten