Debian Paketi Düzenleme ve Sıfırdan Basit Bir Debian Paketi Oluşturma

Mahmut Gür
7 min readJan 11, 2021

Debian paketleri, Debian dağıtım ailesine mensup Linux dağıtımları tarafından cihazımızda değişiklikler yapmamızı sağlayan paketlerdir.

Bu anlatımı her Linux kullanıcısının iyi bildiği wget paketi üzerinden yapacağım. Sizlerin de bu gösterdiğim adımları kendi ortamınızda farklı paketlerde denemenizi şiddetle tavsiye ederim.

Öncelikle Debian paketinin yapısından bahsetmek isterim. Debian paketleri sıkıştırılmış binary paketlerdir. Eğer strings yada cat gibi araçlar ile bu dosyayı açmaya çalışırsak bunu net bir şekilde görebiliriz.

Eğer bir Debian paketini ayrıştırırsak içerisinde 3 adet dosya buluruz. Bu dosyalar control.tar.xz , data.tar.xz ve debian-binary dosyalarıdır.

  • debian-binary: Bu dosyanın içerisinde, binary formatının versiyon bilgisi bulunur.
  • control.tar.xz: Bu dosyanın içerisinde metadata bulunur. Paketin dependencies ve architecture bilgileri gibi tüm bilgiler bu dosya içerisindedir. Bunlara ek olarak yükleme öncesi ve sonrasında çalıştırılacak scriptler gibi bir çok şey de bu dosya içerisinde tutulur.
  • data.tar.xz: Bu dosya kurulum esnasında cihazımıza çıkartılacak dosyadır. İçerisindeki tüm dosyalar, sistemdeki aynı yollara çıkartılır.
Debian paket içeriği

control dosyasına biraz değinmek istiyorum. Çünkü temel tüm bilgiler bu dosyanın içerisindedir. Aşağıda ekran görüntüsünü bıraktığım dosya içerisindeki önemli gördüğüm başlıklara değinmek istiyorum.

Package: Paket adı
Version: Paket versiyonu
Architecture: Desteklenen mimari
Maintainer: Geliştirici bilgisi
Installed-Size: Toplam kaplayacağı alan
Depends: Bağımlılıklar. Yüklenen paketin düzgün çalışabilmesi için gerekli olan paketler ve versiyon bilgileri.
Recommends: Önerilen paketler
Description: Pakete dair açıklama

Bu kısıma kadar aktardığım bilgiler paket içerisinde önemli gördüğüm noktalardı. Bu kısımdan sonra değineceğim konu paket içerisinde düzenleme yapmak olacak.

Eğer “apt-get install wget” komutunu kullanırsak wget paketinin sistemimize yükleneceğini biliyoruz. Eğer biz paketi yüklemeden üzerinde değişiklik yapmak istiyorsak .deb dosyasını cihazımıza indirmemiz ve ayrıştırmamız gerekir. Paketi indirmemiz için ihtiyacımız olan komut “apt-get download wget” komutudur.

Şimdi geldik bu dosyayı ayrıştırmaya. Paketi ayrıştırmak için birden çok yöntem var fakat bunların bana göre en kullanışlısı olan dpkg ile ayrıştırmayı göstereceğim. “dpkg -x wget_1.19.4–1ubuntu2.2_amd64.deb ./wget” komutunu vererek bu paketin data dosyalarını, bulunduğumuz dizinde, wget isimli bir dizin oluşturup içine kopyalayabiliriz.

Yukarıdaki görselde göründüğü üzere paketimizin içerisinden cihazımızın / dizinine benzer bir yapı çıktı. Yani çok temel düzeyde bahsedecek olursak bu tree içerisinde gördüğümüz dosyalar, cihazımızdaki ilgili yerlere kopyalanacak ve paketimiz yüklenmiş olacak.

Paketimizin olduğu dizine gidip “dpkg -e wget_1.19.4–1ubuntu2.2_amd64.deb ./wget/DEBIAN” komutunu kullanırsak, data dosyasını çıkarttığımız paketin control dosyasını da DEBIAN dizinine çıkartmış oluruz. Bir önceki komutta oluşturulacak wget ismine ben karar verdim fakat buradaki DEBIAN ismi gerekliliktir. Çünkü düzenleme yaptıktan sonra geri paketleyeceğimiz zaman control dosyasını DEBIAN dizini içerisinde arayacak ve eğer bulamazsa işlem hata verecektir.

