<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>Haidhi Wiki  - Recent changes [en]</title>
		<link>https://wiki.haidhi.my.id/wiki/index.php/Special:RecentChanges</link>
		<description>Track the most recent changes to the wiki in this feed.</description>
		<language>en</language>
		<generator>MediaWiki 1.43.0</generator>
		<lastBuildDate>Sun, 01 Nov 2026 21:41:43 GMT</lastBuildDate>
		<item>
			<title>Cara install OKD</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Cara_install_OKD&amp;diff=888&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Cara_install_OKD&amp;diff=888&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;OKD&amp;#039;&amp;#039;&amp;#039; adalah distribusi Kubernetes komunitas (upstream dari Red Hat OpenShift). Halaman ini mencatat langkah lengkap memasang &amp;#039;&amp;#039;&amp;#039;OKD Single Node (SNO)&amp;#039;&amp;#039;&amp;#039; sebagai satu VM di Proxmox VE, memakai &amp;#039;&amp;#039;&amp;#039;Agent-based Installer&amp;#039;&amp;#039;&amp;#039;, untuk keperluan cluster dev.   == Ringkasan == {| class=&amp;quot;wikitable&amp;quot; ! Item !! Nilai |- | Versi OKD || &amp;lt;code&amp;gt;5.0.0-okd-scos.3&amp;lt;/code&amp;gt; (stable) |- | OS node || CentOS Stream CoreOS (SCOS), ter-bake di ISO |- | Metode install || Agent-based Installer, t...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;OKD&amp;#039;&amp;#039;&amp;#039; adalah distribusi Kubernetes komunitas (upstream dari Red Hat OpenShift). Halaman ini mencatat langkah lengkap memasang &amp;#039;&amp;#039;&amp;#039;OKD Single Node (SNO)&amp;#039;&amp;#039;&amp;#039; sebagai satu VM di Proxmox VE, memakai &amp;#039;&amp;#039;&amp;#039;Agent-based Installer&amp;#039;&amp;#039;&amp;#039;, untuk keperluan cluster dev.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ringkasan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Item !! Nilai&lt;br /&gt;
|-&lt;br /&gt;
| Versi OKD || &amp;lt;code&amp;gt;5.0.0-okd-scos.3&amp;lt;/code&amp;gt; (stable)&lt;br /&gt;
|-&lt;br /&gt;
| OS node || CentOS Stream CoreOS (SCOS), ter-bake di ISO&lt;br /&gt;
|-&lt;br /&gt;
| Metode install || Agent-based Installer, topologi SNO&lt;br /&gt;
|-&lt;br /&gt;
| Hypervisor || Proxmox VE, standalone node &amp;lt;code&amp;gt;node-3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bridge jaringan || &amp;lt;code&amp;gt;vmbr3&amp;lt;/code&amp;gt; (LAB) → subnet &amp;lt;code&amp;gt;192.168.90.0/24&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Gateway || &amp;lt;code&amp;gt;192.168.90.1&amp;lt;/code&amp;gt; (MikroTik)&lt;br /&gt;
|-&lt;br /&gt;
| VM bastion (DNS) || &amp;lt;code&amp;gt;192.168.90.29&amp;lt;/code&amp;gt;, AlmaLinux, dnsmasq&lt;br /&gt;
|-&lt;br /&gt;
| VM OKD (node) || &amp;lt;code&amp;gt;192.168.90.30&amp;lt;/code&amp;gt;, hostname &amp;lt;code&amp;gt;okd-sno&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Cluster / base domain || &amp;lt;code&amp;gt;okd&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lab.local&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Mesin kerja || Arch Linux (edit config + generate ISO)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memilih topologi ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SNO (1 node)&amp;#039;&amp;#039;&amp;#039;: paling hemat resource, cocok untuk dev. Tidak ada HA, dan &amp;#039;&amp;#039;&amp;#039;tidak bisa&amp;#039;&amp;#039;&amp;#039; dikonversi ke cluster HA setelah terpasang.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Compact cluster (3 node)&amp;#039;&amp;#039;&amp;#039;: ketiga node jadi master sekaligus worker. Lebih mirip production, tetap punya quorum etcd.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2 node&amp;#039;&amp;#039;&amp;#039;: OKD punya topologi &amp;#039;&amp;#039;two-node with fencing&amp;#039;&amp;#039; (butuh BMC, tidak cocok untuk VM Proxmox) dan &amp;#039;&amp;#039;two control plane + arbiter&amp;#039;&amp;#039; (tetap 3 mesin, salah satunya arbiter kecil). Untuk lab, praktis pilih SNO atau 3 node.&lt;br /&gt;
&lt;br /&gt;
Dipilih &amp;#039;&amp;#039;&amp;#039;SNO&amp;#039;&amp;#039;&amp;#039; supaya resource host tetap lega untuk VM lain.&lt;br /&gt;
&lt;br /&gt;
== Arsitektur ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Arch Linux (laptop) ──WireGuard──► Proxmox (vmbr0, 192.168.11.x)&lt;br /&gt;
   │  generate ISO&lt;br /&gt;
   ▼&lt;br /&gt;
Proxmox vmbr3 (LAB, 192.168.90.0/24)&lt;br /&gt;
   ├── VM bastion  192.168.90.29  → dnsmasq (DNS cluster)&lt;br /&gt;
   └── VM OKD SNO  192.168.90.30  → seluruh cluster OKD&lt;br /&gt;
          ▲&lt;br /&gt;
   gateway MikroTik 192.168.90.1 → internet (quay.io)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kenapa butuh bastion di dalam vmbr3?&amp;#039;&amp;#039;&amp;#039; Host Proxmox tidak punya IP di &amp;lt;code&amp;gt;vmbr3&amp;lt;/code&amp;gt;, dan laptop berada di jaringan lain (lewat WireGuard). Node OKD harus bisa menjangkau DNS-nya, jadi DNS diletakkan di VM yang satu subnet dengan node.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bastion&amp;#039;&amp;#039;&amp;#039; hanyalah istilah untuk mesin pembantu yang mengurus cluster (tempat &amp;lt;code&amp;gt;oc&amp;lt;/code&amp;gt;, DNS, dsb.). DNS ini harus &amp;#039;&amp;#039;&amp;#039;tetap hidup selama cluster hidup&amp;#039;&amp;#039;&amp;#039;, bukan hanya saat install, karena node memakai nama &amp;lt;code&amp;gt;api-int&amp;lt;/code&amp;gt; untuk komunikasi internal.&lt;br /&gt;
&lt;br /&gt;
== Kebutuhan resource ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! VM !! vCPU !! RAM !! Disk&lt;br /&gt;
|-&lt;br /&gt;
| OKD SNO || 16 || 32 GB || 150 GB&lt;br /&gt;
|-&lt;br /&gt;
| Bastion (AlmaLinux minimal) || 1–2 || 1–2 GB || 10–20 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Catatan:&lt;br /&gt;
* Spesifikasi minimal SNO di dokumentasi sekitar 8 vCPU / 16 GB, tapi 32 GB lebih nyaman.&lt;br /&gt;
* Di Proxmox, pemakaian RAM VM OKD terlihat sekitar 27 GiB saat install. Angka itu termasuk page cache dan tanpa guest agent, jadi lebih besar dari pemakaian riil. Cek angka asli dengan &amp;lt;code&amp;gt;oc adm top node&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Langkah 1: Siapkan binary di mesin kerja ==&lt;br /&gt;
Binary diambil dari GitHub Releases proyek OKD: &amp;lt;code&amp;gt;https://github.com/okd-project/okd/releases&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Pilih rilis &amp;#039;&amp;#039;&amp;#039;stable&amp;#039;&amp;#039;&amp;#039; (tanpa label &amp;#039;&amp;#039;Pre-release&amp;#039;&amp;#039; dan tanpa &amp;lt;code&amp;gt;ec&amp;lt;/code&amp;gt; di namanya).&lt;br /&gt;
* Download &amp;lt;code&amp;gt;openshift-install-linux-&amp;amp;lt;tag&amp;amp;gt;.tar.gz&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;openshift-client-linux-&amp;amp;lt;tag&amp;amp;gt;.tar.gz&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
TAG=&amp;lt;tag-stable&amp;gt;&lt;br /&gt;
BASE=https://github.com/okd-project/okd/releases/download/$TAG&lt;br /&gt;
curl -LO $BASE/openshift-install-linux-$TAG.tar.gz&lt;br /&gt;
curl -LO $BASE/openshift-client-linux-$TAG.tar.gz&lt;br /&gt;
&lt;br /&gt;
tar xzf openshift-install-linux-$TAG.tar.gz openshift-install&lt;br /&gt;
tar xzf openshift-client-linux-$TAG.tar.gz oc kubectl&lt;br /&gt;
sudo mv openshift-install oc kubectl /usr/local/bin/&lt;br /&gt;
&lt;br /&gt;
openshift-install version&lt;br /&gt;
oc version --client&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penting:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;oc&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;wajib&amp;#039;&amp;#039;&amp;#039; ada di &amp;lt;code&amp;gt;$PATH&amp;lt;/code&amp;gt;, karena &amp;lt;code&amp;gt;openshift-install&amp;lt;/code&amp;gt; memanggilnya saat membuat ISO.&lt;br /&gt;
&lt;br /&gt;
Binary &amp;lt;code&amp;gt;openshift-install&amp;lt;/code&amp;gt; terkunci ke satu rilis, jadi versi OKD yang terpasang sama dengan versi binary.&lt;br /&gt;
&lt;br /&gt;
Install juga &amp;lt;code&amp;gt;nmstate&amp;lt;/code&amp;gt; (menyediakan &amp;lt;code&amp;gt;nmstatectl&amp;lt;/code&amp;gt;, dipakai untuk validasi IP statis):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
yay -S nmstate      # Arch (AUR)&lt;br /&gt;
nmstatectl --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buat SSH key kalau belum ada:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh-keygen -t ed25519 -N &amp;quot;&amp;quot;&lt;br /&gt;
cat ~/.ssh/id_ed25519.pub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Langkah 2: Buat VM bastion (AlmaLinux) ==&lt;br /&gt;
AlmaLinux dipilih karena stabil dan support-nya panjang. Fedora kurang cocok untuk server yang hidup lama (siklus rilis cepat); CentOS Stream lebih sering berubah.&lt;br /&gt;
&lt;br /&gt;
Setelan VM di Proxmox:&lt;br /&gt;
* Bridge &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;vmbr3&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;, NIC VirtIO.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CPU type &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; (lihat bagian Troubleshooting: kernel panic).&lt;br /&gt;
* RAM minimal 2 GB saat instalasi.&lt;br /&gt;
* Options → &amp;#039;&amp;#039;&amp;#039;Start at boot&amp;#039;&amp;#039;&amp;#039; aktif.&lt;br /&gt;
&lt;br /&gt;
=== Kunci IP statis ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nmcli -t -f NAME,DEVICE con show&lt;br /&gt;
sudo nmcli con mod ens18 ipv4.method manual \&lt;br /&gt;
  ipv4.addresses 192.168.90.29/24 ipv4.gateway 192.168.90.1 \&lt;br /&gt;
  ipv4.dns &amp;quot;192.168.90.29&amp;quot;&lt;br /&gt;
sudo nmcli con up ens18&lt;br /&gt;
sudo hostnamectl set-hostname marshall-okd-bastion&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS bastion diarahkan ke &amp;#039;&amp;#039;&amp;#039;dnsmasq miliknya sendiri&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;192.168.90.29&amp;lt;/code&amp;gt;), bukan ke DNS publik. Kalau tidak, bastion tidak bisa resolve &amp;lt;code&amp;gt;api.okd.lab.local&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;wait-for&amp;lt;/code&amp;gt; tidak bisa memantau install.&lt;br /&gt;
&lt;br /&gt;
Pastikan IP bastion dan IP node berada &amp;#039;&amp;#039;&amp;#039;di luar pool DHCP&amp;#039;&amp;#039;&amp;#039; MikroTik. Cek tanpa mengubah apa pun:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/ip pool print&lt;br /&gt;
/ip dhcp-server lease print&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cek IP node masih kosong:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ping -c2 192.168.90.30          # harus gagal&lt;br /&gt;
ip neigh | grep 192.168.90.30   # kosong atau FAILED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Langkah 3: DNS dengan dnsmasq ==&lt;br /&gt;
OKD membutuhkan tiga record:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Record !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.okd.lab.local&amp;lt;/code&amp;gt; || API cluster (port 6443), dipakai &amp;lt;code&amp;gt;oc&amp;lt;/code&amp;gt; dan installer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api-int.okd.lab.local&amp;lt;/code&amp;gt; || API internal, dipakai node dan komponen cluster&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;*.apps.okd.lab.local&amp;lt;/code&amp;gt; || Ingress: web console, OAuth, dan semua aplikasi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Di SNO, ketiganya mengarah ke IP node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo dnf install -y dnsmasq bind-utils&lt;br /&gt;
sudo tee /etc/dnsmasq.d/okd.conf &amp;lt;&amp;lt;&amp;#039;EOF&amp;#039;&lt;br /&gt;
listen-address=192.168.90.29&lt;br /&gt;
bind-interfaces&lt;br /&gt;
server=1.1.1.1&lt;br /&gt;
server=8.8.8.8&lt;br /&gt;
address=/api.okd.lab.local/192.168.90.30&lt;br /&gt;
address=/api-int.okd.lab.local/192.168.90.30&lt;br /&gt;
address=/apps.okd.lab.local/192.168.90.30&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Penjelasan:&lt;br /&gt;
* &amp;lt;code&amp;gt;server=&amp;lt;/code&amp;gt; adalah DNS upstream untuk nama di luar cluster (quay.io, dll.). dnsmasq hanya menjadi klien ke server itu, tidak mengubah konfigurasi router.&lt;br /&gt;
* &amp;lt;code&amp;gt;address=/apps.okd.lab.local/...&amp;lt;/code&amp;gt; otomatis mencakup semua subdomain (wildcard).&lt;br /&gt;
* &amp;lt;code&amp;gt;listen-address&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;bind-interfaces&amp;lt;/code&amp;gt; membuat dnsmasq hanya mendengarkan di IP tersebut, sehingga tidak bentrok dengan resolver lain.&lt;br /&gt;
&lt;br /&gt;
Pastikan folder &amp;lt;code&amp;gt;.d&amp;lt;/code&amp;gt; terbaca:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grep -n conf-dir /etc/dnsmasq.conf&lt;br /&gt;
# kalau tidak ada / masih dikomentari:&lt;br /&gt;
echo &amp;#039;conf-dir=/etc/dnsmasq.d/,*.conf&amp;#039; | sudo tee -a /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan dan uji:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo dnsmasq --test&lt;br /&gt;
sudo systemctl enable --now dnsmasq&lt;br /&gt;
sudo firewall-cmd --add-service=dns --permanent &amp;amp;&amp;amp; sudo firewall-cmd --reload&lt;br /&gt;
sudo ss -lntup | grep &amp;#039;:53&amp;#039;&lt;br /&gt;
dig +short api.okd.lab.local @192.168.90.29    # → 192.168.90.30&lt;br /&gt;
dig +short quay.io @192.168.90.29              # harus ada jawaban&lt;br /&gt;
getent hosts api.okd.lab.local                 # dari bastion sendiri&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Langkah 4: install-config.yaml ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
baseDomain: lab.local&lt;br /&gt;
metadata:&lt;br /&gt;
  name: okd&lt;br /&gt;
compute:&lt;br /&gt;
- name: worker&lt;br /&gt;
  replicas: 0&lt;br /&gt;
controlPlane:&lt;br /&gt;
  name: master&lt;br /&gt;
  replicas: 1&lt;br /&gt;
networking:&lt;br /&gt;
  networkType: OVNKubernetes&lt;br /&gt;
  machineNetwork:&lt;br /&gt;
  - cidr: 192.168.90.0/24&lt;br /&gt;
  clusterNetwork:&lt;br /&gt;
  - cidr: 10.128.0.0/14&lt;br /&gt;
    hostPrefix: 23&lt;br /&gt;
  serviceNetwork:&lt;br /&gt;
  - 172.30.0.0/16&lt;br /&gt;
platform:&lt;br /&gt;
  none: {}&lt;br /&gt;
pullSecret: &amp;#039;{&amp;quot;auths&amp;quot;:{&amp;quot;fake&amp;quot;:{&amp;quot;auth&amp;quot;:&amp;quot;aWQ6cGFzcwo=&amp;quot;}}}&amp;#039;&lt;br /&gt;
sshKey: &amp;#039;ssh-ed25519 AAAA... (isi ~/.ssh/id_ed25519.pub)&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan:&lt;br /&gt;
* &amp;lt;code&amp;gt;platform: none&amp;lt;/code&amp;gt; dipakai karena Proxmox tidak punya integrasi native.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pull secret dummy&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;id:pass&amp;lt;/code&amp;gt; dalam base64) cukup untuk OKD, karena image diambil dari &amp;lt;code&amp;gt;quay.io/okd&amp;lt;/code&amp;gt; yang publik. Pull secret asli Red Hat hanya perlu untuk OpenShift atau image dari &amp;lt;code&amp;gt;registry.redhat.io&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Langkah 5: agent-config.yaml ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: v1alpha1&lt;br /&gt;
kind: AgentConfig&lt;br /&gt;
metadata:&lt;br /&gt;
  name: okd&lt;br /&gt;
rendezvousIP: 192.168.90.30&lt;br /&gt;
hosts:&lt;br /&gt;
- hostname: okd-sno&lt;br /&gt;
  role: master&lt;br /&gt;
  interfaces:&lt;br /&gt;
  - name: eth0&lt;br /&gt;
    macAddress: BC:24:11:00:00:30&lt;br /&gt;
  networkConfig:&lt;br /&gt;
    interfaces:&lt;br /&gt;
    - name: eth0&lt;br /&gt;
      type: ethernet&lt;br /&gt;
      state: up&lt;br /&gt;
      mac-address: BC:24:11:00:00:30&lt;br /&gt;
      ipv4:&lt;br /&gt;
        enabled: true&lt;br /&gt;
        dhcp: false&lt;br /&gt;
        address:&lt;br /&gt;
        - ip: 192.168.90.30&lt;br /&gt;
          prefix-length: 24&lt;br /&gt;
    dns-resolver:&lt;br /&gt;
      config:&lt;br /&gt;
        server:&lt;br /&gt;
        - 192.168.90.29&lt;br /&gt;
    routes:&lt;br /&gt;
      config:&lt;br /&gt;
      - destination: 0.0.0.0/0&lt;br /&gt;
        next-hop-address: 192.168.90.1&lt;br /&gt;
        next-hop-interface: eth0&lt;br /&gt;
        table-id: 254&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MAC address ditentukan sendiri&amp;#039;&amp;#039;&amp;#039;, lalu dipasang manual di NIC VM. Installer mencocokkan IP statis ke VM berdasarkan MAC.&lt;br /&gt;
* Aturan MAC: oktet pertama harus genap di digit keduanya (unicast). Prefix &amp;lt;code&amp;gt;BC:24:11&amp;lt;/code&amp;gt; adalah prefix Proxmox.&lt;br /&gt;
* Nama interface &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt; hanya label; pencocokan dilakukan lewat MAC.&lt;br /&gt;
&lt;br /&gt;
== Langkah 6: Generate ISO ==&lt;br /&gt;
ISO &amp;#039;&amp;#039;&amp;#039;tidak didownload&amp;#039;&amp;#039;&amp;#039;, melainkan dibuat oleh &amp;lt;code&amp;gt;openshift-install&amp;lt;/code&amp;gt; dari dua YAML di atas. File YAML akan &amp;#039;&amp;#039;&amp;#039;dikonsumsi&amp;#039;&amp;#039;&amp;#039; (dihapus) saat generate, jadi simpan backup.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/okd&lt;br /&gt;
mkdir -p ~/okd-backup &amp;amp;&amp;amp; cp install-config.yaml agent-config.yaml ~/okd-backup/&lt;br /&gt;
rm -rf cluster &amp;amp;&amp;amp; mkdir cluster&lt;br /&gt;
cp install-config.yaml agent-config.yaml cluster/&lt;br /&gt;
openshift-install agent create image --dir cluster --log-level=info&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hasil: &amp;lt;code&amp;gt;cluster/agent.x86_64.iso&amp;lt;/code&amp;gt;, plus &amp;lt;code&amp;gt;cluster/auth/&amp;lt;/code&amp;gt; (kubeconfig dan password kubeadmin).&lt;br /&gt;
&lt;br /&gt;
* Tidak ada progress bar saat &amp;lt;code&amp;gt;Downloading base ISO&amp;lt;/code&amp;gt;; tunggu sampai prompt kembali.&lt;br /&gt;
* Warning &amp;lt;code&amp;gt;Failed to extract base ISO from release payload&amp;lt;/code&amp;gt; tidak fatal; installer jatuh ke jalur download.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Setiap perubahan IP/DNS/MAC wajib generate ulang ISO&amp;#039;&amp;#039;&amp;#039;, karena konfigurasi ter-bake di dalamnya.&lt;br /&gt;
&lt;br /&gt;
Salin folder &amp;lt;code&amp;gt;cluster/&amp;lt;/code&amp;gt; ke bastion supaya &amp;lt;code&amp;gt;wait-for&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;oc&amp;lt;/code&amp;gt; bisa dijalankan dari sana.&lt;br /&gt;
&lt;br /&gt;
== Langkah 7: Buat VM OKD di Proxmox ==&lt;br /&gt;
Upload ISO lewat UI Proxmox (storage → ISO Images → Upload), lalu Create VM:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tab !! Setelan !! Alasan&lt;br /&gt;
|-&lt;br /&gt;
| General || Start at boot || Cluster ikut hidup saat host reboot&lt;br /&gt;
|-&lt;br /&gt;
| OS || ISO &amp;lt;code&amp;gt;agent.x86_64.iso&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| System || Machine &amp;lt;code&amp;gt;q35&amp;lt;/code&amp;gt;, BIOS SeaBIOS || q35 chipset modern (opsional, i440fx juga bisa). Kalau OVMF, matikan Secure Boot&lt;br /&gt;
|-&lt;br /&gt;
| Disks || VirtIO SCSI single, 150 GB, SSD, &amp;#039;&amp;#039;&amp;#039;Discard&amp;#039;&amp;#039;&amp;#039; + &amp;#039;&amp;#039;&amp;#039;SSD emulation&amp;#039;&amp;#039;&amp;#039; || Discard (TRIM) mengembalikan ruang thin-provisioned ke host; opsional&lt;br /&gt;
|-&lt;br /&gt;
| CPU || 1 socket, 16 core, type &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Wajib.&amp;#039;&amp;#039;&amp;#039; SCOS butuh instruksi CPU modern; tipe default bisa memicu crash&lt;br /&gt;
|-&lt;br /&gt;
| Memory || 32768 MB, &amp;#039;&amp;#039;&amp;#039;Ballooning off&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Penting.&amp;#039;&amp;#039;&amp;#039; Kubernetes mengasumsikan RAM tetap; balloon bisa memicu OOM/eviction&lt;br /&gt;
|-&lt;br /&gt;
| Network || Bridge &amp;lt;code&amp;gt;vmbr3&amp;lt;/code&amp;gt;, VirtIO, MAC &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;BC:24:11:00:00:30&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; || Harus sama persis dengan agent-config.yaml&lt;br /&gt;
|-&lt;br /&gt;
| Options → Boot Order || &amp;lt;code&amp;gt;scsi0&amp;lt;/code&amp;gt; di atas CD-ROM || Setelah install, node boot dari disk, bukan installer lagi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Langkah 8: Install dan pantau ==&lt;br /&gt;
Start VM. Di Console Proxmox, tanda awal yang benar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ens18: 192.168.90.30&lt;br /&gt;
Ignition: user-provided config was applied&lt;br /&gt;
This host (192.168.90.30) is the rendezvous host.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Urutan yang terlihat:&lt;br /&gt;
# &amp;lt;code&amp;gt;Waiting for services&amp;lt;/code&amp;gt; → service installer naik satu per satu.&lt;br /&gt;
# &amp;lt;code&amp;gt;Installation cannot proceed: Cluster status: insufficient&amp;lt;/code&amp;gt; → sementara, validasi host belum selesai.&lt;br /&gt;
# &amp;lt;code&amp;gt;Cluster installation in progress&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;Writing image to disk&amp;lt;/code&amp;gt; 0–100%, lalu node reboot dari disk.&lt;br /&gt;
# Log &amp;lt;code&amp;gt;crio-... libcrun container&amp;lt;/code&amp;gt; berulang → container cluster dinyalakan (normal).&lt;br /&gt;
# &amp;lt;code&amp;gt;Finished bootkube.service&amp;lt;/code&amp;gt; → bootstrap selesai.&lt;br /&gt;
&lt;br /&gt;
Pantau dari bastion:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/okd&lt;br /&gt;
openshift-install agent wait-for bootstrap-complete --dir cluster --log-level=info&lt;br /&gt;
openshift-install agent wait-for install-complete --dir cluster --log-level=info&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Pesan &amp;lt;code&amp;gt;cluster bootstrap did not complete&amp;lt;/code&amp;gt; tepat setelah &amp;#039;&amp;#039;Writing image to disk: 100%&amp;#039;&amp;#039; bisa muncul karena &amp;lt;code&amp;gt;wait-for&amp;lt;/code&amp;gt; kehilangan kontak saat node reboot dari ISO ke disk. Jalankan ulang &amp;lt;code&amp;gt;wait-for&amp;lt;/code&amp;gt; (aman, tidak mengganggu installer).&lt;br /&gt;
* Install aktual memakan sekitar &amp;#039;&amp;#039;&amp;#039;1 jam&amp;#039;&amp;#039;&amp;#039; (cluster &amp;lt;code&amp;gt;Available&amp;lt;/code&amp;gt; sekitar 09:15 dari mulai 08:11).&lt;br /&gt;
&lt;br /&gt;
Cek status langsung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export KUBECONFIG=~/okd/cluster/auth/kubeconfig&lt;br /&gt;
curl -k https://api.okd.lab.local:6443/version&lt;br /&gt;
oc get clusterversion&lt;br /&gt;
oc get co&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install sukses bila &amp;lt;code&amp;gt;clusterversion&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;Available=True&amp;lt;/code&amp;gt; dan semua cluster operator &amp;lt;code&amp;gt;Available=True, Progressing=False, Degraded=False&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Langkah 9: Akses web console ==&lt;br /&gt;
Password:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat ~/okd/cluster/auth/kubeadmin-password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Console tidak bisa dibuka lewat &amp;lt;code&amp;gt;IP:port&amp;lt;/code&amp;gt;, karena router OKD memilih tujuan berdasarkan &amp;#039;&amp;#039;&amp;#039;nama host&amp;#039;&amp;#039;&amp;#039;. Di mesin yang menjalankan browser, tambahkan ke &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.90.30 api.okd.lab.local console-openshift-console.apps.okd.lab.local oauth-openshift.apps.okd.lab.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buka &amp;lt;code&amp;gt;https://console-openshift-console.apps.okd.lab.local&amp;lt;/code&amp;gt;, login sebagai &amp;lt;code&amp;gt;kubeadmin&amp;lt;/code&amp;gt;. Peringatan sertifikat (self-signed) normal.&lt;br /&gt;
&lt;br /&gt;
Mesin itu juga harus bisa menjangkau &amp;lt;code&amp;gt;192.168.90.0/24&amp;lt;/code&amp;gt; (misalnya lewat route WireGuard atau &amp;lt;code&amp;gt;sshuttle&amp;lt;/code&amp;gt; via bastion).&lt;br /&gt;
&lt;br /&gt;
Tes router tanpa browser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -kI --resolve console-openshift-console.apps.okd.lab.local:443:192.168.90.30 \&lt;br /&gt;
  https://console-openshift-console.apps.okd.lab.local&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Langkah 10: Setelah install ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Snapshot VM OKD&amp;#039;&amp;#039;&amp;#039; selagi bersih.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Lepas ISO&amp;#039;&amp;#039;&amp;#039; dari VM OKD (CD/DVD → Do not use any media).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Autostart dan urutan boot&amp;#039;&amp;#039;&amp;#039;: bastion order 1, OKD order 2, beri jeda start.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Simpan &amp;lt;code&amp;gt;cluster/auth/&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; di tempat aman.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Storage class&amp;#039;&amp;#039;&amp;#039;: cluster baru di &amp;lt;code&amp;gt;platform: none&amp;lt;/code&amp;gt; belum punya storage dinamis; PVC akan Pending sampai dipasang NFS / local-path / LVMS. Cek dengan &amp;lt;code&amp;gt;oc get sc&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Image registry&amp;#039;&amp;#039;&amp;#039; (dev): &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
oc patch configs.imageregistry.operator.openshift.io cluster --type merge \&lt;br /&gt;
  --patch &amp;#039;{&amp;quot;spec&amp;quot;:{&amp;quot;managementState&amp;quot;:&amp;quot;Managed&amp;quot;,&amp;quot;storage&amp;quot;:{&amp;quot;emptyDir&amp;quot;:{}}}}&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; (emptyDir: isi hilang saat pod restart, hanya untuk dev.)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Keamanan&amp;#039;&amp;#039;&amp;#039;: jangan publikasikan console, OAuth, dan API ke internet selama masih memakai &amp;lt;code&amp;gt;kubeadmin&amp;lt;/code&amp;gt;. Ganti dengan user admin biasa lewat OAuth.&lt;br /&gt;
&lt;br /&gt;
== Publish aplikasi dengan domain sendiri (rencana) ==&lt;br /&gt;
Alur: &amp;lt;code&amp;gt;Internet → MikroTik NAT → nginx → router OKD (192.168.90.30:80) → app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route dengan domain sendiri:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
oc create route edge myapp --service=myapp \&lt;br /&gt;
  --hostname=app.domainku.com --insecure-policy=Allow&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nginx (TLS di nginx, teruskan header Host):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
location / {&lt;br /&gt;
    proxy_pass http://192.168.90.30:80;&lt;br /&gt;
    proxy_set_header Host $host;&lt;br /&gt;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
    proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tes sisi OKD: &amp;lt;code&amp;gt;curl -sI -H &amp;quot;Host: app.domainku.com&amp;quot; http://192.168.90.30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting (yang benar-benar terjadi) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gejala !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| dnsmasq &amp;lt;code&amp;gt;start-limit-hit&amp;lt;/code&amp;gt;, log: &amp;lt;code&amp;gt;failed to create listening socket for port 53: Address already in use&amp;lt;/code&amp;gt; || Config di &amp;lt;code&amp;gt;/etc/dnsmasq.d/&amp;lt;/code&amp;gt; tidak terbaca (Arch tidak mengaktifkan &amp;lt;code&amp;gt;conf-dir&amp;lt;/code&amp;gt;), dnsmasq bind ke semua alamat dan bentrok dengan dnsmasq libvirt di &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; || Tambahkan &amp;lt;code&amp;gt;conf-dir=/etc/dnsmasq.d/,*.conf&amp;lt;/code&amp;gt;; gunakan &amp;lt;code&amp;gt;listen-address&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;bind-interfaces&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exec: &amp;quot;nmstatectl&amp;quot;: executable file not found in $PATH&amp;lt;/code&amp;gt; || Paket nmstate belum terpasang || &amp;lt;code&amp;gt;yay -S nmstate&amp;lt;/code&amp;gt;, atau jalankan installer di container Fedora&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exec: &amp;quot;oc&amp;quot;: executable file not found in $PATH&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;oc&amp;lt;/code&amp;gt; belum diekstrak/di-PATH || Ekstrak &amp;lt;code&amp;gt;openshift-client&amp;lt;/code&amp;gt;, pindahkan ke &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Node tidak bisa menjangkau DNS di laptop || Laptop (192.168.83.x, WiFi) tidak bisa dijangkau dari jaringan Proxmox (laptop masuk via WireGuard) || Pindahkan DNS ke VM bastion di &amp;lt;code&amp;gt;vmbr3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Kernel panic AlmaLinux: &amp;lt;code&amp;gt;Attempted to kill init! exitcode=0x00007f00&amp;lt;/code&amp;gt; || CPU type default Proxmox menyembunyikan instruksi x86-64-v2/v3 yang dibutuhkan Alma 9/10 || Ubah Processor → Type &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wait-for&amp;lt;/code&amp;gt; stuck lama di &amp;lt;code&amp;gt;Waiting for cluster install to initialize. Sleeping for 30 seconds&amp;lt;/code&amp;gt; || Bastion tidak bisa resolve &amp;lt;code&amp;gt;api.okd.lab.local&amp;lt;/code&amp;gt; (DNS bastion ke 1.1.1.1). Cluster sebenarnya sudah jadi || Arahkan DNS bastion ke dnsmasq-nya (&amp;lt;code&amp;gt;192.168.90.29&amp;lt;/code&amp;gt;) atau tambah &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;. Cek dengan &amp;lt;code&amp;gt;getent hosts api.okd.lab.local&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Console tidak terbuka di laptop || Nama &amp;lt;code&amp;gt;*.apps&amp;lt;/code&amp;gt; tidak dikenal, atau subnet 192.168.90.x tidak terjangkau || Tambah &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;, pastikan route ke 192.168.90.0/24&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Perintah debug yang berguna:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh core@192.168.90.30&lt;br /&gt;
sudo journalctl -b -f&lt;br /&gt;
sudo crictl ps&lt;br /&gt;
tail -n 60 ~/okd/cluster/.openshift_install.log&lt;br /&gt;
openshift-install agent wait-for bootstrap-complete --dir cluster --log-level=debug&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referensi ==&lt;br /&gt;
* [https://docs.okd.io/latest/installing/overview/ OKD installation overview]&lt;br /&gt;
* [https://docs.okd.io/4.21/installing/installing_sno/install-sno-preparing-to-install-sno.html Preparing to install OKD on a single node]&lt;br /&gt;
* [https://docs.okd.io/4.22/installing/installing_two_node_cluster/about-two-node-arbiter-installation.html OKD two control plane + arbiter]&lt;br /&gt;
* [https://okd.io/blog/2025/05/14/okd-4.19-and-4.20-release OKD 4.19 / 4.20 release (transisi ke SCOS)]&lt;br /&gt;
* [https://github.com/okd-project/okd/releases OKD releases (GitHub)]&lt;/div&gt;</description>
			<pubDate>Wed, 28 Oct 2026 04:17:44 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Cara_install_OKD</comments>
		</item>
		<item>
			<title>DevOps</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=DevOps&amp;diff=887&amp;oldid=872</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=DevOps&amp;diff=887&amp;oldid=872</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:17, 28 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l5&quot;&gt;Line 5:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 5:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Cara buat monitoring server pake Grafana &amp;amp; Prometheus]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Cara buat monitoring server pake Grafana &amp;amp; Prometheus]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Deploy app bare-metal]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Deploy app bare-metal]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Cara install OKD]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Microk8s ==  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Microk8s ==  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Microk8s: setup awal]]  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Microk8s: setup awal]]  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Microk8s: setup registry]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Microk8s: setup registry]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Wed, 28 Oct 2026 04:17:00 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:DevOps</comments>
		</item>
		<item>
			<title>Main Page</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=886&amp;oldid=871</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=886&amp;oldid=871</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:57, 26 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l36&quot;&gt;Line 36:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 36:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Tedja, H. A. (2025). Perbandingan Metode Vektorisasi Teks dan Algoritma Pembelajaran Mesin Klasik untuk Klasifikasi Teks Bahasa Arab. Journal of Computer and Information Systems Ampera, 7(3), 207–219. https://doi.org/10.51519/journalcisa.v7i3.793&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== CV ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== CV ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Mon, 26 Oct 2026 09:57:51 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Main_Page</comments>
		</item>
		<item>
			<title>Mikrotik 5: Bridge VLAN Filtering</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_5:_Bridge_VLAN_Filtering&amp;diff=885&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_5:_Bridge_VLAN_Filtering&amp;diff=885&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;== Tujuan == * Paham kapan cukup memakai VLAN interface di port, dan kapan butuh bridge VLAN filtering. * Paham tiga bagian bridge VLAN filtering: PVID, tabel VLAN, dan VLAN interface di atas bridge. * Bisa membuat access port, trunk ke switch, dan trunk ke server. * Bisa men-debug konfigurasi VLAN lewat CLI.  == Konsep ==  === Router sebagai switch VLAN === * &amp;#039;&amp;#039;&amp;#039;Part 4 (router-on-a-stick)&amp;#039;&amp;#039;&amp;#039;: VLAN diurus switch. Router hanya menerima satu kabel trunk. * &amp;#039;&amp;#039;&amp;#039;Part 5&amp;#039;&amp;#039;&amp;#039;: ro...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Tujuan ==&lt;br /&gt;
