ARMhf

Ce tutoriel a été contribué par @wwjabc

https://github.com/rustdesk/rustdesk/issues/175#issuecomment-1129516367

Étapes de compilation de base

  • Téléchargez ubuntu18.04_rootfs.tar.gz (code d’extraction : xlnx). J’ai essayé plusieurs versions de systèmes Ubuntu et n’ai réussi que sur celle-ci. Le fichier exécutable compilé peut être utilisé sur d’autres systèmes armhf. PS : Si vous ne faites pas confiance à la source du système, vous pouvez également le compiler sur votre système en vous basant sur ce tutoriel. Si vous réussissez, veuillez soumettre une solution pour remplacer ce tutoriel.

  • Ressources officielles PYNQ | PYNQ-github | ubuntu

  • Téléchargez et compilez cmake-3.14.5. Tutoriel de référence de compilation. La version cmake intégrée du système est 3.10.2, qui signalera une erreur de version trop basse lors de la compilation de vcpkg-2020.11

    • Compiler sur la carte (je n’ai pas réussi à configurer la machine virtuelle qemu)
  • Installez vcpkg, et définissez correctement la variable d’environnement VCPKG_ROOT. Il est recommandé de télécharger vcpkg-2020.11, qui est la version que j’utilise actuellement

    • Linux : vcpkg install libyuv
    • libvpx (code d’extraction : xlnx) (installation manuelle, quant à la raison pour laquelle ce fichier est spécifié, je veux exprimer que j’ai compilé avec succès en me basant sur ce fichier, vous pouvez également télécharger d’autres fichiers pour remplacer ce fichier.)
    • opus (code d’extraction : xlnx) (installation manuelle, même raison que ci-dessus.)
  • Compilez cargo build --release

Compilation sur armhf

Installer Ubuntu 18.04 sur carte SD

sudo tar zxmf ./ubuntu18.04_rootfs.tar.gz -C /your sd path/rootfs/
#Nom d'utilisateur : xilinx
#Mot de passe : xilinx

Installer cmake

tar -xzvf cmake-3.14.5.tar.gz
cd cmake-3.14.5/
#Ces deux étapes peuvent prendre beaucoup de temps, entrez en séquence
./bootstrap
make -j4
sudo make install
root@pynq:~/cmake-3.14.5# ./bootstrap 
---------------------------------------------
CMake 3.14.5, Copyright 2000-2019 Kitware, Inc. and Contributors
Found GNU toolchain
C compiler on this system is: gcc       
C++ compiler on this system is: g++          
Makefile processor on this system is: make
g++ has setenv
g++ has unsetenv
g++ does not have environ in stdlib.h
g++ has stl wstring
g++ has <ext/stdio_filebuf.h>
---------------------------------------------
root@pynq:~/cmake-3.14.5# cmake --version
cmake version 3.14.5

CMake suite maintained and supported by Kitware (kitware.com/cmake).

Installer les dépendances

sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev ninja-build

Installer vcpkg

tar zxmf vcpkg-2020.11.tar.gz
mv vcpkg-2020.11 vcpkg
vcpkg/bootstrap-vcpkg.sh
export VCPKG_ROOT=$HOME/vcpkg
export VCPKG_FORCE_SYSTEM_BINARIES=1
vcpkg/vcpkg install libyuv
root@pynq:~# export VCPKG_ROOT=$HOME/vcpkg
root@pynq:~# export VCPKG_FORCE_SYSTEM_BINARIES=1
root@pynq:~# vcpkg/vcpkg install libyuv
Computing installation plan...
The following packages will be built and installed:
  * libjpeg-turbo[core]:arm-linux
    libyuv[core]:arm-linux
