Skip to content

Instantly share code, notes, and snippets.

@nhira
Last active June 19, 2024 01:41
Show Gist options
  • Save nhira/203cd72388e1332cccaf2d9d86742101 to your computer and use it in GitHub Desktop.
Save nhira/203cd72388e1332cccaf2d9d86742101 to your computer and use it in GitHub Desktop.
How to install Amazon Workspaces Linux Client for Fedora

Amazon WorkSpaces Linux client - RPM installation

Overview

The good news is that there is an Amazon WorkSpaces Linux client. If you happen to use Ubuntu, you can use the official instructions from the documentation. But what if you're on an rpm-friendly distribution like Fedora or CentOS?

alien to the rescue.

How to

You can use these steps to build a PCoIP client (not the 2023 WSP client) RPM from the original .deb package.

(Tested using a Lubuntu 23.10 image to build the RPM and Fedora 39 to install it.)

Get the .deb package

Download the file from the Workspaces Linux client page.

wget "https://d3nt0h4h6pmmc4.cloudfront.net/workspacesclient_focal_amd64.deb"

Create rpm

If you don't have alien, get it.

sudo apt install alien

To avoid some errors, we need to repackage manually.

sudo alien -rgv workspacesclient_focal_amd64.deb

Fedora now ships liblttng-ust0-2.13 and the package was built with 2.12, so we'll omit coreclrtraceprovider.so. See this issue for an unrelated project for a better explanation of the problem and the solution.

sudo sed -i '/"\/opt\/workspacesclient\/libcoreclrtraceptprovider.so"$/d' workspacesclient-4.7.0.4312/workspacesclient-4.7.0.4312-2.spec

Build the rpm package.

cd workspacesclient-4.7.0.4312 && \
    sudo rpmbuild --buildroot `pwd` -bb workspacesclient-4.7.0.4312-2.spec && \
    cd -

Did it work?

sudo rpm --query --info --package ./workspacesclient-4.7.0.4312-2.x86_64.rpm 

You should see output like this...

Name        : workspacesclient
Version     : 4.7.0.4312
Release     : 2
Architecture: x86_64
Install Date: (not installed)
Group       : Converted/misc
Size        : 162134366
License     : see /usr/share/doc/workspacesclient/copyright
Signature   : (none)
Source RPM  : workspacesclient-4.7.0.4312-2.src.rpm
Build Date  : Sat Nov 18 05:21:48 2023
Build Host  : lubuntu
Summary     : Amazon WorkSpaces Client for Ubuntu 20.04
Description :


(Converted from a deb package by alien version 8.95.6.)

Install

Copy over this rpm to your RPM-based host. Install it and try it out.

sudo dnf localinstall ./workspacesclient-4.7.0.4312-2.x86_64.rpm
/opt/workspacesclient/workspacesclient

Challenges

If you run into dependency errors for some packages that aren't in Fedora, you can try installing them yourself. These are not authoritative recommendations; they're just what others have found. Be careful about adding foreign packages to your installation.

# last confirmed on 24-Jun-2023 (includes libhiredis.so.0.13 and libhiredis.so.0.14)
sudo dnf install https://rpmfind.net/linux/openmandriva/4.3/repository/x86_64/main/release/lib64hiredis0.13-0.14.1-1-omv4050.x86_64.rpm

The spec also introduces an incorrect dependency error.

Error: 
 Problem: conflicting requests
  - nothing provides libbz2.so.1.0()(64bit) needed by workspacesclient-4.7.0.4312-2.x86_64 from @commandline
  - nothing provides libcurl.so.4(CURL_OPENSSL_4)(64bit) needed by workspacesclient-4.7.0.4312-2.x86_64 from @commandline
(try to add '--skip-broken' to skip uninstallable packages)

If these are the only dependencies you need, they're in the package, so we can use rpm to skip past them.

sudo rpm -ivh --nodeps ./workspacesclient-4.7.0.4312-2.x86_64.rpm

If the login doesn't render, you might be missing some packages.

sudo dnf install javascriptcoregtk4.0-devel webkit2gtk4.0-devel

If you run into a globalization related error, this invocation should help.

DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 /opt/workspacesclient/workspacesclient 
@crocodile-coder7
Copy link

Yes, my bad. It's not supported on the mobile clients. I knew I'd read that somewhere.