DEBIAN dizini içerisine control dosyasının çıkartılması

Şuan elimizde tam anlamı ile ayrıştırılmış bir Debian paketi mevcut. Peki bununla ne yapılabilir? Aslında herhangi bir şey yapılabilir. Çünkü iş bu noktaya geldikten sonra kontrol artık tamamen bizdedir. Örneğin paketin içerisine yeni scriptler yada çalıştırılabilir binary dosyalar eklenebilir. Yada dependencies değiştirilebilir. Mesela eski bir paketi sisteme kurmaya çalışırken bağımlılık sorunları sebebi ile kuramamıştım. Buna çözüm olarak programın düzgün çalışmaması pahasına bulamadığım paketleri depends listesinden çıkartarak kurulumu tamamlayabildim. Bu kesinlikle önerdiğim bir yol değil fakat çok gerekli olduğu durumlarda işe yarayabilen bir yol.

Öncelikle cihazımdan wget paketini sildim. İçini açtığım bu dosya içerisine bir adet bash script dosyası bir adet de compile edilmiş c dosyası koymak istiyorum.

Yukarıda görüldüğü üzere basit birer bash ve C kodu yazdım. Ardından C kodunu derledim ve çalıştırılabilir olan dosyaları paketin içerisinde usr/bin dizinine kopyaladım. Artık bu dosyalar paket yüklenirken, yüklendiği sistemin /usr/bin dizinine gidecek.

Sadece data kısmında değil control kısmında da değişiklik yapabiliriz. Örneğin ben bu pakete yükleme öncesi ve yüklemeden sonra çalışacak scriptler eklemek istiyorum. Basitçe yazacağım scriptler /var/log altında bir dosya oluştursun ve dosya içerisine yazı yazsın.

Normalde yaptığımız değişiklikleri paket içerisindeki changelog dosyasına eklememiz gerekirdi fakat bu yazıda bundan bahsetmeyeceğim. Daha sonra yazmayı planladığım yazıda farklı bir yöntem ile paket oluştururken bu konuya değineceğim.

Paketimizin son hali aşağıdaki gibidir;

Şimdi sıra geldi bu paketi tekrar derleme kısmına. “dpkg -b wget new_wget.deb” komutunu girerek wget dizini içerisindeki dosyaları new_wget.deb isminde bir dosyanın içerisine derleyebiliriz.

Yukarıda gördüğümüz gibi paketi derledik ve yeni paket oluşturduk. Şimdi sıra geldi oluşturduğumuz yeni paketi yüklemeye. “dpkg -i new_wget.deb” komutunu girerek paketimizi yükleyebiliriz. Paketi yükledikten sonra, paket içine eklediğimiz ek komutları da test edebiliriz.

Gördüğümüz gibi paketimiz yüklendi ve eklediğimiz dosyalar düzgün bir şekilde çalışıyor. Şimdi bir de yazmasını istediğimiz log kayıtlarına bakmak için /var/log altına gidelim.

Yukarıda görebileceğimiz üzere önce preinst sonra postinst scriptleri başarılı bir şekilde çalışmış ve cihazımıza log basmış.

Şimdiye kadar anlattıklarımı toparlayacak olursak uyguladığımız adımlar şu şekilde;

1- “apt-get download wget” komutu ile paketi indirdik.
2- “dpkg -x wget_1.19.4–1ubuntu2.2_amd64.deb ./wget” komutu ile data.tar.xz dosyasını wget isimli dizine çıkarttık.
3- “dpkg -e wget_1.19.4–1ubuntu2.2_amd64.deb ./wget/DEBIAN” komutu ile control.tar.xz dosyasını wget/DEBIAN isimli dizine çıkarttık.
4- Paket içerisinde istediğimiz değişiklikleri yaptık.
5- “dpkg -b wget new_wget.deb” komutu ile new_wget.deb içerisinde değiştirilmiş halini derledik.

Bu kısıma kadar bahsettiğim bilgiler var olan paketleri üzerineydi. Buradan sonraki bilgiler sıfırdan basit bir Debian paketinin nasıl oluşturulacağı ile ilgili olacak.