* Paham kapan cukup memakai VLAN interface di port, dan kapan butuh bridge VLAN filtering.&lt;br /&gt;
* Paham tiga bagian bridge VLAN filtering: PVID, tabel VLAN, dan VLAN interface di atas bridge.&lt;br /&gt;
* Bisa membuat access port, trunk ke switch, dan trunk ke server.&lt;br /&gt;
* Bisa men-debug konfigurasi VLAN lewat CLI.&lt;br /&gt;
&lt;br /&gt;
== Konsep ==&lt;br /&gt;
&lt;br /&gt;
=== Router sebagai switch VLAN ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Part 4 (router-on-a-stick)&amp;#039;&amp;#039;&amp;#039;: VLAN diurus switch. Router hanya menerima satu kabel trunk.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Part 5&amp;#039;&amp;#039;&amp;#039;: router &amp;#039;&amp;#039;&amp;#039;sendiri&amp;#039;&amp;#039;&amp;#039; menjadi switch VLAN. Setiap port bisa menjadi access atau trunk, dan router sekaligus menjadi gateway setiap VLAN.&lt;br /&gt;
&lt;br /&gt;
=== Kapan butuh bridge? ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Situasi !! Pakai&lt;br /&gt;
|-&lt;br /&gt;
| Satu port membawa beberapa VLAN, dan setiap VLAN hanya ada di port itu || &amp;#039;&amp;#039;&amp;#039;VLAN interface langsung di port&amp;#039;&amp;#039;&amp;#039; (cara Part 4, paling simpel)&lt;br /&gt;
|-&lt;br /&gt;
| Satu VLAN tersebar di &amp;#039;&amp;#039;&amp;#039;beberapa port&amp;#039;&amp;#039;&amp;#039; router || &amp;#039;&amp;#039;&amp;#039;Bridge + VLAN filtering&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Port-port hanya bisa &amp;quot;disambung&amp;quot; menjadi satu segmen lewat bridge ([[Belajar MikroTik Part 3|Part 3]]). Begitu port-port berada dalam satu bridge, cara memisahkan VLAN-nya adalah bridge VLAN filtering.&lt;br /&gt;
&lt;br /&gt;
Analogi: VLAN interface di port = satu pipa dibagi beberapa jalur. Bridge VLAN filtering = gedung dengan banyak pintu, setiap pintu diberi label &amp;quot;khusus staff&amp;quot; atau &amp;quot;khusus tamu&amp;quot;, dan pintu berlabel sama tetap tersambung satu sama lain.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;VLAN yang sudah dipakai di satu port tetap bisa dipakai di port lain.&amp;#039;&amp;#039;&amp;#039; Justru itu gunanya: VLAN 10 bisa ada di &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; sekaligus, dan semua perangkatnya tetap satu network.&lt;br /&gt;
&lt;br /&gt;
=== Tiga bagian + satu saklar ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! Bagian !! Menu !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &amp;#039;&amp;#039;&amp;#039;PVID&amp;#039;&amp;#039;&amp;#039; || Bridge → Ports || Frame &amp;#039;&amp;#039;&amp;#039;polos&amp;#039;&amp;#039;&amp;#039; yang masuk dari port ini dianggap milik VLAN berapa. Ini yang membuat port menjadi access port.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &amp;#039;&amp;#039;&amp;#039;Tabel VLAN&amp;#039;&amp;#039;&amp;#039; || Bridge → VLANs || Untuk setiap VLAN: port mana yang menjadi anggota, dan frame yang &amp;#039;&amp;#039;&amp;#039;keluar&amp;#039;&amp;#039;&amp;#039; dikirim tagged atau untagged. Ini daftar VLAN yang boleh lewat trunk.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &amp;#039;&amp;#039;&amp;#039;VLAN interface di atas bridge&amp;#039;&amp;#039;&amp;#039; || Interfaces → VLAN || Gateway Layer 3. Bridge sendiri harus menjadi anggota &amp;#039;&amp;#039;&amp;#039;tagged&amp;#039;&amp;#039;&amp;#039; di setiap VLAN (&amp;quot;port internal&amp;quot; ke otak router).&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &amp;#039;&amp;#039;&amp;#039;Saklar &amp;lt;code&amp;gt;vlan-filtering&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; || Bridge → Bridge → tab VLAN || Selama mati, semua aturan VLAN diabaikan. &amp;#039;&amp;#039;&amp;#039;Nyalakan paling akhir.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Frame Types&amp;#039;&amp;#039;&amp;#039; di Bridge → Ports:&lt;br /&gt;
* Access port: &amp;lt;code&amp;gt;admit-only-untagged-and-priority-tagged&amp;lt;/code&amp;gt; (frame bertag dari PC dibuang).&lt;br /&gt;
* Trunk port: &amp;lt;code&amp;gt;admit-only-vlan-tagged&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Peringatan&amp;#039;&amp;#039;&amp;#039;: mengaktifkan &amp;lt;code&amp;gt;vlan-filtering&amp;lt;/code&amp;gt; saat terhubung ke router lewat port anggota bridge bisa memutus koneksi Winbox. Di router produksi, selalu nyalakan &amp;#039;&amp;#039;&amp;#039;Safe Mode&amp;#039;&amp;#039;&amp;#039; dulu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              ┌──────────── CHR ─────────────┐&lt;br /&gt;
              │  vlan10 … vlan70 (gateway)    │  ← Layer 3&lt;br /&gt;
              │        │ tagged               │&lt;br /&gt;
              │   ┌─ bridge-vlan ──────┐      │  ← &amp;quot;switch&amp;quot;&lt;br /&gt;
              │   │ ether2-4  access   │      │&lt;br /&gt;
              │   │ ether5-6  trunk    │      │&lt;br /&gt;
              │   └────────────────────┘      │&lt;br /&gt;
              │ ether1 (WAN, di luar bridge)  │&lt;br /&gt;
              └───────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pemakaian di dunia nyata ===&lt;br /&gt;
Di lab PC dicolok langsung ke port router agar sederhana. Di dunia nyata, port router biasanya tersambung ke:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Port !! Tipe !! Tersambung ke !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| ether2 || access 10 || Switch ruangan staff || Switch biasa (bahkan unmanaged). Semua yang dicolok otomatis VLAN 10.&lt;br /&gt;
|-&lt;br /&gt;
| ether3 || trunk 10, 20 || Access point || Dua SSID: &amp;lt;code&amp;gt;Kantor&amp;lt;/code&amp;gt; (VLAN 10) dan &amp;lt;code&amp;gt;Kantor-Tamu&amp;lt;/code&amp;gt; (VLAN 20). Satu kabel, dua jaringan.&lt;br /&gt;
|-&lt;br /&gt;
| ether4 || trunk 10, 20, 30 || Server Proxmox || VM ditempatkan di VLAN mana pun lewat satu kabel.&lt;br /&gt;
|-&lt;br /&gt;
| ether5 || access 30 || Switch CCTV || Semua kamera terkurung di VLAN 30.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Di kantor besar, router sering hanya memakai 1–2 port trunk ke switch inti. Switch MikroTik (CRS) dikonfigurasi dengan &amp;#039;&amp;#039;&amp;#039;cara yang sama persis&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Homelab&amp;#039;&amp;#039;&amp;#039;: pola ini juga populer di rumah, misalnya VLAN keluarga, VLAN lab/server, VLAN IoT (smart TV, CCTV murah), dan VLAN tamu. Ingat: VLAN saja tidak mengisolasi, karena router tetap me-routing antar VLAN. Isolasi dibutuhkan lewat firewall ([[Belajar MikroTik Part 6|Part 6]]).&lt;br /&gt;
&lt;br /&gt;
== Lab ==&lt;br /&gt;
&lt;br /&gt;
=== Topologi ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                         [NAT]&lt;br /&gt;
                           │ ether1 (WAN)&lt;br /&gt;
                         [CHR]  ── bridge-vlan&lt;br /&gt;
   ether2    ether3    ether4        ether5                 ether6&lt;br /&gt;
   VLAN10    VLAN10    VLAN20     trunk 30+40           trunk 50+60+70&lt;br /&gt;
     │         │         │            │                      │&lt;br /&gt;
  Staff1    Staff2     Tamu       [Switch1]              [Proxmox]&lt;br /&gt;
                                  /       \             eth0.50/.60/.70&lt;br /&gt;
                              PC-30      PC-40&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! VLAN !! Subnet !! Gateway !! Lokasi&lt;br /&gt;
|-&lt;br /&gt;
| 10 || &amp;lt;code&amp;gt;172.16.10.0/24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; || ether2, ether3 (access)&lt;br /&gt;
|-&lt;br /&gt;
| 20 || &amp;lt;code&amp;gt;172.16.20.0/24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; || ether4 (access)&lt;br /&gt;
|-&lt;br /&gt;
| 30, 40 || &amp;lt;code&amp;gt;172.16.30.0/24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;172.16.40.0/24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; || ether5 (trunk ke switch)&lt;br /&gt;
|-&lt;br /&gt;
| 50, 60, 70 || &amp;lt;code&amp;gt;172.16.50.0/24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.60.&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.70.&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; || ether6 (trunk ke server)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PC memakai container &amp;lt;code&amp;gt;lab-ubuntu&amp;lt;/code&amp;gt; (lihat [[Belajar MikroTik Lampiran: Linux Networking|lampiran Linux]]) atau VPCS.&lt;br /&gt;
&lt;br /&gt;
=== 0. Persiapan ===&lt;br /&gt;
* Host: &amp;lt;code&amp;gt;virsh net-start default&amp;lt;/code&amp;gt; dan aturan &amp;lt;code&amp;gt;DOCKER-USER&amp;lt;/code&amp;gt; ([[Belajar MikroTik Part 1|Part 1]]).&lt;br /&gt;
* Project baru, identity, NAT masquerade di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;, DNS Allow Remote Requests ([[Belajar MikroTik Part 4|Part 4]]).&lt;br /&gt;
* Backup: snapshot GNS3 atau &amp;lt;code&amp;gt;/export file=...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 1. Access port (ether2–ether4) ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bridge&amp;#039;&amp;#039;&amp;#039;: Bridge → Bridge → New, Name &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt;, &amp;#039;&amp;#039;&amp;#039;VLAN Filtering belum dicentang&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ports&amp;#039;&amp;#039;&amp;#039;: Bridge → Ports → New&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Interface !! PVID !! Frame Types&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; || 10 || admit only untagged and priority tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; || 10 || admit only untagged and priority tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt; || 20 || admit only untagged and priority tagged&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tabel VLAN&amp;#039;&amp;#039;&amp;#039;: Bridge → VLANs → New&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! VLAN IDs !! Tagged !! Untagged&lt;br /&gt;
|-&lt;br /&gt;
| 10 || &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 20 || &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gateway&amp;#039;&amp;#039;&amp;#039;: VLAN interface di &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; (bukan di port fisik), IP, dan DHCP per VLAN.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Saklar&amp;#039;&amp;#039;&amp;#039;: Bridge → Bridge → &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; → tab VLAN → centang &amp;#039;&amp;#039;&amp;#039;VLAN Filtering&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== 2. Trunk ke switch (ether5, VLAN 30 + 40) ===&lt;br /&gt;
Switch GNS3: port 0 &amp;lt;code&amp;gt;dot1q&amp;lt;/code&amp;gt; (ke &amp;lt;code&amp;gt;ether5&amp;lt;/code&amp;gt;), port 1 &amp;lt;code&amp;gt;access 30&amp;lt;/code&amp;gt; (PC-30), port 2 &amp;lt;code&amp;gt;access 40&amp;lt;/code&amp;gt; (PC-40).&lt;br /&gt;
&lt;br /&gt;
Di router:&lt;br /&gt;
* Bridge → Ports: &amp;lt;code&amp;gt;ether5&amp;lt;/code&amp;gt;, Frame Types &amp;#039;&amp;#039;&amp;#039;admit only VLAN tagged&amp;#039;&amp;#039;&amp;#039;, PVID dibiarkan default.&lt;br /&gt;
* Bridge → VLANs: VLAN 30 dan 40, Tagged &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ether5&amp;lt;/code&amp;gt;, Untagged kosong.&lt;br /&gt;
* VLAN interface &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vlan40&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt;, IP, DHCP.&lt;br /&gt;
&lt;br /&gt;
Access port menerima frame &amp;#039;&amp;#039;&amp;#039;polos&amp;#039;&amp;#039;&amp;#039; dan memakai PVID untuk menentukan VLAN. Trunk menerima frame &amp;#039;&amp;#039;&amp;#039;bertag&amp;#039;&amp;#039;&amp;#039; karena VLAN-nya sudah tertulis di tag.&lt;br /&gt;
&lt;br /&gt;
=== 3. Trunk ke server (ether6, VLAN 50 + 60 + 70) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/interface bridge port add bridge=bridge-vlan interface=ether6 frame-types=admit-only-vlan-tagged&lt;br /&gt;
&lt;br /&gt;
/interface bridge vlan&lt;br /&gt;
add bridge=bridge-vlan vlan-ids=50 tagged=bridge-vlan,ether6&lt;br /&gt;
add bridge=bridge-vlan vlan-ids=60 tagged=bridge-vlan,ether6&lt;br /&gt;
add bridge=bridge-vlan vlan-ids=70 tagged=bridge-vlan,ether6&lt;br /&gt;
&lt;br /&gt;
/interface vlan&lt;br /&gt;
add name=vlan50 interface=bridge-vlan vlan-id=50&lt;br /&gt;
add name=vlan60 interface=bridge-vlan vlan-id=60&lt;br /&gt;
add name=vlan70 interface=bridge-vlan vlan-id=70&lt;br /&gt;
&lt;br /&gt;
/ip address&lt;br /&gt;
add address=172.16.50.1/24 interface=vlan50 comment=VLAN50-proxmox&lt;br /&gt;
add address=172.16.60.1/24 interface=vlan60 comment=VLAN60-proxmox&lt;br /&gt;
add address=172.16.70.1/24 interface=vlan70 comment=VLAN70-proxmox&lt;br /&gt;
&lt;br /&gt;
/ip pool&lt;br /&gt;
add name=pool50 ranges=172.16.50.100-172.16.50.200&lt;br /&gt;
add name=pool60 ranges=172.16.60.100-172.16.60.200&lt;br /&gt;
add name=pool70 ranges=172.16.70.100-172.16.70.200&lt;br /&gt;
&lt;br /&gt;
/ip dhcp-server network&lt;br /&gt;
add address=172.16.50.0/24 gateway=172.16.50.1 dns-server=172.16.50.1&lt;br /&gt;
add address=172.16.60.0/24 gateway=172.16.60.1 dns-server=172.16.60.1&lt;br /&gt;
add address=172.16.70.0/24 gateway=172.16.70.1 dns-server=172.16.70.1&lt;br /&gt;
&lt;br /&gt;
/ip dhcp-server&lt;br /&gt;
add name=server50 interface=vlan50 address-pool=pool50&lt;br /&gt;
add name=server60 interface=vlan60 address-pool=pool60&lt;br /&gt;
add name=server70 interface=vlan70 address-pool=pool70&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Menambah trunk untuk VLAN yang sudah ada&amp;#039;&amp;#039;&amp;#039; cukup menambahkan port ke kolom Tagged. Hati-hati: &amp;lt;code&amp;gt;set tagged=...&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;menimpa&amp;#039;&amp;#039;&amp;#039; daftar lama, sehingga port yang sudah ada harus ditulis ulang:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/interface bridge vlan set [find vlan-ids=30] tagged=bridge-vlan,ether5,ether6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Sisi server (container Linux) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip link set eth0 up&lt;br /&gt;
for v in 50 60 70; do&lt;br /&gt;
  ip link add link eth0 name eth0.$v type vlan id $v&lt;br /&gt;
  ip link set eth0.$v up&lt;br /&gt;
  dhclient -v eth0.$v&lt;br /&gt;
done&lt;br /&gt;
ip -br addr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hasil:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eth0.50@eth0     UP     172.16.50.200/24&lt;br /&gt;
eth0.60@eth0     UP     172.16.60.200/24&lt;br /&gt;
eth0.70@eth0     UP     172.16.70.200/24&lt;br /&gt;
eth0             UP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;RTNETLINK answers: File exists&amp;lt;/code&amp;gt; saat &amp;lt;code&amp;gt;dhclient&amp;lt;/code&amp;gt; kedua/ketiga itu normal: Linux hanya memakai satu default gateway di tabel routing utama.&lt;br /&gt;
* Ctrl+C di tengah loop menghentikan &amp;#039;&amp;#039;&amp;#039;seluruh&amp;#039;&amp;#039;&amp;#039; loop. VLAN berikutnya harus dicoba manual.&lt;br /&gt;
* Baris &amp;lt;code&amp;gt;xid: warning ...&amp;lt;/code&amp;gt; aman diabaikan.&lt;br /&gt;
&lt;br /&gt;
=== Padanan di Proxmox sungguhan ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
auto vmbr0&lt;br /&gt;
iface vmbr0 inet manual&lt;br /&gt;
    bridge-ports eno1&lt;br /&gt;
    bridge-stp off&lt;br /&gt;
    bridge-fd 0&lt;br /&gt;
    bridge-vlan-aware yes&lt;br /&gt;
    bridge-vids 2-4094&lt;br /&gt;
&lt;br /&gt;
auto vmbr0.50&lt;br /&gt;
iface vmbr0.50 inet static&lt;br /&gt;
    address 172.16.50.20/24&lt;br /&gt;
    gateway 172.16.50.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;bridge-vlan-aware yes&amp;lt;/code&amp;gt; = bridge Proxmox juga memakai VLAN filtering, konsepnya sama dengan &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; di MikroTik.&lt;br /&gt;
* &amp;lt;code&amp;gt;vmbr0.50&amp;lt;/code&amp;gt; = IP manajemen host, statis di range server.&lt;br /&gt;
* Setiap VM: Bridge &amp;lt;code&amp;gt;vmbr0&amp;lt;/code&amp;gt; + &amp;#039;&amp;#039;&amp;#039;VLAN Tag&amp;#039;&amp;#039;&amp;#039; di setting network VM.&lt;br /&gt;
&lt;br /&gt;
== Verifikasi ==&lt;br /&gt;
* Setiap PC/VM mendapat IP sesuai VLAN-nya dan bisa &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; dalam satu VLAN langsung sampai; antar VLAN lewat gateway.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Bridge → VLANs&amp;#039;&amp;#039;&amp;#039;: keanggotaan tagged/untagged sesuai rencana.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Bridge → Hosts&amp;#039;&amp;#039;&amp;#039;: MAC setiap perangkat beserta port dan VLAN-nya.&lt;br /&gt;
&lt;br /&gt;
Entri dinamis seperti &amp;lt;code&amp;gt;VLAN 1 ;;; added by pvid&amp;lt;/code&amp;gt; di tabel VLAN itu normal: bridge sendiri punya PVID default 1.&lt;br /&gt;
&lt;br /&gt;
== Masalah yang ditemui ==&lt;br /&gt;
&lt;br /&gt;
=== VLAN interface berflag R tapi parameternya salah ===&lt;br /&gt;
Ketiga kasus di bawah sama-sama terlihat normal di &amp;lt;code&amp;gt;print&amp;lt;/code&amp;gt; biasa. Flag &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039; hanya berarti &amp;quot;interface hidup&amp;quot;, bukan &amp;quot;konfigurasinya benar&amp;quot;. Masalahnya baru terlihat di &amp;lt;code&amp;gt;print detail&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kasus !! Temuan di &amp;lt;code&amp;gt;print detail&amp;lt;/code&amp;gt; !! Penyebab !! Perbaikan&lt;br /&gt;
|-&lt;br /&gt;
| PC-30 &amp;amp; PC-40 tidak dapat IP || &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;vlan40&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;vlan-id=1&amp;lt;/code&amp;gt; || Kolom VLAN ID terlewat, memakai default || &amp;lt;code&amp;gt;/interface vlan set vlan30 vlan-id=30&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC-40 tidak dapat IP || &amp;lt;code&amp;gt;vlan40&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;use-service-tag=yes&amp;lt;/code&amp;gt; || Checkbox &amp;#039;&amp;#039;&amp;#039;Use Service Tag&amp;#039;&amp;#039;&amp;#039; tercentang. Itu mode QinQ (penanda &amp;lt;code&amp;gt;0x88a8&amp;lt;/code&amp;gt;), sedangkan switch mengirim tag biasa &amp;lt;code&amp;gt;0x8100&amp;lt;/code&amp;gt;. || &amp;lt;code&amp;gt;... vlan-id=40 use-service-tag=no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| VLAN 50 jalan, VLAN 60 tidak || &amp;lt;code&amp;gt;vlan60&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;interface=ether1&amp;lt;/code&amp;gt;, MAC sama dengan &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; || Dropdown Interface terpilih port WAN || &amp;lt;code&amp;gt;/interface vlan set vlan60 interface=bridge-vlan&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Efek samping VLAN interface ber-ID 1 di atas bridge: muncul entri dinamis &amp;lt;code&amp;gt;VLAN 1 ;;; added by vlan on bridge&amp;lt;/code&amp;gt; di tabel VLAN.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosis cepat ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kalau satu VLAN jalan dan VLAN lain tidak&amp;#039;&amp;#039;&amp;#039; di trunk yang sama, jalur fisik dan trunk sudah benar. Fokus ke konfigurasi khusus VLAN yang gagal.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Menentukan layer masalah&amp;#039;&amp;#039;&amp;#039;: jalankan DHCP di client, sementara di router:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/tool torch interface=vlan60&lt;br /&gt;
/tool sniffer quick interface=ether6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Ada traffic di &amp;lt;code&amp;gt;vlanXX&amp;lt;/code&amp;gt; → paket sampai, masalah di DHCP/IP.&lt;br /&gt;
* Kosong → masalah di VLAN ID, interface induk, atau tabel bridge VLAN.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Perintah pengecekan lengkap&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/interface vlan print detail&lt;br /&gt;
/interface bridge print&lt;br /&gt;
/interface bridge port print&lt;br /&gt;
/interface bridge vlan print&lt;br /&gt;
/ip address print&lt;br /&gt;
/ip pool print&lt;br /&gt;
/ip dhcp-server print&lt;br /&gt;
/ip dhcp-server network print&lt;br /&gt;
/ip dhcp-server lease print&lt;br /&gt;
/log print where topics~&amp;quot;dhcp&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Checklist VLAN baru ==&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Bridge → VLANs&amp;#039;&amp;#039;&amp;#039;: VLAN ID; &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; + port trunk di Tagged; access port di Untagged.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Interfaces → VLAN&amp;#039;&amp;#039;&amp;#039;: cek &amp;#039;&amp;#039;&amp;#039;vlan-id&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;interface = bridge-vlan&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;use-service-tag = no&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;IP → Addresses&amp;#039;&amp;#039;&amp;#039;: gateway &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;DHCP&amp;#039;&amp;#039;&amp;#039;: gateway/DNS di Networks.&lt;br /&gt;
# Langsung jalankan &amp;lt;code&amp;gt;/interface vlan print detail&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tips&amp;#039;&amp;#039;&amp;#039;: simpan blok CLI VLAN sebagai template, ganti angkanya, lalu copy-paste. Sebagian besar kesalahan di lab ini terjadi saat mengisi form GUI.&lt;br /&gt;
&lt;br /&gt;
== Latihan ==&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Tebak dulu&amp;#039;&amp;#039;&amp;#039;: hapus &amp;lt;code&amp;gt;ether6&amp;lt;/code&amp;gt; dari Tagged di VLAN 60. Di container, &amp;lt;code&amp;gt;dhclient -r eth0.60&amp;lt;/code&amp;gt; lalu &amp;lt;code&amp;gt;dhclient -v eth0.60&amp;lt;/code&amp;gt;. Apa yang terjadi? Apakah VLAN 50 dan 70 ikut terdampak?&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;IP manajemen statis&amp;#039;&amp;#039;&amp;#039;: lepas DHCP di &amp;lt;code&amp;gt;eth0.50&amp;lt;/code&amp;gt;, pasang &amp;lt;code&amp;gt;172.16.50.20/24&amp;lt;/code&amp;gt; dengan gateway &amp;lt;code&amp;gt;172.16.50.1&amp;lt;/code&amp;gt;, sampai container bisa &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt; lewat VLAN 50.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Detektif&amp;#039;&amp;#039;&amp;#039;: di &amp;#039;&amp;#039;&amp;#039;Bridge → Hosts&amp;#039;&amp;#039;&amp;#039;, MAC container muncul berapa kali dan di VLAN apa saja? Kenapa satu MAC bisa muncul beberapa kali?&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Tebak dulu&amp;#039;&amp;#039;&amp;#039;: hapus &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; dari Tagged di VLAN 20 (biarkan &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt; untagged). Apakah Tamu masih bisa mendapat IP? Ping gateway? Ping Staff1?&lt;br /&gt;
&lt;br /&gt;
== Catatan ==&lt;br /&gt;
Bridge VLAN filtering sudah melampaui cakupan dasar MTCNA dan lebih dekat ke materi switching. Kesalahan di lab ini hampir semuanya salah input, bukan salah konsep. Kemampuan yang paling berguna bukan menghafal menu, tapi melacak kenapa sesuatu tidak berjalan.&lt;br /&gt;
&lt;br /&gt;
== Ringkasan ==&lt;br /&gt;
* Satu VLAN di satu port → VLAN interface di port. Satu VLAN di banyak port → bridge VLAN filtering.&lt;br /&gt;
* PVID = VLAN untuk frame polos yang masuk. Tabel VLAN = keanggotaan dan tagged/untagged saat keluar.&lt;br /&gt;
* VLAN interface (gateway) ditempel di bridge, dan bridge harus tagged di setiap VLAN.&lt;br /&gt;
* Nyalakan &amp;lt;code&amp;gt;vlan-filtering&amp;lt;/code&amp;gt; paling akhir, dengan Safe Mode di router produksi.&lt;br /&gt;
* Flag R bukan jaminan benar: biasakan &amp;lt;code&amp;gt;print detail&amp;lt;/code&amp;gt;.&lt;/div&gt;</description>
			<pubDate>Mon, 26 Oct 2026 09:41:07 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Mikrotik_5:_Bridge_VLAN_Filtering</comments>
		</item>
		<item>
			<title>Networking</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=884&amp;oldid=882</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=884&amp;oldid=882</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:41, 26 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l17&quot;&gt;Line 17:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 17:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 3: Bridge]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 3: Bridge]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 4: VLAN]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 4: VLAN]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Mikrotik 5: Bridge VLAN Filtering]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Cisco =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Cisco =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Mon, 26 Oct 2026 09:41:01 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Networking</comments>
		</item>
		<item>
			<title>Mikrotik 4: VLAN</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_4:_VLAN&amp;diff=883&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_4:_VLAN&amp;diff=883&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;== Tujuan == * Paham VLAN, tag 802.1Q, access port, dan trunk port. * Bisa membuat VLAN interface dan gateway per VLAN di RouterOS. * Bisa melihat tag VLAN di Wireshark. * Paham dua kesalahan klasik: VLAN ditentukan port switch, dan trunk yang tidak sepakat di kedua ujung.  == Konsep ==  === Masalah yang diselesaikan VLAN === Tanpa VLAN, setiap segmen butuh port router, switch, dan jalur kabel sendiri. Lima segmen (staff, tamu, CCTV, server, manajemen) berarti lima port...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Tujuan ==&lt;br /&gt;
* Paham VLAN, tag 802.1Q, access port, dan trunk port.&lt;br /&gt;
* Bisa membuat VLAN interface dan gateway per VLAN di RouterOS.&lt;br /&gt;
* Bisa melihat tag VLAN di Wireshark.&lt;br /&gt;
* Paham dua kesalahan klasik: VLAN ditentukan port switch, dan trunk yang tidak sepakat di kedua ujung.&lt;br /&gt;
&lt;br /&gt;
== Konsep ==&lt;br /&gt;
&lt;br /&gt;
=== Masalah yang diselesaikan VLAN ===&lt;br /&gt;
Tanpa VLAN, setiap segmen butuh port router, switch, dan jalur kabel sendiri. Lima segmen (staff, tamu, CCTV, server, manajemen) berarti lima port router, lima switch, lima kabel.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;VLAN (Virtual LAN)&amp;#039;&amp;#039;&amp;#039; memecah satu switch fisik menjadi beberapa switch virtual yang terisolasi di Layer 2. Setiap VLAN punya nomor (&amp;#039;&amp;#039;&amp;#039;VLAN ID&amp;#039;&amp;#039;&amp;#039;, 1–4094). Perangkat di VLAN berbeda tidak bisa saling meng-ARP, persis seperti berada di switch berbeda.&lt;br /&gt;
&lt;br /&gt;
=== Tag 802.1Q ===&lt;br /&gt;
Satu kabel bisa membawa banyak VLAN karena setiap frame diberi &amp;#039;&amp;#039;&amp;#039;tag&amp;#039;&amp;#039;&amp;#039; (label) berisi VLAN ID. Standarnya &amp;#039;&amp;#039;&amp;#039;IEEE 802.1Q&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Frame biasa:   [Dst MAC][Src MAC][Type][ Data ][FCS]&lt;br /&gt;
Frame 802.1Q:  [Dst MAC][Src MAC][TAG][Type][ Data ][FCS]&lt;br /&gt;
                                  └ 4 byte tambahan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isi tag (4 byte):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bagian !! Ukuran !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;TPID&amp;#039;&amp;#039;&amp;#039; || 16 bit || Penanda &amp;lt;code&amp;gt;0x8100&amp;lt;/code&amp;gt;: &amp;quot;frame ini bertag 802.1Q&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;PRI&amp;#039;&amp;#039;&amp;#039; (PCP) || 3 bit || Prioritas untuk QoS (misalnya VoIP didahulukan)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;DEI&amp;#039;&amp;#039;&amp;#039; || 1 bit || Tanda boleh dibuang lebih dulu saat padat&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;VLAN ID&amp;#039;&amp;#039;&amp;#039; || 12 bit || Nomor VLAN (2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt; = 4096, dipakai 1–4094)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Contoh di Wireshark:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ethernet II, Src: 00:50:79:66:68:00, Dst: ...&lt;br /&gt;
