# Opstartproblemen

Deze pagina gaat over het repareren van opstartbestanden van bestaande besturingssystemen. Bijvoorbeeld, als het stuk gaat na een update of na het per ongeluk verwijderen van de EFI system partition.

## Laptop start op naar Windows in plaats van grub

Pas je de boot volgorde aan in UEFI firmware settings, zodat Grub/Ubuntu bovenaan staat.

In plaats van binnen UEFI firmware settings kan je het ook binnen (Live) Linux doen, met `efibootmgr`. Run eerst `efibootmgr` om te zien welke opties er zijn. Bijvoorbeeld, Boot0004 voor Ubuntu en Boot0003 voor Windows. Vervolgens kan je de boot volgorde instellen met `efibootmgr -o 4,3`.

### Geen GRUB boot entry

Probeer handmatig een boot entry toe te voegen met `efibootmgr`:
```
efibootmgr -c -L "Grub" -l '\EFI\Grub\shimx64.efi'
```

Bestaat `\EFI\Grub\grubx64.efi` niet? Volg de instructies bij "Linux boot reparatie".

### Custom boot entry werkt ook niet

Sommige laptops kunnen helemaal niet booten van EFI bestanden behalve `\EFI\Microsoft\Boot\bootmgfw.efi`. De enige workaround is dan om de grub file te verplaatsen naar bootmgfw.efi, alsof het Windows is. Gebruik (op eigen risico) [dit script](https://github.com/UvA-FNWI/byod-scripts/blob/master/fix-grub-uefi.sh) om het makkelijk te doen. Het gaat wel weer stuk bij grote Windows updates, wanneer Windows de EFI file weer vervangt.

## Fix Windows boot (UEFI)

Het kan gebeuren dat je per ongeluk je EFI partitie of bestanden erop verwijderd. Met het `bcdboot` commando kun je ze opnieuw genereren. Deze instructies kunnen ook helpen als Windows niet meer opstart na het verplaatsen, vergoten, of verkleinen van `C:`.

Als je nog geen EFI System Partition (ESP) hebt, maak er dan eerst een aan. Bijvoorbeeld, met gparted op een live USB. Je hebt niet veel ruimte nodig, met 512MiB heb je sowieso genoeg. De partitie moet een FAT32 filesystem bevatten. Na het maken van de partitie, klik met de rechtermuisknop op de partitie en kies voor "Manage flags". Zet vervolgens "esp" aan.

Mocht je al een ESP hebben, is het alsnog een goed idee om het type te verifiëren. Dit kan bijvoorbeeld binnen Linux met fdisk. `sudo fdisk /dev/<disk>` en vervolgens `p`. Je EFI System Partition hoort het type "EFI System" te hebben. Mocht het niet zo zijn, kan je het type veranderen met `t`. Als je ESP het verkeerde type heeft zal Windows grotendeels lijken te werken, maar functies zoals slaapstand, opstartopties, en windows update werken mogelijk niet goed.

Boot naar een Windows USB en open een command prompt. Dit kan via het recovery menu of met Shift+F10.

Open `diskpart`. Controleer (met `list vol`) of alle nodige partities een letter hebben, en onthoud de letters voor de Windows partitie en EFI boot partitie.

Voer het volgende command uit, waarbij je `C:` vervangt met de letter van de Windows partitie, en `E:` met de letter van de EFI boot partitie.
```
bcdboot C:\Windows /s E: /f UEFI /v
```

Repareer ook de BCD:
```
bootrec /rebuildbcd
```

## Fix Windows boot (legacy boot)

Zoals hierboven maar met `bootrec /fixmbr` ipv `bcdboot`. Maar misschien wil je de Windows installatie wel converteren naar UEFI met `mbr2gpt`? Of opnieuw installeren als de installatie niet belangrijk is? EFI is een stuk makkelijker om mee te werken.

## Linux boot reparatie (UEFI)

Deze instructies werken ook voor het omzetten van legacy boot naar EFI boot. Dan moet je wel zelf de ESP (EFI System Partition) maken, met bijvoorbeeld `gparted` of `fdisk`. Let ook op dat je deze partitie toevoegd aan `/etc/fstab` tijdens chroot.

1. Boot een Ubuntu live USB, en open een terminal. Verkrijg een root shell (`sudo -i`).
2. Mount de root partitie: `mount /dev/<part> /mnt`. Je kan de juiste partitie vinden met `lsblk -f`, zoek voor een ext4 filesystem met de juiste grootte. Of volg anders de speciale instructies voor LUKS/LVM/btrfs.
3. Mount de EFI partitie in `/mnt/boot/efi` (als deze map niet bestaat heb je iets fout gedaan, of je systeem gebruikt legacy boot). De EFI partitie kan je ook vinden met `lsblk -f`, zoek dit keer voor een kleine vfat/fat32 filesystem (vaak 50-500 MB).
4. Bind-mount een aantal filesystems: `for i in /dev /dev/pts /proc /sys /run /sys/firmware/efi/efivars; do mount -B $i /mnt$i; done`
5. Chroot: `chroot /mnt`. Nu zit je "in" je normale besturingssysteem, in plaats van het live besturingssysteem.
6. Ga nu verder met de specifieke stappen voor je besturingssysteem

### Debian, Ubuntu

1. Verwijder de legacy grub (`apt remove grub-pc`) en installeer UEFI grub (`apt install grub-efi shim-signed`)
2. Installeer grub naar `/boot/efi` met: `grub-install`
3. Voor de zekerheid, genereer initramfs bestanden: `update-initramfs -u -k all`
4. Ter controle: `update-grub` (hier zie je als het goed is al je initramfs bestanden langskomen, en eventueel Windows via os-prober)

### Fedora

1. Herinstalleer grub: `dnf reinstall grub2-efi grub2-efi-modules shim`. Dit zorgt er ook meteen voor dat de nodige bestanden in `/boot/efi` worden aangemaakt. Gebruik **NIET** `grub2-install`, dat is alleen voor legacy boot.
2. Voor de zekerheid, genereer initramfs bestanden: `dracut --regenerate-all -vf`
3. Voor de zekerheid, update de grub config:
    - `grub2-mkconfig -o /boot/grub2/grub.cfg`

Meer informatie kun je [hier](https://docs.fedoraproject.org/en-US/quick-docs/bootloading-with-grub2/#installing-grub-2-configuration-on-uefi-system) vinden.

### Arch linux
1. Verwijder legacy grub (`grub-legacy`) en zorg dat de `grub` package geinstallerd is.
2. Gebruik `grub-install --target=x86_64-efi` om grub te installeren

Meer informatie is te vinden [op de Arch Wiki](https://wiki.archlinux.org/title/GRUB).

## Boot reparatie met LUKS

Installeer de `cryptsetup` package (al geïnstalleerd op Ubuntu Live USB).

Open de disk:
```
cryptsetup luksOpen /dev/<disk> <name>`
```
Na dit commando heb je als het goed is een 'virtuele disk' in `/dev/mapper`.

De naam (`<name>`) moet je zelf aangeven, **LET OP** dat je dezelfde naam gebruikt als je systeem heeft in `/etc/crypttab`, anders kan het volume straks niet geopend worden bij het opstarten! Als je niet zeker weet wat de naam was, kies eerst wat. Check dan na het mounten wat de naam hoort te zijn, sluit luks en open het volume opnieuw. Dus zoiets:
```
cryptsetup luksOpen /dev/<disk> temp`
mount /dev/mapper/temp /mnt
cat /mnt/etc/crypttab
umount /mnt
cryptsetup luksClose temp
# Nu met de goede naam uit crypttab
cryptsetup luksOpen /dev/<disk> <naam>
```

## Boot reparatie met LVM

1. Installeer de `lvm2` package (als het goed is al geïnstalleerd).
2. Activeer de *volume group* activeren met `vgchange -ay`.

Je volumes zijn nu te vinden in `/dev/<naam van volume group>`. Zie verder de normale chroot instructies.

## Boot reparatie met btrfs

De configuratie verschilt per distributie. Fedora heeft bijvoorbeeld een volume voor `/home` een volume voor `/`. Mount eerst de filesystem om te kijken welke volumes er zijn:
```
mount /dev/... /mnt
ls /mnt
```
Stel dat de root data in een volume genaamd `root` staat:
```
cat /mnt/root/etc/fstab
```
Nu zie je de opties die je nodig hebt. Bijvoorbeeld:
```
UUID=... /     btrfs subvol=root,compress=zstd:1,x-systemd.device-timeout=0 0 0
UUID=... /home btrfs subvol=home,compress=zstd:1,x-systemd.device-timeout=0 0 0
```
Doe dan:
```
umount /mnt
mount -t btrfs -o subvol=root,compress=zstd:1 /dev/... /mnt
mount -t btrfs -o subvol=home,compress=zstd:1 /dev/... /mnt/home
```

Vergeet niet ook `/mnt/boot` en `/mnt/boot/efi` te mounten.
