Przygoda z bootowaniem

19 Września 2016

Informatyk to taki człowiek, który psuje systemy informacyjne, ale jest też w stanie je naprawić. Jako fan linuksa i użytkownik Windowsa po raz kolejny (win-lin i win-win) zabrałem się za dualbooting. Oto historia o tym jak zepsułem Windows i jak go naprawiłem.

Jak to się zaczęło…

Mam na komputerze trzy partycje. Na pierwszej był Windows 10, na drugiej pliki, a na trzeciej Windows 7. Jakoś się tak zdarzyło, że Dziesiątka przestała działać, więc postanowiłem na jej miejsce zainstalować Manjaro. Pobrałem obraz ISO i za pomocą Rufusa wgrałem go na pendrive’a. Instalacja Manjaro przebiegła pomyślnie (nie do końca ale o tym zaraz) ale po zrestartowaniu komputera na liście systemów do zabootowania w Grubie Windowsa nie widziałem.

Co się stało?

Otóż kiedy instalowałem siódemkę miałem już system na pierwszej partycji (ówcześnie był to XP, potem 8 i 10), więc wszystkie dane związane z bootowaniem były właśnie na tej pierwszej partycji. Kiedy ją sformatowałem, odciąłem sobie drogę do zabootowania siódemki.

Pierwsze próby - wpis Grub

Ponieważ nie przeczytałem wtedy jeszcze X artykułów o naprawianiu boot sektora, postanowiłem manualnie dodać wpis w grubie, aby do Windowsa się dostać. Połowa informacji w internecie jest już nieaktualna odkąd GRUB zaczął oznaczać GRUB2, a ten poprzedni dostał nazwę GRUB legacy. W końcu natrafiłem na informację aby edytować plik /etc/grub.d/40_custom/. Chwilę się jeszcze naszukałem co wpisać i dlaczego, bo w internecie sporo ludzi rzuca przykładowymi wpisami bez żadnych obiaśnień. Otrzymałem

menuentry "Windows 7 on sda3" --class windows --class os {
	insmod part_msdos
	insmod ntfs
	search --set=root --fs-uuid 4E5262E65262D26F
	chainloader +1
}

Po krótce co i jak: menuentry bierze string, nazwę do wyświetlania, oraz odpowiednie parametry klas (windows/gnu-linux/innny os, os/tool, itp). insmod part_msdos mówi że korzystam z MBR z partycjami w standardzie msdos, a insmod ntfs mówi o systemie plików tej partycji. Teraz, moglibyśmy ustawić źródło samemu przez set root='hd0,msdos3', co w tym przypadku oznacza pierwszy dysk i trzecią partycję, lub uruchomić wyszukiwanie. Ja wyszukuję po fs-uuid, który można znaleźć poleceniem blkid. Ostatnia linijka chainloader +1 ma chyba pomóc w bootowaniu przez załadowanie pierwszego pliku na wskazanej partycji.

Linux bez X

Wcześniej wspomniałem, że pojawił się problem z moją instalacją Manjaro. Kiedy uruchomiłem go w trybie graficznym (X server) dostałem dziwne rozmycie okien. Pomyślałem, że to wina sterownika karty graficznej więc go zmieniłem. I wtedy w ogóle X przestał się uruchamiać. Na szczęście na Linuxie istnieje ogrom narzędzi terminalowych. Szczególnie pomocny był w3m - konsolowa przeglądarka internetowa, oraz transmission-cli - klient sieci bit-torrent.

Tworzenie bootowalnego pendrive’a z win7

Z mojego przeszukiwania internetu winiknęło, iż najprościej naprawię swoją instalację Windowsa jeśli odpalę płytę/pendrive z instalacją i uruchomię opcję naprawiania systemu. Akurat tak się złożyło, że nie miałem pod ręką płyty, więc postanowiłem pobrać obraz z internetu i nagrać go na pendrive’a. Możliwe, że obrazy instalatorów Linuxa są spreparowane tak aby poleceniem dd zapisać całego pendrive’a wraz z boot sektorem, ale obraz instalacji Windowsa tak nie miał. Kierując się odpowiedzią StackOverflow (albo SuperUser, nie mogę jej znaleźć) zrobiłem następujące kroki:

  1. cfdisk /dev/sdb - utworzyłem nową partycję typu 7 wraz z flagą boot
  2. mkfs.ntfs -f /dev/sdb1 - utworzyłem system plików NTFS na tej partycji
  3. sudo dd if=/usr/lib/syslinux/bios/mbr.bin of=/dev/sdb - wpisałem boot sektor (potrzeba pakiet syslinux)
  4. sudo mkdir /mnt/iso && sudo mkdir /mnt/usb - utworzyłem dwa foldery do montowania w następnych krokach
  5. sudo mount -o loop win7.iso /mnt/iso - zamontowałem obraz instalacji
  6. sudo mount /dev/sdb1 /mnt/usb - zamontowałem partycję na pendrive’ie
  7. sudo cp -r /mnt/iso/* /mnt/usb - przekopiowałem wszystkie pliki z obrazu na pendrive’a
  8. sync /dev/sdb1 - upewniłem się, że pisanie na pendrive’a zostało zakończone (kwestia cache’owania dysku)

Startup Repair i zakończenie

Teraz wystarczyło zrestartować komputer, zabootwać pendrive’a, uruchomić instalację Windows 7 w trybie naprawy i uruchomić Startup Repair. Gdyby to nie pomogło, byłem przygotowany na ręczne uruchamianie poleceń bootsect, bcdboot i bcdedit. Koniec końców działa!