Thursday, April 19, 2018

Akses Romote OpenGL pakai VirtualGL melalui TurboVNC

Mendayagunakan server berbeda dari memakai workstation biasa. Server tidak dimaksudkan untuk digunakan melalui login secara lokal. Semua aktivitas komputasi dilakukan secara remote walaupun bisa juga dilakukan secara lokal tetapi itu kurang sesuai dengan konsep server dan client. Termasuk keperluan grafis terakselerasi seperti OpenGL. Aplikasi visualisasi 3D banyak menggunakan OpenGL. Aplikasi yang menggunakan OpenGL dimaksudkan untuk memanfaatkan kemampuan kartu grafis secara maksimal. Karena akses lokal diminimalkan maka harus dilakukan setting penggunaan OpenGL secara remote. Cara yang cukup populer digunakan adalah melalui TurboVNC dan VirtualGL. TurboVNC menyediakan tampilan grafis tidak terakselerasi secara remote atau singkatnya remote desktop. Seolah kita bekerja menggunakan desktop GUI tanpa harus login secara lokal. TurboVNC tidak mendukung akselerasi grafis sehingga tidak dapat menjalankan aplikasi OpenGL seperti blender secara langsung. Untuk dapat menggunakan OpenGL secara remote melalui TurboVNC maka digunakan VirtualGL.

Jadi VirtualGL ini akan menjembatani pemrosesan grafis OpenGL dari server dan mengirimkan hasilnya ke komputer client. Apabila client juga terhubung ke server melalui TurboVNC karena memakai GUI maka VirtualGL akan mengirimkan hasil pemrosesan grafis ke TurboVNC. Dengan demikian kita bisa menikmati hasil pemrosesan grafis secara remote. Proses instalasi dan seting sebenarnya simple tetapi karena kasus setiap instalasi beda maka bisa menimbulkan pusing tersendiri. Kebetulan komputer server yang saya pakai menggunakan Ubuntu Server 16.04 64 bit dengan 2 VGA Adapter yaitu bawaan Matrox G200 yang sepertinya sekedar agar bisa disambung ke layar. Adapter yang kedua ada Nvidia Titan Xp donasi dari Nvidia GPU grant yang saya pakai untuk komputasi menggunakan GPU. Sebenarnya kalai GPU hanya dipakai sebagai co-proccessor saja hanya untuk memanfaatkan CUDA maka tidak perlu pengelolaan grafis. Tapi saya berpikir juga apabila nanti diperlukan visualisasi model yang kompleks dan harus menggunakan akselerasi seperti OpenGL maka pemrosesan grafis menjadi perlu. Di sini saya coba untuk mendokumentasikan pengalaman instalasi yang akhirnya sukses setelah 2 hari coba-cobi hampir menyerah di hari ke 3. Untuk client saya pakai komputer dengan resource terbatas karena segala pemrosesan akan dibebankan ke server. Juga menggunakan Ubuntu 16.04 64bit.
Pada komputer server sudah terpasang driver proprietary dari Nvidia dan ini sepertinya wajib karena dalam driver tersebut terdapat modul GLX yang memungkinkan OpenGL menggunakan kartu VGA. Apabila driver telah terpasang maka perintah nvidia-smi akan memunculkan status kartu grafis aktif. Karena saya juga menjalankan program CUDA maka saya juga memasang CUDA Toolkit walaupun sepertinya tidak wajib di sini. Semua proses saya lakukan secara remote dan tidak ada monitor terpasang pada komputer server.

OK, pertama adalah proses instalasi, sederhana TurboVNC dan VirtualGL dapat didownload dan diinstal tentu saja akses root diperlukan. Arsitekturnya menyesuaikan karena saya menggunakan versi 64 bit maka installernya juga 64 bit. Ubuntu sendiri sebenarnya juga sudah menyediakan instalasi VirtualGL sendiri sehingga terserah pilih yang mana. Instalasi dilakukan baik di server juga client. Jadi kalau salah satu atau keduanya Windows maka harap menyesuaikan.

Berikutnya adalah pembuatan file /etc/X11/xorg.conf yang akan mengaktifkan OpenGL pada kartu grafis. Biasanya dengan instalasi driver nvidia proprietary akan menonaktifkan driver opensource seperti nouveau dan driver generik seperti mesa. Saya memang sudah tidak bermaksud mendayagunakan kartu grafis bawaan selain karena fiturnya terbatas dan saya ingin murni server yang headless artinya tidak terhubung dengan monitor. Perintah untuk membuat file /etc/X11/xorg.conf versi Nvidia adalah:
sudo nvidia-xconfig -a --use-display-device=none
setelah itu file xorg.conf akan tersedia. Apabila hanya ada kartu grafis maka file xorg.conf tidak perlu diapa2kan. Tapi seandainya ada dua kartu grafis seperti berikut:
lspci | grep VGA
01:00.1 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200EH (rev 01)
09:00.0 VGA compatible controller: NVIDIA Corporation Device 1b02 (rev a1)
maka kita perlu menambahkan informasi BusID pada file /etc/X11/xorg.conf  sehingga pada bagian device menjadi seperti ini:
Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "TITAN Xp"
    BusID          "PCI:9:0:0"
EndSection
BusID ditulis sesuai dengan alamat bus PCIe yang muncul dari perintah lspci. Yang membuat instalasi tidak berhasil selama dua hari karena tidak ada baris BusID sehingga X server tidak dapat berkomunikasi dengan kartu grafis.

