28.03.2019

GRUB kurtarma

Dual boot sistemler, Windows güncellemeleri ve daha bir çok etken sebebiyle grub bozulur. Bu normal.

Çoğu zaman düzeltmek için iki yol vardır:
  1. CD/USB gibi başka bir ortamdan açarak chroot ile grub'ı tekrar oluşturmak
  2. grub etkileşimli kabuğa (interactive shell) erişerek sistemi bir şekilde açtıktan sonra grub'ı tekrar oluşturmak
Elbette bazı terimleri açıklamak gerek. Artık 2 farklı sistem var. Birincisi eski ama hala var olan MBR diskler. Bunlar BIOS sistemler ile kullanılır. Diskin ilk sektöründe MBR olarak adlandırılan bir bölüm bulunur. Bu bölümün boyutu 512 byte'tır. MBR'nin ilk 446 byte'lık bölümü boot loader, geri kalan 66 byte ise disk bölümü tablosudur (partition table). Herşey yolundayken boot loader'ın (veya MBR'nin) yedeği alınabilir.
$ sudo dd if=/dev/sda bs=446 count=1 of=/root/backup.bin
Burada diskin sda olduğu varsayıldı. Yukarıdaki satır boot loader'ın yedeğini alarak /root klasörü altındaki backup.bin dosyasına kopyalar. Bu dosyanın uzantısı önemli değil. Uzantısı olmak zorunda bile değil. Sadece boot loader değil, bütün MBR'nin (partition table dahil) bir yedeğini almak için 446 yerine 512 yazılmalıdır. Zamanı geldiğinde bu yedeği kullanarak boot loader'ı tekrar oluşturmak için şu komut kullanılabilir:
$ sudo dd if=/root/backup.bin of=/dev/sda bs=446 count=1
Yine elimizde tüm 512 byte'lık bölüm varsa buradaki size parametresini de ona göre değiştirebiliriz. Eğer bilgisayar açılış sırasında aşağıdaki bir ekranda kaldıysa boot loader (ön yükleyici mi desek?) bozulmuş demektir. Yukarıdaki komutları uygulayabilmek için bilgisayarı bir CD veya USB bellek ile bir linux ortamına açmış olmak gerekir.


1. CD/USB ile açarak

Elimizde diskin ilk bölümünün bir yedeği yoksa burayı tekrar yazmak gerek. Bunun için bir linux CD'si veya USB canlı ortamıyla açmak gerek. İlk iş fdisk ile diskin bölümleri hakkında bilgi toplamak olabilir.

# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sda1  *       2048  3999743  3997696  1.9G 82 Linux swap / Solaris
/dev/sda2       4001790 41940991 37939202 18.1G  5 Extended
/dev/sda5       4001792 41940991 37939200 18.1G 83 Linux


Benim test ortamımda yukarıda görülebileceği gibi linux sda5'te kurulu. sda1 ise swap bölümü.

Yapılacak iş, sda5'i mount etmek, ardından da şu anda açık olan canlı linux ortamındaki dev, sys ve proc klasörlerini sda5'in içindeki ilgili klasörlere bağlamak. Bunun için şu adımlar gerekli.
# mount /dev/sda5 /mnt
# mount --bind /dev/ /mnt/dev/
# mount --bind /sys/ /mnt/sys/
# mount --bind /proc/ /mnt/proc/
Bu aşamadan sonra chroot kullanılarak sda5'te kurulu linux ortamında sanal bir root oturumu oluşturuyorum:
# chroot /mnt/
Şimdi grub'ı tekrar yazabilirim:
# grub-install /dev/sda5

2. GRUB interactive shell

Açılış önyükleyicisinin çalıştığı ama linux çekirdeği veya initrd ile ilgili sorunların olduğu durumlarda aşağıdaki gibi bir ekran görüntülenir.


Bu durumda herhangi bir tuşa basıldığında yine grub boot menüsü görüntülenir, ama varsayılan boot menüsü girişinden bir sonuç alınamaz. "Advanced Boot Options" altında yer alan bir önceki çekirdek ile açma denenirse sonuç olumlu olabilir. Ama bunların hiçbiri işe yaramadıysa, veya yeni bir linux kurulumu sonrası önceki linuxa ait disk bölümü hiç algılanmadıysa grub boot menüsü görüntülendiğinde "e"ye basılarak boot menüsünü düzenleme moduna veya "c"ye basılarak etkileşimli grub kabuğuna (interactive shell) girilebilir. Örnek bir kurtarma şöyle olabilir:

Disklerin ve bölümlerin listelenmesi

grub> ls
(hd0) (hd0,msdos5) (hd0,msdos1)
Disk numaralama 0'dan başlar. Ama disk bölümü numaralama 1'den başlar. msdos5 yazdığı aslında ext4 bir dosya sistemi.

Bir bölümün içeriğinin listelenmesi

grub> ls (hd0,5)/
lost+found etc/ media/ bin/ boot/ dev/ ...
hatta boot klasörünün içeriğini görüntülemek
grub> ls (hd0,5)/boot/
vmlinux-4.18...
initrd.img-4.18...
Birden fazla linux kurulu olan bir diskte işlem yaparken hangi kurulumda olduğumuzdan emin olmak için birçok kurulumda var olan /etc/issue dosyasını kullanabiliriz:
grub> cat (hd0,5)/etc/issue
Ubuntu 18.10  \n \l
Emin olduktan sonra /boot/grub/grub.cfg dosyasının konumunu prefix ile belirleyebiliriz:
grub>  set prefix=(hd0,5)/boot/grub
Son olarak söz konusu linux kurulumu için kök disk bölümününü (root partition) belirleyebiliriz:
grub> set root=(hd0,5)
Bundan sonra normal modülünü yükleyerek sistemi tekrar başlatabiliriz.
grub> insmod normal
grub> normal

Son sözler

Grub menüsü gözüküyor mu?
  • Gözükmüyorsa grub2-install ile tekrar yazmalı.
  • Gözüküyor ama seçim yaptıktan sonra boot etmiyorsa grub.cfg ile ilgili sorun olabilir; grub2-mkconfig kullanılmalı.
Grub menüsünü hangi linux kurulumu yazmış olabilir? Grub menüsünde en üstte listelenen linux dağıtımı. Peki bu arkadaş hangi disk bölümündedir? Grub menüsünde o öğe seçiliyken e'ye basarak edit moduna girip öğrenebiliriz.

Hiç yorum yok: