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.

25.03.2019

Manjaro mirrorlist

Manjaro'da güncellemelerin  indirilmesini ve depolardan başka paketlerin kurulmasını sağlayan pacman sunucuları coğrafik olarak yedekli bir yapıda, çoğu linux dağıtımında olduğu gibi. Depolarla ilgili işlemler çok yavaş ilerliyorsa (bir program kurmak veya güncellemeleri kurmak gibi) yapılabilecek şey mirror adı verilen (asıl sunucunun ayna kopyası anlamında) listeyi güncellemek. Mevcut liste
/etc/pacman.d/mirrorlist 
klasröründe görülebilir. Varsayılan olarak benim sistemimde şöyleydi:

##
## Manjaro Linux default mirrorlist
## Generated on 2018-11-29 11:30
##
## Please use 'pacman-mirrors -f [NUMBER] [NUMBER]' to modify mirrorlist
## (Use 0 for all mirrors)
##
 

## Country : Germany
Server = https://mirror.netcologne.de/manjaro/stable/$repo/$arch

## Country : France
Server = http://kibo.remi.lu/stable/$repo/$arch

## Country : Philippines
Server = http://mirror.rise.ph/manjaro/stable/$repo/$arch

## Country : Singapore
Server = https://mirror.0x.sg/manjaro/stable/$repo/$arch

## Country : South_Korea
Server = http://mirror.d-tl.com/manjaro/stable/$repo/$arch

## Country : Hong_Kong
Server = http://ftp.cuhk.edu.hk/pub/Linux/manjaro/stable/$repo/$arch

## Country : Japan
Server = http://ftp.riken.jp/Linux/manjaro/stable/$repo/$arch

## Country : United_Kingdom
Server = http://repo.manjaro.org.uk/stable/$repo/$arch


Manjaro ile gelen pacman-mirrors komutu bu dosyayı istenen şekilde güncellemek için bazı kolaylıklar sağlıyor. Örneğin listemizin sadece anlık olarak en iyi erişime sahip 5 sunucudan oluşmasını istiyorsak
$ sudo pacman-mirrors --fasttrack 5
kullanabiliriz. Benim sistemimde şöyle bir çıkış üretti:

::INFO Downloading mirrors from repo.manjaro.org
::INFO Using default mirror file
::INFO Querying mirrors - This may take some time
  0.548 Germany        : http://mirror.ragenetwork.de/manjaro/
  0.624 Germany        : https://manjaro.moson.eu/
  0.390 Germany        : http://manjaro.moson.eu/
  1.565 Kenya          : https://manjaro.mirror.liquidtelecom.com/
  0.944 Kenya          : http://manjaro.mirror.liquidtelecom.com/
  0.425 United_Kingdom : http://manjaro.mirrors.uk2.net/
  2.387 Singapore      : https://mirror.0x.sg/manjaro/
  1.453 Singapore      : http://mirror.0x.sg/manjaro/
  ..... Singapore      : ftp://mirror.0x.sg/manjaro/
::INFO Writing mirror list
::Germany         : https://manjaro.moson.eu/stable
::United_Kingdom  : http://manjaro.mirrors.uk2.net/stable
::Germany         : http://mirror.ragenetwork.de/manjaro/stable
::Kenya           : https://manjaro.mirror.liquidtelecom.com/stable
::Singapore       : https://mirror.0x.sg/manjaro/stable
::INFO Mirror list generated and saved to: /etc/pacman.d/mirrorlist


Kırmızı ile vurgulanan yerlerde sırasıyla sunucu listesini Almanya, Birleşik Krallık, Almanya, Kenya ve Singapur sunucularından oluşturarak yazdığını belirtiyor. Bundan sonra uygulanacak bir güncellemenin daha hızlı olması beklenir.

Eğer en hızlı sunucu Türkiye'deki sunucudur diyorsak sadece Türkiye sunucusunu kullanmak için şöyle bir komut verebiliriz.:
$ sudo pacman-mirrors --country Turkey
bu komut da şöyle bir çıktı üretti:

::INFO Downloading mirrors from repo.manjaro.org
::INFO User generated mirror list
::------------------------------------------------------------
::INFO Custom mirror file saved: /var/lib/pacman-mirrors/custom-mirrors.json
::INFO Using custom mirror file
::INFO Querying mirrors - This may take some time
  0.338 Turkey         : http://ftp.linux.org.tr/manjaro/
  0.729 Turkey         : ftp://ftp.linux.org.tr/manjaro/