802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 10      ← tag&lt;br /&gt;
Internet Protocol Version 4, Src: 172.16.10.x, Dst: 8.8.8.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access port vs trunk port ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Access port !! Trunk port&lt;br /&gt;
|-&lt;br /&gt;
| Membawa || &amp;#039;&amp;#039;&amp;#039;Satu&amp;#039;&amp;#039;&amp;#039; VLAN || &amp;#039;&amp;#039;&amp;#039;Banyak&amp;#039;&amp;#039;&amp;#039; VLAN&lt;br /&gt;
|-&lt;br /&gt;
| Frame || &amp;#039;&amp;#039;&amp;#039;Untagged&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Tagged&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Tersambung ke || PC, printer, CCTV || Switch lain, router, server Proxmox&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PC tidak tahu apa-apa soal VLAN.&amp;#039;&amp;#039;&amp;#039; PC mengirim frame polos. Switch menempelkan tag saat frame masuk dari access port, dan melepas tag saat frame keluar ke access port. Tag hanya hidup di jalur trunk.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Native VLAN&amp;#039;&amp;#039;&amp;#039;: VLAN yang lewat trunk &amp;#039;&amp;#039;&amp;#039;tanpa tag&amp;#039;&amp;#039;&amp;#039;. Di switch GNS3, kolom VLAN pada port &amp;lt;code&amp;gt;dot1q&amp;lt;/code&amp;gt; adalah native VLAN (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Router-on-a-stick ===&lt;br /&gt;
Setiap VLAN adalah segmen terpisah, sehingga butuh &amp;#039;&amp;#039;&amp;#039;subnet dan gateway sendiri&amp;#039;&amp;#039;&amp;#039;. Router cukup tersambung ke switch dengan &amp;#039;&amp;#039;&amp;#039;satu kabel trunk&amp;#039;&amp;#039;&amp;#039;, lalu membuat satu &amp;#039;&amp;#039;&amp;#039;VLAN interface&amp;#039;&amp;#039;&amp;#039; per VLAN (misalnya &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;). Setiap VLAN interface diberi IP gateway. Satu kabel, banyak gateway.&lt;br /&gt;
&lt;br /&gt;
=== Keuntungan dan harga yang dibayar ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Keuntungan&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Hemat port router: satu port trunk bisa membawa banyak segmen.&lt;br /&gt;
* Hemat switch: satu switch fisik dipakai bersama semua segmen.&lt;br /&gt;
* Hemat kabel antar lantai/ruangan: cukup satu trunk per switch.&lt;br /&gt;
* Fleksibel: memindahkan PC ke segmen lain cukup mengubah setting port switch.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Harga yang dibayar&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Bandwidth trunk dibagi&amp;#039;&amp;#039;&amp;#039; semua VLAN. Traffic antar VLAN naik ke router lewat trunk lalu turun lagi lewat trunk yang sama.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Single point of failure&amp;#039;&amp;#039;&amp;#039;: trunk putus = semua VLAN di switch itu putus.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Butuh managed switch&amp;#039;&amp;#039;&amp;#039;. Switch unmanaged tidak mengerti tag.&lt;br /&gt;
* CPU router mengerjakan semua routing antar VLAN.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solusi umum&amp;#039;&amp;#039;&amp;#039;: trunk di port cepat (SFP+ 10 Gbps), &amp;#039;&amp;#039;&amp;#039;bonding/LACP&amp;#039;&amp;#039;&amp;#039; (beberapa kabel menjadi satu trunk dengan cadangan), atau &amp;#039;&amp;#039;&amp;#039;switch Layer 3&amp;#039;&amp;#039;&amp;#039; untuk routing antar VLAN di kantor besar.&lt;br /&gt;
&lt;br /&gt;
=== Managed vs unmanaged switch ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Unmanaged !! Managed (termasuk &amp;quot;smart/easy smart&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| Setup || Colok langsung jalan || Colok langsung jalan, tapi bisa dikonfigurasi&lt;br /&gt;
|-&lt;br /&gt;
| IP / web UI || Tidak ada || Ada (web UI, SSH/CLI, port console)&lt;br /&gt;
|-&lt;br /&gt;
| VLAN || Tidak || Ya&lt;br /&gt;
|-&lt;br /&gt;
| Fitur lain || – || Monitoring per port, port mirroring, LACP, STP, limit bandwidth&lt;br /&gt;
|-&lt;br /&gt;
| Contoh || Switch 5–8 port murah || MikroTik CRS/CSS, Cisco Catalyst, TP-Link Easy Smart/JetStream, UniFi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Managed switch baru &amp;#039;&amp;#039;&amp;#039;berperilaku seperti unmanaged&amp;#039;&amp;#039;&amp;#039;: semua port default &amp;lt;code&amp;gt;access VLAN 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Jebakan di kantor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Unmanaged switch di &amp;#039;&amp;#039;&amp;#039;access port VLAN 10&amp;#039;&amp;#039;&amp;#039; → semua perangkat di switch kecil itu masuk VLAN 10. Normal dan sering disengaja.&lt;br /&gt;
* Unmanaged switch di &amp;#039;&amp;#039;&amp;#039;trunk port&amp;#039;&amp;#039;&amp;#039; → perangkat hanya mendapat native VLAN, sementara frame bertag VLAN lain ikut diteruskan. Gejalanya: &amp;quot;PC di ruangan ini dapat IP dari segmen yang salah.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Lab ==&lt;br /&gt;
&lt;br /&gt;
=== Topologi ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                 [NAT]&lt;br /&gt;
                   │&lt;br /&gt;
                 ether1 (WAN, DHCP client)&lt;br /&gt;
                   │&lt;br /&gt;
                 [CHR]&lt;br /&gt;
                 ether2&lt;br /&gt;
                   ║  trunk (VLAN 10 + 20)&lt;br /&gt;
                   ║&lt;br /&gt;
               [Switch1]&lt;br /&gt;
           port1  port2  port3&lt;br /&gt;
          VLAN10 VLAN10 VLAN20&lt;br /&gt;
            │      │      │&lt;br /&gt;
         Staff1 Staff2  Tamu&lt;br /&gt;
&lt;br /&gt;
  vlan10 → 172.16.10.1/24  (staff)&lt;br /&gt;
  vlan20 → 172.16.20.1/24  (tamu)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Konvensi alamat&amp;#039;&amp;#039;&amp;#039;: range privat &amp;lt;code&amp;gt;172.16.0.0/12&amp;lt;/code&amp;gt;, dengan oktet ketiga = VLAN ID (VLAN 10 → &amp;lt;code&amp;gt;172.16.10.0/24&amp;lt;/code&amp;gt;). Memudahkan saat VLAN sudah puluhan.&lt;br /&gt;
&lt;br /&gt;
=== 1. Persiapan host dan project ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo virsh net-start default 2&amp;gt;/dev/null&lt;br /&gt;
sudo iptables -I DOCKER-USER -i virbr0 -j ACCEPT&lt;br /&gt;
sudo iptables -I DOCKER-USER -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* GNS3: &amp;#039;&amp;#039;&amp;#039;File → New blank project&amp;#039;&amp;#039;&amp;#039; (contoh nama: &amp;lt;code&amp;gt;fase2-vlan&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Perangkat: NAT, MikroTik CHR, Ethernet switch, 3 VPCS (beri nama Staff1, Staff2, Tamu).&lt;br /&gt;
&lt;br /&gt;
=== 2. Konfigurasi switch GNS3 ===&lt;br /&gt;
Nyalakan &amp;#039;&amp;#039;&amp;#039;View → Show interface labels&amp;#039;&amp;#039;&amp;#039; untuk melihat nomor port tiap kabel, lalu klik kanan switch → &amp;#039;&amp;#039;&amp;#039;Configure&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Untuk setiap port: klik barisnya di daftar &amp;#039;&amp;#039;&amp;#039;Ports&amp;#039;&amp;#039;&amp;#039;, isi &amp;#039;&amp;#039;&amp;#039;VLAN&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;Type&amp;#039;&amp;#039;&amp;#039;, lalu klik &amp;#039;&amp;#039;&amp;#039;Add&amp;#039;&amp;#039;&amp;#039; (menimpa setting port dengan nomor yang sama). Akhiri dengan &amp;#039;&amp;#039;&amp;#039;Apply → OK&amp;#039;&amp;#039;&amp;#039;. Kalau perubahan tidak tersimpan, stop switch dulu.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Port !! Ke !! VLAN !! Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CHR &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; || 1 || &amp;lt;code&amp;gt;dot1q&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Staff1 || 10 || &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Staff2 || 10 || &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Tamu || 20 || &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dot1q&amp;lt;/code&amp;gt; = trunk 802.1Q. QinQ EtherType dibiarkan &amp;lt;code&amp;gt;0x8100&amp;lt;/code&amp;gt; (hanya dipakai pada type &amp;lt;code&amp;gt;qinq&amp;lt;/code&amp;gt;). Sesuaikan nomor port dengan label kabel.&lt;br /&gt;
&lt;br /&gt;
=== 3. Setup dasar CHR ===&lt;br /&gt;
Di console:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/system identity set name=router-vlan&lt;br /&gt;
/ip address print&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Catat IP WAN di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;, connect Winbox, lalu:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IP → Firewall → NAT&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;srcnat&amp;lt;/code&amp;gt;, Out. Interface &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;masquerade&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IP → DNS&amp;#039;&amp;#039;&amp;#039;: centang &amp;#039;&amp;#039;&amp;#039;Allow Remote Requests&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Tes: &amp;lt;code&amp;gt;/ping 8.8.8.8 count=3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. VLAN interface dan gateway ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Winbox !! Isian !! CLI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Interfaces → VLAN&amp;#039;&amp;#039;&amp;#039; → New || &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;, VLAN ID &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, Interface &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/interface vlan add name=vlan10 vlan-id=10 interface=ether2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Interfaces → VLAN&amp;#039;&amp;#039;&amp;#039; → New || &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;, VLAN ID &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt;, Interface &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/interface vlan add name=vlan20 vlan-id=20 interface=ether2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;IP → Addresses&amp;#039;&amp;#039;&amp;#039; → New || &amp;lt;code&amp;gt;172.16.10.1/24&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;, comment &amp;lt;code&amp;gt;VLAN10-staff&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip address add address=172.16.10.1/24 interface=vlan10 comment=VLAN10-staff&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;IP → Addresses&amp;#039;&amp;#039;&amp;#039; → New || &amp;lt;code&amp;gt;172.16.20.1/24&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;, comment &amp;lt;code&amp;gt;VLAN20-tamu&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip address add address=172.16.20.1/24 interface=vlan20 comment=VLAN20-tamu&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; sendiri &amp;#039;&amp;#039;&amp;#039;tidak diberi IP&amp;#039;&amp;#039;&amp;#039;. Ia hanya kabel trunk, sedangkan kerja Layer 3 ada di &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;. Sama seperti aturan bridge: IP di interface logis, bukan di port fisik.&lt;br /&gt;
&lt;br /&gt;
=== 5. DHCP per VLAN ===&lt;br /&gt;
Setiap VLAN butuh &amp;#039;&amp;#039;&amp;#039;pool, network, dan server sendiri&amp;#039;&amp;#039;&amp;#039; karena subnetnya berbeda.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lewat DHCP Setup&amp;#039;&amp;#039;&amp;#039; (jalankan untuk &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;, lalu &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;): wizard membuat pool otomatis. Ubah &amp;#039;&amp;#039;&amp;#039;Addresses to Give Out&amp;#039;&amp;#039;&amp;#039; menjadi &amp;lt;code&amp;gt;.100–.200&amp;lt;/code&amp;gt; agar &amp;lt;code&amp;gt;.2–.99&amp;lt;/code&amp;gt; tetap kosong untuk perangkat statis.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Manual&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bagian !! VLAN 10 !! VLAN 20&lt;br /&gt;
|-&lt;br /&gt;
| Pool || &amp;lt;code&amp;gt;172.16.10.100-172.16.10.200&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;172.16.20.100-172.16.20.200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Network || &amp;lt;code&amp;gt;172.16.10.0/24&amp;lt;/code&amp;gt;, gateway &amp;amp; DNS &amp;lt;code&amp;gt;172.16.10.1&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;172.16.20.0/24&amp;lt;/code&amp;gt;, gateway &amp;amp; DNS &amp;lt;code&amp;gt;172.16.20.1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Server || Interface &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt; || Interface &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Periksa&amp;#039;&amp;#039;&amp;#039;: pool di subnet yang benar, gateway/DNS = &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt;, server menempel di &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt; (bukan &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;). Rule NAT tidak perlu diubah.&lt;br /&gt;
&lt;br /&gt;
== Verifikasi ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ip dhcp&lt;br /&gt;
show ip&lt;br /&gt;
ping 8.8.8.8&lt;br /&gt;
trace &amp;lt;IP PC lain&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Staff1 dan Staff2 mendapat &amp;lt;code&amp;gt;172.16.10.x&amp;lt;/code&amp;gt;, Tamu mendapat &amp;lt;code&amp;gt;172.16.20.x&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; Staff1 → Staff2: langsung sampai (satu VLAN, di-switch).&lt;br /&gt;
* &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; Staff1 → Tamu: lewat &amp;lt;code&amp;gt;172.16.10.1&amp;lt;/code&amp;gt; (beda VLAN, di-route).&lt;br /&gt;
&lt;br /&gt;
Ketiganya tersambung ke &amp;#039;&amp;#039;&amp;#039;switch fisik yang sama&amp;#039;&amp;#039;&amp;#039;, tapi VLAN memisahkan mereka di Layer 2.&lt;br /&gt;
&lt;br /&gt;
Kalau PC hanya menampilkan &amp;quot;DDD&amp;quot;, periksa dulu kecocokan nomor port switch dengan label kabel.&lt;br /&gt;
&lt;br /&gt;
== Latihan dan pembahasan ==&lt;br /&gt;
&lt;br /&gt;
=== Soal 1: melihat tag ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Soal&amp;#039;&amp;#039;&amp;#039;: capture Wireshark di kabel CHR ↔ Switch1 (trunk) dan Switch1 ↔ Staff1 (access), lalu ping dari Staff1. Di mana ada tag 802.1Q? VLAN ID-nya berapa?&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pembahasan&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Trunk&amp;#039;&amp;#039;&amp;#039;: ada baris &amp;lt;code&amp;gt;802.1Q Virtual LAN&amp;lt;/code&amp;gt; dengan &amp;#039;&amp;#039;&amp;#039;ID 10 dan ID 20&amp;#039;&amp;#039;&amp;#039;. Meskipun ping hanya dari Staff1 (VLAN 10), traffic Tamu (ARP, DHCP renew) juga lewat kabel yang sama. Bukti satu trunk membawa banyak VLAN.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Access&amp;#039;&amp;#039;&amp;#039;: tidak ada tag, frame polos.&lt;br /&gt;
* Alur: Staff1 mengirim frame polos → Switch1 menempelkan tag &amp;lt;code&amp;gt;ID: 10&amp;lt;/code&amp;gt; → CHR membaca tag dan menyerahkan frame ke &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;. Arah balik, switch melepas tag sebelum frame sampai ke Staff1.&lt;br /&gt;
&lt;br /&gt;
=== Soal 2: menambah VLAN CCTV ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Soal&amp;#039;&amp;#039;&amp;#039;: buat VLAN 30 (&amp;lt;code&amp;gt;172.16.30.0/24&amp;lt;/code&amp;gt;) dengan PC4 sampai bisa internetan.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pembahasan&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Di mana !! Perubahan&lt;br /&gt;
|-&lt;br /&gt;
| Router || &amp;#039;&amp;#039;&amp;#039;Interfaces → VLAN&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt;, ID &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt;, di &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Router || &amp;#039;&amp;#039;&amp;#039;IP → Addresses&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;172.16.30.1/24&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Router || DHCP: pool, network (gateway/DNS &amp;lt;code&amp;gt;172.16.30.1&amp;lt;/code&amp;gt;), server di &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Router || NAT: tidak perlu diubah&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Port PC4: &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt; VLAN &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Port trunk: tidak diubah (di GNS3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Jangan lupa IP gateway&amp;#039;&amp;#039;&amp;#039; di &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt;. DHCP Setup bisa berjalan tanpanya, tapi PC akan mendapat gateway yang tidak ada di router.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Trunk di GNS3&amp;#039;&amp;#039;&amp;#039; otomatis membawa semua VLAN. Di banyak switch sungguhan (termasuk MikroTik), trunk harus &amp;#039;&amp;#039;&amp;#039;didaftarkan VLAN mana saja yang boleh lewat&amp;#039;&amp;#039;&amp;#039;. Lupa menambahkan VLAN baru ke trunk = PC di VLAN itu &amp;quot;DDD&amp;quot; terus, padahal konfigurasi lain sudah benar.&lt;br /&gt;
* Beri comment &amp;lt;code&amp;gt;VLAN30-cctv&amp;lt;/code&amp;gt; di semua objek terkait.&lt;br /&gt;
&lt;br /&gt;
=== Soal 3: memindahkan VLAN tanpa menyentuh PC ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Soal&amp;#039;&amp;#039;&amp;#039;: ubah port Tamu dari access VLAN 20 menjadi access VLAN 10, tanpa mengubah PC. Lalu &amp;lt;code&amp;gt;ip dhcp -x&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ip dhcp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hasil&amp;#039;&amp;#039;&amp;#039;: Tamu mendapat &amp;lt;code&amp;gt;172.16.10.x&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pembahasan&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;&amp;#039;VLAN sebuah PC ditentukan oleh port switch tempat ia tersambung.&amp;#039;&amp;#039;&amp;#039; PC tidak tahu dan tidak bisa memilih.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Enak&amp;#039;&amp;#039;&amp;#039;: memindahkan karyawan ke segmen lain cukup mengubah port switch.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Bahaya&amp;#039;&amp;#039;&amp;#039;: siapa pun yang mencolok laptop ke port staff langsung masuk jaringan staff. Keamanan port fisik penting. Solusi lanjutannya &amp;#039;&amp;#039;&amp;#039;802.1X&amp;#039;&amp;#039;&amp;#039; (perangkat harus login sebelum port dibuka), yaitu fitur di menu &amp;#039;&amp;#039;&amp;#039;Dot1X&amp;#039;&amp;#039;&amp;#039; RouterOS.&lt;br /&gt;
&lt;br /&gt;
=== Soal 4: trunk yang salah ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Soal&amp;#039;&amp;#039;&amp;#039;: ubah port trunk (port 0) dari &amp;lt;code&amp;gt;dot1q&amp;lt;/code&amp;gt; menjadi &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt; VLAN 10.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hasil&amp;#039;&amp;#039;&amp;#039;: Staff1 dan Tamu sama-sama tidak bisa internetan, tapi dengan alasan berbeda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Normal (dot1q):     switch ══[tag 10][tag 20]══► CHR → vlan10 / vlan20 ✅&lt;br /&gt;
Salah (access 10):  switch ───[polos, VLAN 10 saja]──► CHR → ether2 (tanpa IP) ❌&lt;br /&gt;
                    VLAN 20 → tidak dikirim sama sekali ❌&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Staff1&amp;#039;&amp;#039;&amp;#039;: switch mengirim traffic VLAN 10 ke CHR &amp;#039;&amp;#039;&amp;#039;tanpa tag&amp;#039;&amp;#039;&amp;#039;. &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt; hanya menerima frame bertag 10, sehingga frame polos jatuh ke &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; yang tidak punya IP. ARP ke gateway tidak pernah terjawab.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tamu&amp;#039;&amp;#039;&amp;#039;: port 0 sekarang hanya anggota VLAN 10, sehingga frame VLAN 20 tidak pernah dikirim keluar. Tamu terkurung di dalam switch.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pelajaran&amp;#039;&amp;#039;&amp;#039;: kedua ujung trunk harus &amp;#039;&amp;#039;&amp;#039;sepakat&amp;#039;&amp;#039;&amp;#039;. Kalau satu sisi mengirim bertag dan sisi lain menunggu polos (atau sebaliknya), link terlihat menyala (lampu hijau, interface Running), tapi traffic tidak tersambung. Sering terjadi saat mengganti switch atau saat ada yang &amp;quot;merapikan&amp;quot; konfigurasi.&lt;br /&gt;
&lt;br /&gt;
== Kesalahan umum ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gejala !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| PC &amp;quot;DDD&amp;quot; setelah setting VLAN || Nomor port switch tidak cocok dengan kabel || Cek &amp;#039;&amp;#039;&amp;#039;Show interface labels&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| PC dapat IP tapi tidak bisa internetan || IP gateway belum dipasang di VLAN interface || &amp;#039;&amp;#039;&amp;#039;IP → Addresses&amp;#039;&amp;#039;&amp;#039; di &amp;lt;code&amp;gt;vlanXX&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC di VLAN baru &amp;quot;DDD&amp;quot; padahal router benar || VLAN belum didaftarkan di trunk switch || Tambahkan VLAN ke daftar trunk&lt;br /&gt;
|-&lt;br /&gt;
| Link menyala tapi semua VLAN putus || Trunk tidak sepakat (tagged vs untagged) || Samakan konfigurasi kedua ujung&lt;br /&gt;
|-&lt;br /&gt;
| PC dapat IP dari segmen yang salah || Port switch salah VLAN, atau unmanaged switch di trunk port || Periksa port dan perangkat yang tersambung&lt;br /&gt;
|-&lt;br /&gt;
| Comment tidak sesuai isi || Typo saat membuat objek || Perbaiki, karena comment adalah dokumentasi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Ringkasan ==&lt;br /&gt;
* VLAN memecah satu switch menjadi beberapa segmen Layer 2 terpisah.&lt;br /&gt;
* Tag 802.1Q (4 byte, berisi VLAN ID) hanya ada di trunk. PC selalu mengirim frame polos.&lt;br /&gt;
* Access = satu VLAN untagged. Trunk = banyak VLAN tagged.&lt;br /&gt;
* Router-on-a-stick: satu trunk, satu VLAN interface + gateway per VLAN.&lt;br /&gt;
* VLAN ditentukan port switch, bukan PC.&lt;br /&gt;
* Kedua ujung trunk harus sepakat.&lt;/div&gt;</description>
			<pubDate>Mon, 26 Oct 2026 06:33:34 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Mikrotik_4:_VLAN</comments>
		</item>
		<item>
			<title>Networking</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=882&amp;oldid=880</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=882&amp;oldid=880</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 06:33, 26 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l16&quot;&gt;Line 16:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 16:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 2: Kantor Mini]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 2: Kantor Mini]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 3: Bridge]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 3: Bridge]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Mikrotik 4: VLAN]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Cisco =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Cisco =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Mon, 26 Oct 2026 06:33:28 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Networking</comments>
		</item>
		<item>
			<title>Mikrotik 3: Bridge</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_3:_Bridge&amp;diff=881&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_3:_Bridge&amp;diff=881&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;&amp;quot;&amp;#039;&amp;#039;bridge&amp;#039;&amp;#039;&amp;#039; adalah cara menggabungkan beberapa port router menjadi satu segmen jaringan.   == Tujuan == * Paham apa itu bridge dan kenapa port router defaultnya berdiri sendiri. * Tahu kapan memakai bridge dan kapan memisahkan segmen. * Bisa membuktikan beda &amp;#039;&amp;#039;&amp;#039;switching&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;routing&amp;#039;&amp;#039;&amp;#039; lewat &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;. * Bisa melacak perangkat ke port fisik lewat &amp;#039;&amp;#039;&amp;#039;Bridge → Hosts&amp;#039;&amp;#039;&amp;#039;.  == Konsep ==  === Port router berdiri sendiri === Di RouterOS, &amp;#039;&amp;#039;&amp;#039;setiap port etherne...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;quot;&amp;#039;&amp;#039;bridge&amp;#039;&amp;#039;&amp;#039; adalah cara menggabungkan beberapa port router menjadi satu segmen jaringan. &lt;br /&gt;
&lt;br /&gt;
== Tujuan ==&lt;br /&gt;
* Paham apa itu bridge dan kenapa port router defaultnya berdiri sendiri.&lt;br /&gt;
* Tahu kapan memakai bridge dan kapan memisahkan segmen.&lt;br /&gt;
* Bisa membuktikan beda &amp;#039;&amp;#039;&amp;#039;switching&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;routing&amp;#039;&amp;#039;&amp;#039; lewat &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bisa melacak perangkat ke port fisik lewat &amp;#039;&amp;#039;&amp;#039;Bridge → Hosts&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Konsep ==&lt;br /&gt;
&lt;br /&gt;
=== Port router berdiri sendiri ===&lt;br /&gt;
Di RouterOS, &amp;#039;&amp;#039;&amp;#039;setiap port ethernet adalah interface terpisah&amp;#039;&amp;#039;&amp;#039;. Tanpa bridge, &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; adalah dua segmen yang sama sekali tidak tersambung, seperti dua switch tanpa kabel penghubung.&lt;br /&gt;
&lt;br /&gt;
Konsekuensinya:&lt;br /&gt;
* Setiap port yang dipakai butuh &amp;#039;&amp;#039;&amp;#039;subnet sendiri&amp;#039;&amp;#039;&amp;#039; (seperti Part 2: &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;192.168.10.0/24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;192.168.11.0/24&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Subnet yang sama &amp;#039;&amp;#039;&amp;#039;tidak bisa&amp;#039;&amp;#039;&amp;#039; dipasang di dua port (network tidak boleh tumpang tindih).&lt;br /&gt;
* Port tanpa IP dan bukan anggota bridge &amp;#039;&amp;#039;&amp;#039;tidak melakukan apa-apa&amp;#039;&amp;#039;&amp;#039;. Perangkat yang dicolok ke sana tidak mendapat apa pun.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Perangkat !! Kondisi default port LAN&lt;br /&gt;
|-&lt;br /&gt;
| Router rumahan || Sudah menjadi satu switch dari pabrik&lt;br /&gt;
|-&lt;br /&gt;
| Router MikroTik fisik || Biasanya membawa &amp;#039;&amp;#039;&amp;#039;defconf&amp;#039;&amp;#039;&amp;#039;: port LAN sudah dimasukkan ke &amp;lt;code&amp;gt;bridge&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CHR || Tidak ada defconf, setiap port berdiri sendiri&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bridge dengan comment &amp;lt;code&amp;gt;defconf&amp;lt;/code&amp;gt; di router MikroTik adalah bridge bawaan pabrik. Bridge lain biasanya dibuat oleh admin untuk memisahkan segmen.&lt;br /&gt;
&lt;br /&gt;
=== Apa itu bridge ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bridge adalah switch versi software di dalam router.&amp;#039;&amp;#039;&amp;#039; Port yang dimasukkan ke satu bridge menjadi &amp;#039;&amp;#039;&amp;#039;satu segmen Layer 2&amp;#039;&amp;#039;&amp;#039;, seolah dicolok ke satu switch.&lt;br /&gt;
&lt;br /&gt;
Konsep yang sama dipakai di tempat lain:&lt;br /&gt;
* &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; (libvirt, [[Belajar MikroTik Part 1|Part 1]])&lt;br /&gt;
* &amp;lt;code&amp;gt;vmbr0&amp;lt;/code&amp;gt; (Proxmox)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dua aturan penting&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;IP, DHCP server, dan konfigurasi Layer 3 lainnya dipasang di bridge&amp;#039;&amp;#039;&amp;#039;, bukan di port anggotanya. Port anggota hanya menjadi &amp;quot;colokan switch&amp;quot;.&lt;br /&gt;
# Port anggota bridge mendapat flag &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; (slave). Flag &amp;#039;&amp;#039;&amp;#039;RS&amp;#039;&amp;#039;&amp;#039; = Running + Slave.&lt;br /&gt;
&lt;br /&gt;
=== Bridge vs segmen terpisah ===&lt;br /&gt;
Analogi: bridge = satu ruangan besar, semua bisa langsung bicara. Segmen terpisah = banyak ruangan, komunikasi antar ruangan lewat resepsionis (router).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Segmen terpisah (routed) !! Bridge (switched)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Konfigurasi&amp;#039;&amp;#039;&amp;#039; || Subnet, pool, DHCP server, DHCP network per port || Satu set untuk semua port&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Pindah colokan&amp;#039;&amp;#039;&amp;#039; || IP ikut berubah || IP tetap&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Discovery berbasis broadcast/multicast&amp;#039;&amp;#039;&amp;#039; (printer, network discovery, AirPlay, Wake-on-LAN) || Tidak menyeberang subnet || Berjalan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Kinerja antar port&amp;#039;&amp;#039;&amp;#039; || Di-route oleh CPU || Di perangkat fisik bisa memakai &amp;#039;&amp;#039;&amp;#039;hardware offload&amp;#039;&amp;#039;&amp;#039; switch chip (di CHR semuanya software)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Isolasi&amp;#039;&amp;#039;&amp;#039; || Bisa diberi firewall antar segmen || Tidak ada isolasi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Dampak masalah&amp;#039;&amp;#039;&amp;#039; (loop, broadcast storm, rogue DHCP) || Terbatas di satu segmen || Mengenai semua perangkat di bridge&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kapan memakai yang mana&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Port LAN biasa untuk karyawan → &amp;#039;&amp;#039;&amp;#039;bridge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Perlu memisahkan tamu, CCTV, atau server → &amp;#039;&amp;#039;&amp;#039;segmen terpisah&amp;#039;&amp;#039;&amp;#039; + firewall.&lt;br /&gt;
&lt;br /&gt;
Di kantor biasanya &amp;#039;&amp;#039;&amp;#039;kombinasi&amp;#039;&amp;#039;&amp;#039;: beberapa bridge, masing-masing berisi beberapa port, dan antar bridge di-route. Memisahkan segmen per port fisik itu kaku, sehingga solusi modernnya adalah &amp;#039;&amp;#039;&amp;#039;VLAN&amp;#039;&amp;#039;&amp;#039; ([[Belajar MikroTik Part 4|Part 4]]).&lt;br /&gt;
&lt;br /&gt;
== Lab: menggabungkan ether2 + ether3 ==&lt;br /&gt;
&lt;br /&gt;
=== Topologi ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                    [NAT]&lt;br /&gt;
                      │&lt;br /&gt;
                    ether1 (WAN)&lt;br /&gt;
                      │&lt;br /&gt;
               [MikroTikCHR-1]&lt;br /&gt;
                 │         │          │&lt;br /&gt;
          ┌── bridge-lan ──┐       ether4&lt;br /&gt;
          │ 192.168.10.1/24│     192.168.20.1/24&lt;br /&gt;
        ether2          ether3        │&lt;br /&gt;
          │               │        [Switch3]&lt;br /&gt;
      [Switch1]       [Switch2]        │&lt;br /&gt;
     PC1 PC2 PC3      PC4 PC5         PC6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; digabung di &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt;, sehingga PC1–PC5 berada di satu subnet.&lt;br /&gt;
* &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt; berdiri sendiri dengan subnet &amp;lt;code&amp;gt;192.168.20.0/24&amp;lt;/code&amp;gt; sebagai &amp;#039;&amp;#039;&amp;#039;pembanding&amp;#039;&amp;#039;&amp;#039; segmen yang di-route.&lt;br /&gt;
&lt;br /&gt;
=== 0. Backup dulu ===&lt;br /&gt;
Biasakan sebelum mengubah konfigurasi:&lt;br /&gt;
* GNS3: &amp;#039;&amp;#039;&amp;#039;Edit → Manage snapshots → Create&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* atau di terminal router:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/export file=fase1-selesai&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 1. Hapus konfigurasi LAN2 lama ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IP → Addresses&amp;#039;&amp;#039;&amp;#039;: hapus &amp;lt;code&amp;gt;192.168.11.1/24&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IP → DHCP Server → DHCP&amp;#039;&amp;#039;&amp;#039;: hapus server di &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IP → DHCP Server → Networks&amp;#039;&amp;#039;&amp;#039;: hapus &amp;lt;code&amp;gt;192.168.11.0/24&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IP → Pool&amp;#039;&amp;#039;&amp;#039;: hapus &amp;lt;code&amp;gt;pool-lan2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2–5. Buat bridge dan pindahkan konfigurasi ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! Winbox !! Isian !! CLI&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &amp;#039;&amp;#039;&amp;#039;Bridge → Bridge&amp;#039;&amp;#039;&amp;#039; → New || Name &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/interface bridge add name=bridge-lan&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &amp;#039;&amp;#039;&amp;#039;Bridge → Ports&amp;#039;&amp;#039;&amp;#039; → New (dua kali) || &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; ke &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/interface bridge port add bridge=bridge-lan interface=ether2&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;/interface bridge port add bridge=bridge-lan interface=ether3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &amp;#039;&amp;#039;&amp;#039;IP → Addresses&amp;#039;&amp;#039;&amp;#039; → edit &amp;lt;code&amp;gt;192.168.10.1/24&amp;lt;/code&amp;gt; || Interface: &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip address set [find address=&amp;quot;192.168.10.1/24&amp;quot;] interface=bridge-lan&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &amp;#039;&amp;#039;&amp;#039;IP → DHCP Server → DHCP&amp;#039;&amp;#039;&amp;#039; → edit server LAN || Interface: &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip dhcp-server set [find interface=ether2] interface=bridge-lan&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rule NAT tidak perlu diubah, karena tetap mencocokkan &amp;lt;code&amp;gt;out-interface=ether1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 6. Perbarui IP di semua PC ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ip dhcp -x&lt;br /&gt;
ip dhcp&lt;br /&gt;
show ip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pembanding: segmen ether4 ===&lt;br /&gt;
Untuk Switch3 + PC6, &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt; dikonfigurasi seperti LAN di Part 2: IP &amp;lt;code&amp;gt;192.168.20.1/24&amp;lt;/code&amp;gt;, pool, DHCP network (gateway &amp;amp; DNS &amp;lt;code&amp;gt;192.168.20.1&amp;lt;/code&amp;gt;), dan DHCP server sendiri.&lt;br /&gt;
&lt;br /&gt;
== Verifikasi ==&lt;br /&gt;
* PC1–PC5 mendapat IP &amp;lt;code&amp;gt;192.168.10.x&amp;lt;/code&amp;gt; dari pool yang sama dengan gateway &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Interfaces&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; berflag &amp;#039;&amp;#039;&amp;#039;RS&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Bridge → Hosts&amp;#039;&amp;#039;&amp;#039;: daftar MAC semua PC beserta port tempat mereka terhubung.&lt;br /&gt;
* &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt; dari PC berhasil.&lt;br /&gt;
&lt;br /&gt;
== Membaca &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
trace &amp;lt;IP tujuan&amp;gt;            # di VPCS&lt;br /&gt;
/tool traceroute 8.8.8.8     # di router&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setiap baris adalah satu &amp;#039;&amp;#039;&amp;#039;hop&amp;#039;&amp;#039;&amp;#039;, yaitu perangkat Layer 3 (router) yang dilewati. Trace mengirim paket dengan &amp;#039;&amp;#039;&amp;#039;TTL&amp;#039;&amp;#039;&amp;#039; kecil (mulai dari 1). Setiap router mengurangi TTL satu, dan router tempat TTL habis membalas, sehingga trace bisa menyusun daftar router di sepanjang jalur.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Switch dan bridge tidak mengurangi TTL&amp;#039;&amp;#039;&amp;#039;, sehingga tidak pernah muncul di hasil trace.&lt;br /&gt;
* Baris terakhir dengan &amp;lt;code&amp;gt;Destination port unreachable&amp;lt;/code&amp;gt; itu &amp;#039;&amp;#039;&amp;#039;normal&amp;#039;&amp;#039;&amp;#039;. VPCS mengirim UDP ke port yang tidak dipakai, dan balasan &amp;quot;port tidak ada&amp;quot; menandakan paket sudah sampai di tujuan.&lt;br /&gt;
&lt;br /&gt;
== Latihan dan pembahasan ==&lt;br /&gt;
&lt;br /&gt;
=== Soal 1: bandingkan trace dengan Fase 1 ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Soal&amp;#039;&amp;#039;&amp;#039;: trace dari PC1/PC4 ke PC lain di bridge, bandingkan dengan Fase 1 (Part 2) dan dengan PC6.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hasil&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PC6 → PC1 (192.168.10.200):&lt;br /&gt;
 1   192.168.20.1     ← router, beda subnet → di-route&lt;br /&gt;
 2   192.168.10.200   ← tujuan&lt;br /&gt;
&lt;br /&gt;
PC4 → PC1 (192.168.10.200):&lt;br /&gt;
 1   192.168.10.200   ← langsung sampai, satu bridge → di-switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pembahasan&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Di Fase 1, PC1 dan PC4 berada di subnet berbeda, sehingga ada hop tambahan lewat router.&lt;br /&gt;