Additional packages (*) will be modified to complete this operation.
Detecting compiler hash for triplet arm-linux...
Starting package 1/2: libjpeg-turbo:arm-linux
Building package libjpeg-turbo[core]:arm-linux...
Could not locate cached archive: /root/.cache/vcpkg/archives/62/629c73ee8920588cb446128f15cbfa66dfec1528.zip
-- Using community triplet arm-linux. This triplet configuration is not guaranteed to succeed.
-- [COMMUNITY] Loading triplet configuration from: /root/vcpkg/triplets/community/arm-linux.cmake
-- Downloading https://github.com/libjpeg-turbo/libjpeg-turbo/archive/ae87a958613b69628b92088b313ded0d4f59a716.tar.gz...
-- Extracting source /root/vcpkg/downloads/libjpeg-turbo-libjpeg-turbo-ae87a958613b69628b92088b313ded0d4f59a716.tar.gz
-- Applying patch add-options-for-exes-docs-headers.patch
-- Applying patch workaround_cmake_system_processor.patch
-- Using source at /root/vcpkg/buildtrees/libjpeg-turbo/src/0d4f59a716-5f2e7bc00b.clean
-- Configuring arm-linux-dbg
-- Configuring arm-linux-rel
-- Building arm-linux-dbg
-- Building arm-linux-rel
-- Performing post-build validation
-- Performing post-build validation done
Stored binary cache: /root/.cache/vcpkg/archives/62/629c73ee8920588cb446128f15cbfa66dfec1528.zip
Building package libjpeg-turbo[core]:arm-linux... done
Installing package libjpeg-turbo[core]:arm-linux...
Installing package libjpeg-turbo[core]:arm-linux... done
Elapsed time for package libjpeg-turbo:arm-linux: 5.475 min
Starting package 2/2: libyuv:arm-linux
Building package libyuv[core]:arm-linux...
Could not locate cached archive: /root/.cache/vcpkg/archives/36/3683c357e53932d95a037b4eb8cb74fe71c15f80.zip
-- Using community triplet arm-linux. This triplet configuration is not guaranteed to succeed.
-- [COMMUNITY] Loading triplet configuration from: /root/vcpkg/triplets/community/arm-linux.cmake
-- Fetching https://chromium.googlesource.com/libyuv/libyuv...
#Parfois, cela peut bloquer longtemps ici, voire échouer. Vous pouvez appuyer sur ctrl+c et réexécuter vcpkg/vcpkg install libyuv
CMake Error at scripts/cmake/vcpkg_execute_required_process.cmake:106 (message):
    Command failed: /usr/bin/git fetch https://chromium.googlesource.com/libyuv/libyuv fec9121b676eccd9acea2460aec7d6ae219701b9 --depth 1 -n
    Working Directory: /root/vcpkg/downloads/git-tmp
    Error code: 128
    See logs for more information:
      /root/vcpkg/buildtrees/libyuv/git-fetch-arm-linux-err.log

Call Stack (most recent call first):
  scripts/cmake/vcpkg_from_git.cmake:78 (vcpkg_execute_required_process)
  ports/libyuv/portfile.cmake:3 (vcpkg_from_git)
  scripts/ports.cmake:135 (include)


Error: Building package libyuv:arm-linux failed with: BUILD_FAILED
Please ensure you are using the latest portfiles with `./vcpkg update`, then
submit an issue at https://github.com/Microsoft/vcpkg/issues including:
  Package: libyuv:arm-linux
  Vcpkg version: 2020.06.15-unknownhash

Additionally, attach any relevant sections from the log files above.
  • Ou téléchargez directement le package hors ligne libyuv (code d’extraction : xlnx) et copiez-le dans le dossier vcpkg/downloads/ (cette option est facultative et peut être utilisée pour de mauvaises conditions réseau), puis continuez
mv ./libyuv-fec9121b676eccd9acea2460aec7d6ae219701b9.tar.gz vcpkg/downloads/
vcpkg/vcpkg install libyuv
root@pynq:~# mv libyuv-fec9121b676eccd9acea2460aec7d6ae219701b9.tar.gz vcpkg/downloads/
root@pynq:~# vcpkg/vcpkg install libyuv
Computing installation plan...
The following packages will be built and installed:
    libyuv[core]:arm-linux
