2019-03-11

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.

2019-03-07

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

2019-01-10

Linux'a Powershell Core kurulumu

Powershell bir süredir açık kaynak kodlu. Aslında açık kaynak kodlu haline Powershell Core deniyor ve github'da kaynak kodları mevcut. Powershell ile aralarında ufak farklılıklar var.

Denemek için Fedora'ya powershell kurmaya karar verdim. Microsoft'un Poweshell bloğu sayfasında linux için kurulum adımlarına rastladım. Gariptir, Ubuntu 14.04 ve 16.04 için çok iyi tarif edilmiş bir kurulum yönergesi mevcutken Fedora için yok. CentOS var, o da yum tabanlı, ben de benzer bir yol izledim. Öncelikle yeni bir depo oluşturmak lazım. Şu adreste depo linki verilmiş. Bunu önce indirdim ve /etc/yum.repos.d altına kopyaladım.
$ curl https://packages.microsoft.com/config/rhel/7/prod.repo > microsoft.repo
$ sudo cp microsoft.repo /etc/yum.repos.d
Sonrasında depoları güncelleyerek kurulum komutunu verdim.  Kurulacak paketin adı powershell.
$ sudo dnf check-update
$ sudo dnf install powershell
50 MB gibi bir boyutu var, 6.1.1 sürmünün. Kurulum tamamlandıktan sonra
$ pwsh
yazarak powershell'e geçiş yaptım. İlk denememi aşağıdaki gibi yaptım.


Dünya garip bir dünya oldu: Microsoft loves Linux!

---
düzeltme (10.01.2019):
Github'da Fedora için kurulum adımları verilmiş. Yakışıklı yönerge şöyl:

# Register the Microsoft signature key
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc

# Register the Microsoft RedHat repository
curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo

# Update the list of products
sudo dnf update

# Install a system component
sudo dnf install compat-openssl10

# Install PowerShell
sudo dnf install -y powershell

# Start PowerShell
pwsh

2019-01-09

Linux terminali özelleştirmek

Linux'ta vakit geçirdikçe Windows'un komut satırı pek bi sıradan gözüküyor insanın gözüne. Ama buna çare yok (ya da çare cmder!)


Yukarıda Fedora ile gelen standart terminal penceresi. Renklendirme yok, prompt standart. Biraz kendime göre özelleştirmeye çalıştım. Bunun sonuçlarında da şöyle bir sonuca ulaştım:


Biraz renklendirilmiş, saat ve geçmiş bilgisi eklenmiş. Bu sonuca nasıl vardığımı kısaca anlatayım.

Öncelikle prompt satırında "[" ve "]" arasında yazılmış 3 alan var. Birinci alan varsayılan haliyle

[metin@ozm-fed ~]

kısmı. Burada kullanıcı adı ve bilgisayar adını, sonrasında da bulunduğumuz klasör adını görüyoruz. Bunu kodlamak için

[\u@\h \w]

kullandım.

İkinci kısım ise saati gösteriyor. Bunun için de

[\A]

kullandım.

Üçüncü kısım ise komut geçmişindeki mevcut indeksi gösteriyor. Bunun içinse

[\h]

kullandım. Son prompt karakteri olarak \$ aşikar. Tüm bunları birleştirince şöyle bir dizi çıkıyor:

"[\u@\h \w] [\A] [\h] \$"

Ancak bu renklendirilmemiş hali. Renklendirme işi ise başka bir dünya. Renk kodları vermek için escape karakteri kullanmak gerek. Escape karakteri başlangıcı \[ ile, bitişi ise \] ile belirtiliyor. Renk kodları ise \e[ ile başlayan ve m ile bitecek şekilde belirtiliyor. Garip ama böyle.

Renk kodları şöyle:
  • 30: Siyah
  • 31: Kırmızı
  • 32: Yeşil
  • 33: Sarı
  • 34: Mavi
  • 35: Mor
  • 36: Camgöbeği
  • 37: Beyaz
Ayrıca bir de biçem kodları var:

  • 0: Normal metin
  • 1: Kalın veya ince, terminale göre değişir
  • 4: Altı çizili
Fon rengi kodları da şöyle:
  • 40: Siyah fon
  • 41: Kırmızı fon
  • 42: Yeşil fon
  • 43: Sarı fon
  • 44: Mavi fon
  • 45: Mor fon
  • 46: Camgöbeği fon
  • 47: Beyaz fon

Nihayet sarı bir kullanıcı adı yazmak için şu kodlama gerek:

\[\e[0;33m\]\h

Sarı ile vurgulanan alan sadece \h ile belirtilen kullanıcı adını düz metin (0) ve sarı renk (33) ile yazmak içindi. Eğer bir de arka fon rengi belirtmek istiyorsak 0'dan önce de onu yazmamız gerekecekti, yine noktalı virgille ayırarak. Aşağıda örneği var. Kullanıcı adını sarı ile yazdıktan sonra tekrar @ karakterini varsayılan renkte yazması için sıfırlamak gerek. Bunun için de

\[\e[0m\]

kullanılır. Bu şekilde tüm promptu oluşturmak için şöyle bir kodlama gerekti:

[\[\e[0;33m\]\u\[\e[0m\]@\[\e[0;31m\]\h\[\e[0m\] \w] [\[\e[0;34m\]\A\[\e[0m\]] [\[\e[0;32m\]h:\!\[\e[0m\]] \[\e[43;1;37m\]$\[\e[0m\]

Şu renk kodlamasıyla ayrılan bölüm prompt karakterini sarı fon üzerine beyaz olarak yazmak içindi.

Bu karakter dizisini PS1 adlı bir ortam değişkenine atarak etkin kılabiliriz. Bunu her yeni terminal penceresinde kullanabilmek için ise profil klasörümüzdeki .bashrc dosyasının içine

PS1="[\[\e[0;33m\]\u\[\e[0m\]@\[\e[0;31m\]\h\[\e[0m\] \w] [\[\e[0;34m\]\A\[\e[0m\]] [\[\e[0;32m\]h:\!\[\e[0m\]] \[\e[43;1;33m\]\$\[\e[0m\] "

gibi bir satır ekleyerek yapabiliriz.

ls komutunun renkli çıktı üretmesi için .bashrc dosyasının içine bir alias eklenebilir:

export ls='ls --color=ALWAYS'

Burada, Manjaro için ls= den sonra gelen kısmın tek tırnak içinde olmasına, color'dan sonra iki nokta üstüste değil eşittir kullanılmasına ve ALWAYS'sin büyük harflerle yazılmasına dikkat etmek gerek. Fedora için ise always küçük harflerle yazılmalı.

Ya da ls komutunda gösterilen tarih ve saat biçimini değiştirmek için Manjaro için yine .bashrc'de aşağıdaki gibi bir ortam değişkeni tanımlanabilir:

export SYSTEM_TIME=long-iso

Fedora için ise ls komutu parametresi --time-style=long-iso kullanılabilir. Yukarıdakiyle birleştirildiğinde toplu alias şöyle olabilir:

alias ls='ls --color=always --time-style=long-iso'

2021-12-20 düzenleme: Aşağıdaki bash değişkenlerini tanımlayarak işimizi kolaylaştırabiliriz.

Sari_Siyah = "\[\e[0;33m\]"
Kirmizi_Siyah = "\[\e[0;31m\]"
Mavi_Siyah = "\[\e[0;34m\]"
Yesil_Siyah = "\[\e[0;32m\]"
Sari_Sari = "\[\e[43;1;37m\]"
Sifirla = "\[\e[0m\]"
Kullanici = "${Sari_Siyah}\u${Sifirla}"
Makine = "${Kirmizi_Siyah}\h${Sifirla}"
Konum = "${Kirmizi_Siyah}\w${Sifirla}"
Saat = "${Mavi_Siyah}\A${Sifirla}"
Gecmis = "${Yesil_Siyah}h:\!${Sifirla}"
Prmpt = "${Sari_Sari}\$${Sifirla}"
PS1 = "[${Kullanici}@${Makine} ${Konum}] [${Saat}] [${Gecmis}] ${Prmpt}"


Ya da direk hazır kodlanmışı alıp kopyalayabiliriz.
 
2023-01-02: Hiç uğraşmadan yapmak için https://ezprompt.net/ süper!

2025-02-15 Ek:

# Function to calculate and display command duration
function preexec() {
    TIMER_START=$(date +%s%N)
}

function precmd() {
    # Calculate duration in seconds and milliseconds
    if [ -n "$TIMER_START" ]; then
        TIMER_END=$(date +%s%N)
        DURATION=$(( (TIMER_END - TIMER_START) / 1000000 ))  # Convert nanoseconds to milliseconds
        if (( DURATION > 1000 )); then
            DURATION_DISPLAY="$((DURATION / 1000))s"
        else
            DURATION_DISPLAY="${DURATION}ms"
        fi
    else
        DURATION_DISPLAY="0ms"
    fi
}

PROMPT_COMMAND=precmd

# Function to set the prompt
function set_prompt() {
    local term_width=$(tput cols)  # Get terminal width

    # Left section: current working directory in blue
    local cwd="\[\e[1;34m\]\w\[\e[0m\]"

    # Right section: date and time in green
    local datetime="$(date +'%Y-%m-%d %H:%M:%S')"
    local datetime_length=${#datetime}

    # Calculate padding to right-align the date and time
    local padding=$((term_width - datetime_length))

    # Ensure the padding is valid
    if (( padding < 0 )); then
        padding=0
    fi

    # First line: Left (cwd) and right (datetime)
    PS1="${cwd}\[\e[${padding}G\]\[\e[1;32m\]${datetime}\[\e[0m\]\n"

    # Second line: Command duration + "$" prompt
    PS1+="\[\e[1;36m\]${DURATION_DISPLAY}\[\e[0m\] $ "
}

PROMPT_COMMAND="set_prompt; $PROMPT_COMMAND"
nd 'set show-all-if-ambiguous on'
bind 'TAB:menu-complete'
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
# veya
# bindkey '\e[A' history-beginning-search-backward
# bindkey '\e[B' history-beginning-search-forward 

---

[1] https://www.digitalocean.com/community/tutorials/how-to-customize-your-bash-prompt-on-a-linux-vps

[2] https://dev.to/rossijonas/how-to-set-up-history-based-autocompletion-in-zsh-k7o

 

<

2018-12-18

Açılmayan Arch sorunu

Arch kurulumum aşağıdaki mesajlar sonrasında takılıp kalıyordu:

Warning: /lib/modules/4.19.8-arch1-1-ARCH/modules.devname not found -ignoring
starting version 239
ERROR: device 'UUID=.....' not found. Skipping fsck.
mount: /new_root: can't find 'UUID=....'.
You are now being dropped into an emergency shell.
sh: can't access tty; job control turned off
[rootfs ]#
Her ne kadar son gelinen nokta bir acil durum konsolu gibi gözükse de klavye çalışmıyor, öylece kalıyor. UUID ile gösterilen disk bölümü sağlam. Başka bir linux kurulumundan bu bölümü mount edip içeriği görebiliyorum.

Uzun uğraşlar sonucunda anladım ki olay pacman -Syu ile güncelleme yaparken güncellemenin yarım kalmasıyla yeni sürüm linux çekirdeğinin yüklenmesi ama initramfs'in yeniden oluşturulmasının gerçekleşmemesinden kaynaklanıyormuş.

USB sürücüsüne yazdığım archlinux ISO'su ile açtığım bilgisayarda ilk önce boot partition'ı /mnt'ye bağladım:
# mount /dev/sda3 /mnt
Ardından chroot ortamına geçtim:
# arch-chroot /mnt
Sonra gerek var mı, bilemiyorum ama arch forumlarında linux çekirdeği paketini tekrar yüklemem önerilmiş, onu yükledim (çünkü pacman -Qs linux ile mevcut sürümün yüklenmiş olduğunu görebiliyordum).
# pacman -S linux
Bundan sonra asıl işlem olarak initramfs'i tekrar oluşturdum:
# mkinitcpio -o linux
Grub'ı tekrar oluşturma adımını atladım, çünkü benim durumumda grub'ı başka bir linux kontrol ediyordu:
# grub2-mkconfig -o /boot/grub2/grub.cfg
Tekrar başlattığımda sorun giderilmişti.

Bu sorun ile şu adımların arkasından karşılaştım: 2 aya yakın bir süredir bu kurulumu açmamıştım. Açtıktan sonra pacman -Syu ile güncellemeleri kontrol etmek istedim, ama hiç güncelleme olmadığı mesajını aldım. Bu garip, çünkü 2 ay gibi bir süre zarfında arch linux gibi bir kurulumda mutlaka birkaç paket güncellemesi çıkardı. pacman -Syyu da fayda etmedi. Bunun üzerine güncelleme kaynaklarını tekrar oluşturmak istedim:
# reflector --verbose --latest 100 --sort rate --save /etc/pacman.d/mirrorlist

gibi bir komutla mirrorlist dosyasını tekrar oluşturdum. Sonrasında pacman -Syyu ile kontrol ettiğimde çok sayıda güncelleme buldum. Bunları yüklemeye çalıştım. Ama bir sebepten güncellemeler yarım kalmış. Bunun sonucunda da linux çekirdeği yüklenmiş, ama initramfs dosyası yeni sürüme uygun tekrar oluşturulmamş. Bunun sonucunda açılamayan bir sistem oluşmuş.

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

Ayrıca şu adreste söylendiği gibi --lastest ve --score değerlerinin çok yüksek verilmesi listelerin indirilememesine sebep olabilirmuş.

2018-12-01

Linux'ta çok yavaş açılış

Yeni kurulum yaptığım bir bilgisayardaki Fedora'nın çok yavaş açılışını incelemek için plymouth ekranında escape'e bastığımda şöyle bir satırda uzun süre beklediğini farkettim:

A startup job is running for dev-disk-by\....
Sorun nerden kaynaklanıyor diye aradığımda bu sorunun /etc/fstab'da yer alan ve UUID'si güncel olmayan bir disk bölümü ile ilgili olabileceğini okudum. Gerçekten de karşılaştırdığımda swap bölümü için UUID'nin güncel olmadığını gördüm.

$ sudo blkid /dev/sdaX
ile güncel UUID'yi öğrendim. Sonra da /etc/fstab'a girerek burayı güncelledim. Kendimden emin bir şekilde tekrar başlattığımda hatanın aynı yerde durduğunu farkettim. 90 saniye kadar bu işlemin hata vermesini bekiyordu. Daha başka nerde sorun olabilir diye düşünürken /boot/grub/grub.cfg dosyasında resume alanın da aynı UUID'yi içerdiğini gördüm. Bunu değiştirmek için /etc/default/grub dosyasına baktığımda GRUB_CMDLINE_LINUX bölümünde yine aynı UUID'nin olduğunu gördüm. Son olarak bu dosyayı da güncelledim ve sorun yine olduğu gibi duruyordu.

Sonra hatırladım ki, swap bölümünün UUID'sinin değişmesine sebep olan, dual boot archlinux kurulumumdu ve grub'ı arch yönetiyordu. Bunun için arch'ı açtım. Bu kurulumda /etc/fstab ile ilgili bir sorun yoktu. Aslında /etc/default/grub dosyasında da sorunlu UUID'nin izine rastlamadım. Sadece
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
ile grub'ı güncellemem yeterli oldu.