::INFO Writing mirror list
::Turkey          : http://ftp.linux.org.tr/manjaro/stable/$repo/$arch
::INFO Mirror list generated and saved to: /etc/pacman.d/mirrorlist
::INFO To reset custom mirrorlist 'sudo pacman-mirrors -id'
::INFO To remove custom config run  'sudo pacman-mirrors -c all'


veya olası ülkeleri listelemek için
$ pacman-mirrors --country-list

kullanılabilir.

Gördüm ki Manjaro, Arch Linux gibi reflector kullanmıyormuş.

Ekleme 2021-08-12 : https://archlinux.org/mirrorlist/ sayfasından çevrimiçi mirrorlist dosyası oluşturulabiliyormuş.

12.03.2019

Linux'ta açık bir pencerenin PID'sini ve süreç adını bulma

Manjaro'da kurulu uygulamaların arasında yer alan Microsoft Excel Online'ı görüp ne olduğuna bakmak istedim. Aşağıdaki gibi bir ekran açıldı.


Microsoft Excel Online olarak çalılşan programın ne olduğunu merak ettim. Bu gibi durumlarda xprop'u (Property Displayer for X) kullanıyorum. Komut satırından

$ xprop _NET_WM_PID

çalıştırıyorum. Bundan sonra farenin okuyla bu pencerenin içine tıklıyorum. Bana farenin altındaki pencerenin PID'sini veriyor.

_NET_WM_PID(CARDINAL) = 1330

Bundan sonra da ps ile 1330 numaralı sürecin ne olduğuna bakmak kalıyor.

$ ps -p 1330 -o pid,command
   PID COMMAND
  1330 python3 ./ms-excel-online


Demek bir python betiğiymiş. Acaba ms-excel-online nerede?

$ locate ms-excel-online
/usr/share/ms-office-online/excel/ms-excel-online

Bunu da ilk defa bir linux dağıtımında görüyorum. LibreOffice falan varken Microsoft Office'in online sürümüne ait linkler... Linux da Microsoft'u seviyor mu acaba?

tcplay kullanımı

Truecrypt'ten ses seda yok. Uzun süredir güncellenemeyen programın yerine artık alternatifleri değerlendirme zamanı geldi.

Archlinux Wiki'sinde tcplay gözüme çarpmıştı, cryptsetup ve Veracrypt'in yanısıra. tcplay'i denemeye karar verdim. Kurulum basit:

$ sudo pacman -S tcplay

Bundan sonra elimizdeki örneğin tcvolume.tc adındaki bir truecrypt birimini örneğin /mnt klasörüne bağlamak için şu komut dizileri gerek:

$ sudo losetup /dev/loop0 tcvolume.tc
$ sudo tcplay -m tcvolume.tc -d /dev/loop0
$ sudo mount -o nodev,nosuid,uid=100,gid=100 /dev/mapper/tcvolume.tc /mnt

İşimiz bittikten sonra da kaldırmak için

$ sudo umount /mnt
$ sudo dmsetup remove tcvolume.tc
$ sudo losetup -d /dev/loop0

Buradaki kritik nokta loop0. Şuradaki bilgiye göre yeni linux çekirdeklerinde açılışta varsayılan olarak loop modülü yüklenmiyor. Dolayısıyla loop0, loop1 vs yok. Bunları yaratmak gerek. Önce

$ sudo modprobe loop

(eğer her açılışta bunu yapmasını istiyorsak

$ sudo tee /etc/modules-load.d/truecrypt.conf <<< "loop"

daha iyi olacaktır)

ile loop modülünü yüklemek, ardından da örneğin 4 tane /dev/loop# yaratmak gerek:

$ echo "options loop max_loop=4" > /etc/modprobe.d/eightloop.conf

Bunu bir shell script'i ile yapmak
Yukarıdaki işlemer her dosya için ayrı ayrı oldukça uğraştırıcı olur. Onun için az biraz kısatılmış hali şöyle bir bash script'i ile olabilir:

tcmount.sh
#!/bin/bash
sudo losetup /dev/loop$1 $2
sudo tcplay -m $2 -d /dev/loop$1
sudo mount -o nodev,nosuid,uid=1000,gid=1000 /dev/mapper/$2 $3


tcumount.sh
sudo umount $3
sudo dmsetup remove $2
sudo losetup -d /dev/loop$1


Örnek olarak yine tcvolume.tc dosyasını /mnt klasörüne bağlamak için:

