This is a text-only version of the following page on https://raymii.org: --- Title : Remote desktop on NetBSD with Xnest (no VNC) Author : Remy van Elst Date : 22-08-2021 URL : https://raymii.org/s/articles/Remote_desktop_on_NetBSD_with_Xnest_no_VNC.html Format : Markdown/HTML --- After I recently wrote about [NetBSD on the DEC Alpha CPU in QEMU][1], I decided to play with NetBSD some more. One x86_64 virtual machine later, I'm starting to appreciate the beauty and simplicity. Great documentation, both online and via the manpages, low resource usage and boy oh boy does it feel fast. But, you're not here for my love letter, you want to have a remote desktop. In the [earlier][1] article, we set up VNC, both because it shows you how to install packages and because native X11 crashes. In this article, we are going to set up X11 forwarding via SSH, but with `Xnest` instead of VNC. `Xnest` allows you to have a full desktop / window manager inside a window. If you did a full install of NetBSD, then all you need is included on the system, no need to install any packages. This is an advantage if you are on an architecture that has no precompiled binary packages or if compiling from source takes too long.

Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below:

I'm developing an open source monitoring app called Leaf Node Monitoring, for windows, linux & android. Go check it out!

Consider sponsoring me on Github. It means the world to me if you show your appreciation and you'll help pay the server costs.

You can also sponsor me by getting a Digital Ocean VPS. With this referral link you'll get $200 credit for 60 days. Spend $25 after your credit expires and I'll get $25!

