Kendi GRUB Temanızı Oluşturun

Bu yazıda, Linux makinemizin GRUB ön yükleyicisini kişiselleştirmek amacıyla bir GRUB teması oluşturacağız.

Denemelerimi, bir Ubuntu Desktop cihazda yapacağım. Tavsiyem, kendi kullandığınız cihazda bu denemeleri yapmayın. En azından neyin ne olduğunu anlayana kadar.

Tema dosyalarını, yazının sonunda bulabilirsiniz.

İzmir GRUB Teması
İzmir GRUB Teması

GNU GRUB Nedir?

Açılımı GNU GRand Unified Bootloader olan GRUB, GNU Projesi kapsamında geliştirilmiş bir bootloader‘dır (ön yükleyici). Bilgisayarınızda kurulu olan bir ya da birden fazla işletim sistemini başlatabilmenize ve bu işletim sistemlerinin kernel (çekirdek) parametrelerini, başlatma öncesinde değiştirebilmenize olanak tanır.

Bilgisayarınızı kişiselleştirme merakınız varsa, GRUB’ın varsayılan teması yerine farklı temalar kullanabilmeniz mümkün. Daha önce, kendi cihazımda kullanmak için Mercedes-AMG Petronas Formula 1 GRUB Teması hazırlamıştım. Sonrasında gelen istekler üzerine, diğer takımları da içeren Formula 1 2021 GRUB Temaları hazırlamıştım.

Sizler de “Kendi GRUB temamı nasıl yaparım?” diyorsanız, bu dokümanı takip ederek ilk GRUB temanızı oluşturabilirsiniz.

GRUB Teması Oluşturma

GRUB teması oluştururken, elimizin altında mutlaka bulunması gereken kaynaklardan biri, GNU GRUB Tema Kılavuzu. Bu yazıda bahsi geçecek olan konulara ve daha fazlasına, bu bağlantıdan ulaşmanız mümkün.

Görsellerin Hazırlanması

Bir GRUB teması, temel olarak tasarım dosyası ve görsel içeriklerden oluşur. Görseller, “styled-boxes” adı verilen bir mantıkla hazırlanır. Kullanılacak görseller, kullanılacakları yöne göre tasarlanır. Ek olarak, arkaplan için de bir görsel belirleyebilirsiniz:

North (N)Kuzey
South (S)Güney
East (E)Doğu
West (W)Batı
Center (C)Merkez
Northeast (NE)Kuzeydoğu
Southeast (SE)Güneydoğu
Northwest (NW)Kuzeybatı
Southwest (SW)Güneybatı
GRUB teması görsel yönleri

Bu noktada dikkat edilmesi gereken bazı hususlar var. Tasarımınızın parçaları, bir araya geldiğinde bir bütün oluşturmalı. Herhangi bir şekilde, 1 pixel bile olsa, boşluk kalırsa; ekran çözünürlüğüne göre değişmekle beraber, bu boşluk fark edilecektir. Ek olarak, dokümanın önerisiyle biz de “PNG” tipinde görseller oluşturacağız.

Görsellerin detaylarını görmek için, yukarıda belirttiğim temaları inceleyebilirsiniz. Basitçe; 5×5, 20×20 gibi küçük boyutlara sahip görsel parçaları. Fakat bir araya geldiklerinde anlamlı bir bütün oluşturuyorlar.

Tema Dosyasının Hazırlanması

Tema tasarım dosyası, özel bir formatta hazırlanan “txt” uzantılı bir düz metin dosyasıdır. “anahtar:değer” mantığıyla çalışır. Tema dosyasının ismi, “theme.txt” olarak belirlenir.

Aşağıda örnek bir tema dosyası yer alıyor. Dosya içeriğinden göreceğiniz üzere, sadece arkaplan görseline referans verilmiş. Görselin ekranı kaplaması için de scale-method olarak “stretch” seçilmiş. “#” karakteriyle başlayan satırlar ise yorum satırlarıdır:

#Global Özellikler
desktop-image: "background.png"
desktop-image-scale-method: "stretch"

Şimdi, elimizde bir text dosyası var. Bir de arkaplan resmi. Peki ne yapacağız? İlk denememizi yapmak için biraz erken. Biraz görselle desteklemek istiyorum bu dosyayı:

#Global Özellikler
desktop-image: "background.png"
desktop-image-scale-method: "stretch"