* Sekarang PC4 dan PC1 berada di &amp;#039;&amp;#039;&amp;#039;satu bridge = satu segmen Layer 2&amp;#039;&amp;#039;&amp;#039;. PC4 meng-ARP PC1 secara langsung, dan CHR hanya meneruskan frame seperti switch.&lt;br /&gt;
* Paket &amp;#039;&amp;#039;&amp;#039;tetap melewati CHR secara fisik&amp;#039;&amp;#039;&amp;#039;, tapi tidak muncul sebagai hop. Router yang sama bekerja sebagai &amp;#039;&amp;#039;&amp;#039;switch&amp;#039;&amp;#039;&amp;#039; untuk traffic di dalam bridge dan sebagai &amp;#039;&amp;#039;&amp;#039;router&amp;#039;&amp;#039;&amp;#039; untuk traffic antar subnet (seperti ke PC6).&lt;br /&gt;
&lt;br /&gt;
=== Soal 2: detektif port ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Soal&amp;#039;&amp;#039;&amp;#039;: hanya lewat &amp;#039;&amp;#039;&amp;#039;Bridge → Hosts&amp;#039;&amp;#039;&amp;#039;, tentukan PC5 terhubung di port mana.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pembahasan&amp;#039;&amp;#039;&amp;#039;: cocokkan MAC dari &amp;lt;code&amp;gt;show ip&amp;lt;/code&amp;gt; di PC5 dengan tabel Hosts → &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;. Di kantor, ini cara tercepat mencari &amp;quot;PC ini dicolok di port mana&amp;quot; tanpa menyusuri kabel.&lt;br /&gt;
&lt;br /&gt;
=== Soal 3: disable port anggota bridge ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Soal&amp;#039;&amp;#039;&amp;#039;: disable &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; di &amp;#039;&amp;#039;&amp;#039;Bridge → Ports&amp;#039;&amp;#039;&amp;#039;. Apakah PC4 masih bisa ping PC5? Ping PC1?&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hasil&amp;#039;&amp;#039;&amp;#039;: PC4 → PC5 &amp;#039;&amp;#039;&amp;#039;bisa&amp;#039;&amp;#039;&amp;#039;, PC4 → PC1 &amp;#039;&amp;#039;&amp;#039;tidak bisa&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pembahasan&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;PC4 → PC5&amp;#039;&amp;#039;&amp;#039;: keduanya terhubung ke Switch2. Switch2 meneruskan frame di antara mereka sendiri tanpa butuh router atau bridge.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;PC4 → PC1&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; adalah satu-satunya penghubung Switch2 ke bridge. Setelah port itu mati, Switch2 menjadi &amp;quot;pulau&amp;quot; terpisah.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kenapa router tidak menolong?&amp;#039;&amp;#039;&amp;#039; PC4 menganggap PC1 &amp;#039;&amp;#039;&amp;#039;tetangga&amp;#039;&amp;#039;&amp;#039; (sama-sama &amp;lt;code&amp;gt;192.168.10.x&amp;lt;/code&amp;gt;), sehingga PC4 tidak pernah memakai gateway untuk menuju PC1. Ia hanya meng-ARP PC1, dan ARP itu tidak sampai ke mana pun. &amp;#039;&amp;#039;&amp;#039;Di dalam satu subnet, kalau jalur Layer 2 putus, router tidak bisa menjadi jalur alternatif.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Gateway (&amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;) dan internet juga tidak terjangkau dari PC4 dan PC5.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pelajaran di kantor&amp;#039;&amp;#039;&amp;#039;: gejala &amp;#039;&amp;#039;&amp;#039;&amp;quot;satu ruangan tidak bisa apa-apa, tapi PC di ruangan itu masih bisa saling berbagi file&amp;quot;&amp;#039;&amp;#039;&amp;#039; hampir pasti masalah &amp;#039;&amp;#039;&amp;#039;uplink&amp;#039;&amp;#039;&amp;#039; switch ruangan tersebut: kabel uplink, port di router/switch inti, atau port yang ter-disable.&lt;br /&gt;
&lt;br /&gt;
Jangan lupa enable kembali &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Masalah yang ditemui ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway DHCP berisi alamat network ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gejala&amp;#039;&amp;#039;&amp;#039;: DHCP Networks berisi gateway &amp;lt;code&amp;gt;192.168.10.0&amp;lt;/code&amp;gt; dan DNS kosong setelah menjalankan &amp;#039;&amp;#039;&amp;#039;DHCP Setup&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penyebab&amp;#039;&amp;#039;&amp;#039;: isian gateway di wizard salah. &amp;lt;code&amp;gt;.0&amp;lt;/code&amp;gt; adalah alamat network, bukan alamat perangkat.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solusi&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;&amp;#039;IP → DHCP Server → Networks&amp;#039;&amp;#039;&amp;#039; → gateway &amp;amp; DNS &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;. Selalu periksa hasil wizard.&lt;br /&gt;
&lt;br /&gt;
=== Static lease hilang setelah DHCP Setup ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gejala&amp;#039;&amp;#039;&amp;#039;: lease PC1 kembali bertanda &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; (dynamic), nama server menjadi &amp;lt;code&amp;gt;server1&amp;lt;/code&amp;gt; dan pool menjadi &amp;lt;code&amp;gt;pool1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penyebab&amp;#039;&amp;#039;&amp;#039;: lease terikat ke DHCP server. Server lama diganti oleh wizard, sehingga static lease ikut hilang.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solusi&amp;#039;&amp;#039;&amp;#039;: buat ulang static lease. &amp;#039;&amp;#039;&amp;#039;Pelajaran&amp;#039;&amp;#039;&amp;#039;: wizard bisa menimpa konfigurasi lama tanpa peringatan, jadi backup sebelum menjalankannya.&lt;br /&gt;
&lt;br /&gt;
=== IP WAN berubah ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gejala&amp;#039;&amp;#039;&amp;#039;: IP &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; berubah dari &amp;lt;code&amp;gt;192.168.122.212&amp;lt;/code&amp;gt; menjadi &amp;lt;code&amp;gt;192.168.122.61&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penyebab&amp;#039;&amp;#039;&amp;#039;: CHR/lab di-restart dan mendapat lease baru dari dnsmasq &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;. Flag &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; pada alamat WAN memang akan selalu ada karena dibuat oleh DHCP client.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dampak&amp;#039;&amp;#039;&amp;#039;: NAT tetap berjalan karena masquerade otomatis memakai IP yang sedang menempel. Winbox harus connect ulang ke IP baru. Ini contoh nyata kenapa masquerade cocok untuk WAN dinamis.&lt;br /&gt;
&lt;br /&gt;
=== VPCS hanya menampilkan &amp;quot;DDD&amp;quot; ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gejala&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PC1&amp;gt; ip dhcp&lt;br /&gt;
DDD&lt;br /&gt;
Can&amp;#039;t find dhcp server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Arti&amp;#039;&amp;#039;&amp;#039;: VPCS mencetak satu huruf per langkah DORA. &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; = Discover terkirim. &amp;quot;DDD&amp;quot; berarti tiga Discover terkirim &amp;#039;&amp;#039;&amp;#039;tanpa Offer&amp;#039;&amp;#039;&amp;#039; yang kembali.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Langkah diagnosis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Periksa konfigurasi DHCP Networks (gateway &amp;amp; DNS).&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Log&amp;#039;&amp;#039;&amp;#039; router: cari pesan dari &amp;lt;code&amp;gt;dhcp&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;IP → DHCP Server → DHCP&amp;#039;&amp;#039;&amp;#039;: pastikan server tidak berflag &amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039; (disabled) atau &amp;#039;&amp;#039;&amp;#039;I&amp;#039;&amp;#039;&amp;#039; (invalid).&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Tools → Torch&amp;#039;&amp;#039;&amp;#039; di &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt;: kalau muncul traffic &amp;lt;code&amp;gt;0.0.0.0 → 255.255.255.255&amp;lt;/code&amp;gt; (port 68 → 67), Discover sampai di router dan masalahnya di konfigurasi. Kalau kosong, masalahnya di jalur kabel/bridge.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Bridge → Hosts&amp;#039;&amp;#039;&amp;#039;: apakah MAC PC terlihat.&lt;br /&gt;
# Di VPCS: &amp;lt;code&amp;gt;ip dhcp -d&amp;lt;/code&amp;gt; untuk melihat detail paket.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penyebab di lab ini&amp;#039;&amp;#039;&amp;#039;: GNS3 &amp;quot;nyangkut&amp;quot; (koneksi virtual antar node tidak terbentuk ulang dengan benar setelah topologi diubah). Selesai setelah GNS3 di-restart.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Urutan perbaikan kalau GNS3 berperilaku aneh&amp;#039;&amp;#039;&amp;#039; (setelah konfigurasi dipastikan benar):&lt;br /&gt;
# Stop/start node yang bermasalah, termasuk switch.&lt;br /&gt;
# Hapus dan sambungkan ulang kabel.&lt;br /&gt;
# Restart GNS3.&lt;br /&gt;
&lt;br /&gt;
== Sisipan: bridge di dunia virtualisasi (Proxmox) ==&lt;br /&gt;
Server Proxmox di LAN bisa menghasilkan banyak IP dari VM-VM-nya. Cara VM terlihat di jaringan tergantung modelnya.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Model !! Cara kerja !! Kelebihan !! Kekurangan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Bridged&amp;#039;&amp;#039;&amp;#039; (default, &amp;lt;code&amp;gt;vmbr0&amp;lt;/code&amp;gt;) || Bridge menyatukan NIC fisik dan NIC virtual VM. Setiap VM punya MAC sendiri dan terlihat seperti PC terpisah. || VM dapat IP dari DHCP router, bisa diakses langsung dari LAN || Setiap VM memakan IP subnet kantor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NAT&amp;#039;&amp;#039;&amp;#039; || Host menjadi router mini dan me-masquerade VM (sama seperti &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;) || Hemat IP, VM terisolasi || VM tidak bisa diakses langsung, perlu port forwarding&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Subnet/VLAN khusus&amp;#039;&amp;#039;&amp;#039; || VM di segmen sendiri, di-route oleh router || Rapi, bisa diberi firewall || Butuh VLAN (Part 4)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Manajemen IP&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Rencanakan pembagian IP&amp;#039;&amp;#039;&amp;#039;, contoh untuk &amp;lt;code&amp;gt;/24&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Range !! Untuk&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; || Gateway&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.2–.19&amp;lt;/code&amp;gt; || Perangkat jaringan (switch, AP)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.20–.79&amp;lt;/code&amp;gt; || Server &amp;amp; VM (statis)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.80–.99&amp;lt;/code&amp;gt; || Printer, CCTV&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.100–.250&amp;lt;/code&amp;gt; || Pool DHCP&lt;br /&gt;
|}&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Server/VM memakai IP tetap&amp;#039;&amp;#039;&amp;#039;: manual di dalam VM atau static lease. MAC VM Proxmox tersimpan permanen di konfigurasi VM, sehingga static lease bekerja baik.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Hati-hati saat clone&amp;#039;&amp;#039;&amp;#039;: clone biasanya mendapat MAC baru, sehingga static lease tidak ikut. IP statis yang di-hardcode di template akan ikut ter-clone dan menyebabkan IP conflict.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Catat semuanya (IPAM)&amp;#039;&amp;#039;&amp;#039;: spreadsheet, atau tools seperti &amp;#039;&amp;#039;&amp;#039;NetBox&amp;#039;&amp;#039;&amp;#039; / &amp;#039;&amp;#039;&amp;#039;phpIPAM&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pantau ukuran subnet&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;/24&amp;lt;/code&amp;gt; hanya 254 host. Kolom &amp;#039;&amp;#039;&amp;#039;Available&amp;#039;&amp;#039;&amp;#039; di menu Pool menunjukkan sisa IP.&lt;br /&gt;
&lt;br /&gt;
Di host Proxmox, cek &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;vmbr0&amp;lt;/code&amp;gt; dengan &amp;lt;code&amp;gt;bridge-ports eno1&amp;lt;/code&amp;gt; → bridged.&lt;br /&gt;
* &amp;lt;code&amp;gt;bridge-vlan-aware yes&amp;lt;/code&amp;gt; → VM dipisah dengan VLAN.&lt;br /&gt;
&lt;br /&gt;
== Ringkasan ==&lt;br /&gt;
* Port RouterOS defaultnya berdiri sendiri, dan bridge menggabungkannya menjadi satu segmen Layer 2.&lt;br /&gt;
* Konfigurasi Layer 3 (IP, DHCP) dipasang di &amp;#039;&amp;#039;&amp;#039;bridge&amp;#039;&amp;#039;&amp;#039;, bukan di port anggota.&lt;br /&gt;
* Di dalam bridge = &amp;#039;&amp;#039;&amp;#039;switching&amp;#039;&amp;#039;&amp;#039; (tidak ada hop). Antar subnet = &amp;#039;&amp;#039;&amp;#039;routing&amp;#039;&amp;#039;&amp;#039; (ada hop lewat gateway).&lt;br /&gt;
* Dalam satu subnet, jalur Layer 2 yang putus tidak bisa ditolong router.&lt;br /&gt;
* Wizard praktis, tapi periksa hasilnya dan backup sebelum menjalankannya.&lt;/div&gt;</description>
			<pubDate>Sun, 25 Oct 2026 05:17:00 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Mikrotik_3:_Bridge</comments>
		</item>
		<item>
			<title>Networking</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=880&amp;oldid=877</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=880&amp;oldid=877</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 05:16, 25 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l15&quot;&gt;Line 15:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 15:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 1: Install GNS3 Arch Linux]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 1: Install GNS3 Arch Linux]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 2: Kantor Mini]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 2: Kantor Mini]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Mikrotik 3: Bridge]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Cisco =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Cisco =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sun, 25 Oct 2026 05:16:52 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Networking</comments>
		</item>
		<item>
			<title>Mikrotik 2: Kantor Mini</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_2:_Kantor_Mini&amp;diff=879&amp;oldid=878</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_2:_Kantor_Mini&amp;diff=879&amp;oldid=878</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_2:_Kantor_Mini&amp;amp;diff=879&amp;amp;oldid=878&quot;&gt;Show changes&lt;/a&gt;</description>
			<pubDate>Fri, 23 Oct 2026 07:38:21 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Mikrotik_2:_Kantor_Mini</comments>
		</item>
		<item>
			<title>Mikrotik 2: Kantor Mini</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_2:_Kantor_Mini&amp;diff=878&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_2:_Kantor_Mini&amp;diff=878&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;Fase 1 dari roadmap: membangun &amp;#039;&amp;#039;&amp;#039;&amp;quot;kantor mini&amp;quot;&amp;#039;&amp;#039;&amp;#039;, yaitu satu router MikroTik sebagai gateway, beberapa PC yang mendapat IP otomatis, dan semuanya bisa internetan. Konfigurasi dilakukan lewat &amp;#039;&amp;#039;&amp;#039;Winbox 4&amp;#039;&amp;#039;&amp;#039;, dengan padanan CLI di setiap langkah.  __TOC__  == Tujuan == * Paham peran IP address, gateway, DHCP, DNS, dan NAT di jaringan kantor. * Paham beda &amp;#039;&amp;#039;&amp;#039;switching&amp;#039;&amp;#039;&amp;#039; (Layer 2) dan &amp;#039;&amp;#039;&amp;#039;routing&amp;#039;&amp;#039;&amp;#039; (Layer 3). * Bisa membaca kondisi router: siapa yang tersambung, dapat IP...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Fase 1 dari roadmap: membangun &amp;#039;&amp;#039;&amp;#039;&amp;quot;kantor mini&amp;quot;&amp;#039;&amp;#039;&amp;#039;, yaitu satu router MikroTik sebagai gateway, beberapa PC yang mendapat IP otomatis, dan semuanya bisa internetan. Konfigurasi dilakukan lewat &amp;#039;&amp;#039;&amp;#039;Winbox 4&amp;#039;&amp;#039;&amp;#039;, dengan padanan CLI di setiap langkah.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Tujuan ==&lt;br /&gt;
* Paham peran IP address, gateway, DHCP, DNS, dan NAT di jaringan kantor.&lt;br /&gt;
* Paham beda &amp;#039;&amp;#039;&amp;#039;switching&amp;#039;&amp;#039;&amp;#039; (Layer 2) dan &amp;#039;&amp;#039;&amp;#039;routing&amp;#039;&amp;#039;&amp;#039; (Layer 3).&lt;br /&gt;
* Bisa membaca kondisi router: siapa yang tersambung, dapat IP apa, lewat mana.&lt;br /&gt;
&lt;br /&gt;
== Topologi ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                    [NAT]&lt;br /&gt;
                      │&lt;br /&gt;
                 ether1 (WAN, DHCP client)&lt;br /&gt;
                 192.168.122.212/24&lt;br /&gt;
                      │&lt;br /&gt;
               [MikroTikCHR-1]&lt;br /&gt;
            ether2 /       \ ether3&lt;br /&gt;
     192.168.10.1/24     192.168.11.1/24&lt;br /&gt;
           │                   │&lt;br /&gt;
       [Switch1]           [Switch2]&lt;br /&gt;
      /    |    \            /    \&lt;br /&gt;
   PC1   PC2   PC3        PC4    PC5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;NAT node&amp;#039;&amp;#039;&amp;#039; dari [[Belajar MikroTik Part 1|Part 1]] tetap di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ethernet switch&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;VPCS&amp;#039;&amp;#039;&amp;#039; adalah perangkat bawaan GNS3 (kategori Switches dan End devices).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pengingat&amp;#039;&amp;#039;&amp;#039;: setelah reboot host, jalankan ulang aturan &amp;lt;code&amp;gt;DOCKER-USER&amp;lt;/code&amp;gt; dari Part 1, kalau tidak traffic lab tidak bisa keluar ke internet.&lt;br /&gt;
&lt;br /&gt;
== Konsep dasar ==&lt;br /&gt;
&lt;br /&gt;
=== IP address, subnet, dan alamat spesial ===&lt;br /&gt;
&amp;lt;code&amp;gt;/24&amp;lt;/code&amp;gt; berarti 24 bit pertama adalah bagian &amp;#039;&amp;#039;&amp;#039;network&amp;#039;&amp;#039;&amp;#039;, 8 bit terakhir bagian &amp;#039;&amp;#039;&amp;#039;host&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.10. | 00000000  → .0    semua bit host 0 = alamat network&lt;br /&gt;
192.168.10. | 00000001  → .1    host pertama&lt;br /&gt;
192.168.10. | 11111110  → .254  host terakhir&lt;br /&gt;
192.168.10. | 11111111  → .255  semua bit host 1 = broadcast&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Alamat !! Fungsi !! Bisa dipakai perangkat?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;192.168.10.0&amp;lt;/code&amp;gt; || Network address (identitas subnet) || Tidak&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; – &amp;lt;code&amp;gt;.254&amp;lt;/code&amp;gt; || Alamat host (254 host) || Ya&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;192.168.10.255&amp;lt;/code&amp;gt; || Broadcast (ke semua di subnet) || Tidak&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kapan menulis &amp;lt;code&amp;gt;.1/24&amp;lt;/code&amp;gt; dan kapan &amp;lt;code&amp;gt;.0/24&amp;lt;/code&amp;gt;?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IP → Addresses&amp;#039;&amp;#039;&amp;#039; menjawab &amp;quot;IP gua apa?&amp;quot; → alamat host, misalnya &amp;lt;code&amp;gt;192.168.10.1/24&amp;lt;/code&amp;gt;. Kolom Network dihitung otomatis.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Route, DHCP Network, firewall&amp;#039;&amp;#039;&amp;#039; menjawab &amp;quot;network yang mana?&amp;quot; → alamat network, misalnya &amp;lt;code&amp;gt;192.168.10.0/24&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Range IP privat&amp;#039;&amp;#039;&amp;#039; (tidak dikenal di internet): &amp;lt;code&amp;gt;10.0.0.0/8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;172.16.0.0/12&amp;lt;/code&amp;gt; (172.16–172.31), &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
Gateway adalah &amp;quot;pintu keluar&amp;quot; PC. Tujuan di luar subnet sendiri dikirim ke gateway.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Aturan emas&amp;#039;&amp;#039;&amp;#039;: gateway &amp;#039;&amp;#039;&amp;#039;harus berada di subnet yang sama&amp;#039;&amp;#039;&amp;#039; dengan PC. Biasanya berupa IP router di interface tersebut. Gateway di &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; hanya kebiasaan, bukan aturan.&lt;br /&gt;
&lt;br /&gt;
=== ARP ===&lt;br /&gt;
Di dalam satu segmen, frame Ethernet dikirim berdasarkan &amp;#039;&amp;#039;&amp;#039;MAC address&amp;#039;&amp;#039;&amp;#039;, bukan IP. &amp;#039;&amp;#039;&amp;#039;ARP&amp;#039;&amp;#039;&amp;#039; menerjemahkan &amp;#039;&amp;#039;&amp;#039;IP → MAC&amp;#039;&amp;#039;&amp;#039; di dalam satu segmen.&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Request (broadcast)&amp;#039;&amp;#039;&amp;#039;: &amp;quot;Siapa yang punya &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;? Kasih tahu &amp;lt;code&amp;gt;192.168.10.100&amp;lt;/code&amp;gt;.&amp;quot;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Reply (unicast)&amp;#039;&amp;#039;&amp;#039;: &amp;quot;Itu gua, MAC gua &amp;lt;code&amp;gt;0C:B3:C6:FB:00:01&amp;lt;/code&amp;gt;.&amp;quot;&lt;br /&gt;
# Hasilnya disimpan di &amp;#039;&amp;#039;&amp;#039;tabel ARP&amp;#039;&amp;#039;&amp;#039; (cache) dan kedaluwarsa setelah beberapa waktu.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Poin penting&amp;#039;&amp;#039;&amp;#039;: saat PC ping &amp;lt;code&amp;gt;8.8.8.8&amp;lt;/code&amp;gt;, yang di-ARP adalah &amp;#039;&amp;#039;&amp;#039;gateway&amp;#039;&amp;#039;&amp;#039;, bukan &amp;lt;code&amp;gt;8.8.8.8&amp;lt;/code&amp;gt;. Di setiap lompatan, &amp;#039;&amp;#039;&amp;#039;IP tujuan tetap sama&amp;#039;&amp;#039;&amp;#039;, tapi &amp;#039;&amp;#039;&amp;#039;MAC tujuan berganti&amp;#039;&amp;#039;&amp;#039;. Inilah beda Layer 2 (antar tetangga) dan Layer 3 (ujung ke ujung).&lt;br /&gt;
&lt;br /&gt;
Switch juga punya tabel MAC, tapi isinya &amp;quot;MAC ini ada di port mana&amp;quot;. Switch tidak peduli IP.&lt;br /&gt;
&lt;br /&gt;
=== DHCP ===&lt;br /&gt;
PC yang baru tersambung belum punya IP, gateway, maupun DNS. DHCP membagikannya secara otomatis lewat proses &amp;#039;&amp;#039;&amp;#039;DORA&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Discover&amp;#039;&amp;#039;&amp;#039;: PC broadcast &amp;quot;ada DHCP server?&amp;quot;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Offer&amp;#039;&amp;#039;&amp;#039;: server menawarkan IP + gateway + DNS&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Request&amp;#039;&amp;#039;&amp;#039;: PC menerima tawaran&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Ack&amp;#039;&amp;#039;&amp;#039;: server mengonfirmasi dan mencatat lease&lt;br /&gt;
&lt;br /&gt;
Di RouterOS, DHCP dipecah menjadi tiga bagian:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bagian !! Menjawab !! Alasan dipisah&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Pool&amp;#039;&amp;#039;&amp;#039; || IP mana yang boleh dibagikan? || Pool dipakai ulang oleh fitur lain (VPN, PPPoE, Hotspot)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Network&amp;#039;&amp;#039;&amp;#039; || Info apa yang diberikan (gateway, DNS)? || Satu server bisa melayani banyak subnet (lewat relay)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Server&amp;#039;&amp;#039;&amp;#039; || Siapa yang melayani, di interface mana? || Mengikat semuanya ke satu segmen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Lease time&amp;#039;&amp;#039;&amp;#039; (default 30 menit): lama IP &amp;quot;disewakan&amp;quot;. PC memperpanjang sebelum habis, dan IP kembali ke pool kalau PC pergi.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kenapa pool mulai dari &amp;lt;code&amp;gt;.100&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;.2–.99&amp;lt;/code&amp;gt; disisakan untuk perangkat ber-IP tetap (server, printer, access point, CCTV).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Di mana DHCP server diletakkan?&amp;#039;&amp;#039;&amp;#039; Broadcast DHCP &amp;#039;&amp;#039;&amp;#039;tidak menyeberang router&amp;#039;&amp;#039;&amp;#039;, jadi DHCP server harus berada di segmen yang sama dengan client, atau memakai &amp;#039;&amp;#039;&amp;#039;DHCP relay&amp;#039;&amp;#039;&amp;#039; yang meneruskan permintaan ke server di network lain.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Skenario !! Lokasi DHCP server&lt;br /&gt;
|-&lt;br /&gt;
| Rumah || Modem/router ISP&lt;br /&gt;
|-&lt;br /&gt;
| Kantor kecil-menengah || Router MikroTik, satu server per segmen/VLAN&lt;br /&gt;
|-&lt;br /&gt;
| Kantor besar || Server khusus (Windows Server, Kea, dnsmasq) + DHCP relay di router&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Di lab ini CHR berperan ganda: &amp;#039;&amp;#039;&amp;#039;client&amp;#039;&amp;#039;&amp;#039; di sisi WAN (dapat IP dari dnsmasq libvirt) dan &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; di sisi LAN.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Satu segmen = satu DHCP server.&amp;#039;&amp;#039;&amp;#039; Dua server di segmen yang sama membuat PC bisa mendapat konfigurasi yang salah. Kasus klasiknya &amp;#039;&amp;#039;&amp;#039;rogue DHCP&amp;#039;&amp;#039;&amp;#039;: router Wi-Fi rumahan yang dicolok ke jaringan kantor.&lt;br /&gt;
&lt;br /&gt;
=== DNS ===&lt;br /&gt;
PC diarahkan ke router (&amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;) sebagai DNS server. Router meneruskan pertanyaan ke &amp;#039;&amp;#039;&amp;#039;Dynamic Servers&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;192.168.122.1&amp;lt;/code&amp;gt;, didapat dari DHCP di WAN) dan menyimpan jawabannya di cache.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Allow Remote Requests&amp;#039;&amp;#039;&amp;#039; harus dicentang, karena defaultnya DNS router hanya untuk dirinya sendiri.&lt;br /&gt;
* Keuntungan lewat router: cache, kontrol terpusat (nama lokal, blokir domain), dan ganti DNS upstream cukup di satu tempat.&lt;br /&gt;
&lt;br /&gt;
=== NAT (masquerade) ===&lt;br /&gt;
IP privat tidak bisa dibalas oleh internet. &amp;#039;&amp;#039;&amp;#039;Masquerade&amp;#039;&amp;#039;&amp;#039; mengganti &amp;#039;&amp;#039;&amp;#039;IP sumber&amp;#039;&amp;#039;&amp;#039; paket yang keluar lewat WAN menjadi IP router, lalu mencatat pemetaannya di &amp;#039;&amp;#039;&amp;#039;connection tracking&amp;#039;&amp;#039;&amp;#039; supaya balasan bisa dikembalikan ke PC yang benar.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Chain &amp;lt;code&amp;gt;srcnat&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: yang diubah alamat sumber, diproses setelah keputusan routing.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Out. Interface &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: hanya traffic ke arah WAN yang di-NAT.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;masquerade&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;src-nat&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: masquerade otomatis memakai IP yang sedang menempel di interface, cocok untuk IP WAN dinamis. &amp;lt;code&amp;gt;src-nat&amp;lt;/code&amp;gt; dipakai kalau IP publik statis.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kenapa NAT ada di menu Firewall?&amp;#039;&amp;#039;&amp;#039; Firewall RouterOS adalah mesin pemroses paket dengan beberapa tabel (Filter, NAT, Mangle, Raw), persis seperti &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; di Linux:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# padanan rule masquerade di Linux&lt;br /&gt;
iptables -t nat -A POSTROUTING -o ether1 -j MASQUERADE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fakta menarik&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; + dnsmasq dari libvirt (Part 1) melakukan hal yang sama persis dengan router di lab ini: IP gateway, DHCP, DNS, dan masquerade. Lab ini juga &amp;#039;&amp;#039;&amp;#039;double NAT&amp;#039;&amp;#039;&amp;#039;: paket di-masquerade CHR, lalu di-NAT lagi oleh &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;. Banyak kantor sungguhan juga begini (router kantor di belakang modem ISP).&lt;br /&gt;
&lt;br /&gt;
=== Perjalanan satu ping ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PC1 (192.168.10.100) ping 8.8.8.8&lt;br /&gt;
 │ &amp;quot;bukan tetangga → kirim ke gateway&amp;quot;  (ARP gateway → dapat MAC router)&lt;br /&gt;
 ▼&lt;br /&gt;
CHR ether2 ── routing: 0.0.0.0/0 via 192.168.122.1 ── keluar ether1&lt;br /&gt;
 │ srcnat masquerade: src 192.168.10.100 → 192.168.122.212&lt;br /&gt;
 ▼&lt;br /&gt;
virbr0 (host) ── masquerade lagi: src → IP host&lt;br /&gt;
 ▼&lt;br /&gt;