Detecting compiler hash for triplet arm-linux...
Starting package 1/1: libyuv:arm-linux
Building package libyuv[core]:arm-linux...
Could not locate cached archive: /root/.cache/vcpkg/archives/36/3683c357e53932d95a037b4eb8cb74fe71c15f80.zip
-- Using community triplet arm-linux. This triplet configuration is not guaranteed to succeed.
-- [COMMUNITY] Loading triplet configuration from: /root/vcpkg/triplets/community/arm-linux.cmake
-- Using cached /root/vcpkg/downloads/libyuv-fec9121b676eccd9acea2460aec7d6ae219701b9.tar.gz
-- Extracting source /root/vcpkg/downloads/libyuv-fec9121b676eccd9acea2460aec7d6ae219701b9.tar.gz
-- Applying patch fix_cmakelists.patch
-- Applying patch fix-build-type.patch
-- Using source at /root/vcpkg/buildtrees/libyuv/src/ae219701b9-6b491b90af.clean
-- Configuring arm-linux-dbg
-- Configuring arm-linux-rel
-- Building arm-linux-dbg
-- Building arm-linux-rel
-- Installing: /root/vcpkg/packages/libyuv_arm-linux/share/libyuv/copyright
-- Performing post-build validation
-- Performing post-build validation done
Stored binary cache: /root/.cache/vcpkg/archives/36/3683c357e53932d95a037b4eb8cb74fe71c15f80.zip
Building package libyuv[core]:arm-linux... done
Installing package libyuv[core]:arm-linux...
Installing package libyuv[core]:arm-linux... done
Elapsed time for package libyuv:arm-linux: 2.266 min

Total elapsed time: 2.59 min

The package libyuv:arm-linux provides CMake targets:

    find_package(libyuv CONFIG REQUIRED)
    target_link_libraries(main PRIVATE yuv)

Installer libvpx

mv webmproject-libvpx-v1.9.0.tar.gz vcpkg/downloads/
cd vcpkg/downloads/
tar zxmf webmproject-libvpx-v1.9.0.tar.gz
cd libvpx-1.9.0
#prefix doit être défini selon votre chemin vcpkg
./configure --prefix="/root/vcpkg/installed/arm-linux/" --disable-examples
#Encore une longue attente
make -j4
make install
cd
root@pynq:~/vcpkg/downloads/libvpx-1.9.0# ./configure --prefix="/root/vcpkg/installed/arm-linux/" --disable-examples
  disabling examples
  enabling vp8_encoder
  enabling vp8_decoder
  enabling vp9_encoder
  enabling vp9_decoder
Configuring for target 'armv7-linux-gcc'
  enabling armv7
  enabling neon
  enabling neon_asm
  enabling unit_tests
  enabling webm_io
  enabling libyuv
Creating makefiles for armv7-linux-gcc libs
Creating makefiles for armv7-linux-gcc tools
Creating makefiles for armv7-linux-gcc docs
root@pynq:~/vcpkg/downloads/libvpx-1.9.0# make install
    [INSTALL] /root/vcpkg/installed/arm-linux/include/vpx/vp8.h
    [INSTALL] /root/vcpkg/installed/arm-linux/include/vpx/vp8cx.h
    [INSTALL] /root/vcpkg/installed/arm-linux/include/vpx/vp8dx.h
    [INSTALL] /root/vcpkg/installed/arm-linux/include/vpx/vpx_codec.h
    [INSTALL] /root/vcpkg/installed/arm-linux/include/vpx/vpx_frame_buffer.h
    [INSTALL] /root/vcpkg/installed/arm-linux/include/vpx/vpx_image.h
    [INSTALL] /root/vcpkg/installed/arm-linux/include/vpx/vpx_integer.h
    [INSTALL] /root/vcpkg/installed/arm-linux/include/vpx/vpx_decoder.h
    [INSTALL] /root/vcpkg/installed/arm-linux/include/vpx/vpx_encoder.h
    [INSTALL] /root/vcpkg/installed/arm-linux/lib/libvpx.a
    [INSTALL] /root/vcpkg/installed/arm-linux/lib/pkgconfig/vpx.pc
make[1]: Nothing to be done for 'install'.
make[1]: Nothing to be done for 'install'.

Installer opus