Dan sepertinya perlu dipastikan juga ada bagian ini:
Section "Module"

    Load "glx"
EndSection

Sekarang melakukan setting VirtualGL yang bertujuan memberikan akses bagi user agar dapat menggunakan X server yang sudah terpasang modul GLX. Sebelum melakukan seting maka X server harus dimatikan dengan mematikan desktop manager. Ubuntu yang menggunakan lightdm untuk mematikan desktop managernya dengan perintah:
sudo service lightdm stop

Karena harus mematikan desktop manager maka lebih baik proses dilakukan melalui remote terminal atau terminal non grafis lokal TTY, (Ctrl-Alt-F1).
Berikutnya perintah seting VirtualGL:
sudo /opt/VirtualGL/bin/vglserver_config

dan akan muncul pertanyaan2:
Restrict local X server access to vglusers group (recommended)?
[Y/n]
Restrict framebuffer device access to vglusers group (recommended)?
[Y/n]
Disable XTEST extension (recommended)?
[Y/n]
Disarankan semua dijawab Y untuk keamanan kemudian exit. Program vglserver_config akan membuat group vglusers yang isinya adalah user yang terpercaya untuk menggunakan X server secara remote. Untuk menambahkan user ke grup vglusers perintahnya:
sudo usermod -a -G vglusers trusted_user_here

Agar setingan di atas atas aktif maka perlu melakukan reboot:
sudo reboot

Apabila kita melakukan secara remote maka pastika tidak ada yang menghalangi koneksi SSH setelah reboot atau kita terpaksa mengakses secara lokal.
Sebelum mengakses X server maka perlu membaca kunci otorisasi X dari VirtualGL oleh user:
xauth merge /etc/opt/VirtualGL/vgl_xauth_key
Apabila proses seting berhasil maka perintah:
xdpyinfo -d :0 | grep GLX akan memunculkan:
GLX dan mungkin NV-GLX

Beberapa kali mencoba saya tidak sukses memunculkan bahwa modul GLX telah terpasang pada DISPLAY :0 yang merupakan display yang memproses grafis yang diharapkan mendukung OpenGL. Langkah2 di atas memastikan keberhasilan terpasangnya GLX pada display :0.

Sekarang kita memasang TurboVNCnya. Sebenarnya apabila kita terkoneksi dengan server melalui LAN maka kita dapat langsung menggunakan VirtualGL melalui terminal dengan vglconnect :
vglconnect trusted_user@server

yang akan melakukan koneksi ke akun remote melalui SSH -X sekaligus menjalankan vglclient untuk koneksi pengiriman grafik hasil proses OpenGL dari server. Tetapi bila koneksi dilakukan melalui internet maka kompresi perlu dilakukan dan interaksi dengan GUI dilakukan dengan TurboVNC dan VirtualGL cukup mengirimkan hasil pemrosesan melalui TurboVNC.

Setelah instalasi TurboVNC maka jalankan vncserver pada akun remote. Sebelum itu untuk keamanan buat dulu password untuk koneksi TurboVNC dengan:
/opt/TurboVNC/bin/vncpasswd

isi sesuai petunjuk pembuatan password. Kemudian jalankan vncserver dengan perintah:
/opt/TurboVNC/bin/vncserver

dan akan muncul informasi display yang dipakai oleh vncserver :
* Starting vncserver for user 'trusted_user' on localhost:2...                                                            
Desktop 'TurboVNC: MACHINE-NAME:2 (trusted_user)' started on display MACHINE-NAME:2

angka :2 pada contoh di atas menunjukkan display yang aktif bagi trusted_user. Pada konsep server-client pada linux sebuah server dapat memiliki lebih dari satu X display mulai :0 sampai seterusnya dan masing2 dapat diakses melalui port 6000 sampai seterusnya secara remote. Untuk display :2 dapat diakses melalui port 6002. Untuk aksesnya bisa melalui cara bermacam2, yang paling mudah dan sangat tidak aman adalah langsung melalui :
ip_address_server:6002
menggunakan program vncviewer yang terpasang di client. Apabila memasang TurboVNC di client maka namanya adalah TurboVNC viewer, file program di /opt/TurboVNC/bin/vncviewer
Sedangkan cara yang disarankan adalah melalui port forwarding atau tunneling menggunakan SSH.
ssh -R 6002:localhost:5902 trusted_user@server_address

perintah di atas adalah contoh untuk mengakses akun remote dan membuka port 5902 pada localhost yang terhubung dengan port 6002 remote. Akses VNC dapat dilakukan melalui localhost:5902 secara aman. Untuk detil port forwarding ssh dapat dicari di web.

Setelah kita terkoneksi dengan remote GUI melalui TurboVNC, maka kita bisa membuka terminal melalui GUI tersebut dan untuk menjalankan program OpenGL seperti glxgears atau bahkan blender untuk desain 3D perintahnya:
/opt/VirtualGL/bin/vglrun glxgears

VirtualGL akan mengirim perintah ke display :0 yang terhubung dengan kartu grafis dan OpenGL untuk memproses program dan mengirim hasilnya ke display TurboVNC. Jadi apabila seting X server + GLX pada display :0 tidak berhasil maka vglrun akan gagal.

Catatan: Pada kasus saya setelah semua cara benar tetapi vglrun gagal ternyata saya menjalankan vncserver dengan depth 16 bit yang artinya tidak murni RGB 24/32bit sehingga tidak dapat dipakai oleh OpenGL, akhirnya opsi depth 16 saya hilangkan dan berhasil.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home