#Boot Menu
+ boot_menu {
	menu_pixmap_style = "boot_menu_*.png"
	width = 50%
	height = 20%
	top = 20%
	left = 25%
	item_color = "#FFFFFF"
	selected_item_color = "#000000"
	item_height = 40
	item_padding = 10
	item_spacing = 10
}

Neler yaptık? “boot_menu” adında yeni bir alan oluşturduk. Menü için kullanılacak görsellerin “boot_menu_*.png” desenine uygun olacağını söyledik. Her bir yön için ilgili görseller, bu şekilde isimlendirilmiş olmalı. Başka bir deyişle, menünün altını oluşturacak görsel (güney) “boot_menu_s.png” iken, üstünü oluşturacak görsel (kuzey) “boot_menu_w.png” olacak. Aynı isimlendirme mantığı, yukarıdaki tabloda yer alan tüm yönler için geçerli.

Genişlik, yükseklik, sağdan ve soldan konum için yüzdelik değerler verdik. Menüdeki nesnelerin renginin “beyaz” olmasını ve seçilen nesnenin renginin de “siyah” olmasını istediğimizi belirttik. Son bölümde ise, menüde görünecek nesnelerin padding, spacing, height değerlerini belirttik. Bu değerler, pixel cinsinden belirlenmiştir.

İlk Deneme (Tema Görselleri ve Tema Dosyası)

GRUB konfigürasyon dosyanızı düzenleyin (/etc/default/grub). Dosya yolu, dağıtıma göre farklılık gösterebilir. Bu örnek, Ubuntu 20.04 Desktop için yazılmıştır. İlgili satırları, aşağıdaki şekilde düzenleyin. Satırlar yoksa, ekleyin:

GRUB_TIMEOUT=10
GRUB_TIMEOUT_STYLE=menu
GRUB_THEME="/boot/grub/themes/deneme/theme.txt"

GRUB’ın bekleme zamanında bize bir “menü” göstermesini istedik. Tema olarak da “/boot/grub/themes/deneme/theme.txt” yolunu verdik. Sanırım buraya bakarak, tema dosyalarımızı nereye atacağımızı fark etmişsinizdir.

Temalar için gerekli dizini oluşturun:

sudo mkdir -p /boot/grub/themes/deneme

Temada kullanacağınız dosyaları – ki ilk denememizde txt dosyası ve bazı görseller var – bu dizine kopyalayın. Dizin içeriği, aşağıdaki gibi olmalı:

root@cube2:/boot/grub/themes/deneme# ls
boot_menu_c.png  boot_menu_ne.png  boot_menu_nw.png  boot_menu_s.png   boot_menu_w.png
boot_menu_e.png  boot_menu_n.png   boot_menu_se.png  boot_menu_sw.png  theme.txt

Son olarak aşağıdaki komutu çalıştırın:

sudo update-grub

Aşağıdakine benzer bir çıktı almalısınız:

root@cube2:/boot/grub/themes/deneme# update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found theme: /boot/grub/themes/deneme/theme.txt
Found linux image: /boot/vmlinuz-5.13.0-44-generic
Found initrd image: /boot/initrd.img-5.13.0-44-generic
Found linux image: /boot/vmlinuz-5.11.0-27-generic
Found initrd image: /boot/initrd.img-5.11.0-27-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done

Aralarda bir yerde, temanın bulunduğuna dair bir ifade göreceksiniz. Şimdi makinemizi yeniden başlatalım ve durumu görelim:

GRUB teması deneme - 1
GRUB teması deneme – 1

Fena görünmüyor. Kullandığımız boot_menu görselleri biraz daha şeffaf olabilir. Seçilen nesnenin siyah renkte olması ise çok kötü. Menünün konumu da biraz daha aşağı-sola gelse, gün batımını bozacak. Bu nedenle yukarı-sola çekebiliriz. Son olarak, tepedeki “GRUB Boot Menu” başlığını değiştirmek güzel olabilir.

İkinci Deneme (Başlığın ve Menü Konumunun Değiştirilmesi)

Tema dosyasını tekrar düzenleyin:

#Global Özellikler
desktop-image: "background.png"
desktop-image-scale-method: "stretch"
title-text: "Kalbim İzmir'de"

