Cpio Komutu ile Arşiv Oluşturma ve RPM Paketlerini İnceleme

Sistem yöneticiliğinin “görünmez kahramanları” arasında cpio her zaman özel bir yere sahip olmuştur benim için. Tar kadar popüler değil, zip kadar bilinmiyor, ama bazı işler söz konusu olduğunda bu ikisinin de yapamayacağı şeyleri sessiz sedasız hallediyor. Özellikle RPM paketlerinin içini didik didik etmek gerektiğinde, ya da eski bir yedek sistemini anlamaya çalışırken, cpio tam da ihtiyacınız olan araç olarak karşınıza çıkıyor.

Bu yazıda cpio komutunu hem kendi başına bir arşiv aracı olarak hem de RPM paketleriyle birlikte nasıl kullanabileceğinizi ele alacağım. Teorik dokümantasyon değil, sahada işe yarayan bilgiler bunlar.

cpio Nedir ve Ne Zaman Kullanılır?

cpio (copy in/out) Unix dünyasında oldukça köklü bir geçmişe sahip. İsminden de anlaşılacağı üzere temel mantığı dosyaları arşive kopyalamak veya arşivden dışarı çıkarmak üzerine kurulu. Tar’dan farklı olarak cpio, dosya listesini standart girdiden alıyor ve bunu büyük bir esneklik sağlıyor.

Peki gerçek hayatta ne zaman cpio‘ya ihtiyaç duyuyorsunuz?

  • RPM paketlerinin içeriğini binary düzeyde incelemeniz gerektiğinde
  • initramfs/initrd imajlarını açıp değiştirmeniz gerektiğinde
  • Belirli kriterlere göre filtrelenmiş dosyaları arşivlemek istediğinizde
  • Eski SystemV tarzı yedek sistemleriyle çalışmanız gerektiğinde
  • Büyük bir dizin ağacını özelleştirilmiş bir seçimle kopyalamanız gerektiğinde

Temel Kullanım Modları

cpio üç temel modda çalışır ve bunları karıştırmamak önemli:

Copy-out modu (-o veya –create): Dosyaları arşiv oluşturmak için kullanır. Dosya listesi stdin’den gelir.

Copy-in modu (-i veya –extract): Arşivden dosyaları çıkarır. Arşiv stdin’den okunur.

Copy-pass modu (-p veya –pass-through): Dosyaları bir dizinden diğerine kopyalar, aşağıda ayrıca değineceğim.

İlk Arşivinizi Oluşturmak

En basit kullanım senaryosuyla başlayalım:

# Mevcut dizindeki tüm dosyaları arşivle
find . -type f | cpio -ov > yedek.cpio

# Belirli uzantıdaki dosyaları arşivle
find /var/log -name "*.log" | cpio -ov > loglar.cpio

# Dizin yapısıyla birlikte arşivle
find /etc/nginx -depth | cpio -ov > nginx_konfig.cpio

Buradaki -v parametresi işlenen dosyaları ekrana basar, -o ise create modunu aktif eder. find çıktısını pipe ile cpio‘ya iletmek standart kullanım kalıbı.

Arşivden Dosyaları Çıkarmak

# Arşivi mevcut dizine çıkar
cpio -iv < yedek.cpio

# Belirli bir dizine çıkar
cpio -iv --no-absolute-filenames -D /tmp/geri_yukleme < yedek.cpio

# Sadece belirli dosyaları çıkar (pattern kullanarak)
cpio -iv "*.conf" < yedek.cpio

# Çıkarmadan önce içeriği listele
cpio -itv < yedek.cpio

-t parametresi arşiv içeriğini listelemek için kullanılır, --no-absolute-filenames ise mutlak path içeren arşivleri güvenli şekilde açmak için kritik bir parametre. Bunu atlarsanız ve arşivde /etc/passwd gibi bir dosya varsa, sistem dosyanızın üzerine yazabilir.

Sıkıştırmayla Birlikte Kullanmak

cpio tek başına sıkıştırma yapmaz ama bunu sorun haline getirmemek için pipe kullanıyoruz:

# gzip ile sıkıştırılmış arşiv oluştur
find /home/mehmet -depth | cpio -ov | gzip > mehmet_yedek.cpio.gz

