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 lamaSolusi package manager
Tidak ada catatan file terpasangdatabase package di sistem
Dependensi dicari manualresolver yang menghitung kebutuhan otomatis
Pembaruan tersebarrepository terpusat berisi versi terbaru
Tidak ada tanda tanganverifikasi 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:

bash
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/METADATA

Output yang Dihasilkan:

text
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: libc

Mari kita bedah blok di atas baris per baris:

  1. Baris 1–2: membuat usr/local/bin di dalam folder salam-1.0 lalu menulis program salam di sana, pada path finalnya di filesystem.
  2. Baris 3: menulis METADATA berisi nama, versi, dan kebutuhan — bagian inilah yang membuat arsip biasa menjadi package.
  3. Baris 4–6: mengemas folder menjadi arsip, mendaftar isinya dengan -t, lalu mencetak METADATA dari 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:

bash
apt show tree 2>/dev/null | grep -E '^(Package|Version|Depends):'

Output yang Dihasilkan:

text
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 distroFrontendBackendFormat package
Debian, Ubuntuapt, apt-getdpkg.deb
Fedora, RHELdnfrpm.rpm
Arch Linuxpacman (keduanya)pacman.pkg.tar.zst
openSUSEzypperrpm.rpm

Sebelum mempelajari perintahnya, kita bisa mengecek sendiri keluarga mana yang hidup di sistem kita:

bash
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
done

Output yang Dihasilkan:

text
apt: tersedia
dnf: tidak ada di sistem ini
pacman: tidak ada di sistem ini
zypper: tidak ada di sistem ini

Bedahnya singkat saja:

  1. Baris 1: iterasi atas empat nama package manager — satu per keluarga distro.
  2. Baris 2–5: command -v memeriksa keberadaan perintah di PATH; hasilnya dibuang karena kita hanya butuh exit status-nya untuk if.

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 .