#Boot Menu
+ boot_menu {
	menu_pixmap_style = "boot_menu_*.png"
	width = 50%
	height = 20%
	top = 10%
	left = 15%
	item_color = "#FFFFFF"
	selected_item_color = "#000000"
	item_height = 40
	item_padding = 10
	item_spacing = 10
}

Yeni bir ögemiz var: “title-text”. Bu sayede, yukarıda görünen başlığı değiştirdik. Görsellerden 3 tanesi hariç hepsinin şeffaflığını azalttım. Bu sayede, 9 parçanın birleşimini görebileceğiz.

Yeni dosyaları ilgili dizine attıktan sonra cihazı reboot edin.

GRUB teması deneme -2
GRUB teması deneme -2

Menüdeki renk tutarsızlığını fark ettiniz mi? Belli ki güneydoğu, güneybatı ve batı görsellerinin şeffaflığı değiştirilmemiş. Sanırım bu örnek, parçalı görselleri anlamaya yardımcı olacaktır.

Menümüzün konumu değişti, fakat başlığın üzerine denk geldi. Biraz daha aşağı alınmalı. Hatta biraz da sola kaymasında bir sakınca yok gibi. Gerekli düzenlemeleri, bir sonraki denemede yapacağız.

Üçüncü Deneme (Progress Bar)

Bir önceki denemedeki konumlandırma ve renk konuları ile birlikte, bir de “progress bar” ekleyelim temamıza:

#Global Özellikler
desktop-image: "background.png"
desktop-image-scale-method: "stretch"
title-text: "Kalbim İzmir'de"

#Boot Menu
+ boot_menu {
	menu_pixmap_style = "boot_menu_*.png"
	width = 55%
	height = 15%
	top = 13%
	left = 5%
	item_color = "#FFFFFF"
	selected_item_color = "#FF0000"
	item_height = 35
	item_padding = 8
	item_spacing = 8
}

#Progress Bar
+ progress_bar {
	id = "__timeout__"
	width = 30%
	height = 45
	top = 80%
	left = 5%
	text = "Cihazın açılmasına %d saniye kaldı"
	text_color = "#FFFFFF"
	bar_style = "progress_bar_*.png"
	highlight_style = "progress_highlight_*.png"
}

Yeni bir bölümümüz var, “progress_bar“. Konum bilgilerinin yanı sıra, bir de metin girdik. Buradaki “id” bölümü ve “%d” ifadesi, kalan süreyi çekebilmemizi sağlayacak. “bar_style” ile, çubuğun görselini belirttik. Menü ile aynı mantık. “highlight_style” ise, çubuğun dolarken hangi görsellerin kullanılacağını gösteriyor.

İlgili görselleri – isimlendirmeye dikkat ederek – ve düzenlenmiş tema dosyasını cihazınıza kopyalayın ve yeniden başlatın.

GRUB teması deneme -3
GRUB teması deneme -3

Bir şeyler oluşmaya başladı gibi. Progress bar, neden menü gibi oval kenarlı değil, onu açıklayayım. Çünkü sadece “center” görseli ekledim. Bu nedenle, kare şeklindeki center görseli, tema dosyasında belirtilen boyuta getirildi. Ancak menü için, köşe dosyaları ayrı hazırlanmıştı ve oval kenarlıydı. Progress bar’ın daha koyu bir renkte dolmasının sebebi ise, tahmin edeceğiniz üzere, progress highlight görselinin daha opak olması.

Temanın Son Hâli

Biraz yemek tarifi programı gibi olacak ama, ana mantığı anlatabildiğimi düşünüyorum. Bundan sonrası görseller, konumlandırma, renkler vs.

Tabii ki bu temada düzenlenebilecek daha pek çok alan var. Scroll bar, ikonlar, terminal ekranı vs. Bunların tamamına yer vermem mümkün değil. Öte yandan, yazının başında belirttiğim dokümandan oldukça faydalı bilgilere ulaşabileceğinizi tekrar hatırlatmak isterim.

Son olarak, temanızı farklı ekran çözünürlüklerinde deneyebilme şansınız varsa mutlaka deneyin. Zira bu temayı, bir sanal makinede, leş gibi bir çözünürlükte yaptım ve muhtemelen kendi fiziksel cihazımda gerçekten çok kötü görünecek.

Tema dosyalarına buradan ulaşabilirsiniz.