Here is a screenshot of my native NetBSD X desktop, running the default `ctwm` window manager, the `Clion` IDE, a web browser and my favorite game, `OpenTTD`: ![screenshot][2] If you have XFCE installed, you can run a full desktop session as well: ![screenshot][3] Other nostalgic desktop environments are available as well, like CDE and WindowMaker: ![screenshot][6] Note that performance is slightly worse than with VNC and you might have some artifacts when dragging windows around. I also have an issue where, once a window manager is running, `xterm` will not start. If I start `xterm` before I start `ctwm` or `xfce` it runs fine. Here is a screenshot of the artifacts after dragging a window around. They're gone when you refresh that screen area, for example, by dragging another window around over that affected area: ![screenshot][8] In this article, the terms `server` and `NetBSD host` are used interchangeably, they both mean the NetBSD machine on which you want to run the GUI. The term `client` means the machine you forward the desktop to, the machine from which you SSH into the NetBSD server. On the `client`, the window is displayed, but the actual X server / GUI is coming from the `server`. ### Setup X11 forwarding via SSH This part assumes you installed NetBSD with X11 via the installer. That way, both `Xnest` and the default window manager, `ctwm` are installed. By default SSH does not allow X11 forwarding. Edit the following file on the NetBSDS server to allow X11 forwarding: vi /etc/ssh/sshd_config Add the following line (or uncomment/change it) to allow X forwarding system wide for all users: X11Forwarding yes You can also add a `Match` block to enable X11 for just one user: Match User remy X11Forwarding yes Restart the ssh server to make this new setting active: service sshd restart Test it out with the following SSH command on your client machine: ssh -Y user@netbsd.host After logging in to your NetBSD machine, start a terminal: xterm It should pop up on your client (the one you used to SSH into the NetBSD server). I'm using the `-Y` flag instead of the `-X` flag because it saves you fiddling with `xauth`. Continue on to the next section to use an actual window manager inside a window (nested X, or, a better name, `Xnest`). ### Xnest and ctwm The next section assumes you are logged in via SSH to the NetBSD server with the `-Y` flag. The manpage describes what `Xnest` is very well: > Xnest is both an X client and an X server. Xnest is a client of the real server which manages windows and graphics requests on its behalf. Xnest is a server to its own clients. Xnest manages windows and graphics requests on their behalf. To these clients, Xnest appears to be a conventional server. Start Xnest with the following options on the NetBSD machine: Xnest :1 -ac -once & - `:1`: The display which the new nested X server will use. - `-ac`: disable access control restrictions - `-once`: Terminate server after one session - ` &`: Start the default window manager `ctwm`, with our new display as an option: ctwm -display :1 This is what you should see in the `Xnest` window on your client: ![screenshot][2] I have an error when launching `xterm` (or `xcalc`) once `Xnest` is running: X Error of failed request: BadAlloc (insufficient resources for operation) Major opcode of failed request: 45 (X_OpenFont) Serial number of failed request: 12 Current serial number in output stream: 13 As stated before, when I launch `xterm` directly, it works, when in `Xnest`, it fails. Tried setting up the `xfs` (x font server) and all kinds of `xset +fp` variants to inform Xnest of fonts. The default font path has all files required and my client machine also has the same files in the same paths (the xnest manpage mentions this). Not being able to run xterm is annoying, but since I have xfce installed, I can run `xfce-terminal` or execute commands right on the SSH session shell. Do note that you do not have to use `$DISPLAY=:1`. Before starting Xnest you can query the current `DISPLAY` variable (that SSH X forwarding uses): echo $DISPLAY Output: localhost:10.0 Since we've started SSH with `-Y`, we can use `:10` as the display variable in `Xnest`, ignoring the `localhost` part: Xnest -ac -once :10 & Now you do not need to specify `-display :1` or export a new display variable in your terminal. I'm used to explicitly specifying one, which is why I do it that way in this guide. ### XFCE If you have a network connection and binary packages available, you can install XFCE, a modern desktop. It works quite well when forwarded via Xnest. This section contains a mini XFCE install guide as a bonus. Make sure you have `pkgin`, the binary package manager, installed and use `pkgin` to install `xfce` plus some dependencies: pkgin install xfce fam dbus `xfce` is a group of packages. Once all of them are installed, copy the example dbus startup script to the required location: cp /usr/pkg/share/examples/rc.d/dbus /etc/rc.d/dbus Edit `/etc/rc.conf` and add: dbus=YES Start `dbus`: service dbus start You only have to start dbus on this session, after a reboot it will be started automatically. Repeat the same for `fam` and `rpcbind`, also required for XFCE: cp /usr/pkg/share/examples/rc.d/famd /etc/rc.d/ echo rpcbind=YES >> /etc/rc.conf echo famd=YES >> /etc/rc.conf service rpcbind start service famd start Make sure you have an empty `Xnest` session started. Export the `DISPLAY` variable so XFCE knows in which X session it should run: export DISPLAY=:1 Start XFCE in that new `Xnest` session: dbus-launch /usr/pkg/bin/xfce4-session It takes a few seconds to load. The background image took a bit longer for me than the rest of the session. Here is how it should look: ![screenshot][3] Other window managers are available as well. I've tried `fluxbox` and `lumina-desktop`, the latter taking a while to compile. `windowmaker` is fun to play with as well. Here is a screenshot after installing the `windowmaker-desktop` meta-package and running `wmaker -display :1` to start: ![screenshot][6] If you're feeling really nostalgic, `CDE`, the [Common Desktop Environment][4] is also [available for NetBSD][5]. Astr0baby has a [guide to run CDE on NetBSD][7] on the Pinebook Pro. [1]: /s/articles/NetBSD_on_QEMU_Alpha.html [2]: /s/inc/img/netbsd-xnest-1.png [3]: /s/inc/img/netbsd-xnest-2.png [4]: /s/blog/The_Common_Desktop_Environment_CDE_is_still_developed_in_2021.html [5]: https://sourceforge.net/p/cdesktopenv/wiki/NetBSD/ [6]: /s/inc/img/netbsd-xnest-3.png [7]: http://web.archive.org/web/20210821210536/https://astr0baby.wordpress.com/2020/05/03/cde-common-desktop-environment-on-netbsd-ebvarm-pinebook/ [8]: /s/inc/img/netbsd-xnest-4.png --- License: All the text on this website is free as in freedom unless stated otherwise. This means you can use it in any way you want, you can copy it, change it the way you like and republish it, as long as you release the (modified) content under the same license to give others the same freedoms you've got and place my name and a link to this site with the article as source. This site uses Google Analytics for statistics and Google Adwords for advertisements. You are tracked and Google knows everything about you. Use an adblocker like ublock-origin if you don't want it. All the code on this website is licensed under the GNU GPL v3 license unless already licensed under a license which does not allows this form of licensing or if another license is stated on that page / in that software: This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Just to be clear, the information on this website is for meant for educational purposes and you use it at your own risk. I do not take responsibility if you screw something up. Use common sense, do not 'rm -rf /' as root for example. If you have any questions then do not hesitate to contact me. See https://raymii.org/s/static/About.html for details.