[Share Experiences] 在deepin上使用容器扩展生态(支持图形软件甚至桌面环境)
Tofloor
poster avatar
shy
deepin
2023-01-07 06:36
Author

不多bb先上图

桌面模式:(没有装截图软件手机比较糊,此时运行的是容器内完整的kde,但是从内核能看出主系统是deepin)

fa9e247df3871e75bd0fc4ab9a75b37.jpg

GUI应用模式(在deepin的dde桌面基础上运行容器内GUI应用)

Screenshot_select-area_20230106221019.png

命令行模式(在深度终端下运行终端软件)

截图_deepin-terminal_20230106221806.png

准备工作:任意容器(理论上chroot proot lxc docker systemd-nspawn等都可以,仅测试chroot和systemd-nspawn)

容器可以使用https://gitee.com/mo2/linux配置,教程可以参考b站上使用termux运行linux的教程这里不过多解释https://www.bilibili.com/video/BV1qb4y1C7n5/?spm_id_from=333.337.search-card.all.click&vd_source=134460b1ba660b6c9125951a345687ff

命令行软件:配置好容器后就可以用

GUI软件:

1.在容器内安装任意桌面

2.在容器外(再开一个深度终端)运行xhost +(注意,每次运行图形化程序前都需要这么做)

3.在容器内运行export DISPLAY=:0(可以使用tmoe的脚本或手动设置全局变量,否则每次都需要运行一次)

4.在容器内用命令运行你要运行的软件,大功告成

桌面:

两种方案

一.安装任意桌面后用vnc链接

二.直接连接到显示器(本地的x11服务)

1.在容器内安装任意桌面

2.在容器外(再开一个深度终端)运行xhost +(注意,每次运行桌面环境前都需要这么做)

3.主系统注销

4.Ctrl+F2进入tty2,输入用户名,回车,输入密码登录

5.在tty2下kill掉lightdm的进程(我使用的是htop,可以sudo apt install htop安装,

sudo htop然后找到/usr/sbin/lightdm,F9回车kill掉,F10退出)

6.tty2下运行sudo Xorg

7.Ctrl+F3进入tty3并像tty2一样登录

8.命令行运行容器(我是用的tmoe脚本,直接输入tmoe进入,tty不支持中文盲操作进入容器)

9.容器内运行export DISPLAY=:0(可以使用tmoe的脚本或手动设置全局变量,否则每次都需要运行一次)】

10.容器内运行桌面(如kde是startplasma-x11)

11Ctrl+F1,不出意外容器的桌面就开始加载了!

tips:桌面模式下退出容器桌面的方法:

1.Ctrl+F3进入tty3,此时应该是在运行容器,一路exit以退出容器

2.reboot重启(不要使用容器桌面本身的重启,也不要在容器内reboot)

Reply Favorite View the author
All Replies
shy
deepin
2023-01-07 06:49
#1

问:为什么不在本机直接运行软件或桌面环境?

答:一方面deepin软件源较老,很多新软件不支持或兼容性差,需要手动编译甚至无法运行

另一方面可以有效隔离软件,有风险的软件可以使用容器运行

问:为什么不用虚拟机

答:相较于虚拟机,容器的性能更好,几乎没有性能损耗,事实上有了容器你几乎没有理由在linux上虚拟机运行另一个linux

问:flatpak等容器化的软件包管理器与这个有什么区别?

答:相较于容器化包管理器,此方案占用磁盘空间更大,且初次配置较为复杂,但是也更有"折腾"的空间,比如跑桌面环境,且能控制软件版本(要用高版本软件就用arch,debian testing等,反之就用ubuntu lts),而且无需包管理器的学习成本,只要容器内是debian系的系统你依然可以快乐apt

Reply View the author
shy
deepin
2023-01-07 06:53
#2

补充:你可以将home目录挂载进容器里(tmoe脚本可实现)

这样就可以在容器内访问容器外的文件

你甚至可以把home挂载在home上,然后容器内新建一个和主系统用户名一样的用户,这样当你用一些软件时(比如bash fish zsh等shell,dde的桌面特效设置),软件可以自动读取并运用主系统的配置

Reply View the author
pzm9012
Moderator
2023-01-07 07:05
#3

感谢分享

Reply View the author
神末shenmo
Moderator
Spark-App
2023-01-07 07:50
#4

感觉有点像distrobox

Reply View the author
jjcui8595
Moderator
2023-01-07 14:58
#5

like

Reply View the author
希声
deepin
2023-01-07 18:22
#6

楼主真赞,我也是正在搞这一套方案,但我是想借助distrobox的开源项目来实现楼主的想法。

