Cross Compile ZeroTier untuk armv7a Advantech ICR-3211B

Cross Compile ZeroTier untuk armv7a Advantech ICR-3211B
Photo by Privecstasy / Unsplash

Pendahuluan

ZeroTier adalah solusi jaringan global yang menggabungkan fitur VPN, SD-WAN, dan konektivitas IoT dalam satu platform. Dengan ZeroTier, pengguna dapat menghubungkan perangkat mereka ke jaringan pribadi yang aman tanpa perlu konfigurasi kompleks atau perangkat keras tambahan.

Beberapa fitur utama ZeroTier:

  • Koneksi Peer-to-Peer: Perangkat dapat berkomunikasi langsung tanpa harus melewati server pusat.
  • Keamanan Tinggi: Data dienkripsi end-to-end, memastikan privasi dan keamanan komunikasi.
  • Kemudahan Penggunaan: Instalasi ringan dan dapat digunakan di berbagai sistem operasi serta perangkat.
  • Manajemen Jaringan: Memungkinkan pengguna untuk mengontrol dan mengelola jaringan mereka melalui antarmuka web yang intuitif.

"Jika Anda ingin mencoba atau mempelajari lebih lanjut, kunjungi situs resmi ZeroTier."

Artikel ini menjelaskan cara melakukan cross-compile ZeroTier client untuk perangkat ICR-3211B dari Advantech, khususnya berbasis ARMv7a 32-bit. Metode ini berguna untuk perangkat seperti router atau sistem berbasis embedded Linux lainnya.


Persiapan Cross-Compile

  • Host Linux atau WSL (Windows Subsystem for Linux): Menggunakan distribusi Ubuntu, Debian, atau sejenisnya.
  • Toolchain khusus ICR-3211B: Dapat diunduh dari Advantech Toolchains Repository, lebih spesifik V3 routers (ARM Cortex-A8) untuk target keluarga ICR-3200.
  • Koneksi internet untuk mengunduh dependensi.

1. Instalasi Toolchain Cross-Compiler

sudo apt-get install git make pkg-config build-essential  
sudo dpkg -i gcc-icr-v3-armv7-linux-gnueabi-7.4.0-3.x86_64.deb  

Toolchain akan terinstal di /opt/toolchain/gcc-icr-v3-armv7-linux-gnueabi/.

2. Clone Kode Sumber ZeroTier

git clone https://github.com/zerotier/ZeroTierOne.git --depth=1  
cd ZeroTierOne  

Opsi --depth=1 memastikan hanya commit terbaru yang diunduh untuk menghemat bandwidth.

3. Patch untuk Perbaikan Deteksi Arsitektur dan Optimasi

Patch berikut disiapkan untuk memperbaiki deteksi arsitektur saat kompilasi dan optimasi ARM Cortex-A8 ICR-3211B. ARMv7a tidak memiliki dukungan native penuh untuk operasi atomic di semua prosesor, sehingga beberapa operasi seperti std::atomic pada C++ atau __atomic_ pada GCC memerlukan pustaka tambahan untuk bekerja dengan benar. Untuk menghindari error saat linking, override LDFLAGS+=-latomic ditambahkan. Simpan patch berikut sebagai make-linux-Fix-architecture-detection.patch:

From 0a82874f6d1170205fa50400b3904bcab1e7da56 Mon Sep 17 00:00:00 2001
From: Ketut Kumajaya <ketut.kumajaya@gmail.com>
Date: Sat, 17 May 2025 21:19:46 +0700
Subject: [PATCH] make-linux: Fix architecture detection

---
 make-linux.mk | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/make-linux.mk b/make-linux.mk
index efc1bad..e47397b 100644
--- a/make-linux.mk
+++ b/make-linux.mk
@@ -334,7 +334,12 @@ endif

 # ARM32 hell -- use conservative CFLAGS
 ifeq ($(ZT_ARCHITECTURE),3)
-       ifeq ($(shell if [ -e /usr/bin/dpkg ]; then dpkg --print-architecture; fi),armel)
+       ifeq ($(shell $(CC) -dM -E - </dev/null | grep -q __ARM_ARCH_7A__ && echo 1),1)
+               override CFLAGS+=-march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=vfpv3 -O2
+               override CXXFLAGS+=-march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=vfpv3 -O2
+               override LDFLAGS+=-latomic
+               ZT_USE_ARM32_NEON_ASM_CRYPTO=0
+       else ifeq ($(shell $(CC) -dM -E - </dev/null | grep -q __ARMEL__ && echo 1),1)
                override CFLAGS+=-march=armv5t -mfloat-abi=soft -msoft-float -mno-unaligned-access -marm
                override CXXFLAGS+=-march=armv5t -mfloat-abi=soft -msoft-float -mno-unaligned-access -marm
                ZT_USE_ARM32_NEON_ASM_CRYPTO=0