mv xiph-opus-5c94ec3205c30171ffd01056f5b4622b7c0ab54c.tar.gz vcpkg/downloads/
cd vcpkg/downloads/
tar zxmf xiph-opus-5c94ec3205c30171ffd01056f5b4622b7c0ab54c.tar.gz
cd opus-5c94ec3205c30171ffd01056f5b4622b7c0ab54c
./autogen.sh
#prefix doit être défini selon votre chemin vcpkg
./configure --prefix="/root/vcpkg/installed/arm-linux/" CFLAGS="-Os" --enable-fixed-point --enable-intrinsics --host=arm-linux
make -j4
make install
cd
root@pynq:~/vcpkg/downloads/opus-5c94ec3205c30171ffd01056f5b4622b7c0ab54c# ./autogen.sh
Updating build configuration files, please wait....
libtoolize: putting auxiliary files in '.'.
libtoolize: linking file './ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
libtoolize: linking file 'm4/libtool.m4'
libtoolize: linking file 'm4/ltoptions.m4'
libtoolize: linking file 'm4/ltsugar.m4'
libtoolize: linking file 'm4/ltversion.m4'
libtoolize: linking file 'm4/lt~obsolete.m4'
configure.ac:38: installing './compile'
configure.ac:36: installing './config.guess'
configure.ac:36: installing './config.sub'
configure.ac:33: installing './install-sh'
configure.ac:33: installing './missing'
Makefile.am:319: warning: '%'-style pattern rules are a GNU make extension
Makefile.am:322: warning: '%'-style pattern rules are a GNU make extension
Makefile.am: installing './INSTALL'
Makefile.am: installing './depcomp'
parallel-tests: installing './test-driver'
configure:
------------------------------------------------------------------------
  opus unknown:  Automatic configuration OK.

    Compiler support:

      C99 var arrays: ................ yes
      C99 lrintf: .................... yes
      Use alloca: .................... no (using var arrays)

    General configuration:

      Floating point support: ........ no
      Fast float approximations: ..... no
      Fixed point debugging: ......... no
      Inline Assembly Optimizations: . ARM (EDSP) (Media)
      External Assembly Optimizations: ARM (EDSP) (Media)
      Intrinsics Optimizations: ...... ARM (NEON)
      Run-time CPU detection: ........ ARM (NEON) (NEON Intrinsics)
      Custom modes: .................. no
      Assertion checking: ............ no
      Hardening: ..................... yes
      Fuzzing: ....................... no
      Check ASM: ..................... no

      API documentation: ............. yes
      Extra programs: ................ yes
------------------------------------------------------------------------

 Type "make; make install" to compile and install
 Type "make check" to run the test suite

Compiler

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
#git clone https://github.com/rustdesk/rustdesk
#Actuellement, seule la version rustdesk-1.1.8 a été testée
#https://github.com/rustdesk/rustdesk/archive/refs/tags/1.1.8.zip
tar zxmf rustdesk-1.1.8.tar.gz
mv rustdesk-1.1.8 rustdesk
cd rustdesk
#Besoin de modifier deux endroits dans rustdesk/Cargo.toml :
#Ligne 3 : version = "1.1.6"-> version = "1.1.8"
#Ligne 20 : whoami = "1.1" -> whoami = "1.2"
#Besoin de modifier un endroit dans rustdesk/libs/hbb_common/Cargo.toml :
#Ligne 27 : confy = { git = "https://github.com/open-trade/confy" } -> confy = "0.4" 
cargo build --release
#Maintenant une longue attente
#Si la phase de téléchargement ne se passe pas bien, vous pouvez appuyer sur ctrl+c pour terminer et réessayer jusqu'à ce que cela réussisse
root@pynq:~/rustdesk# cargo build --release
    Updating crates.io index
error: failed to get `block` as a dependency of package `scrap v0.5.0 (/root/rustdesk/libs/scrap)`

Caused by:
  failed to fetch `https://github.com/rust-lang/crates.io-index`

Caused by:
  network failure seems to have happened
  if a proxy or similar is necessary `net.git-fetch-with-cli` may help here
  https://doc.rust-lang.org/cargo/reference/config.html#netgit-fetch-with-cli

