Memvisualisasikan dependensi paket Ubuntu

Sebelum ngerjain tesis, mari kita pemanasan dulu =P

Gambar di atas adalah cuplikan dari aplikasi kecil yang memvisualisasikan dependensi paket-paket di Ubuntu Intrepid Ibex (mudah2an sih ngga salah menyusun data dependensinya =P) Dibuat pake Java dengan bantuan Prefuse.

Kalau mau nyoba2, silakan donlod aplikasinya lalu coba2 masukkan sebuah nama paket. Kalau udah muncul di layar, klik nama paketnya supaya paket-paket lain yg terhubung ikutan muncul.

  1. Download

    $ wget http://labs.fajran.web.id/p/ubuntu-pkg-vis/ubuntu-pkg-vis-0.1.tar.bz2
    
  2. Extract

    $ tar xjf ubuntu-pkg-vis-0.1.tar.bz2
    
  3. Jalankan

    $ cd p
    $ java -Xmx512M -cp .:prefuse.jar id/web/fajran/vis/ubuntupkg/Main orig/
    

Yayaya.. memang sangat berat! Seluruh data paket dibaca dan masuk ke memory. Selain itu, proses layouting dg Force Directed Layout emang berat, apalagi kalau datanya banyak. Walau sebenarnya diharapkan untuk tidak terlalu berat2 amat berhubung tidak seluruh data ditampilkan. Namun sepertinya Prefuse masih bermasalah dalam hanya-mengutak-atik-data-yang-tampil-saja.

Kalau mau pake subset-tidak-lengkap data yang lebih kecil, coba ganti orig/ menjadi small/

$ java -Xmx512M -cp .:prefuse.jar id/web/fajran/vis/ubuntupkg/Main small/

Contoh paket yang lumayan dapat dilihat dalam data kecil ini adalah pinot, jadi coba cari paket tsb.

Source code? err.. berhubung aplikasi ini beneran tuk icip2 Prefuse, saya gak nyimpen source code nya xD ada sih, tapi udah babak belur di sana sini. Nanti aja kalo saya udah gapé pake Prefuse, saya bikin lagi aja yg baru =P

Susunan repository, hardlink, dan mirroring

Pada repositori Ubuntu, ada direktori pool/ yang berisi seluruh berkas yang ada, mulai dari berkas paket deb, kode sumber orig.tar.gz, modifikasi tuk membuat paket diff.gz, dan lain-lain. Berkas-berkas ini ditujuk dari daftar isi yang ada pada berkas Packages dan Sources yang ada di bawah direktori dists/. Sebuah berkas, tentu saja bisa ditunjuk oleh lebih dari satu daftar isi, yang melambangkan versi dan arsitektur berbeda. Kalau ada berkas yang dipakai bersama, bisa lebih hemat tempat bukan?

Lain distro, lain pula teknik yang dipakai tuk menyusun repositori. Coba lihat repositori Fedora. Berkas-berkas paket, selain dapat ditemukan di bawah direktori Everything/, dapat juga ditemukan di bawah direktori Fedora/. Kalau dilihat sekilas, banyak duplikasi berkas di sana yang tentu saja kalau tidak diatur dengan baik, hanya membuang kapasitas harddisk. Dengan kata lain, tidak efisien!

Susunan repositori Fedora yang dibuat seperti itu belum tentu tidak memiliki maksud tertentu. Berhubung saya tidak familiar dengan Fedora termasuk repositorinya, saya hanya dapat menduga-duga saja. Total ukuran berkas paket di bawah direktori Fedora/ untuk i386 adalah sekitar 2.9 GB. Sedangkan total ukuran berkas di bawah direktori Everything/ adalah sekitar 12.6 GB. Sungguh perbedaan ukuran yang sangat besar bukan? Saya duga, paket yang ada di bawah direktori Fedora/ adalah paket-paket “pilihan” sedangkan yang ada di bawah direktori Everything/, sesuai namanya, adalah seluruh paket yang ada.