Aslında bu kısımda anlatacaklarım, bir önceki kısımda anlattıklarımdan çok farklı olmayacak. Çünkü temel olarak yapacağımız şey ayrıştırdığımız paketi el ile oluşturmak olacak. Bu sebeple yukarıdakilerden biraz daha farklılaştırmak adına sisteme bir crontab kuralı ekleyeceğim.

Öncelikle “mkdir deb_paketi” komutu ile deb_paketi adında bir dizin oluşturuyorum. Daha sonra “mkdir -p deb_paketi/usr/bin”, “mkdir deb_paketi/tmp” ve “mkdir deb_paketi/DEBIAN” komutlarını girerek ihtiyacım olan dizinleri oluşturuyorum.

Öncelikle crontabın çalıştıracağı scripti hazırlayıp usr/bin altına atacağım. Bu script epoch time’ı alıp /var/log/paket_deneme.log içerisine yazacak.

Daha sonra crontaba ekleyeceğim kuralı içeren dosyayı tmp altına oluşturuyorum. Bunu bu şekilde yapmamın sebebi, eğer direkt /etc altında crontab olarak oluşturursam, daha önceden var olan dosyanın yerine kendisini kopyalayacak olması. Bunun olmasını istemediğimden tmp altına kopyalayacağım ve postinst scripti ile dosya içerisindeki veriyi crontaba satır olarak ekleyeceğim.

Şimdi control DEBIAN dizini içerisinde control, md5sums ve postinst dosyalarını oluşturmaya sıra geldi. Bunun için DEBIAN dizinine gidip “touch control md5sums postinst” komutunu giriyorum ve postinst dosyasını çalıştırılabilir hale getiriyorum.

DEBIAN dizinindeyken “echo “$(md5sum ~/deb_paketi/tmp/crontab | awk ‘{ print $1 }’) /tmp/crontab” >> md5sums” ve “echo “$(md5sum ~/deb_paketi/usr/bin/paket_test | awk ‘{ print $1 }’) /usr/bin/paket_test” >> md5sums” komutları ile md5 ile hashleyip verileri dosya içine yazıyorum.

control dosyasını düzenlemek için aşağıdaki komutları kullandım.

echo “Package: testpac

” >> control
echo “Version: 1.0.0” >> control
size=$(du -s ~/deb_paketi/ | awk ‘{ print $1 }’ )
echo “Installed-Size: $size” >> control
echo “Maintainer: Mahmut Gür <
a.mahmutgur@gmail.com>” >> control
echo “Depends: crontab” >> control
echo “Architecture: all” >> control
echo “Description: Dakika başı /var/log/paket_test dosyası içerisine epoch time yazılmasını sağlayacak örnek paket.” >> control

Son olarak dosya içerisindeki crontab kuralını cihazımıza ekleyecek postinst scriptini yazıyorum.

Sıra paketi derlemeye geldi ama küçük bir sorun var.

Yukarıda görüldüğü üzere paket adını deb_paketi yaptığım için hata verdi. Bu hatanın çözümü olarak control dosyasından paket adını belirtilen kurallara uygun bir şekilde düzenledim ve nihayetinde paket derlenmiş oldu.

Şimdi oluşturduğumuz paketi sisteme yükleyerek test ederim. “dpkg -i newpac.deb” komutu ile paketi yüklüyorum. Daha doğrusu yükleyemiyorum. Çünkü depends kısmına cron yerine crontab yazdım ve yükleme esnasında dependencies hatası ile karşılaştım.

Şimdi yapmam gereken şey tekrar control dosyasını düzenlemek, ardından paketi tekrar derleyip yüklemek.

Yukarıda görülebileceği üzere gerekli düzenleme yapıldıktan sonra paket başarı ile kuruldu. Bu aşamadan sonra yapılan işlemin düzgün çalışıp çalışmadını görmek için bir süre bekliyorum ve yaklaşık 5 dakika sonra /var/log/paket_deneme.log dosyasını kontrol ediyorum.

Yukarıdaki görselden de görebileceğimiz üzere hazırladığımız paket düzgün bir şekilde çalışıyor.

Anlamadığınız yada hata ile karşılaştığınız yerleri mail yolu ile sorabilirsiniz.

Yazımı okuduğunuz için teşekkür ederim.

Yazılarımın tamamı için https://pumburo.github.io/ sitesindeki blog ve projeler kısımlarını inceleyebilirsiniz.

--

--