Cross Compile ZeroTier untuk armv7a Advantech ICR-3211B
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!