<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/a-modern-linux-graphical-terminal-server-ji6slrlqi" -->

---
title: A Modern Linux Graphical Terminal Server | daily.dev
description: A practical guide to setting up a multi-user Linux graphical terminal server using XRDP on Xubuntu 21.10. Covers installation of XRDP and the PulseAudio plugin...
canonical: https://daily.dev/posts/a-modern-linux-graphical-terminal-server-ji6slrlqi
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: A Modern Linux Graphical Terminal Server | daily.dev
og:description: A practical guide to setting up a multi-user Linux graphical terminal server using XRDP on Xubuntu 21.10. Covers installation of XRDP and the PulseAudio plugin...
og:url: https://daily.dev/posts/a-modern-linux-graphical-terminal-server-ji6slrlqi
og:image: https://api.daily.dev/og/posts/jI6sLrLqI.png
og:image:alt: A Modern Linux Graphical Terminal Server
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# A Modern Linux Graphical Terminal Server

**[apalrd's adventures](https://daily.dev/sources/apalrd)** · 10 min read · 0 upvotes · 0 comments

## Summary

A practical guide to setting up a multi-user Linux graphical terminal server using XRDP on Xubuntu 21.10. Covers installation of XRDP and the PulseAudio plugin for sound support, RDP security considerations (recommending VPN over direct internet exposure), restricting users via the tsusers group, limiting per-user resources with systemd cgroups (CPUQuota and MemoryMax), and fixing the color managed device error with PolKit. The setup allows many clients to simultaneously connect to individual Linux desktops from Windows, macOS, Linux, iOS, Android, and even smart TVs, with less overhead than VM-based solutions.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.apalrd.net/posts/2022/xrdp_intro>

## Questions this post answers

### How do I restrict which users can log in via XRDP on Ubuntu?

XRDP's session manager (sesman) restricts access to users in the group tsusers, but only if that group exists — the package does not create it automatically. Create the group manually and add desired users to it. Also edit /etc/xrdp/sesman.ini to disable root login. If the group does not exist, any system account can connect.

_Admins locking down XRDP access on shared Linux servers find relevant hardening tips on daily.dev._

### How do I limit CPU and memory per user on a Linux terminal server using systemd?

Place a .conf file in /etc/systemd/system/user-.slice.d/ to set defaults for all users. Use CPUQuota (percentage relative to one thread, so 200% equals two threads on any CPU) and MemoryMax (in M or G) to cap resources. The OOM killer enforces MemoryMax as if the system had only that much RAM. A MemoryHigh threshold can throttle processes before the hard limit is hit.

_Teams running shared Linux desktops track systemd resource control patterns like this on daily.dev._

### Why is there no sound when connecting to a Linux desktop via XRDP?

XRDP relies on an internal PulseAudio API that must be compiled against the exact PulseAudio version installed on the system. The Ubuntu package does not include this plugin, so audio is absent by default. The fix is to build the pulseaudio-module-xrdp plugin from source following the guide in the neutrinolabs/pulseaudio-module-xrdp repository.

_Developers setting up Linux remote desktop environments share build tips and workarounds on daily.dev._

## Similar posts on daily.dev

- [KDE Remote Desktop Experience Improving For Closing The X11 vs. Wayland Gap](https://daily.dev/posts/kde-remote-desktop-experience-improving-for-closing-the-x11-vs-wayland-gap-noumjxzae) · Phoronix · 0 upvotes · 0 comments
- [A desktop terminal built for day-to-day remote access - uTerminal](https://daily.dev/posts/a-desktop-terminal-built-for-day-to-day-remote-access---uterminal-hnelg0yxj) · Product Hunt · 9 upvotes · 0 comments
- [Winpodx is like a Linux Subsystem for Windows, and it's just as exciting \(and useful\) as it sounds](https://daily.dev/posts/winpodx-is-like-a-linux-subsystem-for-windows-and-it-s-just-as-exciting-and-useful-as-it-sounds-ijpdujytn) · XDA Developers · 27 upvotes · 3 comments
- [Not the Linux You Remember: 16 Every Day Tasks That No Longer Need the Terminal](https://daily.dev/posts/not-the-linux-you-remember-16-every-day-tasks-that-no-longer-need-the-terminal-bth522die) · It's Foss · 2 upvotes · 0 comments

---

Tags: [#linux](https://daily.dev/tags/linux)

[View this post on daily.dev](https://daily.dev/posts/a-modern-linux-graphical-terminal-server-ji6slrlqi)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"A Modern Linux Graphical Terminal Server","url":"https://daily.dev/posts/a-modern-linux-graphical-terminal-server-ji6slrlqi","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/a-modern-linux-graphical-terminal-server-ji6slrlqi"},"datePublished":"2026-08-11T08:55:32.593Z","dateModified":"2026-08-11T09:38:16.212Z","description":"A practical guide to setting up a multi-user Linux graphical terminal server using XRDP on Xubuntu 21.10. Covers installation of XRDP and the PulseAudio plugin...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/a188118e85d4f2afcbd565675e11b183?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/a188118e85d4f2afcbd565675e11b183?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"apalrd's adventures","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"apalrd's adventures","logo":"https://media.daily.dev/image/upload/s--4zkx8dRj--/f_auto,q_auto/v1786438309/logos/apalrd?_a=BAMAMicg0","url":"https://daily.dev/sources/apalrd"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/a-modern-linux-graphical-terminal-server-ji6slrlqi","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"linux","timeRequired":"PT10M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"apalrd's adventures","item":"https://daily.dev/sources/apalrd"},{"@type":"ListItem","position":3,"name":"A Modern Linux Graphical Terminal Server"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/a-modern-linux-graphical-terminal-server-ji6slrlqi#faq","mainEntity":[{"@type":"Question","name":"How do I restrict which users can log in via XRDP on Ubuntu?","acceptedAnswer":{"@type":"Answer","text":"XRDP's session manager (sesman) restricts access to users in the group tsusers, but only if that group exists — the package does not create it automatically. Create the group manually and add desired users to it. Also edit /etc/xrdp/sesman.ini to disable root login. If the group does not exist, any system account can connect. Admins locking down XRDP access on shared Linux servers find relevant hardening tips on daily.dev."}},{"@type":"Question","name":"How do I limit CPU and memory per user on a Linux terminal server using systemd?","acceptedAnswer":{"@type":"Answer","text":"Place a .conf file in /etc/systemd/system/user-.slice.d/ to set defaults for all users. Use CPUQuota (percentage relative to one thread, so 200% equals two threads on any CPU) and MemoryMax (in M or G) to cap resources. The OOM killer enforces MemoryMax as if the system had only that much RAM. A MemoryHigh threshold can throttle processes before the hard limit is hit. Teams running shared Linux desktops track systemd resource control patterns like this on daily.dev."}},{"@type":"Question","name":"Why is there no sound when connecting to a Linux desktop via XRDP?","acceptedAnswer":{"@type":"Answer","text":"XRDP relies on an internal PulseAudio API that must be compiled against the exact PulseAudio version installed on the system. The Ubuntu package does not include this plugin, so audio is absent by default. The fix is to build the pulseaudio-module-xrdp plugin from source following the guide in the neutrinolabs/pulseaudio-module-xrdp repository. Developers setting up Linux remote desktop environments share build tips and workarounds on daily.dev."}}]}
```