--
2.43.0

kemudian terapkan ke kode sumber ZeroTier:

git apply make-linux-Fix-architecture-detection.patch

4. Konfigurasi Cross Compile

Konfigurasi toolchain cross compile sebagai berikut:

export CC=/opt/toolchain/gcc-icr-v3-armv7-linux-gnueabi/bin/armv7-linux-gnueabi-gcc
export CXX=/opt/toolchain/gcc-icr-v3-armv7-linux-gnueabi/bin/armv7-linux-gnueabi-g++
export LD=/opt/toolchain/gcc-icr-v3-armv7-linux-gnueabi/bin/armv7-linux-gnueabi-ld

5. Kompilasi ZeroTier

Kompilasi ZeroTier dengan sejumlah thread prosesor yang tersedia agar prosesnya berlangsung cepat. Bila perlu, lakukan strip setelah kompilasi agar ukuran binary ZeroTier menjadi sangat kecil:

make -j$(nproc)
/opt/toolchain/gcc-icr-v3-armv7-linux-gnueabi/bin/armv7-linux-gnueabi-strip --strip-all zerotier-one

6. Menyalin Binary ke Target

Setelah kompilasi selesai, binary ZeroTier yang dihasilkan dapat ditemukan di direktori ZeroTierOne/. Anda bisa menyalinnya ke perangkat menggunakan SCP atau metode lain:

scp zerotier-one root@ip-target:/usr/sbin/

7. Verifikasi

Login ke perangkat ARMv7a dan jalankan binary untuk memastikan berhasil:

ssh root@ip-target
cd /usr/sbin
ln -sf zerotier-one zerotier-idtool
ln -sf zerotier-one zerotier-cli
zerotier-one -h

Menjalankan ZeroTier di ICR-3211B

Pada sistem minimalis seperti ICR-3211B, layanan systemd tidak tersedia, sehingga tidak bisa menggunakan systemctl. Sebagai solusi, kita akan menggunakan skrip init untuk mengelola ZeroTier secara langsung dan memastikan layanan tetap berjalan setelah reboot atau jika mengalami crash.

1. Menambahkan Skrip Startup dan Monitoring ke Sistem

Simpan skrip berikut sebagai /etc/rc.d/init.d/zerotier-one:

#!/bin/sh

DAEMON="zerotier-one"
DATADIR="/var/data/zerotier-one"
PIDFILE="$DATADIR/$DAEMON.pid"
WALL_CHAIN="srv_$DAEMON"
LOCAL_PORT=9993
EXTRA_OPTS="-d -p$LOCAL_PORT $DATADIR"

. /etc/rc.d/init.d/functions

start() {
    if [ -f "$PIDFILE" ] && ps | grep -v grep | grep "$(cat $PIDFILE)" > /dev/null 2>&1; then
        echo "$DAEMON is already running."
    else
        echo "Starting $DAEMON..."
        mkdir -p "$DATADIR" /var/lib
        ln -sf "$DATADIR" /var/lib/zerotier-one
        add_chain $WALL_CHAIN
        add_rule $WALL_CHAIN udp $LOCAL_PORT
        add_chain6 $WALL_CHAIN
        add_rule6 $WALL_CHAIN udp $LOCAL_PORT
        logger -t "$DAEMON" "$DAEMON service start"
        nohup "$DAEMON" $EXTRA_OPTS &> /dev/null &
        echo $! > "$PIDFILE"
        echo "Started."
    fi
}

stop() {
    if [ -f "$PIDFILE" ] && ps | grep -v grep | grep "$(cat $PIDFILE)" > /dev/null 2>&1; then
        echo "Stopping $DAEMON..."
        kill -9 "$(cat $PIDFILE)" && rm -f "$PIDFILE"
        sleep 2
        del_chain $WALL_CHAIN
        del_chain6 $WALL_CHAIN
        logger -t "$DAEMON" "$DAEMON service stop"
        echo "Stopped."
    else
        echo "$DAEMON is not running."
    fi
}

status() {
    echo -n "$DAEMON is "
    if [ -f "$PIDFILE" ] && ps | grep -v grep | grep "$(cat $PIDFILE)" > /dev/null 2>&1; then
        echo "running (PID: $(cat $PIDFILE))"
    else
        echo "not running."
    fi
}

restart() {
    echo "Restarting $DAEMON..."
    stop
    sleep 3
    start
}

case "$1" in
    start) start ;;
    stop) stop ;;
    restart) restart ;;
    status) status ;;
    *) echo "Usage: $0 {start|stop|restart|status}" ;;
esac

exit 0

Simpan skrip berikut sebagai /usr/sbin/zerotier-watchdog untuk memastikan layanan selalu tetap berjalan:

#!/bin/sh