Caused by:
  SSL error: received early EOF; class=Ssl (16); code=Eof (-20)

#Ne paniquez pas lorsque vous rencontrez cette situation, réessayez simplement. Cela peut se produire plusieurs fois tout au long du processus. Si vous avez de bonnes méthodes, faites-le moi savoir ^_^
root@pynq:~/rustdesk# cargo build --release
    Updating crates.io index
    Updating git repository `https://github.com/open-trade/confy`
warning: spurious network error (2 tries remaining): SSL error: syscall failure: Broken pipe; class=Os (2)
error: failed to get `confy` as a dependency of package `hbb_common v0.1.0 (/root/rustdesk/libs/hbb_common)`

Caused by:
  failed to load source for dependency `confy`

Caused by:
  Unable to update https://github.com/open-trade/confy#27fa1294

Caused by:
  failed to clone into: /root/.cargo/git/db/confy-90047e480c044d79

Caused by:
  network failure seems to have happened
  if a proxy or similar is necessary `net.git-fetch-with-cli` may help here
  https://doc.rust-lang.org/cargo/reference/config.html#netgit-fetch-with-cli

Caused by:
  SSL error: received early EOF; class=Ssl (16); code=Eof (-20)

#Besoin de modifier un endroit dans rustdesk/libs/hbb_common/Cargo.toml :
#Ligne 27 : confy = { git = "https://github.com/open-trade/confy" } -> confy = "0.4" 

Si vous avez atteint cette étape, félicitations, vous n’êtes pas loin du succès !

   Compiling rustdesk v1.1.8 (/root/rustdesk)
warning: `hbb_common` (lib) generated 1 warning
    Finished release [optimized] target(s) in 141m 20s

Test

  • Vérifier le numéro de version
root@pynq:~/rustdesk# ./target/release/rustdesk --version
1.1.8
  • Exécuter le service
root@pynq:~/rustdesk# ./target/release/rustdesk --service
[2022-05-19T06:48:44Z INFO  rustdesk] start --service
[2022-05-19T06:48:46Z INFO  rustdesk] start --server
[2022-05-19T06:48:46Z INFO  rustdesk::server] DISPLAY=Err(NotPresent)
[2022-05-19T06:48:46Z INFO  rustdesk::server] XAUTHORITY=Err(NotPresent)
[2022-05-19T06:48:46Z INFO  rustdesk::ipc] Started ipc server at path: /tmp/RustDesk/ipc
[2022-05-19T06:48:46Z ERROR rustdesk::server::clipboard_service] Failed to start clipboard: Unknown error while interacting with the clipboard: Display parsing error
[2022-05-19T06:48:46Z INFO  rustdesk::common] Testing nat ...
[2022-05-19T06:48:46Z INFO  rustdesk::rendezvous_mediator] start rendezvous mediator of rs-ny.rustdesk.com
[2022-05-19T06:48:46Z INFO  rustdesk::rendezvous_mediator] start rendezvous mediator of rs-sg.rustdesk.com
[2022-05-19T06:48:51Z INFO  rustdesk::rendezvous_mediator] start rendezvous mediator of rs-cn.rustdesk.com
[2022-05-19T06:48:51Z INFO  rustdesk::rendezvous_mediator] register_pk of rs-sg due to key not confirmed
[2022-05-19T06:48:51Z INFO  rustdesk::rendezvous_mediator] register_pk of rs-ny due to key not confirmed
[2022-05-19T06:48:51Z INFO  rustdesk::rendezvous_mediator] machine uid: 1bb53cb1093f458aa5d68063d06aa39f
[2022-05-19T06:48:51Z INFO  rustdesk::rendezvous_mediator] machine uid: 1bb53cb1093f458aa5d68063d06aa39f
[2022-05-19T06:48:51Z INFO  rustdesk::rendezvous_mediator] register_pk of rs-cn due to key not confirmed
[2022-05-19T06:48:51Z INFO  rustdesk::rendezvous_mediator] machine uid: 1bb53cb1093f458aa5d68063d06aa39f
[2022-05-19T06:48:51Z INFO  rustdesk::rendezvous_mediator] UUID_MISMATCH received from rs-cn.rustdesk.com
[2022-05-19T06:48:51Z INFO  hbb_common::config] id updated from xxxxxx to xxxxxxx (hide id)
[2022-05-19T06:48:51Z INFO  rustdesk::rendezvous_mediator] machine uid: 1bb53cb1093f458aa5d68063d06aa39f
[2022-05-19T06:48:52Z INFO  rustdesk::common] Tested nat type: ASYMMETRIC in 6.084360199s
[2022-05-19T06:49:04Z INFO  rustdesk::rendezvous_mediator] register_pk of rs-sg due to key not confirmed
[2022-05-19T06:49:04Z INFO  rustdesk::rendezvous_mediator] machine uid: 1bb53cb1093f458aa5d68063d06aa39f
[2022-05-19T06:49:04Z INFO  rustdesk::rendezvous_mediator] register_pk of rs-ny due to key not confirmed
[2022-05-19T06:49:04Z INFO  rustdesk::rendezvous_mediator] machine uid: 1bb53cb1093f458aa5d68063d06aa39f
[2022-05-19T06:49:05Z INFO  rustdesk::rendezvous_mediator] register_pk of rs-sg due to key not confirmed
[2022-05-19T06:49:05Z INFO  rustdesk::rendezvous_mediator] machine uid: 1bb53cb1093f458aa5d68063d06aa39f

