u-boot im flash mit remote funktion ?

Diskussionen um Bootloader, Kernel, Busybox
gmo18t
Erleuchteter
Erleuchteter
Beiträge: 553
Registriert: Freitag 27. Februar 2004, 14:30

u-boot im flash mit remote funktion ?

Beitrag von gmo18t »

Hi,

der br-bootloader sendet ja ein 'bootp'-Request, den man ja bekanntermaßen dazu benutzen kann, ein u-boot von einem Server zu laden.
Nun tritt bei mir verstärkt das Problem auf, daß der br-bootlader nicht lange auf eine Antwort zum bootp-Request wartet und dann meist vom Flash bootet anstelle vom Netzwerk.
(Als ich noch ein kleines Netzwerk hatte ging's besser).

Ich möchte aber gerne eine verläßliches remote-Boot haben und deshalb habe ich daran gedacht, ein entsprechend angepasstes u-boot zu flashen, welches den Kernel nicht aus dem Flash lädt, sondern ihn via bootp od. dhcp-Request vom Server nimmt (aber mit vernünftigem request timeout).

Evtl. kann man das u-boot so universell gestalten, daß es nach einem längeren request-timeout dann doch den Flash-Kernel nimmt.

Hat jemand in diese Richtung schonmal was probiert oder Ahnung mit welchen Problemen man bei diesem Vorhaben konfrontiert werden könnte ?

- GMo -
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

Uboot könnte zum Beispiel die uboot.conf o.ä. aus der var partition auslesen und so entscheiden, ob aus dem Flash oder von Tftp gestartet werden soll.

Dann könnte man einen Flashkernel machen der nfs root support hat und uboot übergibt dann den entsprechenden root= string für Flash oder NFS Boot

Houdini
gmo18t
Erleuchteter
Erleuchteter
Beiträge: 553
Registriert: Freitag 27. Februar 2004, 14:30

Beitrag von gmo18t »

... hab jetzt mal in die Sourcen geschaut: da wird ja bereits das file
'/var/tuxbox/boot/boot.conf' ausgewertet

Code: Alles auswählen

#ifdef CONFIG_DBOX2_ENV_READ_FS
void load_env_fs (void)
{
	int size, i = 0;
	char *s = (char *) CFG_LOAD_ADDR;
	char *c = s;
	int namestart, nameend, valuestart, valueend;

	size = fs_fsload ((unsigned long) s, CONFIG_DBOX2_ENV_READ_FS);

	while (1)
	{
		if (i >= size)
			break;
		namestart = i;
		while (i < size && *c != '\n' && *c != '=') { i++; c++; }
		nameend = i;
		if (i >= size)
			break;
		i++; c++;
		valuestart = i;
		while (i < size && *c != '\n') { i++; c++; };
		valueend = i;
		i++; c++;
		s[nameend] = '\0';
		s[valueend] = '\0';
		
		if (!strcmp (&s[namestart], "bootcmd"))
			setenv ("bootcmd", &s[valuestart]);
		else if (!strcmp (&s[namestart], "console"))
			setenv ("console", &s[valuestart]);
		else if (!strcmp (&s[namestart], "lcd_contrast")) 
			setenv ("lcd_contrast", &s[valuestart]); 
		else if (!strcmp (&s[namestart], "lcd_inverse")) 
			setenv ("lcd_inverse", &s[valuestart]); 
		else
			printf ("env: can't set \"%s\"\n", &s[namestart]);
	}
}
#endif /* CONFIG_DBOX2_ENV_READ_FS */
und man darf darin auch die Option 'bootcmd' verwenden.
Geht das also schon "out of the box" mit dem normalen flash u-boot oder ist das irgendwo nicht zu Ende geführt...
Hat damit jemand schonmal experimentiert ?

- GMo -
Zuletzt geändert von gmo18t am Freitag 17. Februar 2006, 14:48, insgesamt 1-mal geändert.
DieMade
Oberlamer, Administrator & Supernanny
Beiträge: 10532
Registriert: Samstag 13. Juli 2002, 10:49

Beitrag von DieMade »

bootcmd sollte gehen. Das haben wir beim ersten IDE-Projekt auch benutzt, um wahlweise vom Flash oder von der Platte zu booten.

Code: Alles auswählen

bootcmd=setenv bootcmd ; protect off 10020000 107fffff; setenv autostart yes; setenv bootargs root=/dev/hda2 ro rootfstype=ext3 console=$(console) idebus=66; diskboot 1000000 0:1
Wichtig ist "setenv bootcmd", damit die Defaults gelöscht werden.
gmo18t
Erleuchteter
Erleuchteter
Beiträge: 553
Registriert: Freitag 27. Februar 2004, 14:30

Beitrag von gmo18t »

... Danke ! geht prima mit:

Code: Alles auswählen

bootcmd=setenv bootcmd; dhcp; tftp $(bootfile); protect off 10020000 107fffff; setenv bootargs root=/dev/nfs rw nfsroot=$(rootpath) ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off console=$(console); bootm
- GMo -
Sagem 1x Kabel, AVIA600_vb028, cam-alpha 01_02_105D, int. ucode, .sp_ts + .hw_sections