$ sudo tcmount.sh 0 tcvolume.tc /mnt

ve bağlantıyı kesmek için ise

$ sudo tcumount.sh 0 tcvolume.tc /mnt

kullanmak gerek. Aynı anda birden fazla dosyanın bağlanması ihtimaline karşı loop için de bir parametre kullandım. Gerekli görülmezse $1 silinerek giriş argümanı sayısı 2'ye düşürülebilir.

11.03.2019

Firefox'ta saatin yanlış algılanması

Kullandığım bir web uygulaması, Firefox'ta saatleri 3 saat geride gösteriyordu. Sunucu tarafında ve bilgisayarımdaki saat/zaman dilimi ayarlarının normal olduğunu doğruladıktan sonra aynı uygulamayı kullanan başka bilgisayarlarda da kontrol ettim: hiçbir sorun yoktu. Demek benim bilgisayarıma özgü bir sorun.

Aklıma Process Explorer ile firefox'un ortam değişkenlerini incelemek geldi. Şöyle bir ekranla karşılaştım:


Komut satırından kontrol ettiğimde böyle bir ortam değişkenimin olmadığını da doğruladım:


Demek ki birşey, firefox'un

set TZ=UTC

ile başlamasını sağlıyor. Bunu doğrulamak için firefox'un içinden Dosya>Aç komutunu vererek C:\Windows\System32 klasörüne gidip cmd.exe'yi sağ tıklayarak çalıştırı seçtim (Aç değil!). Açılan yeni komut satırı penceresinde aynı şeyi denediğimde ise şunu gördüm:



Bu nasıl oluyor diye bir kez daha aradığımda, daha sonuca yönelik kelimeler kullandım sanıyorum, bu sefer şu sayfayı buldum. Anlaşılan TOR browser'dan örnek alınarak adapte edilen yeni finger printing özelliğini etkinleştirince bu da bir özellik olarak geliyormuş.




O kadar sorunun kısa bir süre önce kendi yaptığım bir değişiklikten kaynaklanıyor olmasına sevinsem mi, üzülsem mi bilemedim.

7.03.2019

Manjaro, Fedora e EFI disk bölümü

Bir bilgisayara önce Manjaro kurdum. Son zamanların favori dağıtımı. Benim de hoşuma gitti. Ama yetmedi, yanına bir de Fedora kurmak istedim. Manjaro'yu kurmadan önce live CD ortamında fdisk ile diski bölümlendirmiştim. Manjaro'yu kurdum, gayet güzel çalıştı, ama Fedora'yı kurma aşamasında sürekli aşağıdaki hatayı alıyordum.



Görüldüğü gibi Fedora, EFI bölümünün yapısından yakınıyor. Oysa Manjaro bu yapıyı kabul edip, kurumu tamamlayarak çalışmaya bile başladı. Acaba tam olarak neyi beğenmedi diye arattığımda şu reddit gönderisinde gdisk ile bölüm tipinin değiştirilmesinden bahsediyordu. Benim durumumda gdisk ile disk tablosuna baktığımda aşağıdaki gibi bir sonuçla karşılaştım:


Görüldüğü gibi Manjaro sda1 bölümünün tipi 0700 (Microsoft Basic Data, ki bu da FAT32 aslında) olarak görüyor.

Hemen

$ sudo gdisk /dev/sda

ile gdisk'i başlatıp t komutuyla bölüm tipini ef00 olarak seçtim, Fedora bundan sonra sorunsuz ilerledi.