Penyusunan direktori seperti ini sebenarnya mempermudah urusan mirroring. Aplikasi rsync yang dapat digunakan untuk menyalin berkas “mentah-mentah” sudah bisa digunakan untuk membuat mirror sebuah repositori Fedora secara selektif, yaitu hanya repositori untuk versi dan arsitektur tertentu saja. Berbeda dengan menyalin repositori Ubuntu yang harus menggunakan aplikasi tambahan seperti debmirror jika ingin menyalin secara selektif.

Lalu bagaimana caranya agar tetap bisa mengatur susunan repositori seperti Fedora dan tetap bisa menjaga efisiensi penggunaan harddisk seperti Ubuntu? Pembuatan hardlink bisa menjadi jawaban! Dengan menggunakan hardlink, sebuah berkas dapat dibuat “salinannya” di tempat lain tanpa harus mengorbankan kapasitas harddisk karena berkas-berkas tersebut sebenarnya adalah berkas yang sama. Yaaa.. mirip pointer pada bahasa C yang menunjuk ke alamat memori yang sama. Dan, … repositori Fedora menggunakan cara ini! Berkas yang ada di bawah direktori Fedora/ merupakan hardlink ke berkas yang ada di bawah direktori Everything/ (atau sebaliknya? ah sama saja 🙂

Nah.. bagi para pemelihara mirror yang menggunakan rsync, untungnya rsync cukup cerdas untuk membaca informasi link ini. Berkas berbeda yang sebenarnya sama karena penggunaan hardlink ini dapat dideteksi sehingga sang mirror tidak perlu menyalin berkas yang sama lebih dari satu kali dan rsync akan membuatkan hardlink-nya secara otomatis. Hemat bandwidth, hemat waktu, dan tentu saja hemat tempat!

Caranya cukup dengan menambahkan opsi -H pada saat menjalankan rsync.

$ rsync -avH server::modul/ /tujuan/

Sekian dulu, nanti terlalu panjang =P

Kompilasi ZFS-Fuse di Ubuntu

ZFS juga sudah bisa dinikmati di Linux walau mungkin blom selengkap, sehandal, dan sestabil yg ada di OpenSolaris. Karena satu dan lain hal, implementasi di Linux dibuat di atas FUSE yang bisa saja mengorbankan kinerja.

  • Donlod ZFS-Fuse versi terakhir, 0.5.0.

  • Instal paket2 yang dibutuhkan.

    $ sudo apt-get install libaio1 libaio-dev zlib1g-dev libfuse-dev 
      scons build-essential
  • Extrak, masuk ke direktori src dan lakukan kompilasi.

    $ tar xjf zfs-fuse-0.5.0.tar.bz2
    $ cd zfs-fuse-0.5.0/src
    $ scons

    Andai gak bisa dikompilasi karena error berikut, ubah isi berkas SConstruct dan hapus -Werror dari CCFLAGS.

    cc1: warnings being treated as errors
    cmd/zdb/zdb.c: In function 'zdb_dump_block_raw':
    cmd/zdb/zdb.c:2007: error: ignoring return value of 'write', declared with attribute warn_unused_result
    scons: *** [cmd/zdb/zdb.o] Error 1
    scons: building terminated because of errors.

    Hapus -Werror dari CCFLAGS.

    $ vi SConstruct
    ...
    env['CCFLAGS'] = Split('-pipe -Wall -std=c99 -Wno-switch ...
    ...

    lalu ulangi kompilasi dg scons.

    Tadi nyoba juga ngompile di Debian Lenny Belum Jadi edisi amd64, ngga ada masalah kaya gtu soale.

  • Setelah kompilasi selesai, instal ZFS Fuse. Misalnya di /usr/local

    $ sudo scons install install_dir=/usr/local

Kalau sudah, yaa.. silakan dimainkan =D

Referensi tambahan: milis zfs-fuse