# bzip2 ile sıkıştır
find /opt/uygulama -depth | cpio -ov | bzip2 > uygulama.cpio.bz2

# xz ile sıkıştır (en yüksek sıkıştırma oranı)
find /var/www -depth | cpio -ov | xz -9 > web_yedek.cpio.xz

# Sıkıştırılmış arşivi aç
gunzip -c mehmet_yedek.cpio.gz | cpio -idv

Pratikte xz kullanımı disk alanı kısıtlı ortamlarda fark yaratıyor. Web sunucusu yedeklerinde bu kombinasyonla %60-70 oranında alan tasarrufu sağladığım oldu.

Copy-Pass Modu: Tar’dan Daha İyi Bir Kopyalama Yöntemi

Bu modu çoğu kişi görmezden gelir ama son derece kullanışlı. Sembolik linkleri, izinleri ve sahiplik bilgilerini koruyarak dosyaları bir yerden bir yere kopyalar:

# Dizini kopyala (rsync alternatifi olarak)
find /var/www/html -depth | cpio -pvd /backup/www_html

# Hard linkleri koruyarak kopyala
find /etc -depth | cpio -pvld /mnt/yedek/etc

# Sadece son 24 saatte değişen dosyaları kopyala
find /var/log -newer /tmp/referans_dosya | cpio -pvd /backup/gunluk_loglar

-l parametresi mümkün olduğunda hard link oluşturur, bu da büyük dosya topluluklarını kopyalarken ciddi bir hız ve alan avantajı sağlar.

RPM Paketlerini cpio ile İncelemek

İşte cpio‘nun gerçekten parladığı alan burası. RPM paketi aslında bir header bölümü ile bir cpio arşivinin birleşimi. Bu yapıyı anlamak, paket yönetiminde size büyük bir esneklik kazandırır.

rpm2cpio: Köprü Aracı

rpm2cpio komutu bir RPM dosyasını cpio arşivine dönüştürür. Bu ikili birlikte kullanmak standart bir teknik:

# RPM paketinin içeriğini listele
rpm2cpio nginx-1.24.0-1.el9.x86_64.rpm | cpio -itv

# Paketi mevcut dizine çıkar
rpm2cpio nginx-1.24.0-1.el9.x86_64.rpm | cpio -idv

# Belirli bir dizine çıkar
rpm2cpio nginx-1.24.0-1.el9.x86_64.rpm | cpio -idv --no-absolute-filenames -D /tmp/rpm_inceleme

Bu teknikleri ne zaman kullanıyorum? Birkaç gerçek senaryo:

Senaryo 1: Üretim sunucusunda yanlışlıkla silinen bir konfigürasyon dosyasını kurtarmak. rpm veritabanı bozulmuş ya da rpm -V çalışmıyor. Paketi indirip rpm2cpio ile dosyayı çıkarıyorsunuz.

Senaryo 2: Güvenlik incelemesi. Bir paketin tam olarak hangi dosyaları kurduğunu, bunların izinlerini ve sahiplik bilgilerini paket kurulmadan önce incelemek istiyorsunuz.

Senaryo 3: Paket yöneticisi olmayan bir sisteme (container imajı, kısıtlı ortam) dosya kurmak gerekiyor.

Pratik RPM İnceleme Örnekleri

# Paketi indirip inceleme (kurulum yapmadan)
dnf download httpd
rpm2cpio httpd-*.rpm | cpio -itv 2>/dev/null | head -50

# Sadece konfigürasyon dosyalarını listele
rpm2cpio httpd-*.rpm | cpio -itv 2>/dev/null | grep "etc/"

# Paketten tek bir dosyayı çıkar
rpm2cpio httpd-*.rpm | cpio -idv --no-absolute-filenames ./etc/httpd/conf/httpd.conf

# Binary dosyaları kontrol et
rpm2cpio uygulama.rpm | cpio -itv | grep "usr/bin"

initramfs ile Çalışmak

Bu konu ayrı bir yazı gerektirecek kadar derin ama cpio bağlamında mutlaka değinmek gerekiyor. Modern Linux sistemlerinde initramfs imajı aslında bir cpio arşivi:

# initramfs içeriğini incele
# Önce sıkıştırma formatını tespit et
file /boot/initramfs-$(uname -r).img