DAEMON="zerotier-one"
PIDFILE="/var/data/zerotier-one/$DAEMON.pid"
CHECK_INTERVAL=15  # Check every 15 seconds

while true; do
    if [ -f "$PIDFILE" ] && ps | grep -v grep | grep "$(cat $PIDFILE)" > /dev/null 2>&1; then
        echo "$DAEMON is running."
    else
        logger -t "$DAEMON" "$DAEMON stopped. Restarting..."
        service $DAEMON start
    fi
    sleep "$CHECK_INTERVAL"
done

2. Mengaktifkan Skrip Startup

Setelah menyimpan skrip di /etc/rc.d/init.d/zerotier, jalankan perintah berikut untuk mengaktifkan startup otomatis:

chmod +x /etc/rc.d/init.d/zerotier-one
cd /etc/rc.d/rc.start
ln -sf /etc/rc.d/init.d/zerotier-one rc.99.zerotier-one

Di halaman web ICR-3211B, ubah startup script menjadi:

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here.
chmod 777 /dev/net/tun

nohup zerotier-watchdog &> /dev/null &

3. Verifikasi & Debugging

  • Pastikan layanan berjalan:
service zerotier-one start
service zerotier-one status
ip a
  • Periksa log jika ada masalah:
    Setelah reboot, periksa kembali log dan status jaringan melalui antarmuka web ICR-3211B untuk memastikan ZeroTier berjalan normal.

Bergabung ke Jaringan ZeroTier

Setelah ZeroTier berhasil berjalan di ICR-3211B, langkah berikutnya adalah bergabung ke jaringan ZeroTier agar perangkat dapat berkomunikasi dengan sistem lain.

1. Dapatkan Network ID

Sebelum menghubungkan perangkat, pastikan Anda memiliki Network ID dari jaringan yang telah dibuat di ZeroTier Central.

  • Login ke ZeroTier Central: https://my.zerotier.com
  • Buat atau pilih jaringan yang ingin digunakan.
  • Catat Network ID (biasanya berupa string angka, misalnya abcdef1234567890).

Anda bisa meminta Network ID ke administrator jaringan jika menggunakan jaringan ZeroTier private self hosted.

2. Bergabung ke Jaringan dari ICR-3211B

Gunakan perintah berikut di perangkat ICR-3211B:

zerotier-cli join <NETWORK_ID>

Contoh:

zerotier-cli join abcdef1234567890 

3. Verifikasi Koneksi

Setelah bergabung ke jaringan, pastikan perangkat telah berhasil terkoneksi:

zerotier-cli info 

Jika berhasil, output akan menunjukkan status jaringan aktif, seperti:

200 info <ztaddr> <ver> ONLINE

Jika jaringan memerlukan persetujuan manual, masuk ke ZeroTier Central, lalu izinkan perangkat bergabung ke jaringan atau minta persetujuan ke administrator jaringan private yang digunakan.

4. Cek IP Address di ZeroTier

Gunakan perintah berikut untuk melihat IP yang diberikan oleh jaringan ZeroTier:

zerotier-cli listnetworks

Hasilnya akan menunjukkan IP yang diberikan, misalnya:

200 listnetworks abcdef1234567890 <name> <mac> OK PRIVATE <dev> 10.10.10.15/24

5. Uji Koneksi Antar Perangkat

Gunakan ping untuk menguji konektivitas antar perangkat yang terhubung ke ZeroTier:

ping <IP_DEVICE_LAIN>

Misalnya jika perangkat lain memiliki IP 10.10.10.20:

ping 10.10.10.20

Jika ping berhasil, berarti koneksi melalui ZeroTier sudah aktif!

Sekarang, ICR-3211B telah terhubung ke jaringan ZeroTier dan siap digunakan untuk komunikasi dengan perangkat lain.


Penutup

Dengan langkah-langkah yang telah dijelaskan, ZeroTier-One kini dapat berjalan optimal di ICR-3211B, meskipun tanpa dukungan systemd. Cross-compiling, penerapan patch arsitektur, serta skrip startup dan monitoring layanan memastikan bahwa sistem tetap stabil dan terhubung tanpa perlu intervensi manual.

Keunggulan dari pendekatan ini:

  • Portabilitas: Dapat digunakan pada perangkat ARMv7a lainnya dengan sedikit modifikasi.
  • Keamanan: Firewall diaktifkan untuk melindungi komunikasi jaringan.
  • Reliabilitas: Layanan otomatis restart jika ada kegagalan proses.

Jika Anda ingin melakukan penyesuaian lebih lanjut—misalnya optimasi sumber daya atau penerapan kebijakan keamanan tambahan—artikel ini bisa menjadi dasar yang kuat. ZeroTier memungkinkan konektivitas fleksibel dan aman, sehingga cocok untuk berbagai implementasi di sistem embedded Linux lainnya.

Tetap eksplorasi dan selamat mencoba!