Memasang software di Linux tidak seperti menjalankan setup.exe di Windows. Sebelum ada package manager, satu-satunya jalan adalah mengunduh source code, menjalankan ./configure, make, lalu make install — dan berdoa semua library yang dibutuhkan sudah ada. Chapter ini membongkar model yang menggantikan cara manual itu: package sebagai arsip file plus metadata, repository sebagai gudang bermeterai, dan resolver dependensi. Modelnya sama di semua distro; yang berbeda hanya nama perintahnya.
Dari make install ke Package Manager #
Cara lama memang berjalan, tetapi masalahnya menumpuk: make install menyalin file ke mana-mana tanpa catatan, dan mencari dependensi satu per satu dulu dijuluki dependency hell. Package manager menjawabnya dengan mekanisme berpasangan:
| Masalah cara lama | Solusi package manager |
|---|---|
| Tidak ada catatan file terpasang | database package di sistem |
| Dependensi dicari manual | resolver yang menghitung kebutuhan otomatis |
| Pembaruan tersebar | repository terpusat berisi versi terbaru |
| Tidak ada tanda tangan | verifikasi GPG pada indeks |
Package: Arsip File Plus Metadata #
Sebuah package adalah arsip berisi file pada posisi finalnya plus metadata yang menjelaskan isi arsip — bentuknya bisa kita tiru dengan tar:
mkdir -p salam-1.0/usr/local/bin
printf '#!/bin/sh\necho "Salam!"\n' > salam-1.0/usr/local/bin/salam
printf 'nama: salam\nversi: 1.0\nbutuh: libc\n' > salam-1.0/METADATA
tar -czf salam-1.0.tar.gz salam-1.0
tar -tzf salam-1.0.tar.gz
tar -xzf salam-1.0.tar.gz -O salam-1.0/METADATAOutput yang Dihasilkan:
salam-1.0/
salam-1.0/usr/
salam-1.0/usr/local/
salam-1.0/usr/local/bin/
salam-1.0/usr/local/bin/salam
salam-1.0/METADATA
nama: salam
versi: 1.0
butuh: libcMari kita bedah blok di atas baris per baris:
- Baris 1–2: membuat
usr/local/bindi dalam foldersalam-1.0lalu menulis programsalamdi sana, pada path finalnya di filesystem. - Baris 3: menulis
METADATAberisi nama, versi, dan kebutuhan — bagian inilah yang membuat arsip biasa menjadi package. - Baris 4–6: mengemas folder menjadi arsip, mendaftar isinya dengan
-t, lalu mencetakMETADATAdari dalam arsip dengan-O.
Package sungguhan seperti .deb dan .rpm memakai ide yang sama, hanya lebih rapi: metadata distandarkan dan ada script maintainer yang berjalan sebelum atau sesudah file disalin. Karena seluruh isi tercatat di database, uninstall tinggal membaca catatan itu.
Repository: Gudang Package Bermeterai #
Repository adalah server berisi kumpulan package plus indeksnya — daftar semua package beserta versi dan dependensinya; distro besar menyediakan banyak mirror berisi identik. Saat kita menjalankan apt update, yang diunduh hanyalah indeks itu, bukan ribuan packagenya.
Kepercayaan dijaga tanda tangan digital: indeks ditandatangi kunci GPG pengelola repository, dan kunci publiknya tersimpan di sistem sejak instalasi distro. Bila tanda tangan tidak cocok, package manager menolak memasang apa pun — mekanismenya didokumentasikan di apt-secure(8) untuk keluarga Debian.
Dependensi: Metadata yang Saling Terkait #
Dunia Linux memecah library menjadi package terpisah agar satu library bisa dipakai banyak program, jadi tiap package mengumumkan kebutuhannya di metadata — misalnya pada package tree di sistem Debian:
apt show tree 2>/dev/null | grep -E '^(Package|Version|Depends):'Output yang Dihasilkan:
Package: tree
Version: 2.2.1-1
Depends: libc6 (>= 2.38)Depends: libc6 (>= 2.38) menyatakan tree membutuhkan libc6 minimal versi 2.38. Saat kita meminta tree, resolver membaca metadata ini, mengecek apakah libc6 yang cocok sudah ada, dan bila belum menambahkannya ke daftar instalasi — lalu membaca metadata libc6 juga, dan seterusnya hingga tidak ada kebutuhan yang menggantung. Debian membedakan lagi Recommends dan Suggests; bedahnya kita lanjutkan di Chapter Package Dependencies.
Frontend dan Backend di Setiap Keluarga #
Semua distro besar membagi pekerjaan menjadi dua lapis: backend menginstal file package dan mengelola database lokal, sedangkan frontend membaca indeks repository, menyelesaikan dependensi, lalu memanggil backend. Pemetaannya per keluarga distro:
| Keluarga distro | Frontend | Backend | Format package |
|---|---|---|---|
| Debian, Ubuntu | apt, apt-get | dpkg | .deb |
| Fedora, RHEL | dnf | rpm | .rpm |
| Arch Linux | pacman (keduanya) | pacman | .pkg.tar.zst |
| openSUSE | zypper | rpm | .rpm |
Sebelum mempelajari perintahnya, kita bisa mengecek sendiri keluarga mana yang hidup di sistem kita:
for pm in apt dnf pacman zypper; do
if command -v "$pm" > /dev/null 2>&1; then
echo "$pm: tersedia"
else
echo "$pm: tidak ada di sistem ini"
fi
doneOutput yang Dihasilkan:
apt: tersedia
dnf: tidak ada di sistem ini
pacman: tidak ada di sistem ini
zypper: tidak ada di sistem iniBedahnya singkat saja:
- Baris 1: iterasi atas empat nama package manager — satu per keluarga distro.
- Baris 2–5:
command -vmemeriksa keberadaan perintah diPATH; hasilnya dibuang karena kita hanya butuh exit status-nya untukif.
Pada mesin tempat materi ini diuji hanya apt yang tersedia karena sistemnya Debian; di laptop ber-Fedora baris dnf yang tercetak tersedia.
flatpak dan snap di Sela-Sela #
Ada pendatang yang menyeberangi batas distro: flatpak dan snap. Keduanya memaketkan aplikasi beserta seluruh dependensinya dalam satu arsip besar dan menjalankannya dalam sandbox, sehingga aplikasi yang sama berjalan identik di distro mana pun. Harganya: ukuran download membengkak, pembaruan lepas dari channel sistem, dan akses file kadang perlu diatur manual. Untuk software inti sistem, package manager bawaan distro tetap pilihan utama.
Modelnya sudah utuh: package membawa metadata, repository membekalinya, resolver menutup dependensi. Tiga Chapter berikutnya mengajak kita memegang perintahnya — dimulai dari keluarga yang paling banyak dijumpai di server dan desktop: apt dan dpkg .