Internet ── balasan kembali, setiap NAT membalik alamatnya ── PC1 ✅&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfigurasi LAN pertama ==&lt;br /&gt;
&lt;br /&gt;
=== Konek Winbox ===&lt;br /&gt;
Isi &amp;#039;&amp;#039;&amp;#039;Connect To&amp;#039;&amp;#039;&amp;#039; dengan IP WAN CHR (contoh &amp;lt;code&amp;gt;192.168.122.212&amp;lt;/code&amp;gt;), login &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt;. Konek lewat MAC di tab &amp;#039;&amp;#039;&amp;#039;Neighbors&amp;#039;&amp;#039;&amp;#039; belum tentu berhasil melalui &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;, jadi pakai IP.&lt;br /&gt;
&lt;br /&gt;
=== Langkah-langkah ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! Winbox !! Isian !! CLI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &amp;#039;&amp;#039;&amp;#039;IP → Addresses&amp;#039;&amp;#039;&amp;#039; → New || Address &amp;lt;code&amp;gt;192.168.10.1/24&amp;lt;/code&amp;gt;, Interface &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;, Comment &amp;lt;code&amp;gt;LAN&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip address add address=192.168.10.1/24 interface=ether2 comment=LAN&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &amp;#039;&amp;#039;&amp;#039;IP → Pool&amp;#039;&amp;#039;&amp;#039; → New || Name &amp;lt;code&amp;gt;pool-lan&amp;lt;/code&amp;gt;, Addresses &amp;lt;code&amp;gt;192.168.10.100-192.168.10.200&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip pool add name=pool-lan ranges=192.168.10.100-192.168.10.200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &amp;#039;&amp;#039;&amp;#039;IP → DHCP Server&amp;#039;&amp;#039;&amp;#039; → tab &amp;#039;&amp;#039;&amp;#039;Networks&amp;#039;&amp;#039;&amp;#039; → New || Address &amp;lt;code&amp;gt;192.168.10.0/24&amp;lt;/code&amp;gt;, Gateway &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;, DNS &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip dhcp-server network add address=192.168.10.0/24 gateway=192.168.10.1 dns-server=192.168.10.1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &amp;#039;&amp;#039;&amp;#039;IP → DHCP Server&amp;#039;&amp;#039;&amp;#039; → tab &amp;#039;&amp;#039;&amp;#039;DHCP&amp;#039;&amp;#039;&amp;#039; → New || Name &amp;lt;code&amp;gt;dhcp-lan&amp;lt;/code&amp;gt;, Interface &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;, Address Pool &amp;lt;code&amp;gt;pool-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip dhcp-server add name=dhcp-lan interface=ether2 address-pool=pool-lan disabled=no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &amp;#039;&amp;#039;&amp;#039;IP → DNS&amp;#039;&amp;#039;&amp;#039; || Centang &amp;#039;&amp;#039;&amp;#039;Allow Remote Requests&amp;#039;&amp;#039;&amp;#039; || &amp;lt;code&amp;gt;/ip dns set allow-remote-requests=yes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || &amp;#039;&amp;#039;&amp;#039;IP → Firewall&amp;#039;&amp;#039;&amp;#039; → tab &amp;#039;&amp;#039;&amp;#039;NAT&amp;#039;&amp;#039;&amp;#039; → New || General: Chain &amp;lt;code&amp;gt;srcnat&amp;lt;/code&amp;gt;, Out. Interface &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;; Action: &amp;lt;code&amp;gt;masquerade&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment=&amp;quot;NAT ke internet&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Catatan langkah 1&amp;#039;&amp;#039;&amp;#039;: entri &amp;lt;code&amp;gt;192.168.122.x&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; dengan flag &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; (Dynamic) adalah IP WAN dari DHCP client. Jangan dihapus. Router memang punya &amp;#039;&amp;#039;&amp;#039;satu IP di setiap network&amp;#039;&amp;#039;&amp;#039; yang ia sambungkan, dan network di interface berbeda &amp;#039;&amp;#039;&amp;#039;tidak boleh tumpang tindih&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Peringatan keamanan&amp;#039;&amp;#039;&amp;#039;: CHR ini belum punya firewall filter, dan &amp;lt;code&amp;gt;allow-remote-requests=yes&amp;lt;/code&amp;gt; membuat DNS router bisa ditanya dari sisi WAN. Aman di lab, tapi di router sungguhan harus diblok (Fase 3).&lt;br /&gt;
&lt;br /&gt;
=== Trik Winbox ===&lt;br /&gt;
* Tombol &amp;#039;&amp;#039;&amp;#039;DHCP Setup&amp;#039;&amp;#039;&amp;#039; mengerjakan langkah 2–4 sekaligus. Pakai setelah paham cara manualnya.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Terminal&amp;#039;&amp;#039;&amp;#039; tersedia di dalam Winbox. Jalankan &amp;lt;code&amp;gt;/ip firewall nat export&amp;lt;/code&amp;gt; untuk melihat padanan CLI dari apa yang diklik di GUI.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Safe Mode&amp;#039;&amp;#039;&amp;#039;: kalau koneksi putus karena salah setting, perubahan otomatis dibatalkan. Biasakan menyalakannya.&lt;br /&gt;
&lt;br /&gt;
== Verifikasi ==&lt;br /&gt;
Di VPCS:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ip dhcp&lt;br /&gt;
show ip&lt;br /&gt;
ping 192.168.10.1&lt;br /&gt;
ping 8.8.8.8&lt;br /&gt;
ping google.com&lt;br /&gt;
trace 8.8.8.8&lt;br /&gt;
show arp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; menampilkan hop lewat &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; lalu &amp;lt;code&amp;gt;192.168.122.1&amp;lt;/code&amp;gt;, jadi double NAT terlihat langsung.&lt;br /&gt;
&lt;br /&gt;
=== Melihat perangkat yang tersambung ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Menu !! Menampilkan !! Keterbatasan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;IP → DHCP Server → Leases&amp;#039;&amp;#039;&amp;#039; || IP, MAC, hostname, status (&amp;lt;code&amp;gt;bound&amp;lt;/code&amp;gt;) || Hanya perangkat yang memakai DHCP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;IP → ARP&amp;#039;&amp;#039;&amp;#039; || Perangkat yang baru-baru ini berkomunikasi, termasuk IP statis || Perangkat yang diam bisa tidak muncul&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Bridge → Hosts&amp;#039;&amp;#039;&amp;#039; || MAC per port fisik || Hanya untuk port anggota bridge&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;IP → Neighbors&amp;#039;&amp;#039;&amp;#039; || Perangkat jaringan (MNDP/LLDP/CDP) || PC biasa umumnya tidak muncul&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Tools → IP Scan&amp;#039;&amp;#039;&amp;#039; || Scan aktif satu range || Harus dijalankan manual&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kombinasi di kantor: &amp;#039;&amp;#039;&amp;#039;Leases&amp;#039;&amp;#039;&amp;#039; (perangkat siapa), &amp;#039;&amp;#039;&amp;#039;ARP&amp;#039;&amp;#039;&amp;#039; (siapa yang aktif), &amp;#039;&amp;#039;&amp;#039;Bridge Hosts&amp;#039;&amp;#039;&amp;#039; (colok di port mana).&lt;br /&gt;
&lt;br /&gt;
Melihat paket ARP secara langsung: klik kanan kabel di GNS3 → &amp;#039;&amp;#039;&amp;#039;Start capture&amp;#039;&amp;#039;&amp;#039;, lalu di PC jalankan &amp;lt;code&amp;gt;clear arp&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ping 192.168.10.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== LAN kedua dan routing antar subnet ==&lt;br /&gt;
&lt;br /&gt;
=== Konfigurasi ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bagian !! Isian&lt;br /&gt;
|-&lt;br /&gt;
| IP → Addresses || &amp;lt;code&amp;gt;192.168.11.1/24&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; (beri comment, misalnya &amp;lt;code&amp;gt;LAN2&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| IP → Pool || &amp;lt;code&amp;gt;pool-lan2&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;192.168.11.100-192.168.11.200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DHCP → Networks || &amp;lt;code&amp;gt;192.168.11.0/24&amp;lt;/code&amp;gt;, gateway &amp;amp; DNS &amp;lt;code&amp;gt;192.168.11.1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DHCP → DHCP || Server baru di &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; dengan &amp;lt;code&amp;gt;pool-lan2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NAT || &amp;#039;&amp;#039;&amp;#039;Tidak perlu diubah&amp;#039;&amp;#039;&amp;#039;: rule mencocokkan &amp;lt;code&amp;gt;out-interface=ether1&amp;lt;/code&amp;gt;, jadi semua subnet yang keluar ke WAN otomatis di-masquerade&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Kenapa PC1 bisa ping PC4? ===&lt;br /&gt;
# PC1 melihat &amp;lt;code&amp;gt;192.168.11.x&amp;lt;/code&amp;gt; bukan tetangga → kirim ke gateway &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Router sudah mengenal kedua network sebagai &amp;#039;&amp;#039;&amp;#039;connected route&amp;#039;&amp;#039;&amp;#039; (lihat &amp;#039;&amp;#039;&amp;#039;IP → Routes&amp;#039;&amp;#039;&amp;#039;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DAC  192.168.10.0/24   → ether2&lt;br /&gt;
DAC  192.168.11.0/24   → ether3&lt;br /&gt;
DAd  0.0.0.0/0         → 192.168.122.1  (dari DHCP client)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; = dynamic, &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; = active, &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; = connected.&lt;br /&gt;
# Router meng-ARP PC4 di sisi &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; lalu meneruskan paket.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Tidak kena NAT&amp;#039;&amp;#039;&amp;#039;, karena traffic keluar lewat &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;, bukan &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;. PC4 melihat IP asli PC1.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Tidak ada yang memblokir&amp;#039;&amp;#039;&amp;#039;, karena belum ada firewall filter.&lt;br /&gt;
&lt;br /&gt;
=== Switching vs routing ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tes !! Hasil &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; !! Yang bekerja&lt;br /&gt;
|-&lt;br /&gt;
| PC1 → PC2 (satu switch) || Langsung sampai || &amp;#039;&amp;#039;&amp;#039;Switch&amp;#039;&amp;#039;&amp;#039; (Layer 2). Router tidak terlibat.&lt;br /&gt;
|-&lt;br /&gt;
| PC1 → PC4 (beda subnet) || Satu hop lewat &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;&amp;#039;Router&amp;#039;&amp;#039;&amp;#039; (Layer 3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implikasi di kantor&amp;#039;&amp;#039;&amp;#039;: memisahkan subnet &amp;#039;&amp;#039;&amp;#039;tidak sama dengan isolasi&amp;#039;&amp;#039;&amp;#039;. Secara default router menyambungkan semua subnet. Untuk memisahkan misalnya Wi-Fi tamu atau CCTV dari jaringan karyawan, dibutuhkan &amp;#039;&amp;#039;&amp;#039;firewall filter di chain &amp;lt;code&amp;gt;forward&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; (Fase 3).&lt;br /&gt;
&lt;br /&gt;
== Kesalahan umum ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gejala !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| PC dapat IP tapi tidak bisa internetan setelah ganti subnet || Gateway/DNS di DHCP Network masih memakai alamat subnet lama. PC tidak bisa meng-ARP gateway yang bukan tetangganya. || Gateway &amp;amp; DNS = IP router di subnet baru&lt;br /&gt;
|-&lt;br /&gt;
| Router punya dua IP di satu interface setelah ganti subnet || Menambah entri baru tanpa menghapus yang lama || Edit entri yang ada (double-click)&lt;br /&gt;
|-&lt;br /&gt;
| PC masih memakai IP lama || Lease lama belum diperbarui || Jalankan &amp;lt;code&amp;gt;ip dhcp&amp;lt;/code&amp;gt; lagi di VPCS&lt;br /&gt;
|-&lt;br /&gt;
| Satu segmen mendadak dapat gateway aneh || Rogue DHCP (dua DHCP server di satu segmen) || Cari dan cabut DHCP server liar&lt;br /&gt;
|-&lt;br /&gt;
| Router bingung meneruskan paket || Dua interface memakai subnet yang tumpang tindih || Pakai subnet berbeda di setiap interface&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;failure: dhcp-client on that interface already exists&amp;lt;/code&amp;gt; || Appliance CHR sudah membawa DHCP client di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; || Normal, abaikan&lt;br /&gt;
|-&lt;br /&gt;
| Parameter ditolak || &amp;lt;code&amp;gt;disable=no&amp;lt;/code&amp;gt; || Yang benar &amp;lt;code&amp;gt;disabled=no&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Latihan ==&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Pindah subnet&amp;#039;&amp;#039;&amp;#039;: ubah LAN pertama menjadi &amp;lt;code&amp;gt;10.10.10.0/24&amp;lt;/code&amp;gt; (gateway &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt;, pool &amp;lt;code&amp;gt;.50–.99&amp;lt;/code&amp;gt;). Ada empat isian yang harus ikut berubah. Apakah rule NAT perlu diubah?&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Static lease&amp;#039;&amp;#039;&amp;#039;: buat PC1 selalu mendapat &amp;lt;code&amp;gt;192.168.10.10&amp;lt;/code&amp;gt;, sementara PC lain tetap acak dari pool.&lt;br /&gt;
#* Bolehkah static lease memakai IP di luar pool? Kenapa justru bisa jadi ide bagus?&lt;br /&gt;
#* Bagaimana membuat PC1 memakai IP barunya?&lt;br /&gt;
#* Apa yang bisa terjadi kalau static lease memakai IP di dalam pool yang sedang dipakai PC lain?&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Sengaja dirusak&amp;#039;&amp;#039;&amp;#039;: disable rule NAT. Tebak dulu: &amp;lt;code&amp;gt;/ping 8.8.8.8&amp;lt;/code&amp;gt; dari router masih jalan? Dari PC1? Tes, lalu jelaskan kenapa hasilnya berbeda.&lt;br /&gt;
&lt;br /&gt;
== Selanjutnya ==&lt;br /&gt;
Part 3: bridge dan VLAN, yaitu cara satu router melayani banyak segmen lewat satu kabel.&lt;br /&gt;
&lt;br /&gt;
== Referensi ==&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/24805500/DHCP MikroTik Docs: DHCP]&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/37748767/DNS MikroTik Docs: DNS]&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/3211299/NAT MikroTik Docs: NAT]&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/328088/IP+Addressing MikroTik Docs: IP Addressing]&lt;br /&gt;
&lt;br /&gt;
[[Category:Networking]]&lt;/div&gt;</description>
			<pubDate>Fri, 23 Oct 2026 03:16:24 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Mikrotik_2:_Kantor_Mini</comments>
		</item>
		<item>
			<title>Networking</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=877&amp;oldid=875</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=877&amp;oldid=875</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 03:16, 23 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l14&quot;&gt;Line 14:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 14:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Mikrotik =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Mikrotik =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 1: Install GNS3 Arch Linux]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Mikrotik 1: Install GNS3 Arch Linux]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Mikrotik 2: Kantor Mini]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Cisco =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Cisco =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Fri, 23 Oct 2026 03:16:10 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Networking</comments>
		</item>
		<item>
			<title>Mikrotik 1: Install GNS3 Arch Linux</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_1:_Install_GNS3_Arch_Linux&amp;diff=876&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_1:_Install_GNS3_Arch_Linux&amp;diff=876&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;Halaman ini mencatat setup lab MikroTik virtual pakai &amp;#039;&amp;#039;&amp;#039;GNS3&amp;#039;&amp;#039;&amp;#039; di &amp;#039;&amp;#039;&amp;#039;Arch Linux&amp;#039;&amp;#039;&amp;#039;, dari install sampai router pertama bisa nge-ping internet. Semua error yang muncul selama setup juga dicatat, lengkap dengan penyebab dan solusinya.  __TOC__  == Tujuan == * Punya lab MikroTik tanpa beli hardware. * Router virtual bisa diakses dari host (WebFig) dan bisa keluar ke internet. * Paham istilah dasar: CHR, appliance, template, libvirt, &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;.  == Konsep dan ist...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Halaman ini mencatat setup lab MikroTik virtual pakai &amp;#039;&amp;#039;&amp;#039;GNS3&amp;#039;&amp;#039;&amp;#039; di &amp;#039;&amp;#039;&amp;#039;Arch Linux&amp;#039;&amp;#039;&amp;#039;, dari install sampai router pertama bisa nge-ping internet. Semua error yang muncul selama setup juga dicatat, lengkap dengan penyebab dan solusinya.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Tujuan ==&lt;br /&gt;
* Punya lab MikroTik tanpa beli hardware.&lt;br /&gt;
* Router virtual bisa diakses dari host (WebFig) dan bisa keluar ke internet.&lt;br /&gt;
* Paham istilah dasar: CHR, appliance, template, libvirt, &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Konsep dan istilah ==&lt;br /&gt;
&lt;br /&gt;
=== RouterOS dan CHR ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;RouterOS&amp;#039;&amp;#039;&amp;#039; adalah sistem operasi router MikroTik. &amp;#039;&amp;#039;&amp;#039;CHR (Cloud Hosted Router)&amp;#039;&amp;#039;&amp;#039; adalah RouterOS versi x86 yang dijalankan sebagai VM.&lt;br /&gt;
&lt;br /&gt;
* Fiturnya sama dengan RouterOS di router fisik: bridge, NAT, firewall, VLAN, OSPF, BGP, VPN.&lt;br /&gt;
* Ringan: cukup RAM beberapa ratus MB per router, jadi bisa jalan banyak router sekaligus.&lt;br /&gt;
* Lisensi gratis dibatasi upload &amp;#039;&amp;#039;&amp;#039;1 Mbps per interface&amp;#039;&amp;#039;&amp;#039;, tapi semua fitur tetap jalan. Cukup buat belajar.&lt;br /&gt;
&lt;br /&gt;
=== Tools konfigurasi ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tool !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;WebFig&amp;#039;&amp;#039;&amp;#039; || Antarmuka web bawaan RouterOS. Tanpa install, cukup buka IP router di browser. Hanya bisa konek lewat IP.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Winbox 4&amp;#039;&amp;#039;&amp;#039; || Aplikasi native (Windows, macOS, Linux). Bisa konek lewat &amp;#039;&amp;#039;&amp;#039;MAC address&amp;#039;&amp;#039;&amp;#039;, berguna kalau router belum punya IP.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;CLI&amp;#039;&amp;#039;&amp;#039; || Lewat console/telnet/SSH. Paling lengkap, dan yang dipakai di halaman ini.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GNS3: appliance vs template ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Template&amp;#039;&amp;#039;&amp;#039;: perangkat yang siap di-drag ke canvas.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Appliance&amp;#039;&amp;#039;&amp;#039;: file resep (&amp;lt;code&amp;gt;.gns3a&amp;lt;/code&amp;gt;) yang otomatis membuat template, lengkap dengan setting RAM, adapter, console, serta nama file dan checksum image yang dibutuhkan.&lt;br /&gt;
* GNS3 &amp;#039;&amp;#039;&amp;#039;tidak membawa image&amp;#039;&amp;#039;&amp;#039; vendor. Image CHR tetap diambil dari mikrotik.com.&lt;br /&gt;
&lt;br /&gt;
Di katalog appliance ada banyak model MikroTik (CCR, RB, CRS, dll). Buat belajar, cukup pakai &amp;#039;&amp;#039;&amp;#039;MikroTik CHR&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== libvirt dan virbr0 ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;libvirt&amp;#039;&amp;#039;&amp;#039;: lapisan manajemen virtualisasi di Linux (daemon &amp;lt;code&amp;gt;libvirtd&amp;lt;/code&amp;gt;, tool &amp;lt;code&amp;gt;virsh&amp;lt;/code&amp;gt;). Mengatur VM, storage, dan network virtual.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;virbr0&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;virtual bridge&amp;#039;&amp;#039;): switch virtual di host yang dibuat oleh network &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; libvirt. Fungsinya:&lt;br /&gt;
** gateway lab (&amp;lt;code&amp;gt;192.168.122.1&amp;lt;/code&amp;gt;),&lt;br /&gt;
** DHCP via dnsmasq (range &amp;lt;code&amp;gt;192.168.122.x&amp;lt;/code&amp;gt;),&lt;br /&gt;
** NAT supaya lab bisa keluar lewat internet host.&lt;br /&gt;
&lt;br /&gt;
Node &amp;#039;&amp;#039;&amp;#039;NAT&amp;#039;&amp;#039;&amp;#039; di GNS3 memakai &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; ini.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHR (GNS3) ── NAT node ── virbr0 (host) ── internet&lt;br /&gt;
                             │&lt;br /&gt;
                     Browser/Winbox di host&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Efek ke host&amp;#039;&amp;#039;&amp;#039;: koneksi internet asli tidak berubah. libvirt hanya menambah aturan NAT untuk &amp;lt;code&amp;gt;192.168.122.0/24&amp;lt;/code&amp;gt;, menyalakan &amp;lt;code&amp;gt;ip_forward&amp;lt;/code&amp;gt;, dan menjalankan dnsmasq khusus &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;. Pastikan subnet ini tidak bentrok dengan jaringan asli.&lt;br /&gt;
&lt;br /&gt;
== Instalasi ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Upgrade sistem ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo pacman -Syu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wajib, untuk menghindari partial upgrade (lihat [[#Masalah 1: partial upgrade QEMU|Masalah 1]]).&lt;br /&gt;
&lt;br /&gt;
=== 2. Dependensi ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
paru -S --needed qemu docker vpcs dynamips libvirt ubridge inetutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--needed&amp;lt;/code&amp;gt; melewati paket yang sudah terinstall.&lt;br /&gt;
* Kalau &amp;lt;code&amp;gt;qemu-full&amp;lt;/code&amp;gt; sudah ada, &amp;lt;code&amp;gt;qemu&amp;lt;/code&amp;gt; tidak perlu dipasang lagi.&lt;br /&gt;
* &amp;lt;code&amp;gt;vpcs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dynamips&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ubridge&amp;lt;/code&amp;gt; dari AUR.&lt;br /&gt;
* &amp;lt;code&amp;gt;inetutils&amp;lt;/code&amp;gt; menyediakan &amp;lt;code&amp;gt;telnet&amp;lt;/code&amp;gt; untuk console.&lt;br /&gt;
&lt;br /&gt;
=== 3. GNS3 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
paru -S gns3-server gns3-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Group user dan service ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
for g in ubridge libvirt kvm docker wireshark; do&lt;br /&gt;
  getent group $g &amp;gt;/dev/null &amp;amp;&amp;amp; sudo gpasswd -a $USER $g || echo &amp;quot;group $g belum ada&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
sudo systemctl enable --now libvirtd docker&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Group &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; baru ada setelah &amp;lt;code&amp;gt;sudo pacman -S wireshark-qt&amp;lt;/code&amp;gt;. Setelah reboot, cek dengan &amp;lt;code&amp;gt;groups&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 5. Network default libvirt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo virsh net-list --all&lt;br /&gt;
# kalau &amp;quot;default&amp;quot; belum ada:&lt;br /&gt;
sudo virsh net-define /usr/share/libvirt/networks/default.xml&lt;br /&gt;
sudo virsh net-start default&lt;br /&gt;
sudo virsh net-autostart default&lt;br /&gt;
ip a show virbr0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pakai &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; supaya &amp;lt;code&amp;gt;virsh&amp;lt;/code&amp;gt; konek ke koneksi &amp;#039;&amp;#039;system&amp;#039;&amp;#039;, bukan &amp;#039;&amp;#039;session&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== 6. Console terminal ===&lt;br /&gt;
GNS3 default memakai &amp;lt;code&amp;gt;xterm&amp;lt;/code&amp;gt;. Pilih salah satu:&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo pacman -S xterm&amp;lt;/code&amp;gt;, atau&lt;br /&gt;
* ganti di &amp;#039;&amp;#039;&amp;#039;Edit → Preferences → General → Console applications&amp;#039;&amp;#039;&amp;#039;, contoh:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
kitty --title &amp;quot;%d&amp;quot; telnet %h %p&lt;br /&gt;
alacritty -t &amp;quot;%d&amp;quot; -e telnet %h %p&lt;br /&gt;
konsole -p tabtitle=%d -e telnet %h %p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(&amp;lt;code&amp;gt;%h&amp;lt;/code&amp;gt; = host, &amp;lt;code&amp;gt;%p&amp;lt;/code&amp;gt; = port, &amp;lt;code&amp;gt;%d&amp;lt;/code&amp;gt; = nama node)&lt;br /&gt;
&lt;br /&gt;
=== 7. Template MikroTik CHR ===&lt;br /&gt;
# Jalankan &amp;lt;code&amp;gt;gns3&amp;lt;/code&amp;gt;, pilih &amp;#039;&amp;#039;&amp;#039;Run appliances on my local computer&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;File → New template → Install an appliance from the GNS3 server&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Cari &amp;#039;&amp;#039;&amp;#039;MikroTik CHR&amp;#039;&amp;#039;&amp;#039;, klik &amp;#039;&amp;#039;&amp;#039;Install&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Lihat &amp;#039;&amp;#039;&amp;#039;nama file dan versi&amp;#039;&amp;#039;&amp;#039; yang diminta wizard (contoh: &amp;lt;code&amp;gt;chr-7.22.1.img&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Download &amp;#039;&amp;#039;&amp;#039;Raw disk image&amp;#039;&amp;#039;&amp;#039; versi yang sama dari mikrotik.com, lalu unzip:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
unzip chr-7.22.1.img.zip&lt;br /&gt;
md5sum chr-7.22.1.img   # harus sama dengan checksum di wizard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Import&amp;#039;&amp;#039;&amp;#039; file &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (bukan &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt;), lalu Finish.&lt;br /&gt;
&lt;br /&gt;
Template muncul di panel &amp;#039;&amp;#039;&amp;#039;Routers&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
=== Router pertama ===&lt;br /&gt;
# Drag &amp;#039;&amp;#039;&amp;#039;MikroTik CHR&amp;#039;&amp;#039;&amp;#039; ke canvas, klik kanan → &amp;#039;&amp;#039;&amp;#039;Start&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Double-click node untuk membuka console.&lt;br /&gt;
# Login &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt;, password kosong. Jawab &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; untuk lisensi, lalu set password baru.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/system identity set name=hello-world&lt;br /&gt;
/system resource print&lt;br /&gt;
/interface print&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Prompt berubah jadi &amp;lt;code&amp;gt;[admin@hello-world] &amp;gt;&amp;lt;/code&amp;gt;. Hello world selesai.&lt;br /&gt;
&lt;br /&gt;
=== Sambung ke internet ===&lt;br /&gt;
# Drag node &amp;#039;&amp;#039;&amp;#039;NAT&amp;#039;&amp;#039;&amp;#039; ke canvas, sambungkan ke &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; CHR.&lt;br /&gt;
# Di console CHR:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/ip dhcp-client print&lt;br /&gt;
/ip address print&lt;br /&gt;
/ip route print&lt;br /&gt;
/ping 192.168.122.1&lt;br /&gt;
/ping 8.8.8.8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Appliance CHR sudah membawa DHCP client di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;, jadi menambah lagi akan memunculkan &amp;lt;code&amp;gt;failure: dhcp-client on that interface already exists&amp;lt;/code&amp;gt;. Itu normal. (Kalau perlu menambah manual, parameternya &amp;lt;code&amp;gt;disabled=no&amp;lt;/code&amp;gt;, bukan &amp;lt;code&amp;gt;disable=no&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
=== Buka WebFig ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ping -c 3 192.168.122.212   # ganti dengan IP CHR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Lalu buka &amp;lt;code&amp;gt;http://192.168.122.212&amp;lt;/code&amp;gt; di browser host. Kalau tidak terbuka, cek &amp;lt;code&amp;gt;/ip service print&amp;lt;/code&amp;gt; dan pastikan &amp;lt;code&amp;gt;www&amp;lt;/code&amp;gt; tidak disabled.&lt;br /&gt;
&lt;br /&gt;
== Masalah yang ditemui ==&lt;br /&gt;
&lt;br /&gt;
=== Masalah 1: partial upgrade QEMU ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gejala&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
error: failed to prepare transaction (could not satisfy dependencies)&lt;br /&gt;
:: installing qemu-common (11.1.2-1) breaks dependency &amp;#039;qemu-common=11.1.1-1&amp;#039; required by qemu-audio-alsa&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penyebab&amp;#039;&amp;#039;&amp;#039;: repo sudah punya QEMU 11.1.2, sistem masih 11.1.1. Menginstall &amp;lt;code&amp;gt;qemu&amp;lt;/code&amp;gt; menarik &amp;lt;code&amp;gt;qemu-common&amp;lt;/code&amp;gt; baru, sedangkan puluhan paket QEMU lain masih mengunci versi lama. Arch tidak mendukung partial upgrade.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solusi&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;sudo pacman -Syu&amp;lt;/code&amp;gt;, lalu ulangi install dependensi tanpa &amp;lt;code&amp;gt;qemu&amp;lt;/code&amp;gt; (sudah ada lewat &amp;lt;code&amp;gt;qemu-full&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Masalah 2: gns3server crash, &amp;lt;code&amp;gt;No module named &amp;#039;langchain&amp;#039;&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gejala&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRITICAL gns3server.server:331 Critical error while running the server: No module named &amp;#039;langchain&amp;#039;&lt;br /&gt;
  File &amp;quot;.../gns3server/agent/gns3_copilot/gns3_client/gns3_project_info.py&amp;quot;, line 39, in &amp;lt;module&amp;gt;&lt;br /&gt;
    from langchain.tools import BaseTool&lt;br /&gt;
ModuleNotFoundError: No module named &amp;#039;langchain&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penyebab&amp;#039;&amp;#039;&amp;#039;: GNS3 versi baru (3.x alpha di AUR) meng-import modul fitur AI copilot/MCP tanpa pengaman, padahal dependensinya opsional dan tidak ikut terinstall. Pola serupa dilaporkan untuk modul &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; di [https://github.com/GNS3/gns3-server/issues/2794 GNS3 issue #2794].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solusi&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Install dependensi yang kurang (&amp;lt;code&amp;gt;python-langchain&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;python-langchain-core&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;python-mcp&amp;lt;/code&amp;gt;, dari repo atau AUR), lalu jalankan &amp;lt;code&amp;gt;gns3server&amp;lt;/code&amp;gt; dan ulangi sampai tidak ada &amp;lt;code&amp;gt;ModuleNotFoundError&amp;lt;/code&amp;gt; lagi.&lt;br /&gt;
* Alternatif: bungkus import tersebut dengan &amp;lt;code&amp;gt;try/except ModuleNotFoundError&amp;lt;/code&amp;gt; (hilang saat update), atau pakai versi stabil.&lt;br /&gt;
&lt;br /&gt;
=== Masalah 3: import image CHR gagal ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gejala&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cannot install MikroTik CHR version 7.22.1: File chr-7.22.1.img with checksum a67290634f489071eae2fd99dcadba86 not found&lt;br /&gt;
The file is compressed with &amp;#039;zip&amp;#039;, it must be uncompressed first&lt;br /&gt;
Could not upload image chr-7.22.1.img: File &amp;#039;/home/haidhi/GNS3/images/QEMU/chr-7.22.1.img&amp;#039; already exists&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penyebab&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Yang di-import file &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt;, bukan &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; hasil unzip.&lt;br /&gt;
* Sudah ada file dengan nama sama dari percobaan sebelumnya, sehingga GNS3 menolak menimpa.&lt;br /&gt;
* Wizard appliance mencocokkan &amp;#039;&amp;#039;&amp;#039;nama file dan checksum&amp;#039;&amp;#039;&amp;#039; secara persis.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solusi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
file ~/GNS3/images/QEMU/chr-7.22.1.img&lt;br /&gt;
md5sum ~/GNS3/images/QEMU/chr-7.22.1.img&lt;br /&gt;
# kalau salah:&lt;br /&gt;
rm ~/GNS3/images/QEMU/chr-7.22.1.img*&lt;br /&gt;
unzip chr-7.22.1.img.zip &amp;amp;&amp;amp; md5sum chr-7.22.1.img&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Lalu ulangi wizard dan import file &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt;. Kalau versi yang diminta sudah tidak tersedia, buat template QEMU manual (lihat [[#Catatan: template manual|catatan]]).&lt;br /&gt;
&lt;br /&gt;
=== Masalah 4: console tidak terbuka, &amp;lt;code&amp;gt;xterm&amp;lt;/code&amp;gt; tidak ada ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gejala&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Could not start Telnet console with command &amp;#039;xterm -T &amp;quot;MikroTikCHR-1&amp;quot; -e &amp;quot;telnet localhost 5000&amp;quot;&amp;#039;: [Errno 2] No such file or directory: &amp;#039;xterm&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penyebab&amp;#039;&amp;#039;&amp;#039;: GNS3 default memakai &amp;lt;code&amp;gt;xterm&amp;lt;/code&amp;gt;, yang tidak terinstall di Arch.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solusi&amp;#039;&amp;#039;&amp;#039;: install &amp;lt;code&amp;gt;xterm&amp;lt;/code&amp;gt; atau ganti console command (lihat [[#6. Console terminal|langkah 6]]).&lt;br /&gt;
&lt;br /&gt;
=== Masalah 5: &amp;lt;code&amp;gt;NAT interface virbr0 is missing&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gejala&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error while creating node from template: NAT interface virbr0 is missing, please install libvirt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penyebab&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;libvirtd&amp;lt;/code&amp;gt; sudah jalan, tapi network &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; belum dinyalakan, sehingga &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; belum ada. Daemon hidup ≠ network hidup.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solusi&amp;#039;&amp;#039;&amp;#039;: [[#5. Network default libvirt|langkah 5]]. Kalau &amp;lt;code&amp;gt;net-start&amp;lt;/code&amp;gt; gagal, cek apakah &amp;lt;code&amp;gt;dnsmasq&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;iptables-nft&amp;lt;/code&amp;gt;/nftables sudah terpasang.&lt;br /&gt;
&lt;br /&gt;
Catatan: baris log &amp;lt;code&amp;gt;Libvirt doesn&amp;#039;t support VirtualBox API version ...&amp;lt;/code&amp;gt; tidak berbahaya.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kenapa &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; statusnya DOWN?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virbr0: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; ... state DOWN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;NO-CARRIER&amp;lt;/code&amp;gt; berarti belum ada perangkat yang tersambung ke bridge. Begitu node NAT di GNS3 aktif, statusnya berubah jadi UP. Normal.&lt;br /&gt;
&lt;br /&gt;
=== Masalah 6: CHR dapat IP, tapi ping internet timeout ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gejala&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 D 192.168.122.212/24  192.168.122.0  ether1  main&lt;br /&gt;
/ping 8.8.8.8&lt;br /&gt;
  sent=9 received=0 packet-loss=100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
DHCP jalan (IP didapat), tapi traffic keluar tidak tembus.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Penyebab&amp;#039;&amp;#039;&amp;#039;: Docker mengatur policy chain &amp;lt;code&amp;gt;FORWARD&amp;lt;/code&amp;gt; menjadi &amp;lt;code&amp;gt;DROP&amp;lt;/code&amp;gt;, sehingga traffic dari &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; dibuang sebelum di-NAT keluar.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Diagnosis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sysctl net.ipv4.ip_forward          # harus 1&lt;br /&gt;
sudo iptables -S FORWARD | head     # cari: -P FORWARD DROP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solusi&amp;#039;&amp;#039;&amp;#039;: izinkan traffic &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; di chain &amp;lt;code&amp;gt;DOCKER-USER&amp;lt;/code&amp;gt; (chain yang memang disediakan Docker untuk aturan user):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo iptables -I DOCKER-USER -i virbr0 -j ACCEPT&lt;br /&gt;
sudo iptables -I DOCKER-USER -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Aturan pertama: izinkan traffic yang masuk dari lab.&lt;br /&gt;
* Aturan kedua: izinkan balasan yang kembali ke lab.&lt;br /&gt;
&lt;br /&gt;
Aturan ini &amp;#039;&amp;#039;&amp;#039;hilang setelah reboot&amp;#039;&amp;#039;&amp;#039; atau restart Docker. Jalankan ulang sebelum nge-lab, atau buat permanen nanti.&lt;br /&gt;
&lt;br /&gt;
== Catatan: template manual ==&lt;br /&gt;
Kalau tidak memakai appliance:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-img convert -f raw -O qcow2 chr-*.img chr.qcow2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Edit → Preferences → QEMU → QEMU VMs → New&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Binary: &amp;lt;code&amp;gt;qemu-system-x86_64&amp;lt;/code&amp;gt;, RAM: 256 MB, disk: &amp;lt;code&amp;gt;chr.qcow2&amp;lt;/code&amp;gt;&lt;br /&gt;
* Console: &amp;lt;code&amp;gt;telnet&amp;lt;/code&amp;gt;&lt;br /&gt;
* Adapter: 4+, tipe &amp;lt;code&amp;gt;virtio-net-pci&amp;lt;/code&amp;gt; (ganti &amp;lt;code&amp;gt;e1000&amp;lt;/code&amp;gt; kalau interface tidak muncul)&lt;br /&gt;
* Advanced: centang &amp;#039;&amp;#039;&amp;#039;Use as a linked base VM&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Ringkasan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Masalah !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| Dependency QEMU rusak || Partial upgrade || &amp;lt;code&amp;gt;pacman -Syu&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;No module named &amp;#039;langchain&amp;#039;&amp;lt;/code&amp;gt; || Dependensi opsional GNS3 alpha tidak terinstall || Install modul yang kurang&lt;br /&gt;
|-&lt;br /&gt;
| Image CHR tidak ditemukan || Import &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt; / file lama tertinggal / checksum beda || Hapus file lama, unzip, import &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;xterm&amp;lt;/code&amp;gt; tidak ada || Console default GNS3 || Install xterm / ganti console command&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;virbr0 is missing&amp;lt;/code&amp;gt; || Network &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; belum start || &amp;lt;code&amp;gt;virsh net-start default&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Ping internet timeout || Docker &amp;lt;code&amp;gt;FORWARD DROP&amp;lt;/code&amp;gt; || Aturan &amp;lt;code&amp;gt;DOCKER-USER&amp;lt;/code&amp;gt; untuk &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</description>
			<pubDate>Thu, 22 Oct 2026 09:32:58 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Mikrotik_1:_Install_GNS3_Arch_Linux</comments>
		</item>
		<item>
			<title>Networking</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=875&amp;oldid=874</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=875&amp;oldid=874</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:32, 22 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l11&quot;&gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Media Koneksi Ethernet (Layer 1)]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Media Koneksi Ethernet (Layer 1)]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Perangkat Jaringan: Hub, Switch, dan Router]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Perangkat Jaringan: Hub, Switch, dan Router]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;= Mikrotik =&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Mikrotik 1: Install GNS3 Arch Linux]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Cisco =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Cisco =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l16&quot;&gt;Line 16:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 19:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Perintah Dasar Cisco IOS]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Perintah Dasar Cisco IOS]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Lab =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;= Cisco &lt;/ins&gt;Lab &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=&lt;/ins&gt;=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Lab 0.1 - Basic Device Hardening]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Lab 0.1 - Basic Device Hardening]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Thu, 22 Oct 2026 09:32:46 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Networking</comments>
		</item>
		<item>
			<title>CCNA</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=CCNA&amp;diff=874&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=CCNA&amp;diff=874&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/wiki/index.php?title=User:SanzSkuy&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new mw-userlink&quot; title=&quot;User:SanzSkuy (page does not exist)&quot;&gt;&lt;bdi&gt;SanzSkuy&lt;/bdi&gt;&lt;/a&gt; moved page &lt;a href=&quot;/wiki/index.php?title=CCNA&amp;amp;redirect=no&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;CCNA (page does not exist)&quot;&gt;CCNA&lt;/a&gt; to &lt;a href=&quot;/wiki/index.php/Networking&quot; title=&quot;Networking&quot;&gt;Networking&lt;/a&gt; without leaving a redirect&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Networking =&lt;br /&gt;
* [[Model OSI]]&lt;br /&gt;
* [[Lapisan Transport (TCP dan UDP)]]&lt;br /&gt;
* [[Kelas Alamat IP]]&lt;br /&gt;
* [[Subnetting 1]]&lt;br /&gt;
* [[VLSM]]&lt;br /&gt;
* [[Magic Number Method &amp;amp; Subnetting Jaringan Besar]]&lt;br /&gt;
* [[Subnetting: Contoh Oktet ke-3 vs ke-4]]&lt;br /&gt;
* [[Private IP Address (RFC 1918)]]&lt;br /&gt;
* [[Ethernet &amp;amp; Layer 2 (Data Link)]]&lt;br /&gt;
* [[Media Koneksi Ethernet (Layer 1)]]&lt;br /&gt;
* [[Perangkat Jaringan: Hub, Switch, dan Router]]&lt;br /&gt;
&lt;br /&gt;
= Cisco =&lt;br /&gt;
* [[Cisco IOS]]&lt;br /&gt;
* [[Perintah Dasar Cisco IOS]]&lt;br /&gt;
&lt;br /&gt;
= Lab =&lt;br /&gt;
* [[Lab 0.1 - Basic Device Hardening]]&lt;/div&gt;</description>
			<pubDate>Thu, 22 Oct 2026 09:31:24 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:CCNA</comments>
		</item>
		<item>
			<title>Deploy app bare-metal</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Deploy_app_bare-metal&amp;diff=873&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Deploy_app_bare-metal&amp;diff=873&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;Catatan tentang cara deploy aplikasi (Python FastAPI, Rust Actix, Node frontend) langsung di server Ubuntu (contoh: &amp;lt;code&amp;gt;marshall-3&amp;lt;/code&amp;gt;) tanpa Docker, memakai &amp;#039;&amp;#039;&amp;#039;uv&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;systemd&amp;#039;&amp;#039;&amp;#039;, dan &amp;#039;&amp;#039;&amp;#039;Ansible&amp;#039;&amp;#039;&amp;#039;. Fokus utama catatan ini adalah sisi &amp;#039;&amp;#039;&amp;#039;sysadmin&amp;#039;&amp;#039;&amp;#039;: layout direktori, model user dan permission, hardening service, dan otomasi.  == Gambaran besar ==  Docker memberi tiga hal: &amp;#039;&amp;#039;&amp;#039;isolasi&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;reproducibility&amp;#039;&amp;#039;&amp;#039;, dan &amp;#039;&amp;#039;&amp;#039;packaging&amp;#039;&amp;#039;&amp;#039;. Di bare metal, ketiganya tetap b...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Catatan tentang cara deploy aplikasi (Python FastAPI, Rust Actix, Node frontend) langsung di server Ubuntu (contoh: &amp;lt;code&amp;gt;marshall-3&amp;lt;/code&amp;gt;) tanpa Docker, memakai &amp;#039;&amp;#039;&amp;#039;uv&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;systemd&amp;#039;&amp;#039;&amp;#039;, dan &amp;#039;&amp;#039;&amp;#039;Ansible&amp;#039;&amp;#039;&amp;#039;. Fokus utama catatan ini adalah sisi &amp;#039;&amp;#039;&amp;#039;sysadmin&amp;#039;&amp;#039;&amp;#039;: layout direktori, model user dan permission, hardening service, dan otomasi.&lt;br /&gt;