Ne soyez pas trop heureux trop tôt, démarrer le service obtient seulement l’ID, vous devez définir un mot de passe pour être accessible par d’autres terminaux.

  • Définir le mot de passe
root@pynq:~/rustdesk# ./target/release/rustdesk --password qwertyuiop123123 #Veuillez définir n'importe quel mot de passe, ceci n'est qu'un exemple
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Connection refused (os error 111)', src/main.rs:106:55
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
#Bien qu'il y ait un message d'erreur, cela n'affecte pas la définition du mot de passe
  • Redémarrer le service et attendre la connexion
root@pynq:~/rustdesk# ./target/release/rustdesk --service &
[1] 20186

Vous pourriez immédiatement ouvrir la version PC de rustdesk pour vous connecter directement, mais après la connexion, vous constaterez

Unsupported display server type tty,x11 expected

Si vous voulez voir le bureau, vous pourriez avoir besoin du support de sciter. Ensuite, je fournis une méthode de connexion en ligne de commande, basée sur l’installation de rustdesk sur Windows PC ou Linux PC. En prenant Windows 7 comme exemple, pour tester la fonction SSH de la machine cible :

#Trouvez où vous avez installé RustDesk
C:\Users\Administrator\Desktop>cd C:\Program Files\RustDesk 
C:\Program Files\RustDesk>RustDesk.exe --port-forward ur_dev_id 11000 127.0.0.1 22

Ensuite, utilisez un client SSH pour vous connecter à l’IP locale et au port

Connecting to 127.0.0.1:11000...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Welcome to PYNQ Linux, based on Ubuntu 18.04 (GNU/Linux 4.14.0-xilinx armv7l)

 * Super-optimized for small spaces - read how we shrank the memory
   footprint of MicroK8s to make it the smallest full K8s around.

   https://ubuntu.com/blog/microk8s-memory-optimisation
Last login: Thu May 19 07:33:22 2022 from 127.0.0.1
root@pynq:~# 

Pendant le processus de connexion, une fenêtre apparaîtra demandant le mot de passe de la machine distante. Il est recommandé de cocher “Se souvenir du mot de passe”, afin que la prochaine fois vous puissiez directement voir l’historique de connexion dans l’application rustdesk et vous connecter directement en utilisant la fonction tunnel TCP dans l’application au lieu de la ligne de commande. Bien sûr, il serait préférable de suggérer à @rustdesk d’ajouter un bouton [Tunnel TCP] à gauche du bouton [Transférer fichier] dans l’interface de l’application, afin que vous puissiez vous connecter à l’appareil cible sans utiliser la ligne de commande.