但是,因为 deepin v20 基于debian 10,仓库没有podman,再加上网络原因(你懂的),导致安装比较麻烦,但是我年底项目忙,没时间搞,就只能等到过年再把这套方案搞定了。

谢谢楼主这篇帖子,不知道 distrobox 实现是不是与楼主类似,总之看到大概的原理也对理解 容器 下的gui运行实现也有帮助,等我把dde+distrobox+arch容器+透明kx上网,搞定后我会把整个过程在论坛发布,期待更多的开发者能使用这套方案,这样大家能互相交流,更好的解决遇到的问题。

arch 解决依赖问题的方案比较简单直接,但是滚动发布,生产还是不敢用。nixos也是解决依赖的另外一种方案,但是复杂度比较高,放弃。我觉得distrobox 应该算是目前更好的解决方案,但是不适合普通用户,对开发者算是最好的方案了。

Reply View the author
shy
deepin
2023-01-07 21:33
#7
希声

楼主真赞,我也是正在搞这一套方案,但我是想借助distrobox的开源项目来实现楼主的想法。

但是,因为 deepin v20 基于debian 10,仓库没有podman,再加上网络原因(你懂的),导致安装比较麻烦,但是我年底项目忙,没时间搞,就只能等到过年再把这套方案搞定了。

谢谢楼主这篇帖子,不知道 distrobox 实现是不是与楼主类似,总之看到大概的原理也对理解 容器 下的gui运行实现也有帮助,等我把dde+distrobox+arch容器+透明kx上网,搞定后我会把整个过程在论坛发布,期待更多的开发者能使用这套方案,这样大家能互相交流,更好的解决遇到的问题。

arch 解决依赖问题的方案比较简单直接,但是滚动发布,生产还是不敢用。nixos也是解决依赖的另外一种方案,但是复杂度比较高,放弃。我觉得distrobox 应该算是目前更好的解决方案,但是不适合普通用户,对开发者算是最好的方案了。

distrobox那个项目我记得可以用docker作为后端的,deepin源里有,docker镜像也有国内镜像站(不过我不是很会用docker233)

跑应用原理应该是近似的,没用distrobox主要是考虑到tmoe这个脚本对新手较为友好,有一个伪GUI界面

不过更建议systemd-nspawn,这个支持容器内使用systemd服务,退出容器方法是Ctrl+3次”】”

Reply View the author
希声
deepin
2023-01-08 05:05
#8

distrobox那个项目我记得可以用docker作为后端的,deepin源里有,docker镜像也有国内镜像站(不过我不是很会用docker233)

跑应用原理应该是近似的,没用distrobox主要是考虑到tmoe这个脚本对新手较为友好,有一个伪GUI界面

不过更建议systemd-nspawn,这个支持容器内使用systemd服务,退出容器方法是Ctrl+3次”】”

是支持docker,但是docker 需要 daemon 进程,资源耗费大一些,另外podman的rootless 容器支持更完善。distrobox更推荐podman

虽然作为开发者对docker比较熟悉,但是跑gui这方面还是没涉及过,回头参考楼主的帖子研究一下like

你说的systemd-nspawn 我回头也研究一下。。。

总之dde+容器的方案,我个人觉得非常好,完整的解决了美观桌面+新版应用的需求

Reply View the author
shy
deepin
2023-01-08 19:10
#9
希声

distrobox那个项目我记得可以用docker作为后端的,deepin源里有,docker镜像也有国内镜像站(不过我不是很会用docker233)

跑应用原理应该是近似的,没用distrobox主要是考虑到tmoe这个脚本对新手较为友好,有一个伪GUI界面

不过更建议systemd-nspawn,这个支持容器内使用systemd服务,退出容器方法是Ctrl+3次”】”

是支持docker,但是docker 需要 daemon 进程,资源耗费大一些,另外podman的rootless 容器支持更完善。distrobox更推荐podman

虽然作为开发者对docker比较熟悉,但是跑gui这方面还是没涉及过,回头参考楼主的帖子研究一下like

你说的systemd-nspawn 我回头也研究一下。。。

总之dde+容器的方案,我个人觉得非常好,完整的解决了美观桌面+新版应用的需求

又研究了一下,xorg是可以同时开启多个的

这意味者完全可以在dde正常运行的情况下切换到tty2

运行sudo xorg :5(这个数字理论上不是0就行)

再开启一个xorg

然后在其他tty或者回到dde开启终端,进入容器设置display变量(和前面xorg的数字相同即可),运行桌面

这个样子效果就是tty1的dde正常运行,然后进入tty3就是容器的桌面(也可能不是tty3,总之xorg会选择没有使用的数字最小的tty)

Reply View the author