&lt;br /&gt;
== Gambaran besar ==&lt;br /&gt;
&lt;br /&gt;
Docker memberi tiga hal: &amp;#039;&amp;#039;&amp;#039;isolasi&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;reproducibility&amp;#039;&amp;#039;&amp;#039;, dan &amp;#039;&amp;#039;&amp;#039;packaging&amp;#039;&amp;#039;&amp;#039;. Di bare metal, ketiganya tetap bisa didapat dengan alat bawaan Linux:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kebutuhan !! Di Docker !! Di bare metal&lt;br /&gt;
|-&lt;br /&gt;
| Isolasi proses || namespace, cgroup || user terpisah per app + hardening systemd (juga pakai namespace &amp;amp; cgroup)&lt;br /&gt;
|-&lt;br /&gt;
| Dependency terkunci || image || lock file (&amp;lt;code&amp;gt;uv.lock&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Cargo.lock&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;package-lock.json&amp;lt;/code&amp;gt;) + venv per release&lt;br /&gt;
|-&lt;br /&gt;
| Restart otomatis || &amp;lt;code&amp;gt;restart: unless-stopped&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Restart=on-failure&amp;lt;/code&amp;gt; di unit systemd&lt;br /&gt;
|-&lt;br /&gt;
| Log || &amp;lt;code&amp;gt;docker logs&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;journalctl -u nama-app&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Rollback || tag image lama || folder release lama + symlink&lt;br /&gt;
|-&lt;br /&gt;
| Deploy berulang || compose / CI || Ansible&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kapan bare metal masuk akal:&amp;#039;&amp;#039;&amp;#039; sedikit server, workload GPU, tim kecil, atau binary tunggal (Rust/Go).&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kapan Docker lebih unggul:&amp;#039;&amp;#039;&amp;#039; banyak server, scaling horizontal, atau dependency sistem yang bentrok antar app (misalnya versi CUDA berbeda per app, karena di bare metal semua app berbagi satu driver NVIDIA).&lt;br /&gt;
&lt;br /&gt;
== Layout direktori (FHS) ==&lt;br /&gt;
&lt;br /&gt;
Setiap app memakai lokasi standar &amp;#039;&amp;#039;Filesystem Hierarchy Standard&amp;#039;&amp;#039;, supaya jelas mana kode, mana config, mana data:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Path !! Isi !! Kenapa di sini&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/&amp;amp;lt;app&amp;amp;gt;/releases/&amp;amp;lt;versi&amp;amp;gt;/&amp;lt;/code&amp;gt; || kode + &amp;lt;code&amp;gt;.venv&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;dist&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt; untuk software tambahan yang bukan dari paket OS&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/&amp;amp;lt;app&amp;amp;gt;/current&amp;lt;/code&amp;gt; || symlink ke release aktif || service selalu menunjuk ke sini; ganti versi = ganti symlink&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/&amp;amp;lt;app&amp;amp;gt;/&amp;amp;lt;app&amp;amp;gt;.env&amp;lt;/code&amp;gt; || environment variable &amp;amp; secret || &amp;lt;code&amp;gt;/etc&amp;lt;/code&amp;gt; untuk konfigurasi milik host, terpisah dari kode&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;/&amp;lt;/code&amp;gt; || data, cache model, upload, cache uv/cargo/npm || &amp;lt;code&amp;gt;/var/lib&amp;lt;/code&amp;gt; untuk state yang ditulis aplikasi saat jalan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/uv/python/&amp;lt;/code&amp;gt; || interpreter Python bersama || dipakai semua app, bukan milik satu user&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/systemd/system/&amp;amp;lt;app&amp;amp;gt;.service&amp;lt;/code&amp;gt; || unit service || lokasi unit buatan admin (bukan dari paket)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pemisahan ini penting untuk permission: &amp;#039;&amp;#039;&amp;#039;kode&amp;#039;&amp;#039;&amp;#039; boleh read-only saat runtime, &amp;#039;&amp;#039;&amp;#039;config&amp;#039;&amp;#039;&amp;#039; hanya root yang boleh ubah, dan &amp;#039;&amp;#039;&amp;#039;hanya folder data&amp;#039;&amp;#039;&amp;#039; yang boleh ditulis aplikasi.&lt;br /&gt;
&lt;br /&gt;
== Model user &amp;amp; permission ==&lt;br /&gt;
&lt;br /&gt;
=== Satu app, satu system user ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo useradd --system --home-dir /var/lib/transcribe-api \&lt;br /&gt;
  --shell /usr/sbin/nologin transcribe&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--system&amp;lt;/code&amp;gt;: UID diambil dari rentang system (di Ubuntu di bawah 1000), tidak muncul di layar login, dan tidak dibuatkan mailbox atau aging password.&lt;br /&gt;
* &amp;lt;code&amp;gt;--shell /usr/sbin/nologin&amp;lt;/code&amp;gt;: user tidak bisa login interaktif. Kalau proses app dibobol, penyerang tidak otomatis dapat shell login.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kenapa per app?&amp;#039;&amp;#039;&amp;#039; Kalau satu app bocor, app lain dan file-nya tidak ikut terbaca. Ini prinsip &amp;#039;&amp;#039;least privilege&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Perintah berguna:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
id transcribe                 # UID, GID, dan group tambahan&lt;br /&gt;
getent passwd transcribe      # home &amp;amp; shell&lt;br /&gt;
getent group | grep transcribe&lt;br /&gt;
sudo -u transcribe -H bash -c &amp;#039;whoami; echo $HOME&amp;#039;   # tes sebagai user app&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Salah nama user?&amp;#039;&amp;#039;&amp;#039; Rename tanpa bikin ulang:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo usermod -l transcribe -d /var/lib/transcribe-api appuser   # ganti login &amp;amp; home&lt;br /&gt;
sudo groupmod -n transcribe appuser                            # ganti nama group&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Karena UID/GID tidak berubah, ownership file otomatis ikut. &amp;lt;code&amp;gt;usermod -d&amp;lt;/code&amp;gt; akan gagal kalau user sedang dipakai proses yang jalan, jadi stop service-nya dulu.&lt;br /&gt;
&lt;br /&gt;
Error &amp;lt;code&amp;gt;chown: invalid group: &amp;#039;root:appuser&amp;#039;&amp;lt;/code&amp;gt; artinya group tersebut sudah tidak ada (sudah di-rename atau dihapus). Cek dengan &amp;lt;code&amp;gt;getent group&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Tabel ownership &amp;amp; mode ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Path !! Owner:Group !! Mode !! Artinya&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; || root:root || &amp;lt;code&amp;gt;0755&amp;lt;/code&amp;gt; || hanya root yang bisa membuat/mengganti symlink &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/&amp;amp;lt;app&amp;amp;gt;/releases&amp;lt;/code&amp;gt; || app:app || &amp;lt;code&amp;gt;0755&amp;lt;/code&amp;gt; || user app meng-clone dan build release di sini&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; || root:app || &amp;lt;code&amp;gt;0750&amp;lt;/code&amp;gt; || app boleh masuk &amp;amp; baca, user lain tidak bisa melihat isinya&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/&amp;amp;lt;app&amp;amp;gt;/&amp;amp;lt;app&amp;amp;gt;.env&amp;lt;/code&amp;gt; || root:app || &amp;lt;code&amp;gt;0640&amp;lt;/code&amp;gt; || root tulis, app baca, lainnya tidak bisa apa-apa&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; || app:app || &amp;lt;code&amp;gt;0750&amp;lt;/code&amp;gt; || satu-satunya tempat app boleh menulis&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;/.ssh&amp;lt;/code&amp;gt; || app:app || &amp;lt;code&amp;gt;0700&amp;lt;/code&amp;gt; || deploy key; SSH menolak key yang permission-nya terlalu terbuka&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/uv/python&amp;lt;/code&amp;gt; || root:root || &amp;lt;code&amp;gt;a+rX&amp;lt;/code&amp;gt; || semua user boleh baca &amp;amp; eksekusi interpreter, tidak boleh ubah&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Membaca mode oktal ===&lt;br /&gt;
&lt;br /&gt;
Tiap digit = &amp;#039;&amp;#039;&amp;#039;owner&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;group&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;others&amp;#039;&amp;#039;&amp;#039;. Nilainya jumlah dari &amp;lt;code&amp;gt;r=4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;w=2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Owner !! Group !! Others !! Dipakai untuk&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0755&amp;lt;/code&amp;gt; || rwx || r-x || r-x || folder publik, binary&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0750&amp;lt;/code&amp;gt; || rwx || r-x || --- || folder privat yang boleh dibaca group&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0700&amp;lt;/code&amp;gt; || rwx || --- || --- || folder sangat privat (&amp;lt;code&amp;gt;.ssh&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0640&amp;lt;/code&amp;gt; || rw- || r-- || --- || file secret yang dibaca group&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0600&amp;lt;/code&amp;gt; || rw- || --- || --- || private key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Untuk &amp;#039;&amp;#039;&amp;#039;folder&amp;#039;&amp;#039;&amp;#039;, bit &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; artinya &amp;quot;boleh masuk (traverse)&amp;quot;, bukan &amp;quot;eksekusi&amp;quot;. Tanpa &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; di folder induk, file di dalamnya tidak bisa diakses walaupun file-nya sendiri &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chmod -R a+rX&amp;lt;/code&amp;gt; (huruf X besar) memberi &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; hanya ke folder dan file yang sudah executable. Ini cara aman membuka akses baca satu pohon direktori tanpa membuat semua file teks jadi executable.&lt;br /&gt;
&lt;br /&gt;
=== Kenapa env file &amp;lt;code&amp;gt;root:app 0640&amp;lt;/code&amp;gt;? ===&lt;br /&gt;
&lt;br /&gt;
* App perlu &amp;#039;&amp;#039;&amp;#039;membaca&amp;#039;&amp;#039;&amp;#039; secret (DATABASE_URL, SECRET_KEY), tapi tidak perlu &amp;#039;&amp;#039;&amp;#039;mengubahnya&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Kalau app dibobol, penyerang tidak bisa mengganti config agar persisten.&lt;br /&gt;
* User lain di server tidak bisa membaca secret sama sekali.&lt;br /&gt;
* Jangan simpan secret di &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; dalam folder kode: gampang ikut ter-commit, dan ikut terbaca siapa pun yang bisa membaca kode.&lt;br /&gt;
&lt;br /&gt;
=== Toolchain bersama &amp;amp; masalah home directory ===&lt;br /&gt;
&lt;br /&gt;
uv bisa meng-install Python sendiri. Defaultnya ke &amp;lt;code&amp;gt;~/.local/share/uv/python&amp;lt;/code&amp;gt;. Masalahnya:&lt;br /&gt;
&lt;br /&gt;
* venv &amp;#039;&amp;#039;&amp;#039;hanya symlink&amp;#039;&amp;#039;&amp;#039; ke interpreter. Kalau interpreter ada di home user A, user B tidak bisa memakainya.&lt;br /&gt;
* Unit systemd dengan &amp;lt;code&amp;gt;ProtectHome=true&amp;lt;/code&amp;gt; membuat &amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root&amp;lt;/code&amp;gt;, dan &amp;lt;code&amp;gt;/run/user&amp;lt;/code&amp;gt; tidak terlihat. Interpreter di home = service gagal start.&lt;br /&gt;
&lt;br /&gt;
Solusinya taruh di lokasi bersama dan buka akses baca:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export UV_PYTHON_INSTALL_DIR=/opt/uv/python&lt;br /&gt;
sudo -E uv python install 3.13&lt;br /&gt;
sudo chmod -R a+rX /opt/uv/python&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pola yang sama untuk Rust: &amp;lt;code&amp;gt;RUSTUP_HOME=/opt/rust/rustup&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CARGO_HOME=/opt/rust/cargo&amp;lt;/code&amp;gt;, lalu &amp;lt;code&amp;gt;a+rX&amp;lt;/code&amp;gt;. Cache per app (registry cargo, cache uv, cache npm) ditaruh di &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; yang memang writable.&lt;br /&gt;
&lt;br /&gt;
=== Akses GPU ===&lt;br /&gt;
&lt;br /&gt;
Device NVIDIA ada di &amp;lt;code&amp;gt;/dev/nvidia*&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ls -l /dev/nvidia*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Kalau mode-nya &amp;lt;code&amp;gt;crw-rw-rw-&amp;lt;/code&amp;gt;, semua user bisa memakai GPU. Kalau hanya group &amp;lt;code&amp;gt;video&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;render&amp;lt;/code&amp;gt;, tambahkan user app ke group tersebut (&amp;lt;code&amp;gt;usermod -aG video transcribe&amp;lt;/code&amp;gt;) dan tulis &amp;lt;code&amp;gt;SupplementaryGroups=video&amp;lt;/code&amp;gt; di unit. Opsi &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; wajib; tanpa itu, group tambahan lain akan terhapus.&lt;br /&gt;
&lt;br /&gt;
=== sudo yang sempit ===&lt;br /&gt;
&lt;br /&gt;
Kalau deploy dijalankan sebagai user app dan perlu restart service, beri izin &amp;#039;&amp;#039;&amp;#039;hanya&amp;#039;&amp;#039;&amp;#039; untuk perintah itu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;#039;transcribe ALL=(root) NOPASSWD: /usr/bin/systemctl restart transcribe-api, /usr/bin/systemctl restart transcribe-api-worker&amp;#039; \&lt;br /&gt;
  | sudo tee /etc/sudoers.d/transcribe-api&lt;br /&gt;
sudo chmod 0440 /etc/sudoers.d/transcribe-api&lt;br /&gt;
sudo visudo -cf /etc/sudoers.d/transcribe-api     # validasi sintaks!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Selalu validasi dengan &amp;lt;code&amp;gt;visudo -c&amp;lt;/code&amp;gt;. File sudoers yang rusak bisa mengunci &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; untuk semua orang.&lt;br /&gt;
* Path harus absolut dan persis sama. Di Ubuntu modern &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; adalah symlink ke &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;, tapi sudo membandingkan string path, jadi cek dengan &amp;lt;code&amp;gt;command -v systemctl&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Jangan beri &amp;lt;code&amp;gt;NOPASSWD: ALL&amp;lt;/code&amp;gt; ke user app. Itu sama saja memberi root.&lt;br /&gt;
&lt;br /&gt;
Kalau deploy dijalankan lewat Ansible dengan user admin + &amp;lt;code&amp;gt;become&amp;lt;/code&amp;gt;, aturan sudoers untuk user app &amp;#039;&amp;#039;&amp;#039;tidak diperlukan sama sekali&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Siapa yang boleh menulis kode? ===&lt;br /&gt;
&lt;br /&gt;
Di setup ini user app yang meng-clone dan build release, jadi kode bisa ditulis oleh user app. Ini sederhana tapi berarti app yang dibobol bisa mengubah kodenya sendiri. Alternatif yang lebih ketat:&lt;br /&gt;
&lt;br /&gt;
* Buat user &amp;lt;code&amp;gt;deployer&amp;lt;/code&amp;gt; terpisah yang meng-clone &amp;amp; build semua release.&lt;br /&gt;
* User app hanya punya akses baca + eksekusi ke &amp;lt;code&amp;gt;/opt/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bonus: cache uv bisa dipakai bersama antar app, sehingga hardlink menghemat disk (berguna untuk paket besar seperti torch).&lt;br /&gt;
&lt;br /&gt;
Pada level ini, &amp;lt;code&amp;gt;ProtectSystem=strict&amp;lt;/code&amp;gt; sudah menahan sebagian besar risiko: saat runtime seluruh filesystem read-only bagi proses app, kecuali &amp;lt;code&amp;gt;ReadWritePaths&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== systemd ==&lt;br /&gt;
&lt;br /&gt;
=== Anatomi unit ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Transcribe API&lt;br /&gt;
After=network-online.target redis-server.service&lt;br /&gt;
Wants=network-online.target redis-server.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=transcribe&lt;br /&gt;
Group=transcribe&lt;br /&gt;
SupplementaryGroups=video&lt;br /&gt;
WorkingDirectory=/opt/transcribe-api/current&lt;br /&gt;
Environment=HOME=/var/lib/transcribe-api&lt;br /&gt;
Environment=PORT=6969&lt;br /&gt;
EnvironmentFile=-/etc/transcribe-api/transcribe-api.env&lt;br /&gt;
ExecStart=/opt/transcribe-api/current/.venv/bin/python -m uvicorn main:app --host 127.0.0.1 --port 6969&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
ProtectSystem=strict&lt;br /&gt;
ProtectHome=true&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
ReadWritePaths=/var/lib/transcribe-api&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan per baris:&lt;br /&gt;
* &amp;lt;code&amp;gt;After=&amp;lt;/code&amp;gt; mengatur &amp;#039;&amp;#039;&amp;#039;urutan&amp;#039;&amp;#039;&amp;#039;, &amp;lt;code&amp;gt;Wants=&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Requires=&amp;lt;/code&amp;gt; mengatur &amp;#039;&amp;#039;&amp;#039;ketergantungan&amp;#039;&amp;#039;&amp;#039;. Hanya &amp;lt;code&amp;gt;After=&amp;lt;/code&amp;gt; tidak membuat Redis ikut dijalankan.&lt;br /&gt;
* &amp;lt;code&amp;gt;EnvironmentFile=-...&amp;lt;/code&amp;gt;: tanda &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; artinya &amp;quot;jangan gagal kalau file tidak ada&amp;quot;. Variabel dari file &amp;#039;&amp;#039;&amp;#039;meng-override&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;Environment=&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Format env file systemd: &amp;lt;code&amp;gt;KEY=value&amp;lt;/code&amp;gt; per baris, &amp;#039;&amp;#039;&amp;#039;tanpa&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;export&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ExecStart&amp;lt;/code&amp;gt; harus path absolut. Panggil binary venv langsung, bukan &amp;lt;code&amp;gt;uv run&amp;lt;/code&amp;gt;, karena &amp;lt;code&amp;gt;uv run&amp;lt;/code&amp;gt; bisa mencoba sync dependency saat start.&lt;br /&gt;
* Worker sebaiknya &amp;lt;code&amp;gt;Restart=always&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;TimeoutStopSec=120&amp;lt;/code&amp;gt; supaya job yang sedang jalan sempat selesai saat restart (systemd mengirim SIGTERM dulu, baru SIGKILL setelah timeout).&lt;br /&gt;
&lt;br /&gt;
=== Directive hardening ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Directive !! Efek&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NoNewPrivileges=true&amp;lt;/code&amp;gt; || proses dan turunannya tidak bisa naik hak akses (setuid, file capabilities tidak berlaku)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ProtectSystem=strict&amp;lt;/code&amp;gt; || seluruh filesystem read-only bagi service&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ReadWritePaths=&amp;lt;/code&amp;gt; || pengecualian: path yang tetap boleh ditulis&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ProtectHome=true&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/run/user&amp;lt;/code&amp;gt; tidak terlihat&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PrivateTmp=true&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; privat per service, tidak berbagi dengan proses lain&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ukur tingkat keamanan unit:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemd-analyze security transcribe-api&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Output-nya memberi skor dan daftar directive lain yang bisa ditambahkan (misalnya &amp;lt;code&amp;gt;ProtectKernelTunables&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RestrictAddressFamilies&amp;lt;/code&amp;gt;). Tambahkan bertahap dan tes, karena hardening yang terlalu ketat bisa mematahkan app (misalnya akses GPU butuh device yang tidak diblokir &amp;lt;code&amp;gt;PrivateDevices&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Operasional harian ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl daemon-reload                     # wajib setelah edit file unit&lt;br /&gt;
sudo systemctl enable --now transcribe-api       # aktif saat boot + jalan sekarang&lt;br /&gt;
systemctl status transcribe-api transcribe-api-worker&lt;br /&gt;
journalctl -u transcribe-api -u transcribe-api-worker -f    # follow log&lt;br /&gt;
journalctl -u transcribe-api --since &amp;quot;1 hour ago&amp;quot; -p err    # hanya error&lt;br /&gt;
systemctl cat transcribe-api                      # lihat unit final yang dipakai&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exit code systemd yang sering muncul ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status !! Penyebab umum&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;status=203/EXEC&amp;lt;/code&amp;gt; || path di &amp;lt;code&amp;gt;ExecStart&amp;lt;/code&amp;gt; salah, file tidak executable, atau venv rusak (interpreter yang di-symlink tidak bisa diakses)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;status=217/USER&amp;lt;/code&amp;gt; || user di &amp;lt;code&amp;gt;User=&amp;lt;/code&amp;gt; tidak ada&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;status=200/CHDIR&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;WorkingDirectory&amp;lt;/code&amp;gt; tidak ada atau tidak bisa dimasuki user app&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;status=226/NAMESPACE&amp;lt;/code&amp;gt; || path di &amp;lt;code&amp;gt;ReadWritePaths&amp;lt;/code&amp;gt; belum dibuat&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Permission denied&amp;lt;/code&amp;gt; di log app || app menulis di luar &amp;lt;code&amp;gt;ReadWritePaths&amp;lt;/code&amp;gt; (cache model, file upload); arahkan ke &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pola release + symlink ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/transcribe-api/&lt;br /&gt;
├── releases/&lt;br /&gt;
│   ├── 3f2a9c1d7e0b/&lt;br /&gt;
│   └── 9be41c0a22f1/&lt;br /&gt;
└── current -&amp;gt; releases/3f2a9c1d7e0b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alur deploy:&lt;br /&gt;
# Clone versi baru ke &amp;lt;code&amp;gt;releases/&amp;amp;lt;sha&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Build (&amp;lt;code&amp;gt;uv sync --locked --no-dev&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cargo build --release --locked&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;npm ci &amp;amp;&amp;amp; npm run build&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Jalankan migrasi database kalau ada.&lt;br /&gt;
# Arahkan &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt; ke release baru, restart service.&lt;br /&gt;
# Health check. Gagal → arahkan kembali ke release lama.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Soal atomik:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;ln -sfn&amp;lt;/code&amp;gt; sebenarnya menghapus symlink lalu membuat ulang, sehingga ada jeda sangat singkat tanpa &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt;. Cara yang benar-benar atomik:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ln -s /opt/app/releases/NEW /opt/app/current.tmp&lt;br /&gt;
mv -T /opt/app/current.tmp /opt/app/current     # rename(2) atomik&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Venv tidak bisa dipindah.&amp;#039;&amp;#039;&amp;#039; Path absolut tertanam di script dalam &amp;lt;code&amp;gt;.venv/bin&amp;lt;/code&amp;gt;, jadi selalu build venv langsung di folder release, jangan build di tempat lain lalu di-copy.&lt;br /&gt;
&lt;br /&gt;
== Python dengan uv ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;uv sync --locked&amp;lt;/code&amp;gt; gagal kalau &amp;lt;code&amp;gt;uv.lock&amp;lt;/code&amp;gt; tidak sinkron dengan &amp;lt;code&amp;gt;pyproject.toml&amp;lt;/code&amp;gt;. Ini yang diinginkan di produksi: server tidak pernah mengubah lock file.&lt;br /&gt;
* &amp;lt;code&amp;gt;--no-dev&amp;lt;/code&amp;gt; melewati dependency development/test.&lt;br /&gt;
* &amp;lt;code&amp;gt;UV_PYTHON_DOWNLOADS=never&amp;lt;/code&amp;gt; mencegah uv diam-diam mengunduh Python saat build.&lt;br /&gt;
* Update dependency dilakukan di laptop: &amp;lt;code&amp;gt;uv lock --upgrade&amp;lt;/code&amp;gt;, commit, lalu deploy.&lt;br /&gt;
* Cache uv memakai hardlink ke venv selama berada di filesystem yang sama, sehingga deploy berikutnya cepat dan hemat disk.&lt;br /&gt;
&lt;br /&gt;
== Redis lokal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install -y redis-server&lt;br /&gt;
sudo sed -i &amp;#039;s/^appendonly no/appendonly yes/&amp;#039; /etc/redis/redis.conf   # persistence&lt;br /&gt;
grep -E &amp;#039;^(bind|appendonly)&amp;#039; /etc/redis/redis.conf                     # bind 127.0.0.1 -::1&lt;br /&gt;
sudo systemctl enable --now redis-server&lt;br /&gt;
redis-cli ping&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Redis tanpa password &amp;#039;&amp;#039;&amp;#039;wajib&amp;#039;&amp;#039;&amp;#039; hanya listen di localhost. Di Docker, hostname-nya &amp;lt;code&amp;gt;redis&amp;lt;/code&amp;gt;; di bare metal jadi &amp;lt;code&amp;gt;redis://127.0.0.1:6379/0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Jaringan ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--host 127.0.0.1&amp;lt;/code&amp;gt;: app hanya bisa diakses dari server itu sendiri (cocok kalau nginx ada di server yang sama).&lt;br /&gt;
* &amp;lt;code&amp;gt;--host 0.0.0.0&amp;lt;/code&amp;gt;: app bisa diakses dari luar. Wajib dibarengi firewall.&lt;br /&gt;
* Kalau nginx publik ada di VM proxy terpisah, buka port app &amp;#039;&amp;#039;&amp;#039;hanya untuk IP VM proxy&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ufw allow OpenSSH&lt;br /&gt;
sudo ufw allow from 192.168.88.10 to any port 6969 proto tcp comment &amp;#039;transcribe-api&amp;#039;&lt;br /&gt;
sudo ufw enable&lt;br /&gt;
sudo ufw status numbered&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu memakai &amp;#039;&amp;#039;&amp;#039;AppArmor&amp;#039;&amp;#039;&amp;#039;, bukan SELinux seperti AlmaLinux/RHEL. Untuk app di &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt; biasanya tidak perlu konfigurasi tambahan.&lt;br /&gt;
&lt;br /&gt;
== Otomasi dengan Ansible ==&lt;br /&gt;
&lt;br /&gt;
=== Kenapa Ansible ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Agentless&amp;#039;&amp;#039;&amp;#039;: cukup SSH + Python di server.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Idempotent&amp;#039;&amp;#039;&amp;#039;: dijalankan berkali-kali hasilnya sama; hanya yang berubah yang diubah.&lt;br /&gt;
* Semua langkah manual di atas terdokumentasi sebagai kode, sehingga server bisa dibangun ulang kapan saja.&lt;br /&gt;
&lt;br /&gt;
=== Struktur project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ansible-apps/&lt;br /&gt;
├── inventory.ini            daftar server&lt;br /&gt;
├── apps.yml                 daftar app (repo, port, worker)&lt;br /&gt;
├── deploy.yml               playbook utama&lt;br /&gt;
├── group_vars/all/main.yml  setting global&lt;br /&gt;
├── group_vars/all/vault.yml secret terenkripsi&lt;br /&gt;
├── scripts/new-app.sh       tambah app interaktif&lt;br /&gt;
└── roles/&lt;br /&gt;
    ├── base/                paket dasar&lt;br /&gt;
    ├── redis/&lt;br /&gt;
    ├── python_toolchain/    uv + Python di /opt/uv/python&lt;br /&gt;
    ├── rust_toolchain/      rustup di /opt/rust&lt;br /&gt;
    ├── node_toolchain/      NodeSource&lt;br /&gt;
    └── app/                 clone, deteksi tipe, build, systemd/nginx, health check, rollback&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Entry app ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
apps:&lt;br /&gt;
  - name: transcribe-api&lt;br /&gt;
    repo: git@github.com:org/transcribe-api.git&lt;br /&gt;
    version: main&lt;br /&gt;
    port: 6969&lt;br /&gt;
    user: transcribe&lt;br /&gt;
    worker: true          # bikin service transcribe-api-worker&lt;br /&gt;
    redis: true&lt;br /&gt;
    apt_packages: [ffmpeg]&lt;br /&gt;
    extra_groups: [video]&lt;br /&gt;
    health_path: /health&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tipe app dideteksi dari isi repo: &amp;lt;code&amp;gt;pyproject.toml&amp;lt;/code&amp;gt; → Python, &amp;lt;code&amp;gt;Cargo.toml&amp;lt;/code&amp;gt; → Rust, &amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt; → Node (Vite/React jadi static di-serve nginx, Next/Nuxt jadi service).&lt;br /&gt;
&lt;br /&gt;
=== Perintah ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ansible-playbook deploy.yml                                   # semua app&lt;br /&gt;
ansible-playbook deploy.yml -e only=transcribe-api            # satu app&lt;br /&gt;
ansible-playbook deploy.yml -e only=core-api -e rev=v1.2.0    # versi tertentu / rollback&lt;br /&gt;
ansible-playbook deploy.yml --syntax-check&lt;br /&gt;
ansible-vault encrypt group_vars/all/vault.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konsep Ansible yang terkait permission ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;become: true&amp;lt;/code&amp;gt;: task dijalankan sebagai root lewat sudo.&lt;br /&gt;
* &amp;lt;code&amp;gt;become_user: transcribe&amp;lt;/code&amp;gt;: task dijalankan sebagai user app (clone, build), sehingga file yang dihasilkan langsung dimiliki user yang benar tanpa &amp;lt;code&amp;gt;chown&amp;lt;/code&amp;gt; belakangan.&lt;br /&gt;
* Paket &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; wajib terpasang. Saat &amp;lt;code&amp;gt;become_user&amp;lt;/code&amp;gt; ke user non-root, Ansible menulis file modul sementara lalu memakai ACL (&amp;lt;code&amp;gt;setfacl&amp;lt;/code&amp;gt;) agar user tujuan bisa membacanya.&lt;br /&gt;
* Modul &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; dengan &amp;lt;code&amp;gt;owner&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt; menggantikan rangkaian &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;chown&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;chmod&amp;lt;/code&amp;gt; dan idempotent.&lt;br /&gt;
* Secret di &amp;#039;&amp;#039;&amp;#039;ansible-vault&amp;#039;&amp;#039;&amp;#039;, dirender ke env file lewat modul &amp;lt;code&amp;gt;template&amp;lt;/code&amp;gt; dengan mode &amp;lt;code&amp;gt;0640&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Deploy key untuk repo private ===&lt;br /&gt;
&lt;br /&gt;
* Satu key per app, disimpan di &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;/.ssh/id_ed25519&amp;lt;/code&amp;gt; (mode &amp;lt;code&amp;gt;0600&amp;lt;/code&amp;gt;, folder &amp;lt;code&amp;gt;0700&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Didaftarkan sebagai &amp;#039;&amp;#039;&amp;#039;Deploy Key read-only&amp;#039;&amp;#039;&amp;#039; di repo. Kalau server bocor, yang terekspos hanya akses baca ke satu repo, bukan akun GitHub pribadi.&lt;br /&gt;
* &amp;lt;code&amp;gt;StrictHostKeyChecking=accept-new&amp;lt;/code&amp;gt;: host key disimpan saat pertama kali, dan koneksi ditolak kalau host key berubah (proteksi MITM).&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gejala !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chown: invalid group&amp;lt;/code&amp;gt; || group sudah di-rename/dihapus || &amp;lt;code&amp;gt;getent group&amp;lt;/code&amp;gt;, pakai nama baru&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;useradd&amp;lt;/code&amp;gt; menghasilkan shell aneh || sisa &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; line-continuation ikut diketik dalam satu baris || cek &amp;lt;code&amp;gt;getent passwd&amp;lt;/code&amp;gt;, bikin ulang user&lt;br /&gt;
|-&lt;br /&gt;
| Service &amp;lt;code&amp;gt;203/EXEC&amp;lt;/code&amp;gt; padahal file ada || venv menunjuk ke Python di home user lain || install Python di &amp;lt;code&amp;gt;/opt/uv/python&amp;lt;/code&amp;gt;, buat ulang venv&lt;br /&gt;
|-&lt;br /&gt;
| Model Whisper gagal diunduh || cache di luar &amp;lt;code&amp;gt;ReadWritePaths&amp;lt;/code&amp;gt; || set &amp;lt;code&amp;gt;WHISPER_CACHE_DIR&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;HF_HOME&amp;lt;/code&amp;gt; ke &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;libcudnn&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;libcublas&amp;lt;/code&amp;gt; not found || di Docker library datang dari image || install paket pip &amp;lt;code&amp;gt;nvidia-cudnn-cu12&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;nvidia-cublas-cu12&amp;lt;/code&amp;gt; atau CUDA toolkit di host&lt;br /&gt;
|-&lt;br /&gt;
| Worker restart terus || error di job pertama atau Redis belum jalan || &amp;lt;code&amp;gt;journalctl -u app-worker -n 100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;redis-cli ping&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Ansible gagal &amp;lt;code&amp;gt;become_user&amp;lt;/code&amp;gt; || paket &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; belum terpasang || &amp;lt;code&amp;gt;apt install acl&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Checklist server baru ==&lt;br /&gt;
&lt;br /&gt;
* [ ] User admin pakai SSH key, login password dimatikan&lt;br /&gt;
* [ ] &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; aktif, hanya SSH + port yang perlu&lt;br /&gt;
* [ ] Driver NVIDIA terpasang, &amp;lt;code&amp;gt;nvidia-smi&amp;lt;/code&amp;gt; jalan (kalau ada GPU)&lt;br /&gt;
* [ ] &amp;lt;code&amp;gt;unattended-upgrades&amp;lt;/code&amp;gt; aktif untuk patch keamanan&lt;br /&gt;
* [ ] Jalankan &amp;lt;code&amp;gt;ansible-playbook deploy.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
* [ ] &amp;lt;code&amp;gt;systemd-analyze security &amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; untuk tiap service&lt;br /&gt;
* [ ] Backup data di &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; dan database, &amp;#039;&amp;#039;&amp;#039;tes restore&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
* [https://docs.astral.sh/uv/ Dokumentasi uv]&lt;br /&gt;
* [https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html systemd.exec (directive hardening)]&lt;br /&gt;
* [https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html Filesystem Hierarchy Standard 3.0]&lt;br /&gt;
* [https://docs.ansible.com/ Dokumentasi Ansible]&lt;/div&gt;</description>
			<pubDate>Tue, 20 Oct 2026 06:42:08 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Deploy_app_bare-metal</comments>
		</item>
		<item>
			<title>DevOps</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=DevOps&amp;diff=872&amp;oldid=519</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=DevOps&amp;diff=872&amp;oldid=519</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 06:41, 20 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l4&quot;&gt;Line 4:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 4:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Postgres master &amp;amp; slave]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Postgres master &amp;amp; slave]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Cara buat monitoring server pake Grafana &amp;amp; Prometheus]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Cara buat monitoring server pake Grafana &amp;amp; Prometheus]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Deploy app bare-metal]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Microk8s ==  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Microk8s ==  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Microk8s: setup awal]]  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Microk8s: setup awal]]  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Microk8s: setup registry]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Microk8s: setup registry]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Tue, 20 Oct 2026 06:41:50 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:DevOps</comments>
		</item>
		<item>
			<title>Main Page</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=871&amp;oldid=863</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=871&amp;oldid=863</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 01:47, 19 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l48&quot;&gt;Line 48:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 48:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[High-performance computing]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[High-performance computing]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Programming, Software Engineering, etc]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Programming, Software Engineering, etc]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Aerospace Engineering]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Istilah Penting]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Mon, 19 Oct 2026 01:47:44 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Main_Page</comments>
		</item>
		<item>
			<title>SRAM &amp; DRAM</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=SRAM_%26_DRAM&amp;diff=870&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=SRAM_%26_DRAM&amp;diff=870&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;== Pendahuluan ==  Pada model sederhana, sistem komputer terdiri dari &amp;#039;&amp;#039;&amp;#039;CPU&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;memory system&amp;#039;&amp;#039;&amp;#039; yang berupa array linear byte, dengan waktu akses konstan untuk setiap lokasi. Model ini efektif sampai batas tertentu, tetapi &amp;#039;&amp;#039;&amp;#039;tidak mencerminkan cara kerja sistem modern&amp;#039;&amp;#039;&amp;#039;.  Dalam praktiknya, memory system adalah &amp;#039;&amp;#039;&amp;#039;hierarki perangkat penyimpanan&amp;#039;&amp;#039;&amp;#039; dengan kapasitas, biaya, dan waktu akses yang berbeda-beda.  === Level hierarki (atas ke bawah) ===  # &amp;#039;&amp;#039;&amp;#039;Register C...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Pendahuluan ==&lt;br /&gt;
&lt;br /&gt;
Pada model sederhana, sistem komputer terdiri dari &amp;#039;&amp;#039;&amp;#039;CPU&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;memory system&amp;#039;&amp;#039;&amp;#039; yang berupa array linear byte, dengan waktu akses konstan untuk setiap lokasi. Model ini efektif sampai batas tertentu, tetapi &amp;#039;&amp;#039;&amp;#039;tidak mencerminkan cara kerja sistem modern&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Dalam praktiknya, memory system adalah &amp;#039;&amp;#039;&amp;#039;hierarki perangkat penyimpanan&amp;#039;&amp;#039;&amp;#039; dengan kapasitas, biaya, dan waktu akses yang berbeda-beda.&lt;br /&gt;
&lt;br /&gt;
=== Level hierarki (atas ke bawah) ===&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Register CPU&amp;#039;&amp;#039;&amp;#039;: menyimpan data yang paling sering dipakai&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Cache memory (SRAM)&amp;#039;&amp;#039;&amp;#039;: kecil dan cepat, menjadi &amp;#039;&amp;#039;staging area&amp;#039;&amp;#039; untuk subset data/instruksi di main memory&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Main memory (DRAM)&amp;#039;&amp;#039;&amp;#039;: lebih besar tetapi lambat, menjadi staging area untuk data di disk&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Disk&amp;#039;&amp;#039;&amp;#039;: sangat besar dan sangat lambat, bisa menjadi staging area untuk data di disk/tape mesin lain lewat jaringan&lt;br /&gt;
&lt;br /&gt;
Semakin ke bawah: &amp;#039;&amp;#039;&amp;#039;makin besar, makin murah per bit, makin lambat&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Kenapa hierarki ini bekerja? ===&lt;br /&gt;
&lt;br /&gt;
Program yang ditulis dengan baik cenderung mengakses level atas lebih sering daripada level di bawahnya. Akibatnya level bawah boleh lambat (sehingga besar dan murah). Efek akhirnya: &amp;#039;&amp;#039;&amp;#039;kapasitas dan biaya seperti storage paling bawah, tetapi kecepatan seperti storage paling atas&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Waktu akses ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Lokasi data !! Waktu akses&lt;br /&gt;
|-&lt;br /&gt;
| Register || 0 cycle&lt;br /&gt;
|-&lt;br /&gt;
| Cache || 4 sampai 75 cycle&lt;br /&gt;
|-&lt;br /&gt;
| Main memory || ratusan cycle&lt;br /&gt;
|-&lt;br /&gt;
| Disk || puluhan juta cycle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Locality ===&lt;br /&gt;
&lt;br /&gt;
Ide sentral bab ini. Program dengan &amp;#039;&amp;#039;&amp;#039;good locality&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* mengakses data yang &amp;#039;&amp;#039;&amp;#039;sama&amp;#039;&amp;#039;&amp;#039; berulang-ulang (&amp;#039;&amp;#039;&amp;#039;temporal locality&amp;#039;&amp;#039;&amp;#039;), atau&lt;br /&gt;
* mengakses data yang &amp;#039;&amp;#039;&amp;#039;berdekatan&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;spatial locality&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Program dengan locality bagus lebih banyak dilayani level atas, sehingga lebih cepat. Contoh: pada sistem Core i7, beberapa kernel perkalian matriks dengan jumlah operasi aritmetika yang sama bisa berbeda kecepatan hampir &amp;#039;&amp;#039;&amp;#039;40x&amp;#039;&amp;#039;&amp;#039; hanya karena locality-nya.&lt;br /&gt;
&lt;br /&gt;
=== Roadmap bab ===&lt;br /&gt;
&lt;br /&gt;
* Teknologi penyimpanan dasar: SRAM, DRAM, ROM, rotating disk, SSD&lt;br /&gt;
* Organisasi menjadi hierarki, dengan fokus pada &amp;#039;&amp;#039;&amp;#039;cache&amp;#039;&amp;#039;&amp;#039; (paling berdampak ke performa aplikasi)&lt;br /&gt;
* Menganalisis dan memperbaiki locality program C&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Memory mountain&amp;#039;&amp;#039;&amp;#039;: karakterisasi performa hierarki memori sebagai fungsi dari locality&lt;br /&gt;
&lt;br /&gt;
== 6.1 Storage Technologies ==&lt;br /&gt;
&lt;br /&gt;
Kemajuan teknologi komputer sangat dipengaruhi kemajuan teknologi storage. IBM PC-XT (1982) memiliki disk 10 MB. Pada 2015, mesin tipikal punya kapasitas disk sekitar 300.000x lebih besar, dan kapasitas naik 2x tiap dua tahun.&lt;br /&gt;
&lt;br /&gt;
=== 6.1.1 Random Access Memory (RAM) ===&lt;br /&gt;
&lt;br /&gt;
RAM terdiri dari dua varian:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SRAM&amp;#039;&amp;#039;&amp;#039; (Static RAM): lebih cepat dan jauh lebih mahal. Dipakai untuk &amp;#039;&amp;#039;&amp;#039;cache memory&amp;#039;&amp;#039;&amp;#039; (di dalam maupun di luar chip CPU).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;DRAM&amp;#039;&amp;#039;&amp;#039; (Dynamic RAM): lebih lambat dan murah. Dipakai untuk &amp;#039;&amp;#039;&amp;#039;main memory&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;frame buffer&amp;#039;&amp;#039;&amp;#039; sistem grafis.&lt;br /&gt;
&lt;br /&gt;
==== Static RAM (SRAM) ====&lt;br /&gt;
&lt;br /&gt;
* Menyimpan tiap bit dalam sel &amp;#039;&amp;#039;&amp;#039;bistable&amp;#039;&amp;#039;&amp;#039; yang terdiri dari &amp;#039;&amp;#039;&amp;#039;6 transistor&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Sirkuit punya dua konfigurasi tegangan stabil (dua &amp;#039;&amp;#039;state&amp;#039;&amp;#039;). State lain bersifat tidak stabil dan akan bergerak cepat ke salah satu state stabil.&lt;br /&gt;
* Analogi: &amp;#039;&amp;#039;&amp;#039;inverted pendulum&amp;#039;&amp;#039;&amp;#039; (pendulum terbalik)&lt;br /&gt;
** Miring penuh ke kiri: stabil&lt;br /&gt;
** Miring penuh ke kanan: stabil&lt;br /&gt;
** Tegak lurus: &amp;#039;&amp;#039;&amp;#039;metastable&amp;#039;&amp;#039;&amp;#039;. Secara teori bisa bertahan, tetapi gangguan sekecil apa pun membuatnya jatuh dan tidak kembali ke posisi tegak.&lt;br /&gt;
* Selama ada daya (power), nilai SRAM bertahan tanpa batas. Gangguan seperti noise listrik akan hilang dengan sendirinya: sirkuit kembali ke nilai stabil.&lt;br /&gt;
&lt;br /&gt;
==== Perbandingan SRAM vs DRAM (Figure 6.2) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Transistor per bit !! Waktu akses relatif !! Persistent? !! Sensitive? !! Biaya relatif !! Pemakaian&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;SRAM&amp;#039;&amp;#039;&amp;#039; || 6 || 1x || Ya || Tidak || 1.000x || Cache memory&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;DRAM&amp;#039;&amp;#039;&amp;#039; || 1 || 10x || Tidak || Ya || 1x || Main memory, frame buffer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Catatan istilah:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Biaya&amp;#039;&amp;#039;&amp;#039; = biaya per bit penyimpanan. Sebagian besar ditentukan oleh luas area silikon, sehingga SRAM (6 transistor/bit) jauh lebih mahal daripada DRAM (1 transistor/bit).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Persistent&amp;#039;&amp;#039;&amp;#039; = nilai bertahan selama chip dialiri daya, tanpa perlu di-refresh. Bukan berarti data bertahan saat listrik mati (SRAM dan DRAM keduanya &amp;#039;&amp;#039;volatile&amp;#039;&amp;#039;).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sensitive&amp;#039;&amp;#039;&amp;#039; = rentan terhadap gangguan (noise). DRAM menyimpan bit sebagai muatan di kapasitor yang bocor pelan-pelan, sehingga perlu di-refresh berkala.&lt;br /&gt;
&lt;br /&gt;
==== Conventional DRAMs ====&lt;br /&gt;
&lt;br /&gt;
Sel (bit) dalam chip DRAM dibagi menjadi &amp;#039;&amp;#039;&amp;#039;d supercell&amp;#039;&amp;#039;&amp;#039;, masing-masing terdiri dari &amp;#039;&amp;#039;&amp;#039;w sel DRAM&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* Chip &amp;#039;&amp;#039;&amp;#039;d × w&amp;#039;&amp;#039;&amp;#039; menyimpan total &amp;#039;&amp;#039;&amp;#039;d·w bit&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Supercell disusun sebagai array persegi panjang dengan &amp;#039;&amp;#039;&amp;#039;r baris&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;c kolom&amp;#039;&amp;#039;&amp;#039;, dengan &amp;#039;&amp;#039;&amp;#039;r·c = d&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Alamat supercell berbentuk &amp;#039;&amp;#039;&amp;#039;(i, j)&amp;#039;&amp;#039;&amp;#039;: i = baris, j = kolom.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Catatan terminologi&amp;#039;&amp;#039;: komunitas storage tidak punya nama baku untuk elemen array DRAM. Arsitek komputer menyebutnya &amp;quot;cell&amp;quot;, perancang sirkuit menyebutnya &amp;quot;word&amp;quot;. Buku ini memakai istilah netral &amp;#039;&amp;#039;&amp;#039;supercell&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
===== Contoh: DRAM 16 × 8 (Figure 6.3) =====&lt;br /&gt;
&lt;br /&gt;
* d = 16 supercell, w = 8 bit per supercell, total &amp;#039;&amp;#039;&amp;#039;128 bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* r = 4 baris, c = 4 kolom&lt;br /&gt;
* Supercell berwarna pada alamat &amp;#039;&amp;#039;&amp;#039;(2, 1)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Informasi keluar-masuk chip lewat &amp;#039;&amp;#039;&amp;#039;pin&amp;#039;&amp;#039;&amp;#039; (konektor eksternal), dan tiap pin membawa sinyal 1 bit:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pin data&amp;#039;&amp;#039;&amp;#039;: 8 pin, mentransfer 1 byte sekaligus&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pin addr&amp;#039;&amp;#039;&amp;#039;: 2 pin, membawa alamat baris atau kolom (2 bit)&lt;br /&gt;
* (Pin kontrol tidak ditampilkan)&lt;br /&gt;
&lt;br /&gt;
Chip DRAM dihubungkan ke &amp;#039;&amp;#039;&amp;#039;memory controller&amp;#039;&amp;#039;&amp;#039;, yaitu sirkuit yang dapat mentransfer w bit sekaligus ke/dari chip, lalu terhubung ke CPU.&lt;br /&gt;
&lt;br /&gt;
===== Membaca supercell (i, j) =====&lt;br /&gt;
&lt;br /&gt;
Dilakukan dalam dua langkah (Figure 6.4):&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;RAS (Row Access Strobe)&amp;#039;&amp;#039;&amp;#039;: controller mengirim alamat baris &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039;. DRAM menyalin &amp;#039;&amp;#039;&amp;#039;seluruh isi baris i&amp;#039;&amp;#039;&amp;#039; ke &amp;#039;&amp;#039;&amp;#039;internal row buffer&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;CAS (Column Access Strobe)&amp;#039;&amp;#039;&amp;#039;: controller mengirim alamat kolom &amp;#039;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;#039;. DRAM mengambil supercell (i, j) dari row buffer, lalu mengirim w bit-nya ke controller.&lt;br /&gt;
&lt;br /&gt;
RAS dan CAS &amp;#039;&amp;#039;&amp;#039;berbagi pin addr yang sama&amp;#039;&amp;#039;&amp;#039;, sehingga alamat harus dikirim berurutan.&lt;br /&gt;
&lt;br /&gt;
Contoh membaca supercell (2, 1) pada chip 16 × 8:&lt;br /&gt;
# Controller kirim &amp;#039;&amp;#039;&amp;#039;RAS = 2&amp;#039;&amp;#039;&amp;#039;, maka seluruh baris 2 disalin ke row buffer&lt;br /&gt;
# Controller kirim &amp;#039;&amp;#039;&amp;#039;CAS = 1&amp;#039;&amp;#039;&amp;#039;, maka 8 bit di supercell (2, 1) dikirim ke controller&lt;br /&gt;
&lt;br /&gt;
===== Internal row buffer =====&lt;br /&gt;
&lt;br /&gt;
Penyimpanan kecil di dalam chip DRAM yang muat &amp;#039;&amp;#039;&amp;#039;satu baris penuh&amp;#039;&amp;#039;&amp;#039; supercell. Fungsinya sebagai tempat penampung baris yang sedang diakses. Supercell yang diminta dipilih dari row buffer, bukan langsung dari array utama.&lt;br /&gt;
&lt;br /&gt;
===== Kenapa array 2D, bukan linear? =====&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Keuntungan&amp;#039;&amp;#039;&amp;#039;: jumlah pin addr berkurang. Contoh: 16 supercell linear (alamat 0 sampai 15) butuh 4 pin addr, sedangkan susunan 4 × 4 cukup 2 pin.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kerugian&amp;#039;&amp;#039;&amp;#039;: alamat dikirim dalam dua tahap (RAS lalu CAS), sehingga &amp;#039;&amp;#039;&amp;#039;waktu akses bertambah&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Rumus Ringkas ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Yang ditanya !! Rumus&lt;br /&gt;
|-&lt;br /&gt;
| Total bit || d × w&lt;br /&gt;
|-&lt;br /&gt;
| Jumlah pin data || w&lt;br /&gt;
|-&lt;br /&gt;
| Jumlah pin addr || log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(max(r, c))&lt;br /&gt;
|-&lt;br /&gt;
| Supercell disalin saat RAS || c (satu baris penuh)&lt;br /&gt;
|-&lt;br /&gt;
| Ukuran row buffer || c × w bit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Contoh Soal ==&lt;br /&gt;
&lt;br /&gt;
=== Contoh 1: DRAM 64 × 4 (8 baris × 8 kolom) ===&lt;br /&gt;
&lt;br /&gt;
* Total bit = 64 × 4 = &amp;#039;&amp;#039;&amp;#039;256 bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pin data = &amp;#039;&amp;#039;&amp;#039;4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pin addr: 8 baris butuh 3 bit, maka &amp;#039;&amp;#039;&amp;#039;3 pin&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Baca (5, 3): RAS = 5 (baris 5 ke row buffer), lalu CAS = 3 (kirim 4 bit)&lt;br /&gt;
&lt;br /&gt;
=== Contoh 2: DRAM 256 × 8 (16 × 16) ===&lt;br /&gt;
&lt;br /&gt;
* Total bit = 256 × 8 = &amp;#039;&amp;#039;&amp;#039;2048 bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pin data = &amp;#039;&amp;#039;&amp;#039;8&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pin addr = log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;16 = &amp;#039;&amp;#039;&amp;#039;4 pin&amp;#039;&amp;#039;&amp;#039; (jika linear: log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;256 = 8 pin)&lt;br /&gt;
&lt;br /&gt;
=== Contoh 3: DRAM 64 × 16 (8 × 8) ===&lt;br /&gt;
&lt;br /&gt;
* Total bit = &amp;#039;&amp;#039;&amp;#039;1024 bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pin data = &amp;#039;&amp;#039;&amp;#039;16&amp;#039;&amp;#039;&amp;#039; (ditentukan oleh w, bukan selalu 8)&lt;br /&gt;
* Pin addr = &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Baca (6, 2): RAS = 6 (8 supercell masuk row buffer), lalu CAS = 2 (kirim 16 bit)&lt;br /&gt;
&lt;br /&gt;
=== Contoh 4: DRAM 128 × 4 (16 baris × 8 kolom) ===&lt;br /&gt;
&lt;br /&gt;
* Total bit = &amp;#039;&amp;#039;&amp;#039;512 bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pin data = &amp;#039;&amp;#039;&amp;#039;4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pin addr = &amp;#039;&amp;#039;&amp;#039;4&amp;#039;&amp;#039;&amp;#039; (baris butuh 4 bit, kolom butuh 3 bit, ambil yang terbesar karena pin dibagi)&lt;br /&gt;
* Supercell disalin saat RAS = &amp;#039;&amp;#039;&amp;#039;8&amp;#039;&amp;#039;&amp;#039; (row buffer = 8 × 4 = 32 bit)&lt;br /&gt;
&lt;br /&gt;
== Poin Penting ==&lt;br /&gt;
&lt;br /&gt;
* Hierarki memori bekerja karena &amp;#039;&amp;#039;&amp;#039;locality&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* SRAM: cepat, stabil, mahal, untuk cache. DRAM: lambat, sensitif, murah, untuk main memory.&lt;br /&gt;
* Pin data ditentukan oleh &amp;#039;&amp;#039;&amp;#039;w&amp;#039;&amp;#039;&amp;#039;, pin addr ditentukan oleh &amp;#039;&amp;#039;&amp;#039;dimensi terbesar&amp;#039;&amp;#039;&amp;#039; array.&lt;br /&gt;
* Pembacaan DRAM: &amp;#039;&amp;#039;&amp;#039;RAS (baris ke row buffer) lalu CAS (kolom dari row buffer)&amp;#039;&amp;#039;&amp;#039;.&lt;/div&gt;</description>
			<pubDate>Mon, 12 Oct 2026 04:01:04 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:SRAM_%26_DRAM</comments>
		</item>
		<item>
			<title>Linux &amp; Operating System</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=869&amp;oldid=867</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=869&amp;oldid=867</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:00, 12 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l20&quot;&gt;Line 20:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 20:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== temp ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== temp ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Intro Compiler &amp;amp; Machine Abstraction]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Intro Compiler &amp;amp; Machine Abstraction]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[SRAM &amp;amp; DRAM]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== gem5 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== gem5 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Mon, 12 Oct 2026 04:00:49 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Linux_%26_Operating_System</comments>
		</item>
		<item>
			<title>Gem5: hello world</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Gem5:_hello_world&amp;diff=868&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Gem5:_hello_world&amp;diff=868&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;gem5&amp;#039;&amp;#039;&amp;#039; adalah simulator arsitektur komputer open-source yang dipakai untuk riset dan pembelajaran. Dengan gem5, sebuah komputer virtual (CPU, cache, bus, memori) dirakit lewat script Python, lalu sebuah program dijalankan di atasnya dan gem5 melaporkan statistik detail seperti jumlah cycle, jumlah instruksi, dan cache miss.  Catatan ini mencakup pemasangan gem5 sampai menjalankan program &amp;quot;Hello World&amp;quot; pertama.  == Persiapan ==  Catatan ini memakai Linux (Ubuntu/Debia...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;gem5&amp;#039;&amp;#039;&amp;#039; adalah simulator arsitektur komputer open-source yang dipakai untuk riset dan pembelajaran. Dengan gem5, sebuah komputer virtual (CPU, cache, bus, memori) dirakit lewat script Python, lalu sebuah program dijalankan di atasnya dan gem5 melaporkan statistik detail seperti jumlah cycle, jumlah instruksi, dan cache miss.&lt;br /&gt;
