Yeni bir sunucuya SSH ile baglandin. Ne yapiyorsun? Cogu deneyimli sysadmin refleks olarak birkac komut girer – bunlarin basinda uname gelir. Kernel versiyonu ne, mimari 32 bit mi 64 bit mi, hangi isletim sistemindeyiz? Bunlari bilmeden sunucuda is yapmak, haritasiz yabanci bir sehirde araba kullanmaya benzer.
Bu yazida uname komutunu derinlemesine inceleyecegiz. Sadece temel kullanimi degil, gercek dunya senaryolarinda nasil kullandiginizi, scriptlere nasil entegre ettiginizi ve baska hangi komutlarla birlikte guclu bir sistem bilgisi tablosu olusturdugunuzu konusacagiz. Hazirsan baslayalim.
uname Nedir ve Neden Onemlidir?
uname, Unix ve Linux sistemlerde sistem bilgilerini goruntuleyen temel bir komuttur. Adi “Unix Name” kelimelerinin kisaltmasindan gelir. POSIX standartlarina dahil oldugu icin neredeyse her Unix/Linux sistemde bulunur – ister Ubuntu, ister CentOS, ister FreeBSD, ister macOS olsun.
Web sunucusu yonetiyorsan bu komut sana ozellikle kritik anlarda yardimci olur. Mesela bir guvenlik acigi cikmis, CVE numarasi var elimde, etkilenen kernel versiyonunu bilmem gerekiyor. Ya da bir yazilimi derleyeceksin, mimariyi dogrulaman lazim. Belki bir destek bileti aciyorsun ve karsi taraf “kernel versiyonunu gonder” diyor. Tum bu durumlarda uname ilk duragin olacak.
Temel Kullanim: Parametreler ve Ciktilari
Ilk once parametrelere bakalim. uname komutunu parametresiz calistirirsan sadece sistem adini gosterir. Ama asil guc parametrelerde sakli:
# Parametresiz kullanim - sadece kernel adini gosterir
uname
# Cikti: Linux
# Tek tek parametre kullanimi
uname -s # Kernel adi (System)
uname -n # Network hostname
uname -r # Kernel release (versiyon)
uname -v # Kernel version (derleme bilgisi)
uname -m # Makine mimarisi
uname -p # Islemci tipi
uname -i # Donanim platformu
uname -o # Isletim sistemi
# Hepsini bir arada gormek icin
uname -a
Simdi bu parametrelerin ne anlama geldigini tek tek konusalim. Cogu zaman sadece uname -a kullanilir ama ne gordugunu anlamak cok onemli.
| Parametre | Aciklama | Ornek Cikti |
|---|---|---|
| -s | Kernel adi | Linux |
| -n | Hostname | webserver01.example.com |
| -r | Kernel release | 5.15.0-91-generic |
| -v | Kernel version (derleme tarihi) | #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 |
| -m | Makine mimarisi | x86_64 |
| -p | Islemci tipi | x86_64 |
| -i | Donanim platformu | x86_64 |
| -o | Isletim sistemi | GNU/Linux |
| -a | Tum bilgiler | Tum alanlari birlestirerek gosterir |
uname -a Ciktisini Dogru Okumak
Pratik bir ornek uzerinden gidelim. Tipik bir Ubuntu sunucusunda uname -a ciktisi soyle gozukur:
uname -a
# Linux webserver01 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
# Bu ciktiyi parcalayalim:
# Linux -> Kernel adi (-s)
# webserver01 -> Hostname (-n)
# 5.15.0-91-generic -> Kernel release (-r)
# #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 -> Kernel version (-v)
# x86_64 -> Makine mimarisi (-m)
# x86_64 -> Islemci tipi (-p)
# x86_64 -> Donanim platformu (-i)
# GNU/Linux -> Isletim sistemi (-o)
Burada kernel versiyonu olan 5.15.0-91-generic satirini iyi anlamak lazim. Uc bolumden olusuyor: ana versiyon (5), alt versiyon (15), yama seviyesi (0) ve ardinda distroye ozgu ek bilgi. Bu numarayi guvenlik acigi aradigin zaman cok kullaniyor olacaksin.
Ipucu: Kernel versiyonunu CVE veritabanlarinda ararken uname -r ciktisini aynen kullanma. Cogu CVE, upstream kernel versiyonuna gore siniflaydirilir, distro paket numarasina gore degil. Ornegin 5.15.0-91-generic, upstream olarak 5.15 kernel ailesine karsilik gelir.
Gercek Dunya Senaryosu 1: Guvenlik Yamasi Kontrolu
Diyelim ki bir guvenlik acigi haberi okudun. Etkilenen sistemler kernel 5.x serisinin belirli bir versiyonuna kadar olan surumler. Elindeki tum web sunucularini kontrol etmen gerekiyor. Iste bu noktada uname‘i script ile birlestiriyorsun:
#!/bin/bash
# Birden fazla sunucuda kernel versiyonunu kontrol et
# sunucular.txt dosyasinda her satirda bir IP/hostname oldugununu varsayiyoruz
SUNUCU_LISTESI="sunucular.txt"
ETKILENEN_VERSIYON="5.15.0-88"
while IFS= read -r sunucu; do
echo -n "$sunucu: "
kernel=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no "$sunucu" 'uname -r' 2>/dev/null)
if [ $? -eq 0 ]; then
echo "Kernel: $kernel"
# Basit versiyon karsilastirmasi
if [[ "$kernel" == *"$ETKILENEN_VERSIYON"* ]]; then
echo " *** DIKKAT: Bu sunucu etkilenebilir! ***"
fi
else
echo "BAGLANTI HATASI"
fi
done < "$SUNUCU_LISTESI"
Bu script, listendeki sunuculara baglanip kernel versiyonlarini ceker ve etkilenen versiyonla karsilastirir. Otuz sunucuyu tek tek kontrol etmek yerine bunu calistirip kahveni icer, geri dondugun zaman sonuclar seni bekliyor olur.
Gercek Dunya Senaryosu 2: Mimari Bazli Paket Yukleme
Web sunucularinda bazen 32 bit ve 64 bit sistemler karisik kullanilabilir (evet, hala boyle ortamlar var). Yazdigin deployment scriptinin dogru mimariye gore paket indirmesi gerekiyor. Iste uname -m burada devreye giriyor:
#!/bin/bash
# Mimariye gore dogru binary indir ve yukle
MIMARU=$(uname -m)
APP_VERSION="2.4.1"
BASE_URL="https://releases.example-app.com"
case "$MIMARI" in
x86_64)
PACKAGE_URL="${BASE_URL}/app-${APP_VERSION}-linux-amd64.tar.gz"
echo "64-bit sistem tespit edildi, amd64 paketi indiriliyor..."
;;
aarch64|arm64)
PACKAGE_URL="${BASE_URL}/app-${APP_VERSION}-linux-arm64.tar.gz"
echo "ARM64 sistem tespit edildi, arm64 paketi indiriliyor..."
;;
armv7l)
PACKAGE_URL="${BASE_URL}/app-${APP_VERSION}-linux-armv7.tar.gz"
echo "ARMv7 sistem tespit edildi, armv7 paketi indiriliyor..."
;;
i686|i386)
PACKAGE_URL="${BASE_URL}/app-${APP_VERSION}-linux-386.tar.gz"
echo "32-bit sistem tespit edildi, 386 paketi indiriliyor..."
;;
*)
echo "Bilinmeyen mimari: $MIMARI"
exit 1
;;
esac
wget -q "$PACKAGE_URL" -O /tmp/app.tar.gz
tar -xzf /tmp/app.tar.gz -C /opt/
echo "Kurulum tamamlandi."
Bu tarz scriptler ozellikle Ansible playbook yazmadan once prototip cikarmak icin cok isiniza yarar. Mimariye gore dallandirma yaparak hem tek scriptle tum ortamlari yonetebilirsin hem de hata riskini minimize edersin.
uname’in Sinirlamalari ve Tamamlayici Komutlar
uname guclu bir arac ama tek basina tam resmi vermez. Mesela hangi Linux dagitimini kullandigini soylemez. Ubuntu mu, CentOS mu, Debian mi? Bunu anlamak icin baska kaynaklara bakman gerekiyor:
# Distro bilgisi icin - modern sistemlerde calisir
cat /etc/os-release
# Eski sistemlerde
cat /etc/issue
# lsb_release komutu (varsa)
lsb_release -a
# Tum sistem bilgisini toplu gormek icin
echo "=== KERNEL ==="
uname -a
echo ""
echo "=== DISTRO ==="
cat /etc/os-release 2>/dev/null || cat /etc/issue 2>/dev/null
echo ""
echo "=== CPU MIMARISI ==="
uname -m
echo ""
echo "=== HOSTNAME ==="
hostname -f 2>/dev/null || uname -n
Web sunucusu yonetiminde bu bilgilerin hepsini bir arada gormek cok isine yarar. Ozellikle bir destek sureci baslayinca veya yeni bir ekip uyesi sunucuya el atacaksa bu bilgileri bir README dosyasina veya wiki’ye not etmek iyi bir aliskanlik.
hostnamectl ile Gelismis Sistem Bilgisi
Systemd kullanan modern sistemlerde hostnamectl komutu daha zengin cikti verir. uname ile birlikte kullaninca cok kapsamli bir sistem profili cikartabilirsin:
# hostnamectl cok daha detayli bilgi verir
hostnamectl
# Tipik cikti:
# Static hostname: webserver01
# Icon name: computer-server
# Chassis: server
# Machine ID: a1b2c3d4e5f6...
# Boot ID: x9y8z7w6...
# Operating System: Ubuntu 22.04.3 LTS
# Kernel: Linux 5.15.0-91-generic
# Architecture: x86-64
# Sadece mimari almak icin
hostnamectl | grep Architecture
# Sadece OS bilgisi
hostnamectl | grep "Operating System"
# uname ile karsilastirmali rapor
echo "uname ciktisi:"
uname -a
echo ""
echo "hostnamectl ciktisi:"
hostnamectl
Web Sunucusu Ortamlarinda Pratik Kullanim Senaryolari
Web sunucusu yonetirken uname‘e en cok ihtiyac duydugun durumlar sunlar:
- Nginx veya Apache’nin belirli bir versiyonu kernel ozelligi gerektiriyorsa uyumlulugu kontrol etmek
- Let’s Encrypt/Certbot kurulumu oncesinde sistem gereksinimlerini dogrulamak
- Docker veya container teknolojisi kurmadan once kernel versiyonunu kontrol etmek
- eBPF tabanli monitoring araclari icin kernel gereksinimine bakmak
- SSL/TLS ayarlari icin kernel crypto subsystem versiyonunu anlamak
- Load balancer veya firewall kurulumu oncesinde netfilter/nftables destegini kontrol etmek
Bunlarin cogu icin sadece uname -r ciktisina bakman yeterli. Ama bazi durumlarda daha derin bir kontrol gerekebilir. Mesela Docker icin minimum kernel gereksinimini kontrol eden basit bir script:
#!/bin/bash
# Docker kurulumu icin kernel gereksinimleri kontrolu
KERNEL_VERSION=$(uname -r)
ARCH=$(uname -m)
echo "Sistem Bilgisi:"
echo " Kernel: $KERNEL_VERSION"
echo " Mimari: $ARCH"
echo ""
# Kernel versiyonunu parcalara ayir
MAJOR=$(echo "$KERNEL_VERSION" | cut -d. -f1)
MINOR=$(echo "$KERNEL_VERSION" | cut -d. -f2)
echo "Kernel Ana Versiyon: $MAJOR"
echo "Kernel Alt Versiyon: $MINOR"
echo ""
# Docker icin minimum kernel 3.10
if [ "$MAJOR" -gt 3 ] || ([ "$MAJOR" -eq 3 ] && [ "$MINOR" -ge 10 ]); then
echo "GECTI: Kernel versiyonu Docker icin yeterli (min. 3.10)"
else
echo "BASARISIZ: Kernel versiyonu cok eski! Docker icin en az 3.10 gerekli."
exit 1
fi
# Mimari kontrolu
if [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "aarch64" ]; then
echo "GECTI: Desteklenen mimari tespit edildi."
else
echo "UYARI: Bu mimari ($ARCH) icin Docker destegi sinirli olabilir."
fi
echo ""
echo "Kontrol tamamlandi."
Uyari: Kernel versiyonu tek basina yeterli degildir. Docker gibi araclarin cgroup versiyonu, namespace destegi ve baska kernel modulleri gibi gereksinimleri de vardir. Yukaridaki script temel bir on kontrol icin kullanilabilir, resmi kurulum dokumantasyonunu her zaman takip et.
Monitoring ve Loglama Icin uname Kullanimi
Sistem izleme scriptleri yazarken log kayitlarina sistem bilgisini eklemek cok iyi bir aliskanlik. Logdaki bir hataya bakarken hangi kernel ve mimari oldugunu bilmek zaman kazandirir. Ozellikle farkli versiyonlarda farkli davranislar gosteren problemlerde bu bilgi altin degerinde:
#!/bin/bash
# Sistem bilgisini log dosyasina yaz
# Bu scripti cron ile gunluk calistirabilisin
LOG_DIR="/var/log/sysinfo"
LOG_FILE="${LOG_DIR}/system_snapshot_$(date +%Y%m%d).log"
mkdir -p "$LOG_DIR"
{
echo "======================================"
echo "Sistem Anlık Goruntu - $(date '+%Y-%m-%d %H:%M:%S')"
echo "======================================"
echo ""
echo "[KERNEL BILGISI]"
echo "Tam uname -a ciktisi: $(uname -a)"
echo "Kernel adi: $(uname -s)"
echo "Kernel versiyonu: $(uname -r)"
echo "Kernel derleme: $(uname -v)"
echo "Mimari: $(uname -m)"
echo "Hostname: $(uname -n)"
echo ""
echo "[OS BILGISI]"
if [ -f /etc/os-release ]; then
grep -E '^(NAME|VERSION|ID)=' /etc/os-release
fi
echo ""
echo "[SISTEM KAYNAKLARI]"
echo "CPU cekirdek sayisi: $(nproc)"
echo "Toplam RAM: $(free -h | awk '/^Mem:/ {print $2}')"
echo "Disk kullanimi:"
df -h / | tail -1
echo ""
echo "======================================"
} >> "$LOG_FILE"
echo "Sistem bilgisi kaydedildi: $LOG_FILE"
Bu scripti /etc/cron.daily/ altina koyarsan her gun otomatik olarak calisir ve sistemin gecmisini kayit altina alirsin. Kernel guncellemenin ardinda hangi versiyona gectinizi, ne zaman gectinizi bu loglardan takip edebilirsin.
macOS ve Diger Unix Sistemlerinde uname
Sadece Linux degil, macOS da dahil hemen her Unix sisteminde uname calisir. Gelistirme ortaminda Mac kullanip production’da Linux calistiriyorsan bunu bilmen faydali. Aralarindaki farklara dikkat et:
- macOS’ta
uname -sciktisi “Darwin” olarak gelir - macOS’ta
uname -rDarwin kernel versiyonunu verir, macOS surumunu degil - FreeBSD’de
uname -sciktisi “FreeBSD” olarak gelir - Cross-platform script yazarken
uname -sile OS kontrolu yapmak iyi bir pratik
Eger hem Linux hem macOS’ta calisacak bir script yaziyorsan, bunu su sekilde handle edebilirsin:
#!/bin/bash
# Cross-platform sistem bilgisi - Linux ve macOS destekli
OS_TYPE=$(uname -s)
case "$OS_TYPE" in
Linux)
echo "Linux sistem tespit edildi."
echo "Kernel: $(uname -r)"
echo "Mimari: $(uname -m)"
if [ -f /etc/os-release ]; then
DISTRO=$(grep '^NAME=' /etc/os-release | cut -d= -f2 | tr -d '"')
echo "Dagitim: $DISTRO"
fi
PAKET_YONETICISI="apt-get veya yum"
;;
Darwin)
echo "macOS (Darwin) tespit edildi."
echo "Darwin kernel: $(uname -r)"
echo "macOS surumu: $(sw_vers -productVersion 2>/dev/null || echo 'bilinmiyor')"
echo "Mimari: $(uname -m)"
PAKET_YONETICISI="brew"
;;
FreeBSD)
echo "FreeBSD tespit edildi."
echo "Versiyon: $(uname -r)"
PAKET_YONETICISI="pkg"
;;
*)
echo "Bilinmeyen sistem: $OS_TYPE"
PAKET_YONETICISI="bilinmiyor"
;;
esac
echo "Onerilecek paket yoneticisi: $PAKET_YONETICISI"
Sonraki Adimlar
uname komutuna hakim olduktan sonra sistem bilgisi toplama konusunda kendini daha da gelistirebilecegin bir yol haritasi sunuyorum:
- procfs’i ogrenin:
/proc/version,/proc/cpuinfo,/proc/meminfogibi dosyalar uname’den cok daha derin sistem bilgisi verir. Bunlari okumak icin ek bir komuta gerek yok, sadececatyeterli. - dmidecode komutuna bakin: Donanim bilgisi (BIOS versiyonu, RAM slotlari, anakart modeli) icin
dmidecodevazgecilmezdir. Root yetkisi gerektirir. - lscpu ve lsblk ogrenin: CPU detaylari icin
lscpu, disk yapisi icinlsblkharika tamamlayicilardır. uname ile birlikte kullandiginda tam bir donanim profili cikarabilirsin. - Ansible facts mekanizmasina bakin: Birden fazla sunucu yonetiyorsan Ansible’in otomatik olarak toplayan
ansible_factsmodulu seni cok ugrastirici manuel islerden kurtarir. - Monitoring sistemine entegre et: Prometheus, Grafana veya benzeri araclara uname bilgilerini label olarak ekleyebilirsin. Boylece metriklerine bakarken hangi kernel versiyonunda oldugunu aninda gorursun.
- Kernel changelog takibi:
uname -rile ogrendigin versiyon numarasini kernel.org veya distronun changelog sayfasiyla eslestirerek sisteme ne zaman hangi degisikliklerin geldigi hakkinda bilgi sahibi olabilirsin.
uname komutu tek basina kucuk ve sade gorunebilir, ama dogru kullanildiginda sistem yonetiminin temel taslarindan biridir. Guvenlik kontrollerinde, deployment scriptlerinde, troubleshooting sureclerinde ve otomasyonda surekli isinize yarayacak. Scriptlerine entegre et, loglarina ekle ve her yeni sunucuya baglandiginda ilk reflekslerinden biri haline getir.
