{"id":20209805,"url":"https://github.com/rosineygp/symbiosos","last_synced_at":"2026-02-08T19:35:29.140Z","repository":{"id":44372940,"uuid":"373460289","full_name":"rosineygp/symbiosOS","owner":"rosineygp","description":"Share x11, camera and pulseaudio over LXC/LXD containers.","archived":false,"fork":false,"pushed_at":"2021-06-06T19:29:29.000Z","size":598,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-19T20:28:03.041Z","etag":null,"topics":["camera","containers","lxc","lxd","pulseaudio","x11"],"latest_commit_sha":null,"homepage":"https://rosineygp.github.io/symbiosOS","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rosineygp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-06-03T09:58:03.000Z","updated_at":"2024-10-29T18:37:09.000Z","dependencies_parsed_at":"2022-07-12T18:20:00.610Z","dependency_job_id":null,"html_url":"https://github.com/rosineygp/symbiosOS","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rosineygp/symbiosOS","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosineygp%2FsymbiosOS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosineygp%2FsymbiosOS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosineygp%2FsymbiosOS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosineygp%2FsymbiosOS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rosineygp","download_url":"https://codeload.github.com/rosineygp/symbiosOS/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosineygp%2FsymbiosOS/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29240704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-08T18:06:38.086Z","status":"ssl_error","status_checked_at":"2026-02-08T18:06:09.124Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["camera","containers","lxc","lxd","pulseaudio","x11"],"created_at":"2024-11-14T05:42:46.167Z","updated_at":"2026-02-08T19:35:29.123Z","avatar_url":"https://github.com/rosineygp.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca alt=\"lines\" href=\"https://rosineygp.github.io/symbiosOS\"\u003e\n    \u003cimg src=\"assets/logo-bg.png\"/\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n# symbiosⵀS \u003c!-- omit in toc --\u003e\n\n\u003e Symbiosis Operational System\n\nShare x11, camera and pulseaudio over LXC/LXD containers.\n\n**main features**\n\n- near native graphics acceleration\n- nice audio quality\n- user profile isolation\n- fast startup\n- instances can use the same hardware resources (GPU, camera... etc)\n- low resources usage\n\n**reason**\n\n- isolate personal and work accounts\n- fast switch between accounts (one per workspace)\n- performance for video conference\n- multiple VPN connections\n\n**demo video**\n\n[![symbiosOS](https://img.youtube.com/vi/KKnftBApdJQ/3.jpg)](https://youtu.be/KKnftBApdJQ)\n\n# Table of contents \u003c!-- omit in toc --\u003e\n\n- [Host configuration](#host-configuration)\n  - [Install dependencies](#install-dependencies)\n  - [Configure pulseaudio server](#configure-pulseaudio-server)\n- [Profile](#profile)\n  - [Create blank profile](#create-blank-profile)\n  - [Edit x11 profile](#edit-x11-profile)\n    - [Nvidia GPU](#nvidia-gpu)\n    - [Intel iGPU](#intel-igpu)\n  - [Profile advices](#profile-advices)\n- [Guest configuration](#guest-configuration)\n  - [Deploy a new guest](#deploy-a-new-guest)\n  - [Guest login](#guest-login)\n  - [Checking guest](#checking-guest)\n    - [Video GLX](#video-glx)\n    - [Pulseaudio](#pulseaudio)\n    - [Camera](#camera)\n- [Symbiosis OS Launcher](#symbiosis-os-launcher)\n  - [Install](#install)\n  - [Usage](#usage)\n- [Terminal Launcher](#terminal-launcher)\n  - [Install](#install-1)\n  - [Usage](#usage-1)\n\n## Host configuration\n\n### Install dependencies\n\nhttps://linuxcontainers.org/lxd/getting-started-cli/#installation\n\n### Configure pulseaudio server\n\nAppend following line at `/etc/pulse/default.pa` and enable tcp module for pulseaudio\n\n```txt\nload-module module-native-protocol-tcp auth-ip-acl=127.0.0.1\n```\n\nStop pulseaudio server\n\n```shell\npulseaudio -k\n```\n\n\u003e Mapping driver using `unix://` is flickering\n\n## Profile\n\n### Create blank profile\n\n```shell\nlxc profile create x11\n```\n\n### Edit x11 profile\n\n```shell\nlxc profile edit x11\n```\n\nPaste the following `yaml`\n\n#### Nvidia GPU\n\n```yaml\nconfig:\n  environment.DISPLAY: :0\n  environment.PULSE_SERVER: tcp:127.0.0.1:4713\n  nvidia.driver.capabilities: all\n  nvidia.runtime: \"true\"\n  user.user-data: |\n    #cloud-config\n    runcmd:\n      - 'sed -i \"s/; enable-shm = yes/enable-shm = no/g\" /etc/pulse/client.conf'\n      - 'echo export PULSE_SERVER=tcp:127.0.0.1:4713 | tee --append /home/ubuntu/.profile'\n    packages:\n      - x11-apps\n      - mesa-utils\n      - pulseaudio\n      - v4l-utils\ndescription: GUI LXD profile\ndevices:\n  PASocket:\n    bind: container\n    connect: tcp:127.0.0.1:4713\n    listen: tcp:127.0.0.1:4713\n    type: proxy\n  X0:\n    bind: container\n    connect: unix:@/tmp/.X11-unix/X1\n    listen: unix:@/tmp/.X11-unix/X0\n    security.gid: \"1000\"\n    security.uid: \"1000\"\n    type: proxy\n  mygpu:\n    type: gpu\n  video0:\n    gid: \"1000\"\n    path: /dev/video0\n    type: unix-char\nname: x11\nused_by: []\n```\n\n#### Intel iGPU\n\n```yaml\nconfig:\n  environment.DISPLAY: :1\n  environment.PULSE_SERVER: tcp:127.0.0.1:4713\n  raw.idmap: both 1000 1000\n  user.user-data: |\n    #cloud-config\n    runcmd:\n      - 'sed -i \"s/; enable-shm = yes/enable-shm = no/g\" /etc/pulse/client.conf'\n      - 'echo export PULSE_SERVER=tcp:127.0.0.1:4713 | tee --append /home/ubuntu/.profile'\n    packages:\n      - x11-apps\n      - mesa-utils\n      - pulseaudio\n      - v4l-utils\ndescription: GUI LXD profile\ndevices:\n  PASocket:\n    bind: container\n    connect: tcp:127.0.0.1:4713\n    listen: tcp:127.0.0.1:4713\n    type: proxy\n  X1:\n    bind: container\n    connect: unix:@/tmp/.X11-unix/X1\n    listen: unix:@/tmp/.X11-unix/X1\n    security.gid: \"1000\"\n    security.uid: \"1000\"\n    type: proxy\n  mygpu:\n    gid: \"1000\"\n    type: gpu\n  video0:\n    gid: \"1000\"\n    path: /dev/video1\n    type: unix-char\nname: x11\nused_by: []\n```\n\n### Profile advices\n\n- device `video0` is optional\n- pay attention about `uid` and `gid`, it will change as you current user\n- `cloud-config` should not work, it depends of distributution support\n- check your current `$DISPLAY` and change if `/tmp/.X11-unix/X1` not work\n\n## Guest configuration\n\n### Deploy a new guest\n\n```shell\nlxc launch --profile default --profile x11 ubuntu:20.04 guest01\n```\n\n### Guest login\n\n```shell\nlxc exec guest01 -- sudo --user ubuntu --login\n```\n\n\u003cpre\u003e\nTo run a command as administrator (user \"root\"), use \"sudo \u003ccommand\u003e\".\nSee \"man sudo_root\" for details.\n\nubuntu@guest01:~$\n\u003c/pre\u003e\n\nIf you want distinguished colors for different guests `gnome-terminal`.\n\nhttps://mayccoll.github.io/Gogh/\n\n```shell\ngnome-terminal --profile=\"Jackie Brown\" -- bash -c \"lxc exec guest01 -- sudo --user ubuntu --login\"\n```\n\n**OR** use [Symbiosis OS Launcher](#symbiosis-os-launcher)\n\n### Checking guest\n\n#### Video GLX\n\n```shell\nglxinfo -B\n```\n\u003cpre\u003e\ndirect rendering: Yes\nMemory info (GL_NVX_gpu_memory_info):\n    Dedicated video memory: 6144 MB\n    Total available memory: 6144 MB\n    Currently available dedicated video memory: 5228 MB\nOpenGL vendor string: NVIDIA Corporation\nOpenGL renderer string: GeForce GTX 1060 6GB/PCIe/SSE2\nOpenGL core profile version string: 4.6.0 NVIDIA 450.119.03\nOpenGL core profile shading language version string: 4.60 NVIDIA\nOpenGL core profile context flags: (none)\nOpenGL core profile profile mask: core profile\n\nOpenGL version string: 4.6.0 NVIDIA 450.119.03\nOpenGL shading language version string: 4.60 NVIDIA\nOpenGL context flags: (none)\nOpenGL profile mask: (none)\n\nOpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 450.119.03\nOpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20\n\u003c/pre\u003e\n\n#### Pulseaudio\n\n```shell\npactl info\n```\n\n\u003cpre\u003e\nServer String: tcp:127.0.0.1:4713\nLibrary Protocol Version: 33\nServer Protocol Version: 33\nIs Local: no\nClient Index: 14\nTile Size: 65472\nUser Name: rosiney\nHost Name: desk\nServer Name: pulseaudio\nServer Version: 13.99.1\nDefault Sample Specification: s16le 2ch 44100Hz\nDefault Channel Map: front-left,front-right\nDefault Sink: alsa_output.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.analog-stereo\nDefault Source: alsa_input.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.mono-fallback\nCookie: 9537:bf95\n\u003c/pre\u003e\n\n#### Camera\n\n```shell\nv4l2-ctl --list-devices\n```\n\n\u003cpre\u003e\nIriun Webcam (platform:v4l2loopback-000):\n        /dev/video0\n\u003c/pre\u003e\n\n\u003e Sometimes the commands above not working because the `cloud-config` steps not finished, if commands not working try to install manually `x11-apps mesa-utils pulseaudio v4l-utils`\n\n## Symbiosis OS Launcher\n\n### Install\n\nOpen LXC ubuntu guests instances using `gnome-terminal`\n\n```shell\nmkdir -p ~/.local/bin/\n\ncat \u003c\u003c 'EOF' \u003e ~/.local/bin/sos\n#!/bin/bash\n\nCONTAINER=\"$1\"\nPROFILE=\"$2\"\n\nif [[ \"$CONTAINER\" == \"\" ]]; then\n    lxc list\n    exit 0\nfi\n\nread -ra status \u003c\u003c\u003c \"$(lxc info \"$CONTAINER\" | grep 'Status:')\"\n\nif [[ \"${status[0]}\" == \"\" ]]; then\n    exit 1\nelif [[ \"${status[1]}\" != \"Running\" ]]; then\n    lxc start \"$CONTAINER\"\nfi\n\nif [[ \"$PROFILE\" != \"\" ]]; then\n    gnome-terminal --profile=\"$PROFILE\" -- bash -c \"lxc exec $CONTAINER -- sudo --user ubuntu --login\"\nelse\n    gnome-terminal -- bash -c \"lxc exec $CONTAINER -- sudo --user ubuntu --login\"\nfi\n\nEOF\n\nchmod +x ~/.local/bin/sos\n```\n\n### Usage\n\n\u003cpre\u003e\nsos                  # list all containers (lxc list)\nsos \u0026lt;name\u0026gt;           # start and login at ubuntu container\nsos \u0026lt;name\u0026gt; \u0026lt;profile\u0026gt; # start and login at ubuntu container using gnome-terminal profile\n\u003c/pre\u003e\n\n## Terminal Launcher\n\nJust a small script to call GUI apps without lock terminal or print output\n\n### Install\n\n```shell\nmkdir -p ~/.local/bin/\n\ncat \u003c\u003c 'EOF' \u003e ~/.local/bin/tl\n#!/bin/bash\nnohup \"$@\" \u0026\u003e/dev/null \u0026 disown %%\nEOF\n\nchmod +x ~/.local/bin/tl\n```\n\nConfigure autocomplete for `tl`\n\n```shell\ncat \u003c\u003c 'EOF' \u003e\u003e ~/.bashrc\n\n_tl_completions() {\n  COMPREPLY=($(compgen -c \"${COMP_WORDS[1]}\"))\n}\n\ncomplete -F _tl_completions tl\n\nEOF\n```\n\n### Usage\n\n```shell\ntl google-chrome\n```\n\n\u003e needs to logout/login to reload profile\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frosineygp%2Fsymbiosos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frosineygp%2Fsymbiosos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frosineygp%2Fsymbiosos/lists"}