GRUB 2
Achtung dieser Artikel ist noch in Arbeit und dient vorläufig nur als Vorlage. Dieser Beitrag zu Linux oder der Abschnitt ist in Bearbeitung. Weitere Informationen findest du hier. Der Ersteller arbeitet an dem Beitrag oder Abschnitt und entsorgt den Wartungsbaustein spätestens 3 Tage nach der letzten Bearbeitung. Änderungen außer Rechtschreibkorrekturen ohne Absprache mit dem Urspungsautor sind möglichst zu vermeiden, solange dieser Baustein noch innerhalb der genannten Frist aktiviert ist. |
--Gehrke (Diskussion) 22:26, 27. Nov. 2013 (CET)
GNU GRUB (GRand Unified Bootloader)
Inhaltsverzeichnis
- 1 Abgrenzung zu 'GRUB Legacy'
- 2 Installation
- 3 Konfiguration
- 3.1 Boot-Einträge manuell ändern
- 3.2 Die Kommandozeile
- 3.3 YaST: boot loader
- 3.4 Default-Konfiguration: /etc/default/grub
- 3.5 /etc/sysconfig/bootloader
- 3.6 Buildsystem: /etc/grub.d
- 3.7 Module laden
- 3.8 Boot Password setzen
- 3.9 Konfigurationsdatei: /boot/grub2/grub.cfg
- 3.10 Konfiguration neu generieren
- 4 Grundsätzliche Boot-Methoden
- 5 Anwendungsfälle
- 6 Links
Abgrenzung zu 'GRUB Legacy'
GRUB 2 ist eine vollständige Neuentwicklung des alten GRUB Legacy. Seit 2009 wird es in größeren Distributionen als Standard eingeführt, OpenSUSE beispielsweise vollführte diesen Schritt mit Release 12.2 im Herbst 2012.
Um eine Reihe neuer Funktionalitäten anbieten zu können, haben sich die Entwickler für eine radikale Neu-Implementierung entschieden. Es gibt dementsprechend bis auf den Namen kaum Gemeinsamkeiten und bewusst wurde auf Kompatibilität zum Vorgänger verzichtet.
Die aktuelle Version kann beispielsweise so abgefragt werden:
# rpm -qv grub2 grub2-2.00-39.1.3.x86_64 # grub2-install -v grub2-install (GRUB2) 2.00
Erweiterte Funktionalitäten
- Script-gesteuerte, dynamischere Konfiguration
- Unterstützung von mehr Dateisystemen wie beispielsweise ext4, HFS+, NTFS (vollständige Liste)
- Direkter Zugriff auf LVM und RAID-Devices möglich
- Steuerung über ein graphisches Terminal (besonders Rescue Mode) und graphisches Menüsystem gegeben
- Mehrsprachigkeit inklusive der Einträge
- Zusätzliche Unterstützung für weitere Systemsoftware neben PC BIOS: PC EFI, PC coreboot, PowerPC, SPARC, MIPS Lemote Yeeloong
- Support für Boot via Netzwerk über tftp (PXE)
- Zugriff über serielle Konsole möglich (vor allem Embedded Devices)
- Boot Password möglich
- Start von LiveCD ISO-Images direkt von der Festplatte möglich
- Unterstützung von weiteren Plattformen neben x86 (z.B. PowerPC)
- Einführung eines Modells zur Erzeugung von angepassten Layouts (Themes)
- <Was ist mit crypted Devices?!?>
<ToDo>
Unterschiede zu 'GRUB Legacy'
An dieser Stelle werden die Unterschiede zu GRUB Legacy hervorgehoben:
- In Grub 2 existiert die stufenweise Reihenfolge in den Einzelphasen ('Stage 1', 'Stage 1.5', 'Stage 2') nicht mehr.
- In der Konfiguration werden Partitionen ebenfalls über Zahlen adressiert, aber die Nummerierung beginnt mit 1 (und nicht 0).
- Hinweis: Das gilt aber nur für Partitionen, nicht für Festplatten. Festplatten werden mit 'hdX' benannt und X beginnt bei 0!
- Die Konfiguration wurde komplett umgestellt. Wo früher eine einzelne Datei (menu.lst) zu editieren war, gibt es heute ein komplettes Konfigurationssystem aus vielen Dateien mit eigener Struktur und eigenem Build-System, welches die eigentlichen Konfigurationsdateien generiert (s. #Konfiguration).
<ToDo>
Installation
Analog zum Vorgänger wird zur Installation das Script 'grub-install' verwendet. Als Parameter wird das Ziel-Device angegeben (im Beispiel die erste Festplatte 'sda'):
# grub-install /dev/sda Installation finished. No error reported.
<ToDo>
Konfiguration
<ToDo>
Boot-Einträge manuell ändern
Manchmal will oder kann man nicht das komplette Setup von GRUB persistent ändern. Wenn das System beispielsweise infolge von Konfigurationsfehlern gar nicht mehr bootet oder der komplette Konfigurationszyklus zu lange dauert oder schlicht etwas ausprobiert werden soll, dann macht es Sinn, die Einträge manuell zu editieren.
Dies kann erreicht werden durch Drücken von 'E' während der Anzeige des Boot-Menüs. Die zu diesem Zeitpunkt selektierte Zeile wird dann in einen kleinen Editor geladen und kann dort überarbeitet werden. Mit der Tastenkombination <Strg>-<X> wird der geänderte Eintrag dann gestartet.
Die auf diesem Wege durchgeführten Änderungen sind nicht persistent.
Die Kommandozeile
GRUB2 verfügt über eine eingebaute Shell, welche unter anderem TAB-Completion beherrscht. Diese kann entweder direkt angesteuert werden oder wird angezeigt, wenn es Probleme mit einer invaliden Konfiguration gibt.
Hier können die selben Befehle verwendet werden, die in der Konfiguration möglich sind. Damit können beispielsweise im Rescue Mode beliebige Systeme manuell gestartet werden.
YaST: boot loader
OpenSUSE-typisch kann man einige Einstellungen auch in der Systemverwaltung YaST unter System / boot loader vornehmen.
Default-Konfiguration: /etc/default/grub
Globale Grundeinstellungen (Timeout, Standard-Eintrag, Layout...) werden hier definiert.
/etc/sysconfig/bootloader
Diese Datei enthält Konfigurationsoptionen, welche von der perl-bootloader library verwendet werden. Dies passiert dann, wenn eine Konfiguration über YaST durchgeführt wird oder ein neuer Kernel installiert wird.
Diese Datei ist openSUSE-spezifisch. Die Optionen hier werden auch nicht ausschließlich für GRUB 2 verwendet, sondern auch bei anderen supporteten Bootmanagern.
Buildsystem: /etc/grub.d
Das Buildsystem ist eine Sammlung von Scripten. Ein Nummernpräfix sorgt für eine Abfolge in definierter Reihenfolge (bei '00' beginnend):
# ls -l /etc/grub.d -rwxr-xr-x 1 root root 7649 Jul 31 11:48 00_header -rwxr-xr-x 1 root root 10535 Jul 31 11:48 10_linux -rwxr-xr-x 1 root root 11019 Jul 31 11:48 20_linux_xen -rwxr-xr-x 1 root root 1802 Jul 31 11:49 20_memtest86+ -rwxr-xr-x 1 root root 2596 Jul 31 11:48 20_ppc_terminfo -rwxr-xr-x 1 root root 10132 Jul 31 11:48 30_os-prober -rwxr-xr-x 1 root root 489 Jul 11 15:04 40_custom -rwxr-xr-x 1 root root 216 Jul 31 11:48 41_custom -rwxr-xr-x 1 root root 1259 Jul 31 11:49 90_persistent -rw-r--r-- 1 root root 483 Jul 31 11:48 README
Dieses Beispiel stammt aus einer OpenSUSE-Installation (Release 12.3). Andere Distribution liefern geringfügig andere Scripten aus. Es können diesem Schema entsprechend auch eigene Scripte hinzugefügt werden.
Bedeutung der Standard-Scripten:
- 00_header: Initialisierung des Systems anhand der Einträge in /etc/default/grub (Default-Konfiguration).
- 10_linux: Hier wird versucht, alle validen Kernel zu finden. Aus diesen wird dann das Bootmenü generiert.
- 20_linux_xen: <ToDo>
- 20_memtest86+: Aufnahme von memtest in das Bootmenü.
- 20_ppc_terminfo: <ToDo>
- 30_os-prober: Suche nach weiteren Bootladern sowie weiteren installierten Betriebssystemen. In einem Multi-Boot-Kontext werden hier Einträge beispielsweise für Windows oder parallele Linux-Installationen generiert.
- 40_custom: Eigene Booteinträge können hier manuell hinterlegt werden. Dieses Script wird bei System-Updates nicht überschrieben.
- 41_custom: Einbindung der Datei /boot/grub/custom.cfg
- 90_persistent: <ToDo>
Siehe auch: #Konfiguration neu generieren
<ToDo>
Module laden
GRUB 2 bietet direkten Zugriff auf bestimmte Ressourcen wie beispielsweise LVM, RAID oder diverse Dateisysteme. Dieser Zugriff wird über Module implementiert, welche per 'insmod' bei Bedarf geladen werden können.
Unter OpenSUSE liegen diese Module (architekturabhängig) unter:
# tree -d /usr/lib/grub2/ /usr/lib/grub2/ ├── i386-pc └── x86_64-efi
Verfügbare Module (nur x86_64-efi):
# ls -r --format=commas *.mod zfsinfo.mod, zfscrypt.mod, zfs.mod, xzio.mod, xnu_uuid.mod, xnu.mod, xfs.mod, videotest.mod, videoinfo.mod, video_fb.mod, video_cirrus.mod, video_bochs.mod, video.mod, usbtest.mod, usbserial_pl2303.mod, usbserial_ftdi.mod, usbserial_common.mod, usbms.mod, usb_keyboard.mod, usb.mod, uhci.mod, ufs2.mod, ufs1.mod, udf.mod, true.mod, trig.mod, time.mod, tga.mod, tftp.mod, testload.mod, test_blockarg.mod, test.mod, terminfo.mod, terminal.mod, tar.mod, squash4.mod, sleep.mod, sfs.mod, setpci.mod, setjmp.mod, serial.mod, search_label.mod, search_fs_uuid.mod, search_fs_file.mod, search.mod, scsi.mod, romfs.mod, relocator.mod, reiserfs.mod, regexp.mod, reboot.mod, read.mod, raid6rec.mod, raid5rec.mod, probe.mod, priority_queue.mod, png.mod, play.mod, pbkdf2.mod, pata.mod, password_pbkdf2.mod, password.mod, parttool.mod, part_sunpc.mod, part_sun.mod, part_plan.mod, part_msdos.mod, part_gpt.mod, part_dvh.mod, part_bsd.mod, part_apple.mod, part_amiga.mod, part_acorn.mod, ohci.mod, odc.mod, ntfscomp.mod, ntfs.mod, normal.mod, nilfs2.mod, newc.mod, net.mod, multiboot2.mod, multiboot.mod, msdospart.mod, mmap.mod, minix_be.mod, minix3_be.mod, minix3.mod, minix2_be.mod, minix2.mod, minix.mod, minicmd.mod, memrw.mod, memdisk.mod, mdraid1x.mod, mdraid09_be.mod, mdraid09.mod, lzopio.mod, lvm.mod, luks.mod, lssal.mod, lspci.mod, lsmmap.mod, lsefisystab.mod, lsefimmap.mod, lsacpi.mod, ls.mod, loopback.mod, loadenv.mod, loadbios.mod, linuxefi.mod, linux.mod, ldm.mod, keystatus.mod, keylayouts.mod, jpeg.mod, jfs.mod, iso9660.mod, iorw.mod, http.mod, hfsplus.mod, hfs.mod, hexdump.mod, help.mod, hello.mod, hdparm.mod, hashsum.mod, halt.mod, gzio.mod, gptsync.mod, gfxterm.mod, gfxmenu.mod, gettext.mod, geli.mod, gcry_whirlpool.mod, gcry_twofish.mod, gcry_tiger.mod, gcry_sha512.mod, gcry_sha256.mod, gcry_sha1.mod, gcry_serpent.mod, gcry_seed.mod, gcry_rmd160.mod, gcry_rijndael.mod, gcry_rfc2268.mod, gcry_md5.mod, gcry_md4.mod, gcry_des.mod, gcry_crc.mod, gcry_cast5.mod, gcry_camellia.mod, gcry_blowfish.mod, gcry_arcfour.mod, functional_test.mod, fshelp.mod, font.mod, fixvideo.mod, fat.mod, extcmd.mod, ext2.mod, exfctest.mod, exfat.mod, elf.mod, ehci.mod, efinet.mod, efi_uga.mod, efi_gop.mod, echo.mod, dm_nv.mod, diskfilter.mod, datetime.mod, datehook.mod, date.mod, cs5536.mod, cryptodisk.mod, crypto.mod, crc64.mod, cpuid.mod, cpio_be.mod, cpio.mod, configfile.mod, cmp.mod, chain.mod, cat.mod, bufio.mod, btrfs.mod, bsd.mod, boot.mod, blocklist.mod, bitmap_scale.mod, bitmap.mod, bfs.mod, backtrace.mod, ata.mod, at_keyboard.mod, appleldr.mod, aout.mod, all_video.mod, ahci.mod, afs.mod, affs.mod, adler32.mod, acpi.mod
<ToDo>
Boot Password setzen
Diese Funktionalität ist sinnvoll geworden, weil durch die erheblich ausgeweitete Funktionalität schon vor dem Start des OS potentiell Zugriff auf schützenswerte Daten erfolgen kann (möglicherweise auch über das Netzwerk) oder nicht gewünschte Systeme gebootet werden können. Es besteht auf diesem Wege die Möglichkeit, das Starten ausgewählter Systeme oder anderer Eigenschaften von GRUB2 nur bestimmten Usern zu ermöglichen. Hierzu ist ein Authentifizierungsmechanismus und ein simples Usermangagement vorgesehen.
Hinweis: Die hier vorgestellten Mechanismen bieten keinen wirksamen Schutz vor Angreifern, welche physischen Zugang zu einem System haben sowie über ausreichend Zeit, Gelegenheit und über das notwendige KnowHow verfügen. Sollte der Angriff dem Datenbestand gelten, dann könnten die Festplatte auch ausgebaut und in einem anderen Computer eingelesen werden. Gegen solche Angriffe hilft nur eine ausreichende physikalische Sicherung und/oder eine Verschlüsselung der Daten mit ausgereiften kryptographischen Verfahren wie beispielsweise dm-crypt. Auch sollte erwähnt werden, dass hierdurch naturgemäß die Administration erschwert wird, insbesondere im Fall, dass ein System aus irgendwelchen Gründen gar nicht mehr bootet und repariert werden muss.
Gleichwohl kann das hier beschriebene Verfahren sehr wohl in bestimmten Kontexten zu einem höheren Maß an Sicherheit führen. Oftmals geht es in der IT-Sicherheit auch 'nur' darum, Hürden aufzubauen um schwächere Angriffsszenarien abdecken zu können oder Kombinationen von Sicherheitslücken zu entschärfen. So kann es durchaus sinnvoll sein, das Booten von externen Medien (USB-Stick, Netzwerk...) in Kombination mit entsprechenden Einträgen im BIOS einem Administrator vor zu behalten oder bestimmte installierte Betriebssysteme auf ausgewählte User einzugrenzen. Einige Anwendungsfälle wurden beispielsweise hier diskutiert.
Authentifizierung
Es besteht die Möglichkeit, die Passwörter in Klartext in der Konfiguration zu hinterlegen. Viel sicherer ist es aber, anstatt von Klarttext-Passworten einen kryptographisch gesicherten Passwort-Hash zu verwenden, welcher mit einem angemessenen Salt versehen ist (um Angriffen mit Rainbow-Tables abwehren zu können).
Hierzu wird das Kommando 'grub2-mkpasswd-pbkdf2' verwendet. Es generiert einen Password-Hash, welcher an den geeigneten Stellen eingetragen werden kann.
Aufruf für Password '123':
# grub2-mkpasswd-pbkdf2 Enter password: Reenter password: PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.DD2DF79436A5F2CA4F7363030C6C1555A7263BD692A61AAAE2847EDEF9D12B25EBBD0791EA875CBD1726D90DE9E99644BC4A630637D615AA42C06C19C26A6DC8.C68EC9D01A2DFCBEB2B36FDF6836290E8DB6F50B2BD85932AF7E6BEC8E4AC9A5BB4F027EF906AFD97FC2DC2A38745F5CA63DCC1E05049DC3CA12DC5336647249
Folgende Aufrufe mit dem selben Password rufen immer andere Hashes hervor, was auf das Salting zurückzuführen ist.
Weitere Optionen:
# grub2-mkpasswd-pbkdf2 -? Usage: grub2-mkpasswd-pbkdf2 [OPTION...] [OPTIONS] Generate PBKDF2 password hash. -c, --iteration-count=NUM Number of PBKDF2 iterations -l, --buflen=NUM Length of generated hash -s, --salt=NUM Length of salt -?, --help give this help list --usage give a short usage message -V, --version print program version Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.
Siehe auch: PBKDF2 (Wikipedia)
Authorisierung
Zu erst wird die List der User definiert, welchen root-Zugriff zugebilligt werden soll. In diesem Beispiel einfach nur der User 'root':
set superusers="root"
Als nächstes wird das Password mit dem vorher generierten Password-Hash dem User zugeordnet:
password_pbkdf2 root grub.pbkdf2.sha512.10000.DD2DF79436A5F2CA4F7363030C6C1555A7263BD692A61AAAE2847EDEF9D12B25EBBD0791EA875CBD1726D90DE9E99644BC4A630637D615AA42C06C19C26A6DC8.C68EC9D01A2DFCBEB2B36FDF6836290E8DB6F50B2BD85932AF7E6BEC8E4AC9A5BB4F027EF906AFD97FC2DC2A38745F5CA63DCC1E05049DC3CA12DC5336647249
Anwendugsbeispiele:
Windows XP wird als unsicher eingestuft und sollte - wenn überhaupt - nicht in unsicheren Netzen eingesetzt werden. Um das sicherzustellen, wird dieses Recht nur dem besonders vertrauenswürdigen User 'user1' oder 'root' zugestanden:
menuentry 'Windows XP (Achtung: kein Support mehr - unsicher)' --users user1 --class windows --class os $menuentry_id_option 'osprober-chain-3AA87C5BA87C1819' { insmod part_msdos insmod ntfs set root='hd0,msdos2' ... chainloader +1 }
<ToDo>
Konfigurationsdatei: /boot/grub2/grub.cfg
Dies ist die Hauptkonfigurationsdatei, welche wie oben beschrieben aber nicht manuell editiert werden darf, weil sie vom Buildsystem generiert wird!
Diese Datei wird beim eigentlichen Systemstart ausgewertet und bestimmt somit, welche Systeme zur Ausführung gelangen . Sie ersetzt die von GRUB legacy bekannte Datei 'menu.lst'.
Konfiguration neu generieren
Um Konfigurationsänderungen zu aktivieren, muss abschließend das Kommando 'grub2-mkconfig' aufgerufen werden. Bei erfolgreicher Abarbeitung wird die Hauptkonfigurationsdatei neu generiert:
# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub.cfg ... Found theme: /boot/grub2/themes/openSUSE/theme.txt Found linux image: /boot/vmlinuz-3.11.6-4-desktop Found initrd image: /boot/initrd-3.11.6-4-desktop Found linux image: /boot/vmlinuz-3.7.10-1.16-desktop Found initrd image: /boot/initrd-3.7.10-1.16-desktop Found openSUSE 12.3 (x86_64) on /dev/mapper/system-os2 done
Grundsätzliche Boot-Methoden
GRUB 2 kennt zwei grundsätzliche Methoden, Betriebssysteme zu booten:
- Direktes Booten: Bei Betriebssystemen nach 'Multiboot Specification' wird diese Methode verwendet. Das sind hauptsächlich Open Source-Systeme.
- Chain Loading: Wird hauptsächlich bei nicht freien Betriebssystemen angewendet, für die es keinen nativen Support gibt.
Direktes Booten (Multiboot Specification)
Es gibt eine Spezifikation namens 'Multiboot', welche einen sauberen Multi-Boot-Betrieb zwischen unterschiedlichen Betriebssystemen zum Inhalt hat. Auf diesem Wege ist direkte Ansteuerung der installierten Systeme durch einen einzigen BootManager möglich.
Betriebssysteme mit Multiboot-Support: GNU/Linux, FreeBSD, NetBSD, OpenBSD, ...
Siehe: Multiboot Specification (GNU)
Chain Loading
Bei nicht quelloffenen Betriebssystemen gibt es fast immer keinen Support für direktes Booten. An diesen Stellen wird 'chain loading' verwendet, wobei hier der vorgeschaltete Boatloader (GRUB2) den Staffelstab an den nachgeschalteten (z.B. Windows) weitergibt:
menuentry "Windows" { insmod chain insmod ntfs set root=(hd0,1) chainloader +1 }
Anwendungsfälle
An dieser Stelle sollen Anleitungen zu ausgesuchten Anwendungsfällen aufgezeigt werden.
<TODO: später auslagern>
Anwendungsfall: Standardeintrag ändern
Es gibt zwei Möglichkeiten, den Standardeintrag zu verändern, um beim unbeaufsichtigten Starten ein bestimmtes System vorauszuwählen.
Änderung GRUB_DEFAULT in /boot/grub2/grub.cfg
GRUB_DEFAULT=n
Das hat den Nachteil, dass bei einer geänderten Reihenfolge möglicherweise das falsche System vorbelegt ist.
Alternativ kann dort auch der Name in 'menuentry' eingetragen werden. Welche Einträge sind vorhanden?
# grep ^menuentry /boot/grub2/grub.cfg | cut -d "'" -f2 openSUSE 13.1 openSUSE 12.3 (x86_64) (on /dev/mapper/system-os2) openSUSE 12.3 CUSTOM (x86_64) (auf /dev/mapper/system-os2)
Hinweis: Der letzte wurde manuell hinzugefügt. Dieser soll als Default ausgewählt werden.
GRUB_DEFAULT="openSUSE 12.3 CUSTOM (x86_64) (auf /dev/mapper/system-os2)"
Im Anschluss muss der Prozess Konfiguration neu generieren durchgeführt werden.
Wenn die Option 'GRUB_DEFAULT=saved' gesetzt ist, dann kann die Vorauswahl über den Namen in einer separaten Konfigurationsdatei getroffen werden.
Beispiel: Änderung auf einen selbst erzeugten Eintrag (CUSTOM).
Vorher:
# grep 'GRUB_DEFAULT=' /etc/default/grub GRUB_DEFAULT=saved # cat /boot/grub2/grubenv # GRUB Environment Block saved_entry=openSUSE
# grub2-set-default "openSUSE 12.3 CUSTOM (x86_64) (auf /dev/mapper/system-os2)"
Überprüfung:
# grub2-editenv list saved_entry=openSUSE 12.3 CUSTOM (x86_64) (auf /dev/mapper/system-os2)
Vorteil: Eine Änderung der Reihenfolge hat keinen Einfluss auf die Vorbelegung.
In diesem Fall ist es nicht notwendig, den Prozess Konfiguration neu generieren durchzuführen.