# Eğer gzip sıkıştırmalıysa
cp /boot/initramfs-$(uname -r).img /tmp/initramfs_inceleme.img
cd /tmp && mkdir initramfs_icerik
cd initramfs_icerik
zcat /tmp/initramfs_inceleme.img | cpio -idv

# Bazı sistemlerde birden fazla cpio bölümü olabilir
# İlk bölümü atlamak için offset bulmak gerekir

Kernel boot sorunlarında bu teknik hayat kurtarıcı. Bir keresinde bir sunucuda özel bir kernel modülünün initramfs’e dahil edilmediği sorununu tam olarak bu yöntemle tespit ettik. Arşiv içeriğine baktığımızda modül dosyasının orada olmadığı hemen görünüyordu.

İleri Düzey cpio Kullanımı

Dosya Filtreleme ve Seçici Arşivleme

# Belirli sahibe ait dosyaları arşivle
find /var -user www-data | cpio -ov > www_dosyalar.cpio

# Belirli boyutun üzerindeki dosyaları hariç tut
find /home -type f -not -size +100M | cpio -ov > home_yedek.cpio

# İzin bazlı filtreleme
find /tmp -perm -o+w -type f | cpio -ov > dunya_yazilabilir.cpio

# Sembolik linkleri dahil et
find /etc -follow -type f -name "*.conf" | cpio -ov > conf_yedek.cpio

Arşiv Formatlarını Belirtmek

cpio birden fazla arşiv formatını destekler. Varsayılan format bin (eski ikili format) ama modern kullanımda farklı formatlar tercih edilir:

# newc formatı (SVR4, modern sistemlerde önerilen)
find . | cpio -ov --format=newc > arsiv.cpio

# crc formatı (checksum içerir, daha güvenilir)
find . | cpio -ov --format=crc > arsiv_crc.cpio

# odc formatı (POSIX uyumlu)
find . | cpio -ov --format=odc > arsiv_odc.cpio

# Arşiv formatını sorgula
cpio --list-formats 2>/dev/null || cpio --help 2>&1 | grep format

newc formatını özellikle Linux kernel initramfs’leri ve RPM paketleri için standart haline gelmiştir. Farklı sistemler arasında taşınabilirlik söz konusuysa bu formatı tercih edin.

Hata Yönetimi ve Güvenilir Arşivleme

Büyük arşivleme işlemlerinde hata yönetimi kritik:

# Hataları ayrı bir dosyaya logla
find /data -depth 2>/dev/null | cpio -ov 2>hata_log.txt > yedek.cpio

# İşlem sonunda hata kontrolü
if [ ${PIPESTATUS[1]} -ne 0 ]; then
    echo "cpio arşivleme başarısız!"
    cat hata_log.txt
    exit 1
fi

# MD5 hash ile bütünlük kontrolü
find /kritik_veri -depth | cpio -ov > kritik_yedek.cpio
md5sum kritik_yedek.cpio > kritik_yedek.cpio.md5

# Sonradan kontrol
md5sum -c kritik_yedek.cpio.md5

Gerçek Dünya Senaryoları

Senaryo: Çoklu Sunucuya Dağıtım

Bir uygulamanın konfigürasyon dosyalarını 20 sunucuya dağıtmanız gerekiyor. Herbiri için ayrı ayrı scp kullanmak yerine:

# Konfigürasyonları paketle
find /etc/uygulama -depth | cpio -ov | gzip > uygulama_konfig.tar.gz

# Sunuculara dağıt ve aç
for sunucu in sunucu{01..20}.sirket.com; do
    echo "=== $sunucu ==="
    cat uygulama_konfig.tar.gz | ssh $sunucu 
        "cd / && gunzip -c | cpio -idv --no-absolute-filenames"
done

Senaryo: Bozuk RPM Veritabanı Sonrası Kurtarma

RPM veritabanı bozulmuş, rpm komutları çalışmıyor:

# Kurulu olduğunu bildiğimiz paketin dosyalarını yeniden kur
# Önce paketi cache'ten bul veya indir
ls /var/cache/dnf/*/packages/postgresql*.rpm 2>/dev/null || dnf download postgresql

# Paketi kur (veritabanını bypass ederek)
rpm2cpio postgresql-15.3-1.el9.x86_64.rpm | 
    cpio -idv --no-absolute-filenames -D /

# RPM veritabanını yeniden oluştur
rpm --rebuilddb

Senaryo: Güvenlik Denetimi için Paket İçeriği Analizi

Güvenlik ekibine belirli bir pakette hangi setuid dosyaların bulunduğunu raporlamanız gerekiyor:

# Paketi geçici dizine çıkar
mkdir /tmp/paket_analiz
rpm2cpio hedef_paket.rpm | cpio -idv --no-absolute-filenames -D /tmp/paket_analiz

# Setuid/setgid dosyaları bul
find /tmp/paket_analiz -perm /6000 -type f -ls

# World-writable dosyaları bul
find /tmp/paket_analiz -perm -o+w -type f

# Temizlik
rm -rf /tmp/paket_analiz

Önemli Parametreler ve Seçenekler

cpio komutunun en çok kullanılan parametrelerini derledim:

-o, –create: Arşiv oluşturma modunu aktive eder.

-i, –extract: Arşivden çıkarma modunu aktive eder.

-p, –pass-through: Dosyaları doğrudan kopyalama modunu aktive eder.

-v, –verbose: İşlenen dosyaları ekrana yazar.

-t, –list: Arşiv içeriğini listeler, çıkarma yapmaz.

-d, –make-directories: Gerekli dizinleri otomatik oluşturur.

-u, –unconditional: Mevcut dosyaların üzerine koşulsuz yazar.

-l, –link: Mümkün olduğunda hard link kullanır.

–no-absolute-filenames: Mutlak pathleri göreli path olarak işler.

–format=FORMAT: Arşiv formatını belirtir (newc, crc, odc, bin, ustar).

-D DIZIN: Çalışma dizinini belirtir.

-F DOSYA: Stdin/stdout yerine belirtilen dosyayı kullanır.

–only-verify-crc: Arşivi çıkarmadan CRC kontrolü yapar.

-n, –numeric-uid-gid: Kullanıcı/grup ismi yerine sayısal ID gösterir.

cpio ile Tar Karşılaştırması

Birinin diğerinden “daha iyi” olduğunu söylemek doğru olmaz, senaryoya göre doğru aracı seçmek önemli:

  • Standart yedekleme işlemleri için: tar daha pratik, tek komutla dizin alınabiliyor.
  • Seçici dosya listeleme gerektiren durumlar için: find | cpio kombinasyonu çok daha esnek.
  • RPM ve initramfs işlemleri için: cpio zorunlu, alternatif yok.
  • Çok büyük dosya sayıları için: cpio‘nun incremental find ile kombinasyonu avantajlı olabiliyor.
  • Çapraz platform uyumluluğu için: tar daha yaygın destekleniyor.

Pratikte ikisini bilmek ve hangisinin hangi işe daha uygun olduğunu kavramak yeterli. Ben genellikle tar‘ı rutin yedekler için, cpio‘yu ise paket işlemleri ve özelleştirilmiş seçimler gerektiren durumlar için kullanıyorum.

Sonuç

cpio, sistem yöneticisinin alet çantasında “her zaman lazım olmaz ama lazım olduğunda vazgeçilmezdir” kategorisinde yer alan araçlardan biri. Özellikle RPM tabanlı sistemlerde rpm2cpio kombinasyonu paketleri kurulmadan incelemek, bozuk dosyaları kurtarmak ve güvenlik denetimleri yapmak için standart bir teknik haline gelmeli.

initramfs işlemleri söz konusu olduğunda ise cpio bilgisi artık opsiyonel değil, zorunlu. Kernel boot sorunlarıyla uğraşan her sistem yöneticisinin bu aracı ve çalışma mantığını kavraması gerekiyor.

find komutuyla kombinasyonu ise tar’ın yapamayacağı türde özelleştirilmiş arşivleme senaryolarını mümkün kılıyor. Bir kez alışkınlık kazandığınızda bu ikiliyi düzenli olarak kullandığınızı göreceksiniz.

Son olarak şunu söyleyeyim: cpio‘yu gerçekten öğrenmek istiyorsanız, bir sonraki RPM paket incelemenizde rpm -ql yerine rpm2cpio ve cpio -itv kombinasyonunu kullanın. İkisi aynı sonucu verir ama biri sizi perde arkasında neler döndüğünü anlamaya bir adım daha yaklaştırır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir