qubes-lite与kvm和wayland

2021-03-08 04:38:44

自2015年以来,我一直在运行Qubesos作为我的主桌面。它提供了良好的安全性,通过在不同的Xen VMS中运行应用程序。然而,它也很慢,并且有一些硬件问题。我最近一直在尝试nixos,kvm, Hayland和Spectrumos,并试图创造与更现代/兼容/更快的技术类似的东西。

qubesos旨在提供“一个合理的安全操作系统”。它通过在Xen HyperViSor中运行多个虚拟机。移居VM的Windows具有不同的颜色和标记,但它们一起显示为单个桌面。我运行的VMS包括:

桌面环境本身是另一个Linux VM(DOM0),用于管理其他VM.MOST的VMS运行Fedora(Qubes的默认值),尽管我在dev.中运行debian。还有一些系统VM;一个用于处理网络硬件,以及在VM之间提供防火墙。

您可以在VM中运行QVM副本以将文件复制到另一个VM。 dom0弹出一个对话框,询问您应该收到哪个VM的对话框,它到达〜/ qubesincoming / $ source_vm / $ file.you也可以按Ctrl-Shift-C将VM的剪贴板复制到全局剪贴板,然后按Ctrl -shift-v在目标VM的窗口中,复制到该VM的剪贴板,准备粘贴到应用程序中。

然而,它具有较差的硬件兼容性,即使在强大的机器上,它也会感到迟钝。我刚刚买了一台新机器,发现主板仅提供单个视频输出,限制为30Hz。这意味着我必须购买一个离散的显卡。使用卡已启用后,机器无法从暂停恢复,并不是不时锁定(通过删除或禁用卡完全稳定)。我花了一些时间试图了解驱动程序代码,但我不够了解驱动程序代码关于图形,Linux内核,PCI暂停,或Xen修复它。

图形性能是可怕的(特别是在4K监视器上).Qubes以安全原因禁用VM中的图形加速,但即使对于软件渲染也很慢。

它最近从时刻开始冻结几秒钟 - 当您尝试键入时烦人。

它使用LVM薄池进行VM存储,我不明白,有时需要修复(但不过)不丢失任何数据)。

DOM0是过时的,通常不可用。这是故意的(你应该使用VM),但我的安全需求并不高,能够做这些天的视频会议很高兴。能够通过USB打印并使用蓝牙将使是方便的。

无论如何,我决定是时候尝试一些新的东西.linux现在有自己的内置虚拟机管理程序(KVM),我认为这可能会用我的硬件更好地工作。我也热衷于尝试出现在周围的Hayland共享内存,我认为它可能会使用VMS更好地工作。在Linux上直接重新创建Qubes样环境将轻松解决?

我一直认为正常尝试nixos一段时间。自从我开始使用Linux以来,它的包裹管理已经让我成为荒谬。在Debian,Fedora等,安装包意味着让它放置文件,无论它能何处;有效地在系统上提供包作者根。不是一个适合沙箱的基础!

此外,它们很难尝试第三方软件,或测试仅仅是一些包的较新版本。

2003年,我创建了0install来解决这些问题,并且nix具有非常相似的目标。我以为尼克斯年龄几年,但看着它的Git历史第一个提交于2003年3月12日。我宣布的第一次预览0在两天后0install,所以两个项目必须在几天内开始编写代码彼此!

nixos由相当多的组成部分组成。这是我到目前为止学到的内容:

该商店包含所有程序的文件,并且是System的中央组件.ACK的版本在其自己的目录(或文件)中,在/nix/store/ arhash.you可以将数据添加到商店 直接,如下: 在这里,商店位置是从我们添加的文件内容的散列计算的(与0install Store添加或Git Hash-object一样)计算。 但是,您还可以通过询问NIX来运行构建脚本来为商店添加东西。例如,要编译某些源代码: 您将源代码和一些构建指令(将“派生”文件)添加到商店。 您要求商店建立派生。 它在容器沙箱中运行您的构建脚本。 使用构建指令的哈希(不是结果的散列)作为目录名称,将结果添加到商店。 如果商店中的包取决于另一个(在构建时间或运行时),则它只是指其完整路径。例如,商店中的Bash脚本将启动:

如果两个用户想要使用相同的构建指令,那么第二个用户将看到哈希已经存在,并且可以重用。这允许用户从源编译软件并共享生成的二进制文件,而无需相互信任。

理想情况下,构建应该是可重复的。要鼓励这一点,构建使用结果路径的构建指令的哈希建立在没有网络访问的沙箱中。所以,您不能提交构建作业,如“下载和编译和编译任何内容最新版本的Vim“。但是您可以自己发现最新版本,然后向商店提交两个单独的作业:

“下载vim 8.2,带有哈希xxx”(因此固定输出作业,因此具有网络访问)

您可以运行nix-collect-arterber y删除从/nix/var/nix/gcroots/.users下通过symlinks无法访问的商店中的所有内容,可以将符号链接与他们关心保留的东西/ nix / var / nix。 / gcroots / per-user / $用户/。

默认情况下,商店也配置了可信赖的二进制缓存服务,并将尝试从那里下载Build结果,而不是在可能的情况下在本地编译。

手工编写派生文件是乏味的,所以nix提供了一种轻松创建它们的模板语言.NIX语言是动态打字的,并基于地图/词典(它使其令人困惑地指的是“集”)。 nix-Instantiate File.nix将从File.nix生成派生并将其添加到商店。

编写NIX表达式对于您想要的每个包也会繁琐.NIXPKGS GIT存储库包含一个NIX表达式,该表达式评估为一组派生,一个用于分布中的每个包。它还包含用于包的有用辅助函数库(例如,它知道如何自动处理GNU AutoConf软件包)。

您使用-a询问单个包,而不是评估整个批次。例如,您可以使用nix-instantiate ./nixpkgs/default.nix -a firefox为firefox生成派生。

nix-build是一种快速的方法,可以使用nix-instantiate创建派生并用nix-store构建它。它还将创建一个./result符号链接指向它在商店中的路径,以及注册./垃圾收集器/nix/var/nix/gcroots/auto/. for示例,构建和运行firefox:

如果在不进行任何更改的情况下使用nixpkgs,则可以从缓存服务下载预先构建的二进制文件。

跟踪所有这些符号链接也会乏味,但是您可以通过制作依赖于所需每个应用程序的包来收集它们.its构建脚本将为应用程序提供一个充满符号链接的Bin目录。然后,您可以点您在商店中的该bin目录的$ path变量。

要更新更新,您将实际将添加〜/ .nix-profile / bin / to $ path andupdate .nix-profile以指向环境包的最新构建。

这基本上是nix-env的形式,除了允许在多个配置文件之间进行开关的更多符号链接,并允许回滚到先前的环境中,如果出现问题。

最后,就像NIX-ENV可以用BIN,MAN等创建用户环境一样,类似的进程可以为Linux发行版创建根文件系统。

nixos-Rebuild读取/etc/nixos/configuration.nix配置文件,生成系统环境,然后更新GRUB和/运行/运行/当前系统Symlink以指向它。

实际上,它还列出了GRUB文件中的先前版本的系统环境,SOIF您删除了配置,您可以从BootMenu中选择早期的一个,以返回该版本。

要安装nixos,可以在https://nixos.org上启动其中一个实时映像://nixos.org。您仅使用只影响安装UI,而不是您最终的系统。

手册浏览了安装过程,展示了如何分区磁盘,格式化和装入分区,以及如何编辑配置文件。我喜欢这种安装方式,在那里它教你而不是为你做的事情而不是这样做。切换到新系统的努力正在学习它,因此我将在安装指南之后ratherspend 3小时学习内容,而不是使用15分complingle-click安装程序,单击一切。

配置文件(/etc/nixos/configuration.nix)只是另一个NIX表达式。 sound.Enable = true,如果您还想使用pulseaudio,那么您将setware.pulseaudio.enable = true。

nixos支持的每个系统服务都是从这里控制的,使用各种选项,来自program.vim.defaulteditor = true(因此您没有被捕获在nano中)到services.factorio.autosave-internal.use man configuration.nix要查看可用的设置。

nixos默认为x11桌面,但我想尝试wayland(和摇摆)。基于Nixos Wiki的说明,我使用了这个:

Program.Sway = {Enable = True; wrapperfeatures.gtk = true; #以便GTK正常工作extrasessionCommands ="出口Moz_enable_wayland = 1&#34 ;; uppropackages = pkgs; [Swaylock Swayidle Xwayland WL-Clipboard Mako Alacritty Dmenu]; };

Xwayland位很重要;如果没有,则无法运行任何X11应用程序。

我唯一的抱怨与nixos安装说明的抱怨是,追随它们会给您带来一个未加密的系统,这不是非常有用的。分区时,您必须跳过手册的LUKS部分,这只是提供一些选项但没有公司建议。我创建了两个主要分区:1G未加密/引导,以及磁盘其余部分的LUKS分区。然后我从/ dev / mapper / crypted设备创建了一个lvm卷组,并添加了另一个分区。

安装分区并完成配置文件后,nixos-install下载所有内容并配置Grub.then您重新启动到新系统。

运行新系统后,可以以相同的方式进一步编辑到配置文件,并使用nixos-Rebuild交换机生成新系统。似乎非常擅长将运行系统更新到新设置,所以您通常不需要重新启动更改。

我制作的大错误是忘记向FSTAB添加/引导。当我ran r r rebuild时,它将所有grub配置放在加密分区上,渲染系统vootable.i用chattr + i / boot在卸载分区上启动。这样,试图重建/启动卸载将仅提供错误消息。

我现在一直在使用这个系统,我没有尼克斯的问题,到目前为止.Nix一直很快,可靠,并且我想要的一切都有相当最新的套餐(我正在使用稳定的释放)。学习很多,但很多文件。

当我想要一个较新的套餐(Socat与VSOCK支持,只刚刚发布)我刚刚告诉NIX从Debian和类似系统上的NixPkgs.unlike的最新Git结账时安装它,这样做不会干扰任何其他软件包(这样迫使系统范围内的LIBC升级)。

我认为nix确实比大多数其他系统都多数据下载更多的数据,但是现在似乎不足以够快。如图所示,让我们说你正在运行python 3.9.0,你想更新到3.9.1:

使用Debian:Apt-Get升级下载新版本,即未包装的旧版本。这些文件未包装,系统通过令人兴奋的中级状态移动,没有人思考.Running程序可能会崩溃他们的库版本在它们下面更改(虽然它通常是可以的).Only root可以更新软件。

使用0INSTALL:0INSTALL更新下载新版本,将其解压缩到新的目录.Running程序继续使用旧版本。当启动新程序时,0install注意到更新并再次运行求解器。如果程序兼容。新的python然后它使用它。如果没有,它会继续使用旧的。如果出现问题,您可以运行任何以前的版本。

使用nix:nix-env -u下载新版本,将其解压缩到新目录。它也根据python下载(或重建)每个包,根据python为每个包创建新目录。然后,为每个包创建新目录。然后,将创建一个具有符号链接的新环境最新版本的一切.Running程序继续使用旧版本。启动新程序将使用新版本。如果存在问题,您可以将整个环境还原回上一个版本。

使用Docker:Docker Pull下载单个应用程序的新版本,下载大多数或所有应用程序的软件包,无论Python相关或否.Existing Container继续使用旧版本运行.New容器将默认使用新版本。您可以指定启动程序时使用的版本。其他应用程序继续使用旧版本的Python,直到他们的作者更新它们(必须单独更新每个应用程序,而不是仅更新Python本身)。

nixos的主要问题是它与其他Linux系统有很大差异,因此有很多才能relearn.also,关于如何编辑Fstab,sudoers等的现有知识并不是如此有用,因为您必须提供所有配置nix syntax.并且具有单个(相当明智)语法的一切都是一个很好的奖金,并且能够使用模板语言生成东西很有用。对于我的网络设置,我使用一堆点击设备(一个用于我的每个虚拟机)。很容易编写一个小nix函数(mktap)来生成它们从一个简单的列表中生成它们。那个我的configuration.nix:

网络= {medmerhcp = false; interfaces =让mktap = IP:{Virtual = True; Virtualowner =" tal&#34 ;; ipv4.addresses = [{address = IP; prefixlength = 31; }]; };在{eno2.usedhcp = true; wlo1.usedhcp = true; tapdev = mktap" 10.0.0.2&#34 ;; Tapcom = MKTAP" 10.0.0.4&#34 ;; tapshopping = mktap" 10.0.0.6&#34 ;; TapBanking = MKTAP" 10.0.0.8&#34 ;; tapuntrusted = mktap" 10.0.0.10&#34 ;; }; nat = {enable = true; OferyInterface =" eno2&#34 ;;内幕= [" 10.0.0.0/8" ]; }; };

使用nixos,我有一个很好的主机环境,但在使用QUBES后,我想在VM中运行我的应用程序。

基本问题是Linux是唯一知道如何驱动所有硬件的东西,但Linux安全性并不理想。有几个问题:

Linux是用C的编写的。这使得安全性错误相当普通,更重要的意味着CodeCan的一部分中的错误会影响代码的任何其他部分。除非一切都安全,否则没有什么安全。

Linux(UNIX)设计预测Internet,并且之后的安全性已经有所突出。

例如,想象一下,我们想要运行一个程序可以访问网络,但不是图形显示。我们可以使用bubblewrap为它创建新的Linux容器,如下所示:

$ ls -l / run / muser / 1000 / wayland-0 /tmp/.x11-unix/x0 srwxr-xr-x 1 talus用户0 2月0 2月18日16:41 / run / user / 1000 / wayland-0 srwxr-xr -x 1 Tal用户0月18日16:41 /tmp/.x11-unix/x0 $ bwrap \ --ro-bind / \ --dev / dev \ --tmpfs / home / tal \ --tmpfs / run / user \ --tmpfs / tmp \ - share-glal --share-net \ bash $ ls -l /运行/用户/ 1000 / wayland-0 /tmp/.x11-unix/x0 ls:无法访问&# 39; /运行/用户/ 1000 / Wayland-0'没有这样的文件或目录ls:无法访问' /tmp/.x11-unix/x0' ;:没有这样的文件或目录

容器有一个空的主目录,空/ tmp,无法访问显示套接字。如果我们在这个环境中运行Firefox,那么...它打开它的窗口就好了!如何? strace显示发生了什么:

connect(4,{sa_family = af_unix,sun_path =" /运行/用户/ 1000 / wayland-0"},27)= -1 enoent(没有这样的文件或目录)套接字(af_unix,sock_stream | sock_cloexec ,0)= 4 connect(4,{sa_family = af_unix,sun_path = @" /tmp/.x11-unix/x0"},20)= 0

未能连接到Hayland后,它会尝试使用X11(通过Xwayland)。为什么这是工作?如果套接字路径名的第一个字节是\ 0那么Linux就会将其解释为“抽象”套接字地址,而不遵守通常的文件系统权限规则。

试图预测这些特殊情况只是太多的工作。inlinux真的想要一切默认情况下,你必须单独找到并禁用每个功能.by对比度,虚拟机往往将默认情况下与主机的集成。还倾向于具有更小的API(例如,只是读写磁盘块或网络帧),并完全在VM内部的Rich UNIX API,由Linux的单独提供。

我能够设置一个qemu guest虚拟机并恢复我的dev qubes vm,但它并没有与桌面的其余部分集成。安装ssh允许我使用ssh -y dev连接,允许在VM中的应用程序打开主机上的X连接到Xwayland。这有点可用,但仍比QUBES仍然有点慢(这已经太慢了)。

在寻找一种方式直接转发Wayland连接,我遇到了Spectrumos Project.SpectRumos旨在使用每个应用程序的一个虚拟机,使用共享目录,以便VM文件存储在主机上,简化管理。使用来自Chricium的Crosvm项目而不是Qemu,因为它有一个允许转发Wayland连接的驱动程序(以及它也是因为它以RUDR而不是C)。项目的单一开发人员目前正在从项目中休息,并说“我目前正在努力工作概念证明“。

但是,Spectrumos存储库中存在一些有用的东西(这是nixpkgs的叉子)。在特定地,它包含:

带有Virtwl内核模块的Linux版本,它连接到Crosvm的Hayland驱动程序。

构建的,我能够运行项目的演示,它在VM内部运行Wayfire Concoritor,它出现在主机上的窗口中.Dragging嵌套窗口周围,在Qubesos上的像素的方式中,像素在我的屏幕上平滑地流动。别。

这是令人鼓舞的,但我不想运行一位嵌套的窗口经理。我尝试直接运行Firefox(没有Wayfire),但它抱怨侍酒师没有提供一个新版本的东西,andrunning Weston-terminal立即SegFaulted Sommelier 。

为什么我们需要侍酒师进程?问题是,虽然Virtwl主要是直接代理Hayland邮件,但它无法将任意fds发送到主机。例如,如果要从应用程序将可写流转发给Virtwlyou必须首先使用特殊的Virtwl IOCTL从主机中创建管道,然后从中读取并将数据复制到应用程序的常规Linux管道。

我启用了Virtio_FS,允许我将主机目录安装到VM中(用于共享文件)。

将ext4添加到内核图像允许我挂载VM的LVM分区。

设置fontconfig_file格式有一些可用的字体(否则,终端没有单座态字体)。

我跑了(虽然真实; do socat vsock-listen:5000 exec:dash; do done)在VM的引导脚本的末尾。我可以明星 ......