Ama sanıyorum başka bir hatadan /boot/efi bölümünü bozduğumdan (galiba kuruluşta sda1'i biçimlendirdim) Fedora açılmasına rağmen Manjaro açılmadı.

Bunu da kısmen şuradaki adımları izleyerek düzelttim. Boot menümde Manjaro'nun fallback initramfs'i vardı ve onunla açıldı. Açıldıktan sonra da şu komut ile EFI kipindeki GRUB'ı tekrar yazdım:

$ sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=manjaro --recheck
$ sudo update-grub

Güncelleme 2019-03-11: Bundan sonra Fedora ile giriş yapmak istediğimde her şifre yazışımdan sonra tekrar giriş ekranına dönmeye başladı. Şurada sorunun sebebini anlatan arkadaş, bu işin sorumlusunun SELinux olduğunu, başka bir linux ile dual boot yapılan ve muhtemelen ortak bir /home disk bölümü kullanan Fedora'nın bu hataya yol açabileceğini yazmış, ki bu da tam olarak benim durumum. Çözüm olarak giriş (login) ekranındayken Ctrl+F2 ile grafik arayüzden çıkıp konsola giriş yapıp denemek için geçici olarak SELinux'u devre dışı bırakmayı

$ sudo setenforce 0

ardından eğer giriş yapmayı başarabildiysek tekrar GUI oturumumuzu sonlandırarak tekrar Ctrl+F2 ile konsola giriş yaparak önce SELinux'u tekrar etkinleştirmeyi

$ sudo setenforce 1

daha sonra da /home için varsayılan SELinux ayarlarına dönmeyi önermiş:

$ sudo restorecon -R /home

Bunun normal şartlar altında bir veri kaybına yol açmaması gerekiyor. Bu adımların sonucunda ben istediğim sonuca ulaştım.

---
https://bugzilla.redhat.com/show_bug.cgi?id=746895

Sistem EFI kipinde mi açılmış

Açık bir linux sistemin EFI/UEFI mı yoksa BIOS kipinde mi açıldığını nasıl anlarız?

En ayrıntılı yöntem şu gönderide Derobert'in cevabında verilmiş.

dmesg'a bakmak

Basitçe  kernel ring buffer'da ilgili kaydı kontrol etmek:
$ dmesg | grep "EFI v"
sonucunda eğer

[    0.000000] efi: EFI v2.31 by American Megatrends

gibi bir satır dönerse EFI ile açılmıştır. Hiç birşey dönmezse BIOS kipindedir.

/sys/firmware/efi'ı listelemek
Aşağıdaki komut ile efivars varsa EFI'dir

$ ls /sys/firmware/efi
config_table    fw_platform_size  runtime          systab
efivars         fw_vendor         runtime-map

BIOS sistemlerinde yukarıdaki komut bir sonuç üretmez

efibootmgr sonucuna bakmak
Eğer aşağıdaki gibi bir sonuç alınıyorsa EFI kipidir.

$ sudo efibootmgr
BootCurrent: 0004
BootOrder: 0004,0005,0000,0001,0002,0003
Boot0000* EFI VMware Virtual SCSI Hard Drive (0,0)
Boot0001* EFI VMware Virtual IDE CDROM Drive (IDE 1:0)
Boot0002* EFI Network
Boot0003* EFI Internal Shell (Unsupported option)
Boot0004* Manjaro
Boot0005* Fedora

Ya da şöyle bir çıkış alınıyorsa BIOS kipindedir:

EFI variables are not supported on this system.

efivars ile bakmak
Eğer aşağıdaki komut ile efi değişkenleri listeleniyorsa EFI kipindedir.

$ efivar -l

Hiçbir sonuç vermiyorsa BIOS kipindedir.

/boot/efi bölümü bağlanmış mı
EFI olarak açılmışsa bir disk bölümünün /boot/efi olarak bağlanmış olması gerekir. Bunu kontrol etmek için

$ sudo mount -l | grep sda

veya

$ df -h --local | grep /boot

kullanılabilir

Windows için?
Açık bir Windows sistemin EFI kipinde mi, BIOS kipinde mi açıldığını anlamak için birkaç yol var. En kolayı msinfo32.exe ile bakmak [1],[2]:



 BIOS Mode alanı bu iş ile ilgili bilgi veriyor.

Bu olmazsa %SystemRoot%\Panther\setupact.log dosyasının içindeki Callback_BootEnvironmentDetect satırına bakmak gerek. BIOS için

Code:Callback_BootEnvironmentDetect: Detected boot environment: BIOS

UEFI için ise
Code:Callback_BootEnvironmentDetect: Detected boot environment: UEFI

görülecektir.

Diğer bir yöntem ise bcdedit.exe ile (%SystemRoot\System32 klasöründe) Windows önyükleyicisini sorgulamak. Bunun için yönetici olarak açılmış bir komut satırında şu komudu çalıştırmak gerek:

bcdedit /enum

Bunun sonucunda "Windows Boot Loader" başlığının altında path'e bakmak gerek. BIOS için

Windows Boot Loader
-------------------
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.exe


EFI için ise

Windows Boot Loader
-------------------
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.efi


gibi bir sonuç verir.
--
[1] https://www.easyuefi.com/resource/check-windows-is-booted-in-uefi-mode.html
[2] https://superuser.com/questions/464760/how-to-tell-if-the-windows-installer-boots-in-efi-or-bios