&lt;br /&gt;
Catatan ini mencakup pemasangan gem5 sampai menjalankan program &amp;quot;Hello World&amp;quot; pertama.&lt;br /&gt;
&lt;br /&gt;
== Persiapan ==&lt;br /&gt;
&lt;br /&gt;
Catatan ini memakai Linux (Ubuntu/Debian). Paket yang dibutuhkan (mengikuti dokumentasi gem5; cek [https://www.gem5.org/documentation/general_docs/building dokumentasi resmi] kalau versinya berbeda):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install build-essential scons python3-dev git pre-commit \&lt;br /&gt;
    zlib1g zlib1g-dev libprotobuf-dev protobuf-compiler libprotoc-dev \&lt;br /&gt;
    libgoogle-perftools-dev libboost-all-dev libhdf5-serial-dev \&lt;br /&gt;
    python3-pydot python3-venv python3-tk mypy m4 libcapstone-dev \&lt;br /&gt;
    libpng-dev libelf-dev pkg-config wget cmake doxygen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Clone dan build ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/gem5/gem5&lt;br /&gt;
cd gem5&lt;br /&gt;
scons build/ALL/gem5.opt -j &amp;lt;JUMLAH CPU&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keterangan:&lt;br /&gt;
* &amp;lt;code&amp;gt;build/ALL&amp;lt;/code&amp;gt; artinya build mencakup semua ISA (x86, ARM, RISC-V, dan lainnya). Alternatifnya &amp;lt;code&amp;gt;build/X86/gem5.opt&amp;lt;/code&amp;gt; kalau hanya butuh x86, build-nya lebih ringan.&lt;br /&gt;
* &amp;lt;code&amp;gt;gem5.opt&amp;lt;/code&amp;gt; adalah varian dengan optimasi dan debug info secukupnya. Untuk debugging dengan gdb, pakai &amp;lt;code&amp;gt;gem5.debug&amp;lt;/code&amp;gt; (lebih lambat, build lebih lama).&lt;br /&gt;
* &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; menentukan jumlah proses paralel. Isi dengan hasil &amp;lt;code&amp;gt;nproc&amp;lt;/code&amp;gt;. Build pertama memakan waktu lama dan banyak RAM; kalau RAM kurang, kecilkan nilai &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Hello World pertama ==&lt;br /&gt;
&lt;br /&gt;
gem5 menyertakan script contoh untuk menjalankan program sederhana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
build/ALL/gem5.opt configs/learning_gem5/part1/simple.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Script ini merakit satu CPU sederhana dengan memori, lalu menjalankan program &amp;quot;Hello World&amp;quot; di dalamnya (mode &amp;#039;&amp;#039;Syscall Emulation&amp;#039;&amp;#039;). Kalau berhasil, di terminal muncul tulisan &amp;lt;code&amp;gt;Hello world!&amp;lt;/code&amp;gt; dan baris penutup yang menyebut tick terakhir simulasi. Angka tick bisa berbeda antarversi gem5.&lt;br /&gt;
&lt;br /&gt;
=== Isi folder &amp;lt;code&amp;gt;m5out/&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Setiap simulasi menghasilkan folder &amp;lt;code&amp;gt;m5out/&amp;lt;/code&amp;gt; di direktori tempat gem5 dijalankan:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Isi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;stats.txt&amp;lt;/code&amp;gt; || Semua statistik simulasi (cycle, instruksi, cache miss, dan lainnya)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;config.json&amp;lt;/code&amp;gt; || Konfigurasi sistem yang disimulasikan, lengkap dengan semua parameter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;config.dot.svg&amp;lt;/code&amp;gt; || Diagram blok sistem&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nilai yang pertama kali layak dilihat di &amp;lt;code&amp;gt;stats.txt&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;simSeconds&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;simInsts&amp;lt;/code&amp;gt;, dan &amp;lt;code&amp;gt;system.cpu.numCycles&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Merakit sistem sendiri ==&lt;br /&gt;
&lt;br /&gt;
Script berikut melakukan hal yang sama dengan &amp;lt;code&amp;gt;simple.py&amp;lt;/code&amp;gt;, tetapi ditulis manual agar terlihat tiap komponennya.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import m5&lt;br /&gt;
from m5.objects import *&lt;br /&gt;
from gem5.resources.resource import obtain_resource&lt;br /&gt;
&lt;br /&gt;
system = System()&lt;br /&gt;
system.clk_domain = SrcClockDomain()&lt;br /&gt;
system.clk_domain.clock = &amp;quot;1GHz&amp;quot;&lt;br /&gt;
system.clk_domain.voltage_domain = VoltageDomain()&lt;br /&gt;
&lt;br /&gt;
system.mem_mode = &amp;quot;timing&amp;quot;&lt;br /&gt;
system.mem_ranges = [AddrRange(&amp;quot;512MB&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
system.cpu = X86TimingSimpleCPU()&lt;br /&gt;
&lt;br /&gt;
system.membus = SystemXBar()&lt;br /&gt;
&lt;br /&gt;
# Tanpa cache: CPU langsung ke membus&lt;br /&gt;
system.cpu.icache_port = system.membus.cpu_side_ports&lt;br /&gt;
system.cpu.dcache_port = system.membus.cpu_side_ports&lt;br /&gt;
&lt;br /&gt;
# Khusus x86: interrupt controller disambung manual&lt;br /&gt;
system.cpu.createInterruptController()&lt;br /&gt;
system.cpu.interrupts[0].pio = system.membus.mem_side_ports&lt;br /&gt;
system.cpu.interrupts[0].int_requestor = system.membus.cpu_side_ports&lt;br /&gt;
system.cpu.interrupts[0].int_responder = system.membus.mem_side_ports&lt;br /&gt;
&lt;br /&gt;
system.system_port = system.membus.cpu_side_ports&lt;br /&gt;
&lt;br /&gt;
system.mem_ctrl = MemCtrl()&lt;br /&gt;
system.mem_ctrl.dram = DDR3_1600_8x8()&lt;br /&gt;
system.mem_ctrl.dram.range = system.mem_ranges[0]&lt;br /&gt;
system.mem_ctrl.port = system.membus.mem_side_ports&lt;br /&gt;
&lt;br /&gt;
# Workload: program Hello World (SE mode)&lt;br /&gt;
binary = obtain_resource(&amp;quot;x86-hello64-static&amp;quot;).get_local_path()&lt;br /&gt;
system.workload = SEWorkload.init_compatible(binary)&lt;br /&gt;
&lt;br /&gt;
process = Process()&lt;br /&gt;
process.cmd = [binary]&lt;br /&gt;
system.cpu.workload = process&lt;br /&gt;
system.cpu.createThreads()&lt;br /&gt;
&lt;br /&gt;
root = Root(full_system=False, system=system)&lt;br /&gt;
m5.instantiate()&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Beginning simulation!&amp;quot;)&lt;br /&gt;
exit_event = m5.simulate()&lt;br /&gt;
print(f&amp;quot;Exiting @ tick {m5.curTick()} because {exit_event.getCause()}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan dengan:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
build/ALL/gem5.opt my_simple.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan: kalau resource &amp;lt;code&amp;gt;x86-hello64-static&amp;lt;/code&amp;gt; tidak ditemukan di versi gem5 yang dipakai, ganti &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; dengan path ke binary hello di source tree (&amp;lt;code&amp;gt;tests/test-progs/hello/bin/x86/linux/hello&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Komponen yang dirakit ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Komponen !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;clk_domain&amp;lt;/code&amp;gt; || Kerangka sistem dan clock (1 GHz)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mem_mode = &amp;quot;timing&amp;quot;&amp;lt;/code&amp;gt; || Akses memori dimodelkan dengan latency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X86TimingSimpleCPU&amp;lt;/code&amp;gt; || Satu core x86 sederhana yang menunggu respons memori&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SystemXBar&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;membus&amp;lt;/code&amp;gt;) || Bus penghubung. &amp;lt;code&amp;gt;cpu_side_ports&amp;lt;/code&amp;gt; untuk pihak yang meminta data (CPU), &amp;lt;code&amp;gt;mem_side_ports&amp;lt;/code&amp;gt; untuk pihak yang menyediakan data (memori, device)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;interrupts[0]&amp;lt;/code&amp;gt; || Interrupt controller x86, wajib disambung manual&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;system_port&amp;lt;/code&amp;gt; || Jalur khusus gem5 (misalnya untuk memuat binary ke memori sebelum simulasi)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MemCtrl&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;DDR3_1600_8x8&amp;lt;/code&amp;gt; || Memory controller dan DRAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tips: Makefile ==&lt;br /&gt;
&lt;br /&gt;
Agar tidak mengetik path panjang berulang kali:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
GEM5   ?= /home/haidhi/gem5/build/ALL/gem5.opt&lt;br /&gt;
SCRIPT ?= simple.py&lt;br /&gt;
OUTDIR ?= m5out&lt;br /&gt;
FLAGS  ?= Exec&lt;br /&gt;
&lt;br /&gt;
.PHONY: run stats debug clean&lt;br /&gt;
&lt;br /&gt;
run:&lt;br /&gt;
	$(GEM5) --outdir=$(OUTDIR) $(SCRIPT)&lt;br /&gt;
&lt;br /&gt;
stats:&lt;br /&gt;
	@grep -E &amp;quot;simSeconds|simInsts|numCycles|hostSeconds&amp;quot; $(OUTDIR)/stats.txt&lt;br /&gt;
&lt;br /&gt;
debug:&lt;br /&gt;
	$(GEM5) --debug-flags=$(FLAGS) --debug-file=debug.out --outdir=$(OUTDIR) $(SCRIPT)&lt;br /&gt;
&lt;br /&gt;
clean:&lt;br /&gt;
	rm -rf $(OUTDIR)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baris perintah di Makefile harus diawali karakter &amp;#039;&amp;#039;&amp;#039;tab&amp;#039;&amp;#039;&amp;#039;, bukan spasi.&lt;br /&gt;
&lt;br /&gt;
== Masalah umum ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;No module named &amp;#039;_m5&amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: script gem5 tidak bisa dijalankan dengan &amp;lt;code&amp;gt;python3 script.py&amp;lt;/code&amp;gt;. Modul &amp;lt;code&amp;gt;_m5&amp;lt;/code&amp;gt; ditanam di dalam binary, jadi script harus dijalankan lewat &amp;lt;code&amp;gt;gem5.opt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Garis bawah merah di VSCode untuk &amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SrcClockDomain&amp;lt;/code&amp;gt;, dll&amp;#039;&amp;#039;&amp;#039;: modul &amp;lt;code&amp;gt;m5.objects&amp;lt;/code&amp;gt; dibangkitkan saat build dan source-nya di-embed ke binary, sehingga IDE tidak menemukannya. Script tetap berjalan normal. Garis bawahnya bisa dimatikan lewat setting &amp;lt;code&amp;gt;python.analysis.diagnosticSeverityOverrides&amp;lt;/code&amp;gt; atau komentar &amp;lt;code&amp;gt;# pyright: reportUndefinedVariable=false&amp;lt;/code&amp;gt; di baris atas script.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Build gagal karena kehabisan memori&amp;#039;&amp;#039;&amp;#039;: kecilkan nilai &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt;.&lt;/div&gt;</description>
			<pubDate>Sun, 11 Oct 2026 08:43:05 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Gem5:_hello_world</comments>
		</item>
		<item>
			<title>Linux &amp; Operating System</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=867&amp;oldid=864</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=867&amp;oldid=864</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 08:42, 11 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l21&quot;&gt;Line 21:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 21:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Intro Compiler &amp;amp; Machine Abstraction]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Intro Compiler &amp;amp; Machine Abstraction]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;== gem5 ==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[gem5: hello world]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== LLVM ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== LLVM ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[llvm: cara install]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[llvm: cara install]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sun, 11 Oct 2026 08:42:36 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Linux_%26_Operating_System</comments>
		</item>
		<item>
			<title>Accessing Information</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Accessing_Information&amp;diff=866&amp;oldid=865</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Accessing_Information&amp;diff=866&amp;oldid=865</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 06:46, 9 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l22&quot;&gt;Line 22:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 22:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|&amp;lt;------------------- %rax (64 bit) -------------------&amp;gt;|&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|&amp;lt;------------------- %rax (64 bit) -------------------&amp;gt;|&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                            |&amp;lt;------ %eax (32 bit) -----&amp;gt;|&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                            |&amp;lt;------ %eax (32 bit) -----&amp;gt;|&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                                          &lt;/del&gt;|&amp;lt;- %ax (16) -&amp;gt;|&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                                         &lt;/ins&gt;|&amp;lt;- %ax (16) -&amp;gt;|&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                                  |%al(8)|&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                                  |%al(8)|&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Fri, 09 Oct 2026 06:46:15 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Accessing_Information</comments>
		</item>
		<item>
			<title>Accessing Information</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Accessing_Information&amp;diff=865&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Accessing_Information&amp;diff=865&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;CPU x86-64 punya &amp;#039;&amp;#039;&amp;#039;16 general-purpose register&amp;#039;&amp;#039;&amp;#039; berukuran 64-bit. Register ini menyimpan data integer dan pointer.  == Sejarah penamaan == Penamaan register berlapis karena evolusi instruction set:  {| class=&amp;quot;wikitable&amp;quot; ! Generasi !! Lebar !! Nama register !! Catatan |- | 8086 || 16-bit || &amp;lt;code&amp;gt;%ax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%bx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%dx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%si&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%di&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%bp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%sp&amp;lt;/code&amp;gt; || Nama mencerminkan fungsi (accumulat...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;CPU x86-64 punya &amp;#039;&amp;#039;&amp;#039;16 general-purpose register&amp;#039;&amp;#039;&amp;#039; berukuran 64-bit. Register ini menyimpan data integer dan pointer.&lt;br /&gt;
&lt;br /&gt;
== Sejarah penamaan ==&lt;br /&gt;
Penamaan register berlapis karena evolusi instruction set:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Generasi !! Lebar !! Nama register !! Catatan&lt;br /&gt;
|-&lt;br /&gt;
| 8086 || 16-bit || &amp;lt;code&amp;gt;%ax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%bx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%dx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%si&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%di&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%bp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%sp&amp;lt;/code&amp;gt; || Nama mencerminkan fungsi (accumulator, counter, source/destination index, stack pointer)&lt;br /&gt;
|-&lt;br /&gt;
| IA32 || 32-bit || &amp;lt;code&amp;gt;%eax&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;%ebp&amp;lt;/code&amp;gt; || Prefix &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; = &amp;#039;&amp;#039;extended&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| x86-64 || 64-bit || &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;%rbp&amp;lt;/code&amp;gt; || Prefix &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| x86-64 (baru) || 64-bit || &amp;lt;code&amp;gt;%r8&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;%r15&amp;lt;/code&amp;gt; || Konvensi baru, suffix &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; untuk 32/16/8-bit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sub-register (nested boxes) ==&lt;br /&gt;
&amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%eax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%ax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%al&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;bukan&amp;#039;&amp;#039;&amp;#039; empat register berbeda, melainkan satu register fisik yang diakses dengan lebar berbeda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&amp;lt;------------------- %rax (64 bit) -------------------&amp;gt;|&lt;br /&gt;
                           |&amp;lt;------ %eax (32 bit) -----&amp;gt;|&lt;br /&gt;
                                          |&amp;lt;- %ax (16) -&amp;gt;|&lt;br /&gt;
                                                 |%al(8)|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Operasi byte → least significant byte&lt;br /&gt;
* Operasi 16-bit → 2 byte terbawah&lt;br /&gt;
* Operasi 32-bit → 4 byte terbawah&lt;br /&gt;
* Operasi 64-bit → seluruh register&lt;br /&gt;
&lt;br /&gt;
== Aturan sisa byte saat menulis ke register ==&lt;br /&gt;
Ketika instruksi menghasilkan nilai kurang dari 8 byte ke register:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ukuran tulis !! Efek ke byte sisanya&lt;br /&gt;
|-&lt;br /&gt;
| 1 byte / 2 byte || &amp;#039;&amp;#039;&amp;#039;Tidak berubah&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 byte || 4 byte atas &amp;#039;&amp;#039;&amp;#039;di-nol-kan&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Contoh, dengan &amp;lt;code&amp;gt;%rax = 0x1122334455667788&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gas&amp;quot;&amp;gt;&lt;br /&gt;
movb $0xAA, %al      # %rax = 0x11223344556677AA  (sisanya utuh)&lt;br /&gt;
movw $0xAAAA, %ax    # %rax = 0x112233445566AAAA  (sisanya utuh)&lt;br /&gt;
movl $0xAAAA, %eax   # %rax = 0x000000000000AAAA  (4 byte atas = 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kenapa?&amp;#039;&amp;#039;&amp;#039; Aturan zero-upper diadopsi saat ekspansi IA32 → x86-64 supaya hasil tulisan tidak bergantung pada isi lama register (menghindari &amp;#039;&amp;#039;partial register dependency&amp;#039;&amp;#039;), sehingga eksekusi out-of-order lebih lancar. Compiler memanfaatkannya, misalnya &amp;lt;code&amp;gt;mov $0x0,%eax&amp;lt;/code&amp;gt; untuk &amp;lt;code&amp;gt;return 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Peran register (System V ABI) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Register !! Peran&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || Return value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rdi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rsi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rcx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r9&amp;lt;/code&amp;gt; || Argumen ke-1 sampai ke-6 (urut)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rsp&amp;lt;/code&amp;gt; || Stack pointer (spesial, dipakai otomatis oleh &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rbp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r12&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;%r15&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;&amp;#039;Callee saved&amp;#039;&amp;#039;&amp;#039;: fungsi yang dipanggil wajib mengembalikan nilainya&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r11&amp;lt;/code&amp;gt; (+ register argumen &amp;amp; &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;) || &amp;#039;&amp;#039;&amp;#039;Caller saved&amp;#039;&amp;#039;&amp;#039;: boleh dirusak oleh fungsi yang dipanggil&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jembatan keledai urutan argumen: &amp;#039;&amp;#039;&amp;#039;&amp;quot;Diane&amp;#039;s Silk Dress Costs $89&amp;quot;&amp;#039;&amp;#039;&amp;#039; → &amp;lt;code&amp;gt;di&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;si&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Contoh: &amp;lt;code&amp;gt;multstore&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gas&amp;quot;&amp;gt;&lt;br /&gt;
push %rbx          # rbx callee-saved → simpan nilai lama&lt;br /&gt;
mov  %rdx,%rbx     # rdx = argumen ke-3 (dest), amankan di rbx&lt;br /&gt;
call mult2         # x, y masih di rdi &amp;amp; rsi&lt;br /&gt;
mov  %rax,(%rbx)   # *dest = hasil mult2 (rax)&lt;br /&gt;
pop  %rbx          # pulihkan rbx&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;dest&amp;lt;/code&amp;gt; dipindah ke &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt; karena &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt; caller-saved (bisa dirusak &amp;lt;code&amp;gt;mult2&amp;lt;/code&amp;gt;), sedangkan &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt; dijamin selamat melewati &amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= 3.4.1 Operand Specifiers =&lt;br /&gt;
&lt;br /&gt;
== Tiga jenis operand ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jenis !! Contoh !! Arti&lt;br /&gt;
|-&lt;br /&gt;
| Immediate || &amp;lt;code&amp;gt;$-577&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$0x1F&amp;lt;/code&amp;gt; || Konstanta, nilai tertanam di instruksi&lt;br /&gt;
|-&lt;br /&gt;
| Register || &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%al&amp;lt;/code&amp;gt; || Isi register, notasi &amp;lt;code&amp;gt;R[r&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Memory || &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8(%rax)&amp;lt;/code&amp;gt; || Isi memori di &amp;#039;&amp;#039;effective address&amp;#039;&amp;#039;, notasi &amp;lt;code&amp;gt;M[Addr]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Perhatian:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;$0x10&amp;lt;/code&amp;gt; = angka 16, sedangkan &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt; (tanpa &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt;) = isi memori di alamat 16.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; ==&lt;br /&gt;
* &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; → isi register itu sendiri (seperti &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; di C)&lt;br /&gt;
* &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; → isi register dipakai sebagai alamat, lalu baca memori di alamat itu (seperti &amp;lt;code&amp;gt;*p&amp;lt;/code&amp;gt; di C)&lt;br /&gt;
&lt;br /&gt;
Kurung &amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; di AT&amp;amp;T = dereference. Di AT&amp;amp;T, register &amp;#039;&amp;#039;&amp;#039;wajib&amp;#039;&amp;#039;&amp;#039; pakai &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt; tanpa &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; akan dianggap nama simbol.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Maksud !! AT&amp;amp;T (gcc, CS:APP) !! Intel (NASM, MASM)&lt;br /&gt;
|-&lt;br /&gt;
| Isi register || &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Isi memori di alamat rax || &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;[rax]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || &amp;lt;code&amp;gt;$5&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Bentuk umum memory reference ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imm(rb, ri, s)   →   alamat = Imm + R[rb] + R[ri] · s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt;: displacement konstanta&lt;br /&gt;
* &amp;lt;code&amp;gt;rb&amp;lt;/code&amp;gt;: base register (64-bit)&lt;br /&gt;
* &amp;lt;code&amp;gt;ri&amp;lt;/code&amp;gt;: index register (64-bit)&lt;br /&gt;
* &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;: skala, hanya &amp;#039;&amp;#039;&amp;#039;1, 2, 4, atau 8&amp;#039;&amp;#039;&amp;#039; (ukuran &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;short&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;/pointer)&lt;br /&gt;
&lt;br /&gt;
Semua mode lain adalah kasus khusus dengan komponen yang dihilangkan:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Form !! Effective address !! Nama&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt; || Absolute&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(rb)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[rb]&amp;lt;/code&amp;gt; || Indirect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(rb)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[rb]&amp;lt;/code&amp;gt; || Base + displacement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(rb,ri)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[rb] + R[ri]&amp;lt;/code&amp;gt; || Indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(rb,ri)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[rb] + R[ri]&amp;lt;/code&amp;gt; || Indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(rb,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[rb] + R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(rb,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[rb] + R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Tambahan x86-64 yang tidak ada di tabel: &amp;#039;&amp;#039;&amp;#039;RIP-relative&amp;#039;&amp;#039;&amp;#039;, misalnya &amp;lt;code&amp;gt;lea 0x0(%rip),%rdi&amp;lt;/code&amp;gt;, alamat dihitung relatif terhadap instruksi berikutnya (dipakai untuk data global/string literal).&lt;br /&gt;
&lt;br /&gt;
== Kegunaan: akses array dan struct ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
long a[100];&lt;br /&gt;
x = a[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dengan &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;%rcx&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gas&amp;quot;&amp;gt;&lt;br /&gt;
movq (%rdx,%rcx,8), %rax     # alamat = a + i*8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Satu instruksi tanpa perkalian terpisah. Untuk &amp;lt;code&amp;gt;arr[i].field&amp;lt;/code&amp;gt;, offset field masuk ke &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Cara menghitung nilai operand ==&lt;br /&gt;
Untuk memory operand selalu dua langkah:&lt;br /&gt;
# Hitung alamat: &amp;lt;code&amp;gt;Imm + R[rb] + R[ri]·s&amp;lt;/code&amp;gt;&lt;br /&gt;
# Baca isi memori di alamat tersebut&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Jebakan umum:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Displacement tanpa &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; adalah &amp;#039;&amp;#039;&amp;#039;desimal&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;260&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
* Koma di depan (&amp;lt;code&amp;gt;0xFC(,%rcx,4)&amp;lt;/code&amp;gt;) berarti &amp;#039;&amp;#039;&amp;#039;tanpa base register&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Perhatikan carry saat menjumlah hex: &amp;lt;code&amp;gt;0xFC + 4 = 0x100&amp;lt;/code&amp;gt;&lt;br /&gt;
* Jangan berhenti di alamat; jawaban adalah &amp;#039;&amp;#039;&amp;#039;isi&amp;#039;&amp;#039;&amp;#039; memorinya&lt;br /&gt;
&lt;br /&gt;
=== Contoh (Practice Problem 3.1) ===&lt;br /&gt;
Data: &amp;lt;code&amp;gt;%rax = 0x100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rcx = 0x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rdx = 0x3&amp;lt;/code&amp;gt;; memori &amp;lt;code&amp;gt;0x100→0xFF&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x104→0xAB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x108→0x13&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x10C→0x11&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operand !! Jenis !! Alamat !! Nilai&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || Register || — || &amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt; || Absolute || &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xAB&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$0x108&amp;lt;/code&amp;gt; || Immediate || — || &amp;lt;code&amp;gt;0x108&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; || Indirect || &amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;4(%rax)&amp;lt;/code&amp;gt; || Base + displacement || &amp;lt;code&amp;gt;4 + 0x100 = 0x104&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xAB&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;9(%rax,%rdx)&amp;lt;/code&amp;gt; || Indexed || &amp;lt;code&amp;gt;9 + 0x100 + 3 = 0x10C&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x11&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;260(%rcx,%rdx)&amp;lt;/code&amp;gt; || Indexed || &amp;lt;code&amp;gt;0x104 + 1 + 3 = 0x108&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x13&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFC(,%rcx,4)&amp;lt;/code&amp;gt; || Scaled indexed || &amp;lt;code&amp;gt;0xFC + 1·4 = 0x100&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(%rax,%rdx,4)&amp;lt;/code&amp;gt; || Scaled indexed || &amp;lt;code&amp;gt;0x100 + 3·4 = 0x10C&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x11&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 06:45:45 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Accessing_Information</comments>
		</item>
		<item>
			<title>Linux &amp; Operating System</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=864&amp;oldid=861</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=864&amp;oldid=861</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 06:45, 9 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l16&quot;&gt;Line 16:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 16:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Representing and Manipulating Information ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Representing and Manipulating Information ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[CS:APP 2 Intro]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[CS:APP 2 Intro]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Accessing Information]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== temp ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== temp ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Fri, 09 Oct 2026 06:45:18 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Linux_%26_Operating_System</comments>
		</item>
		<item>
			<title>Main Page</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=863&amp;oldid=860</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=863&amp;oldid=860</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 01:50, 9 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l31&quot;&gt;Line 31:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 31:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Widya Robotics — AI Engineer, Internship &amp;#039;&amp;#039;(February 2024 – June 2024)&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Widya Robotics — AI Engineer, Internship &amp;#039;&amp;#039;(February 2024 – June 2024)&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Exylotech, Jakarta — Data Scientist, Internship &amp;#039;&amp;#039;(November 2022 – April 2023)&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Exylotech, Jakarta — Data Scientist, Internship &amp;#039;&amp;#039;(November 2022 – April 2023)&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Riyadhussholihiin Islamic Boarding School, Pandeglang — &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Tahfidz &lt;/del&gt;Teacher &#039;&#039;(July 2020 - July 2021)&#039;&#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Riyadhussholihiin Islamic Boarding School, Pandeglang — Teacher &#039;&#039;(July 2020 - July 2021)&#039;&#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Publication ==  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Publication ==  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Fri, 09 Oct 2026 01:50:09 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Main_Page</comments>
		</item>
		<item>
			<title>Intro Compiler &amp; Machine Abstraction</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Intro_Compiler_%26_Machine_Abstraction&amp;diff=862&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Intro_Compiler_%26_Machine_Abstraction&amp;diff=862&amp;oldid=0</guid>
			<description>&lt;p&gt;Created page with &amp;quot;{{Catatan|Catatan ini merangkum dua topik yang saling berkaitan: &amp;#039;&amp;#039;&amp;#039;optimisasi compiler&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;abstraksi level mesin&amp;#039;&amp;#039;&amp;#039; (ISA, virtual address, processor state x86-64). Materi mengikuti alur pembukaan Bab 3 CS:APP.}}  == Compiler Optimization ==  &amp;#039;&amp;#039;&amp;#039;Optimisasi&amp;#039;&amp;#039;&amp;#039; adalah proses compiler mengubah kode sumber menjadi bentuk yang lebih cepat, lebih kecil, atau lebih hemat sumber daya, &amp;#039;&amp;#039;&amp;#039;tanpa mengubah perilaku program yang teramati dari luar&amp;#039;&amp;#039;&amp;#039;.  Programmer menulis kode y...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Catatan|Catatan ini merangkum dua topik yang saling berkaitan: &amp;#039;&amp;#039;&amp;#039;optimisasi compiler&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;abstraksi level mesin&amp;#039;&amp;#039;&amp;#039; (ISA, virtual address, processor state x86-64). Materi mengikuti alur pembukaan Bab 3 CS:APP.}}&lt;br /&gt;
&lt;br /&gt;
== Compiler Optimization ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Optimisasi&amp;#039;&amp;#039;&amp;#039; adalah proses compiler mengubah kode sumber menjadi bentuk yang lebih cepat, lebih kecil, atau lebih hemat sumber daya, &amp;#039;&amp;#039;&amp;#039;tanpa mengubah perilaku program yang teramati dari luar&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Programmer menulis kode yang mudah dibaca manusia; compiler menerjemahkannya menjadi kode mesin yang efisien.&lt;br /&gt;
&lt;br /&gt;
=== Aturan dasar: &amp;#039;&amp;#039;as-if rule&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
Compiler boleh melakukan transformasi apa pun selama program berperilaku &amp;#039;&amp;#039;&amp;#039;seolah-olah&amp;#039;&amp;#039;&amp;#039; tidak diubah. Output akhir harus tetap sama.&lt;br /&gt;
&lt;br /&gt;
{{Warning|&amp;#039;&amp;#039;Undefined behavior&amp;#039;&amp;#039; (UB) di C/C++ dapat menghasilkan perilaku yang tampak aneh justru karena aturan ini. Compiler berasumsi UB &amp;#039;&amp;#039;&amp;#039;tidak pernah terjadi&amp;#039;&amp;#039;&amp;#039;, lalu melakukan optimisasi berdasarkan asumsi tersebut. Kode yang &amp;quot;kelihatannya benar&amp;quot; bisa dihapus atau diubah total.}}&lt;br /&gt;
&lt;br /&gt;
=== Jenis-jenis optimisasi ===&lt;br /&gt;
&lt;br /&gt;
; Constant folding&lt;br /&gt;
: Ekspresi konstan dihitung saat kompilasi. &amp;lt;code&amp;gt;x = 2 * 3 + 4&amp;lt;/code&amp;gt; menjadi &amp;lt;code&amp;gt;x = 10&amp;lt;/code&amp;gt;.&lt;br /&gt;
; Dead code elimination&lt;br /&gt;
: Kode yang tidak pernah dieksekusi, atau yang hasilnya tidak pernah dipakai, dibuang.&lt;br /&gt;
; Inlining&lt;br /&gt;
: Pemanggilan fungsi kecil diganti langsung dengan isi fungsinya, menghilangkan overhead &amp;#039;&amp;#039;call&amp;#039;&amp;#039;.&lt;br /&gt;
; Loop unrolling&lt;br /&gt;
: Badan loop &amp;quot;dibentangkan&amp;quot; untuk mengurangi overhead pengecekan kondisi dan lompatan.&lt;br /&gt;
; Common subexpression elimination&lt;br /&gt;
: Ekspresi yang dihitung berulang cukup dihitung satu kali.&lt;br /&gt;
; Vectorization (SIMD)&lt;br /&gt;
: Beberapa operasi data diproses sekaligus dalam satu instruksi, memanfaatkan &amp;#039;&amp;#039;vector register&amp;#039;&amp;#039;.&lt;br /&gt;
; Register allocation&lt;br /&gt;
: Variabel yang sering dipakai ditempatkan di register CPU, bukan di memori.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Register x86-64 hanya ada &amp;#039;&amp;#039;&amp;#039;16 buah&amp;#039;&amp;#039;&amp;#039;. Keterbatasan inilah yang membuat &amp;#039;&amp;#039;register allocation&amp;#039;&amp;#039; menjadi salah satu masalah tersulit dalam desain compiler. Variabel yang tidak kebagian register harus di-&amp;#039;&amp;#039;spill&amp;#039;&amp;#039; ke stack, dan itu jauh lebih lambat.}}&lt;br /&gt;
&lt;br /&gt;
=== Flag optimisasi ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Flag !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O0&amp;lt;/code&amp;gt; || Tanpa optimisasi. Paling nyaman untuk &amp;#039;&amp;#039;debugging&amp;#039;&amp;#039; karena kode mesin masih memetakan rapi ke kode sumber.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O1&amp;lt;/code&amp;gt; || Optimisasi dasar.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt; || Standar untuk produksi.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt; || Lebih agresif, termasuk vectorization dan inlining yang lebih luas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-Os&amp;lt;/code&amp;gt; || Mengutamakan ukuran biner yang kecil.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Di Rust, mode optimisasi diaktifkan dengan &amp;lt;code&amp;gt;cargo build --release&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Saat &amp;#039;&amp;#039;debugging&amp;#039;&amp;#039;, gunakan &amp;lt;code&amp;gt;-O0&amp;lt;/code&amp;gt;. Pada level optimisasi tinggi, variabel bisa hilang dari &amp;#039;&amp;#039;debugger&amp;#039;&amp;#039;, urutan eksekusi berubah, dan &amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039; tidak mendarat di tempat yang diharapkan.}}&lt;br /&gt;
&lt;br /&gt;
== Abstraksi dalam Sistem Komputer ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Abstraksi&amp;#039;&amp;#039;&amp;#039; adalah menyembunyikan detail implementasi di balik model yang lebih sederhana. Untuk pemrograman level mesin, ada dua abstraksi yang paling penting.&lt;br /&gt;
&lt;br /&gt;
=== 1. Instruction Set Architecture (ISA) ===&lt;br /&gt;
&lt;br /&gt;
ISA adalah &amp;quot;kontrak&amp;quot; antara perangkat keras dan perangkat lunak. ISA mendefinisikan:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Processor state&amp;#039;&amp;#039;&amp;#039; — apa saja yang disimpan prosesor (register, program counter, condition flag)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Format instruksi&amp;#039;&amp;#039;&amp;#039; — bagaimana instruksi dikodekan&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Efek tiap instruksi&amp;#039;&amp;#039;&amp;#039; terhadap state tersebut&lt;br /&gt;
&lt;br /&gt;
Sebagian besar ISA, termasuk &amp;#039;&amp;#039;&amp;#039;x86-64&amp;#039;&amp;#039;&amp;#039;, mendeskripsikan perilaku program &amp;#039;&amp;#039;&amp;#039;seolah-olah&amp;#039;&amp;#039;&amp;#039; setiap instruksi dieksekusi berurutan: satu instruksi selesai sebelum instruksi berikutnya dimulai.&lt;br /&gt;
&lt;br /&gt;
==== Kenyataan di perangkat keras ====&lt;br /&gt;
&lt;br /&gt;
Prosesor nyata jauh lebih rumit dan mengeksekusi banyak instruksi secara &amp;#039;&amp;#039;&amp;#039;konkuren&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pipelining&amp;#039;&amp;#039;&amp;#039; — beberapa tahap instruksi tumpang tindih&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Superscalar&amp;#039;&amp;#039;&amp;#039; — beberapa instruksi dieksekusi bersamaan&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Out-of-order execution&amp;#039;&amp;#039;&amp;#039; — urutan eksekusi disusun ulang sesuai kesiapan data&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speculative execution&amp;#039;&amp;#039;&amp;#039; — prosesor menebak hasil percabangan sebelum diketahui&lt;br /&gt;
&lt;br /&gt;
Prosesor menggunakan &amp;#039;&amp;#039;&amp;#039;pengaman&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;dependency checking&amp;#039;&amp;#039;, &amp;#039;&amp;#039;reorder buffer&amp;#039;&amp;#039;, &amp;#039;&amp;#039;in-order commit&amp;#039;&amp;#039;) untuk memastikan hasil akhirnya tetap identik dengan model sekuensial yang dijanjikan ISA.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Pola yang sama muncul di dua lapisan berbeda. Compiler boleh mengubah urutan kode (&amp;#039;&amp;#039;as-if rule&amp;#039;&amp;#039;), hardware boleh mengubah urutan eksekusi — keduanya sah &amp;#039;&amp;#039;&amp;#039;selama perilaku yang teramati tidak berubah&amp;#039;&amp;#039;&amp;#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== 2. Virtual Address ===&lt;br /&gt;
&lt;br /&gt;
Alamat memori yang dipakai program level mesin adalah &amp;#039;&amp;#039;&amp;#039;alamat virtual&amp;#039;&amp;#039;&amp;#039;, yang menyajikan memori sebagai &amp;#039;&amp;#039;&amp;#039;satu array byte yang sangat besar dan berurutan&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Implementasi sebenarnya jauh lebih kompleks:&lt;br /&gt;
&lt;br /&gt;
* Hierarki perangkat keras: register → cache L1/L2/L3 → DRAM → disk&lt;br /&gt;
* Perangkat lunak sistem operasi: &amp;#039;&amp;#039;page table&amp;#039;&amp;#039;, MMU, TLB, penanganan &amp;#039;&amp;#039;page fault&amp;#039;&amp;#039;, &amp;#039;&amp;#039;swapping&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Sistem operasi mengelola ruang alamat virtual dan menerjemahkan alamat virtual menjadi alamat fisik.&lt;br /&gt;
&lt;br /&gt;
==== Ukuran ruang alamat x86-64 ====&lt;br /&gt;
&lt;br /&gt;
* Alamat direpresentasikan sebagai word &amp;#039;&amp;#039;&amp;#039;64-bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pada implementasi saat ini, &amp;#039;&amp;#039;&amp;#039;16 bit teratas harus bernilai nol&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Ruang alamat efektif = 2&amp;lt;sup&amp;gt;48&amp;lt;/sup&amp;gt; byte ≈ &amp;#039;&amp;#039;&amp;#039;64 terabyte&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Program biasa hanya memakai beberapa megabyte sampai beberapa gigabyte&lt;br /&gt;
&lt;br /&gt;
{{Warning|Pada satu waktu, hanya sebagian kecil rentang alamat virtual yang dianggap &amp;#039;&amp;#039;&amp;#039;valid&amp;#039;&amp;#039;&amp;#039;. Akses ke alamat yang tidak valid inilah yang memunculkan &amp;#039;&amp;#039;segmentation fault&amp;#039;&amp;#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Abstraksi yang bocor (&amp;#039;&amp;#039;leaky abstraction&amp;#039;&amp;#039;) ===&lt;br /&gt;
&lt;br /&gt;
Kedua abstraksi di atas membuat assembly bisa dipelajari sama sekali. Namun abstraksi tersebut &amp;#039;&amp;#039;&amp;#039;bocor&amp;#039;&amp;#039;&amp;#039; dalam beberapa situasi:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Performa&amp;#039;&amp;#039;&amp;#039; — ISA menjanjikan urutan, tetapi &amp;#039;&amp;#039;cache miss&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;branch misprediction&amp;#039;&amp;#039; tetap memengaruhi kecepatan nyata&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Konkurensi&amp;#039;&amp;#039;&amp;#039; — model sekuensial tidak lagi cukup ketika beberapa thread berinteraksi, sehingga diperlukan &amp;#039;&amp;#039;memory barrier&amp;#039;&amp;#039; dan operasi atomik&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Keamanan&amp;#039;&amp;#039;&amp;#039; — Spectre dan Meltdown adalah kasus di mana pengaman ternyata tidak sempurna: &amp;#039;&amp;#039;speculative execution&amp;#039;&amp;#039; meninggalkan jejak di cache yang bisa dibaca penyerang&lt;br /&gt;
&lt;br /&gt;
== Representasi Level Mesin ==&lt;br /&gt;
&lt;br /&gt;
Compiler mengerjakan bagian terberat: menerjemahkan model eksekusi C yang relatif abstrak menjadi instruksi prosesor yang sangat elementer.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assembly&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;machine code&amp;#039;&amp;#039;&amp;#039; pada dasarnya sama; perbedaannya hanya representasi. Assembly berbentuk teks yang bisa dibaca manusia, machine code berbentuk biner. Hubungan keduanya nyaris satu-ke-satu.&lt;br /&gt;
&lt;br /&gt;
=== Processor state yang terlihat ===&lt;br /&gt;
&lt;br /&gt;
Bagian-bagian state prosesor berikut tersembunyi dari programmer C, tetapi terlihat jelas di level mesin.&lt;br /&gt;
&lt;br /&gt;
==== Program counter (&amp;lt;code&amp;gt;%rip&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
Menyimpan &amp;#039;&amp;#039;&amp;#039;alamat memori instruksi berikutnya&amp;#039;&amp;#039;&amp;#039; yang akan dieksekusi. Di C, posisi eksekusi adalah konsep implisit; di level mesin, ini register konkret yang dapat diubah lewat instruksi lompat dan pemanggilan fungsi.&lt;br /&gt;
&lt;br /&gt;
==== Integer register file ====&lt;br /&gt;
&lt;br /&gt;
16 lokasi bernama, masing-masing menyimpan nilai &amp;#039;&amp;#039;&amp;#039;64-bit&amp;#039;&amp;#039;&amp;#039;. Isinya dapat berupa alamat (setara pointer di C) atau data integer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Register !! Peran umum (System V AMD64 ABI)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || Nilai kembalian fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;Callee-saved&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rcx&amp;lt;/code&amp;gt; || Argumen ke-4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt; || Argumen ke-3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rsi&amp;lt;/code&amp;gt; || Argumen ke-2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rdi&amp;lt;/code&amp;gt; || Argumen ke-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rbp&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;Callee-saved&amp;#039;&amp;#039; / &amp;#039;&amp;#039;frame pointer&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rsp&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;Stack pointer&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r8&amp;lt;/code&amp;gt; || Argumen ke-5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r9&amp;lt;/code&amp;gt; || Argumen ke-6&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r11&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;Caller-saved&amp;#039;&amp;#039;, data sementara&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r12&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;%r15&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;Callee-saved&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Sebagian register melacak bagian penting dari state program, sebagian lain menampung data sementara seperti argumen, variabel lokal, dan nilai kembalian.&lt;br /&gt;
&lt;br /&gt;
==== Condition code register ====&lt;br /&gt;
&lt;br /&gt;
Menyimpan informasi status hasil operasi aritmetika atau logika &amp;#039;&amp;#039;&amp;#039;yang terakhir dieksekusi&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;zero flag&amp;#039;&amp;#039;, &amp;#039;&amp;#039;sign flag&amp;#039;&amp;#039;, &amp;#039;&amp;#039;carry&amp;#039;&amp;#039;, &amp;#039;&amp;#039;overflow&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
Register inilah yang dipakai untuk mengimplementasikan perubahan alur kontrol bersyarat seperti &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Instruksi pembanding dieksekusi → flag berubah&lt;br /&gt;
# Instruksi lompat bersyarat membaca flag → alur program bercabang&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Satu pernyataan &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; di C selalu &amp;quot;dicicil&amp;quot; menjadi minimal dua langkah terpisah di level mesin: penetapan flag, lalu pembacaan flag.}}&lt;br /&gt;
&lt;br /&gt;
==== Vector register ====&lt;br /&gt;
&lt;br /&gt;
Setiap register dapat menampung &amp;#039;&amp;#039;&amp;#039;satu atau lebih&amp;#039;&amp;#039;&amp;#039; nilai integer atau floating-point sekaligus. Inilah dasar perangkat keras untuk SIMD dan &amp;#039;&amp;#039;vectorization&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Memori: tipe data adalah ilusi ===&lt;br /&gt;
&lt;br /&gt;
C menyediakan model di mana objek dengan tipe berbeda dideklarasikan dan dialokasikan di memori. Kode mesin memandang memori &amp;#039;&amp;#039;&amp;#039;semata-mata sebagai array byte besar yang dapat dialamati&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Konsekuensinya:&lt;br /&gt;
&lt;br /&gt;
* Tipe agregat seperti &amp;#039;&amp;#039;array&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;struct&amp;#039;&amp;#039; direpresentasikan sebagai &amp;#039;&amp;#039;&amp;#039;kumpulan byte yang bersebelahan&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Assembly &amp;#039;&amp;#039;&amp;#039;tidak membedakan&amp;#039;&amp;#039;&amp;#039; integer &amp;#039;&amp;#039;signed&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;unsigned&amp;#039;&amp;#039;&lt;br /&gt;
* Assembly tidak membedakan jenis pointer satu sama lain&lt;br /&gt;
* Assembly bahkan &amp;#039;&amp;#039;&amp;#039;tidak membedakan pointer dari integer&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{Warning|Yang membedakan &amp;#039;&amp;#039;signed&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;unsigned&amp;#039;&amp;#039; bukan datanya, melainkan &amp;#039;&amp;#039;&amp;#039;instruksi mana yang dipilih&amp;#039;&amp;#039;&amp;#039; untuk mengolahnya. Pola bit-nya identik. Inilah sebabnya kesalahan tipe data di C bisa lolos tanpa gejala sampai jauh di kemudian hari.}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|Hal ini juga menjelaskan mengapa &amp;#039;&amp;#039;casting&amp;#039;&amp;#039; pointer di C praktis &amp;quot;gratis&amp;quot; di level mesin — tidak ada data yang berubah, hanya cara compiler memperlakukannya.}}&lt;br /&gt;
&lt;br /&gt;
=== Isi program memory ===&lt;br /&gt;
&lt;br /&gt;
Ruang memori program berisi:&lt;br /&gt;
&lt;br /&gt;
* Kode mesin yang dapat dieksekusi&lt;br /&gt;
* Informasi yang dibutuhkan sistem operasi&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Run-time stack&amp;#039;&amp;#039;&amp;#039; untuk mengelola pemanggilan dan pengembalian prosedur&lt;br /&gt;
* Blok memori yang dialokasikan pengguna, misalnya melalui &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seluruhnya dialamati menggunakan alamat virtual.&lt;br /&gt;
&lt;br /&gt;
=== Satu instruksi = satu operasi elementer ===&lt;br /&gt;
&lt;br /&gt;
Satu instruksi mesin hanya melakukan operasi yang sangat sederhana, misalnya:&lt;br /&gt;
&lt;br /&gt;
* Menjumlahkan dua angka yang tersimpan di register&lt;br /&gt;
* Memindahkan data antara memori dan register&lt;br /&gt;
* Melompat ke alamat instruksi lain secara bersyarat&lt;br /&gt;
&lt;br /&gt;
Compiler harus &amp;#039;&amp;#039;&amp;#039;menyusun rangkaian&amp;#039;&amp;#039;&amp;#039; instruksi semacam itu untuk mengimplementasikan konstruksi program seperti evaluasi ekspresi aritmetika, loop, serta pemanggilan dan pengembalian prosedur.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Inilah gambaran besarnya. C menyediakan objek bertipe, variabel bernama, dan struktur kontrol. Mesin hanya punya 16 register, array byte, flag, dan instruksi sederhana. &amp;#039;&amp;#039;&amp;#039;Jarak antara keduanya diisi oleh compiler&amp;#039;&amp;#039;&amp;#039; — dan membaca hasil pengisian jarak itulah inti dari Bab 3 CS:APP.}}&lt;/div&gt;</description>
			<pubDate>Tue, 06 Oct 2026 07:07:14 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Intro_Compiler_%26_Machine_Abstraction</comments>
		</item>
		<item>
			<title>Linux &amp; Operating System</title>
			<link>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=861&amp;oldid=857</link>
			<guid isPermaLink="false">https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=861&amp;oldid=857</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:07, 6 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l16&quot;&gt;Line 16:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 16:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Representing and Manipulating Information ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Representing and Manipulating Information ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[CS:APP 2 Intro]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[CS:APP 2 Intro]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=== temp ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Intro Compiler &amp;amp; Machine Abstraction]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== LLVM ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== LLVM ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[llvm: cara install]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[llvm: cara install]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Tue, 06 Oct 2026 07:07:07 GMT</pubDate>
			<dc:creator>SanzSkuy</dc:creator>
			<comments>https://wiki.haidhi.my.id/wiki/index.php/Talk:Linux_%26_Operating_System</comments>
		</item>
</channel></rss>