I am currently running the Flatpak client in Fedora. Bit we are not using WSP.

Which version client are you running? Does it have dual compatibility with WSP and PCoIP? Or just PCoIP? I've already figured out how to install/run the PCoIP client on RHEL based systems as there are many tutorials out there. However, with the newer WSP client, I haven't been able to find anything yet.

@Clifra-Jones
Copy link

We are using PCoIP, we don't use WPS.

Using 4.6.0.4187

@crocodile-coder7
Copy link

We are using PCoIP, we don't use WPS.

Using 4.6.0.4187

Yeah thanks for your help but I've already gotten 4.7 PCoIP client running. My question is mainly aimed at anyone who has had any luck at converting the new deb to an rpm or has been able to find any other way to get the WSP client up and running on RHEL.

@nhira
Copy link
Author

nhira commented Dec 17, 2023

I saw that you mentioned this doesn't work with the WSP client. Stubbornly, I've been trying to get this to work on the WSP client with no luck. Any idea why this is and know of any workarounds?

I tried for a while to get it working with WSP. The dependencies were a pain (e.g., libwebp.so.6). When I finally got it built and installed, I realized the runtime checks for Ubuntu 20.04 (or Ubuntu 18.04) so it doesn't work after all. Given you need to provide a specific OS runtime, the flatpak seems like the best route for WSP.

Error when trying to run after an installation from the originally distributed Debian package on an Ubuntu 20.04.6 VM:

sudo apt install ./new_workspacesclient_focal_amd64.deb
...
ubuntu@ubuntu:~$ workspacesclient
thread 'main' panicked at 'called Result::unwrap() on an Err value: Error { kind: Uncategorized, message: "creation time is not available for the filesystem" }', /codebuild/output/src2915595996/src/git-codecommit.us-west-2.amazonaws.com/v1/repos/SoloClient/src/linux/client/src/infrastructure/logging/log_utils.rs:111:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

@BOPOHA
Copy link

BOPOHA commented Dec 30, 2023

@nhira could you please show me your rpm's provides and dependencies?
just run rpm -qP ./workspacesclient-4.7.0.4312-2.x86_64.rpm and rpm -qR ./workspacesclient-4.7.0.4312-2.x86_64.rpm

@BOPOHA
Copy link

BOPOHA commented Dec 30, 2023

@nhira
i just want to say that alien is not a rescue, it is evil in case of AWS packages. You can get a crash on your system during next upgrade.

this is provides of healthy rpm:

rpm -qP ~/rpmbuild/RPMS/x86_64/workspacesclient-4.7.0.4312-5.x86_64.rpm
application()
application(workspacesclient.desktop)
mimehandler(x-scheme-handler/workspaces)
workspacesclient = 4.7.0.4312-5
workspacesclient(x86-64) = 4.7.0.4312-5

and its requirements:

bzip2-libs
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.16)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libdl.so.2()(64bit)
libdl.so.2(GLIBC_2.2.5)(64bit)
libgcc_s.so.1()(64bit)
libgcc_s.so.1(GCC_3.0)(64bit)
libm.so.6()(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libstdc++.so.6()(64bit)
libstdc++.so.6(CXXABI_1.3)(64bit)
libstdc++.so.6(GLIBCXX_3.4)(64bit)
libstdc++.so.6(GLIBCXX_3.4.11)(64bit)
libstdc++.so.6(GLIBCXX_3.4.9)(64bit)
openssl1.1
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsZstd) <= 5.4.18-1
rtld(GNU_HASH)
webkit2gtk4.0

@nhira
Copy link
Author

nhira commented Dec 30, 2023

@BOPOHA -- would appreciate your feedback on this. I use this app daily so if we can make it more stable, that would be great. Thanks for taking a look!
(On my Fedora 39, it does not handle suspend/resume in full-screen mode consistently, but generally works.)

requires:

$ rpm -qR ./workspacesclient-4.7.0.4312-2.x86_64.rpm
ld-linux-x86-64.so.2()(64bit)
ld-linux-x86-64.so.2(GLIBC_2.3)(64bit)
libEGL.so.1()(64bit)
libGLX.so.0()(64bit)
libGraphicsMagick++-Q16.so.12()(64bit)
libX11.so.6()(64bit)
libavcodec.so.58()(64bit)
libavcodec.so.58(LIBAVCODEC_58)(64bit)
libavfilter.so.7()(64bit)
libavfilter.so.7(LIBAVFILTER_7)(64bit)
libavformat.so.58()(64bit)
libavformat.so.58(LIBAVFORMAT_58)(64bit)
libavutil.so.56()(64bit)
libavutil.so.56(LIBAVUTIL_56)(64bit)
libbz2.so.1.0()(64bit)
libc.so.6()(64bit)
libc.so.6(GLIBC_2.10)(64bit)
libc.so.6(GLIBC_2.11)(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.15)(64bit)
libc.so.6(GLIBC_2.16)(64bit)
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.25)(64bit)
libc.so.6(GLIBC_2.27)(64bit)
libc.so.6(GLIBC_2.28)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.2)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libc.so.6(GLIBC_2.6)(64bit)
libc.so.6(GLIBC_2.7)(64bit)
libc.so.6(GLIBC_2.9)(64bit)
libcurl.so.4()(64bit)
libcurl.so.4(CURL_OPENSSL_4)(64bit)
libdl.so.2()(64bit)
libdl.so.2(GLIBC_2.2.5)(64bit)
libgcc_s.so.1()(64bit)
libgcc_s.so.1(GCC_3.0)(64bit)
libhiredis.so.0.14()(64bit)
liblzma.so.5()(64bit)
liblzma.so.5(XZ_5.0)(64bit)
libm.so.6()(64bit)
libm.so.6(GLIBC_2.2.5)(64bit)
libm.so.6(GLIBC_2.27)(64bit)
libm.so.6(GLIBC_2.29)(64bit)
libmscordaccore.so()(64bit)
libmscordaccore.so(V1.0)(64bit)
libpcoip_core.so()(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.12)(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libpthread.so.0(GLIBC_2.3.2)(64bit)
libpthread.so.0(GLIBC_2.3.3)(64bit)
libpthread.so.0(GLIBC_2.3.4)(64bit)
libpulse.so.0()(64bit)
libpulse.so.0(PULSE_0)(64bit)
librt.so.1()(64bit)
librt.so.1(GLIBC_2.2.5)(64bit)
libstdc++.so.6()(64bit)
libstdc++.so.6(CXXABI_1.3)(64bit)
libstdc++.so.6(CXXABI_1.3.11)(64bit)
libstdc++.so.6(CXXABI_1.3.2)(64bit)
libstdc++.so.6(CXXABI_1.3.3)(64bit)
libstdc++.so.6(CXXABI_1.3.5)(64bit)
libstdc++.so.6(CXXABI_1.3.7)(64bit)
libstdc++.so.6(CXXABI_1.3.8)(64bit)
libstdc++.so.6(CXXABI_1.3.9)(64bit)
libstdc++.so.6(GLIBCXX_3.4)(64bit)
libstdc++.so.6(GLIBCXX_3.4.11)(64bit)
libstdc++.so.6(GLIBCXX_3.4.13)(64bit)
libstdc++.so.6(GLIBCXX_3.4.14)(64bit)
libstdc++.so.6(GLIBCXX_3.4.15)(64bit)
libstdc++.so.6(GLIBCXX_3.4.18)(64bit)
libstdc++.so.6(GLIBCXX_3.4.19)(64bit)
libstdc++.so.6(GLIBCXX_3.4.20)(64bit)
libstdc++.so.6(GLIBCXX_3.4.21)(64bit)
libstdc++.so.6(GLIBCXX_3.4.22)(64bit)
libstdc++.so.6(GLIBCXX_3.4.26)(64bit)
libstdc++.so.6(GLIBCXX_3.4.9)(64bit)
libswresample.so.3()(64bit)
libswresample.so.3(LIBSWRESAMPLE_3)(64bit)
libswscale.so.5()(64bit)
libswscale.so.5(LIBSWSCALE_5)(64bit)
libusb-1.0.so.0()(64bit)
libva.so.2()(64bit)
libwolfssl.so.35()(64bit)
libxcb-res.so.0()(64bit)
libxcb-shm.so.0()(64bit)
libxcb-util.so.1()(64bit)
libxcb-xfixes.so.0()(64bit)
libxcb.so.1()(64bit)
libz.so.1()(64bit)
libz.so.1(ZLIB_1.2.0)(64bit)
libz.so.1(ZLIB_1.2.0.2)(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)

provides:

$ rpm -qP ./workspacesclient-4.7.0.4312-2.x86_64.rpm
application()
application(workspacesclient.desktop)
libPcoipCoreWrapper.so()(64bit)
libSystem.Globalization.Native.so()(64bit)
libSystem.IO.Compression.Native.so()(64bit)
libSystem.IO.Compression.Native.so(V1.0)(64bit)
libSystem.Native.so()(64bit)
libSystem.Net.Security.Native.so()(64bit)
libSystem.Security.Cryptography.Native.OpenSsl.so()(64bit)
libavcodec.so.58()(64bit)
libavcodec.so.58(LIBAVCODEC_58)(64bit)
libavdevice.so.58()(64bit)
libavdevice.so.58(LIBAVDEVICE_58)(64bit)
libavfilter.so.7()(64bit)
libavfilter.so.7(LIBAVFILTER_7)(64bit)
libavformat.so.58()(64bit)
libavformat.so.58(LIBAVFORMAT_58)(64bit)
libavutil.so.56()(64bit)
libavutil.so.56(LIBAVUTIL_56)(64bit)
libclrgc.so()(64bit)
libclrjit.so()(64bit)
libclrjit.so(V1.0)(64bit)
libcoreclr.so()(64bit)
libcoreclr.so(V1.0)(64bit)
libhostfxr.so()(64bit)
libhostfxr.so(V1.0)(64bit)
libhostpolicy.so()(64bit)
libhostpolicy.so(V1.0)(64bit)
libmscordaccore.so()(64bit)
libmscordaccore.so(V1.0)(64bit)
libmscordbi.so()(64bit)
libmscordbi.so(V1.0)(64bit)
libpcoip_core.so()(64bit)
libswresample.so.3()(64bit)
libswresample.so.3(LIBSWRESAMPLE_3)(64bit)
libswscale.so.5()(64bit)
libswscale.so.5(LIBSWSCALE_5)(64bit)
libvchan-plugin-clipboard.so()(64bit)
libwolfssl.so.35()(64bit)
mimehandler(x-scheme-handler/workspaces)
workspacesclient = 4.7.0.4312-2
workspacesclient(x86-64) = 4.7.0.4312-2

@OkButWine
Copy link

OkButWine commented Feb 9, 2024

Found the issue is most like Amazon doing an OS detection on the new client. Got Workspaces working through distrobox instead

@JHBoricua
Copy link

@OkButWine Can you detail how did you get this working via distrobox? I tried going that route and the client won't launch. I'm on Fedora 40.

@Clifra-Jones
Copy link

@JHBoricua Just use the FlatPak. it works. Well, it does crash on exit but that's a FlatPak issue.
I use this every day without issue.

@JHBoricua
Copy link

JHBoricua commented Jun 13, 2024

I was using the Flatpak, but on Fedora 40 the latest release of the Flatpak crashes on startup. Not to mention it is unverified. There's not even a changelog for the latest update. If using Distrobox allows the use of the official package from Amazon, then IMHO it is less risky than using the Flatpak. In any case, I figured out how to make it work a few hours ago thanks to this Reddit post. Basically, I needed to also install the ubuntu-desktop package in addition to the workspaces one.

In my Fedora 40 I installed the client for ubunto 20.04 did the following:

distrobox create --image ubuntu:20.04 --name Amazon-Workspaces
distrobox enter Amazon-Workspaces
sudo apt update && sudo apt-get install --no-install-recommends ubuntu-desktop -y
wget -q -O - https://workspaces-client-linux-public-key.s3-us-west-2.amazonaws.com/ADB332E7.asc | sudo apt-key add -
echo "deb [arch=amd64] https://d3nt0h4h6pmmc4.cloudfront.net/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/amazon-workspaces-clients.list
sudo apt-get update
sudo apt install workspacesclient -y
distrobox-export --app workspacesclient

So far it's been working flawlessly. No crashes on exit either.

@OkButWine
Copy link

Late to the party but I agree that distrobox is the best way to go. The flatpak either will crash and/or be incompatible with the latest version of AWS Workspaces. Distrobox allows you to run Ubuntu and the install and run the latest version of AWS Workspaces from https://clients.amazonworkspaces.com/linux-install.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment