Pop!_OS 工作环境搭建

Pop!_OS,又称 pop_os,昵称 poop os。

Pop!_OS,又称 pop_os,昵称 poop os。

一个 Ubuntu 的衍生版,干掉了 snapd,有更好用的桌面体验。

背景

这次的折腾起因在于公司开发需求。一来需要做SGX开发,二来我自己想玩玩libraryOS/unikernel,所以开始搭建环境。

先说一下开始之前的环境状态,有一个 1t 的 nvme 固态和一个1t的硬盘,都是GPT分区。Windows 10 系统安装在固态里面,有四个分区:efi、msr、os、oem,工作文件装在硬盘里面,有三个分区。

最终要把 pop_os 安装到固态里面,win10 转移到硬盘里面,使用虚拟机启动 win10 硬盘。win10 里面一堆的工作程序,重新装太麻烦了。

win10 里面启用了BitLocker(公司规定),启用了hyper-v用来搭建win server pxe 环境,安装了vmware用来模拟中标麒麟银河麒麟的客户环境。

pop_os 安装

这个看似最简单的步骤也花了两个多小时。这次的主角是 pop_os 21.10 beta2

首先需要将固态中的系统迁移到硬盘中去,腾出空间。操作很简单,用DiskGenuis从硬盘前部分切出一块儿空间就行,系统相关的分区总共占用了 160G 左右,所以 800G 的 D 盘,切 256G 出来;同盘内拷贝,又有很多空间占用,花了半个小时完成。

然后是系统迁移,因为要操作系统盘,为了出事之后能找回数据,先把BitLocker临时关掉,同时做安装盘,拿balenaEtcher写入到 u 盘里面。为了减少后面迁移的数据量,卸载点软件,把vmware卸载了,同时PrimoCache也卸了(买的正版,根据主板id认证,因为要进虚拟机,所以要重新认证,加速意义也不大了)。

这里出了第一个情况,balena的验证十分慢,再加上BitLocker解密也会消耗大量磁盘 io,导致了我以为卡 io 了,想着应该没多大几率 pop_os 安装盘出事,就点了balena的skip。又等了半个小时终于BitLocker解密完成。

重启进入DiskGeniuspe,迁移系统;跨盘迁移,io 比较快,不过也因为数据量大,也花了半个小时。为DiskGenius点赞,这软件维护磁盘是真好用,有空了去买个正版u盾。

系统迁移完,进入 bios,关闭 secure boot ,关闭硬盘,插入u盘,重启进入u盘启动,一气呵成。

然后就出事了,pop_os 引导阶段,好几个服务启动不起来,怀疑是自己启动盘没做好,重启进入缓慢的硬盘的 win10,重新制作安装盘,耐着性子等它验证完成。制作完毕,重新引导,一样的结果,看来是 pop_os 的引导盘内核和机器的兼容问题。

换个思路,进 win10,用vmware挂载物理磁盘来安装就行了。

进 win10,把刚刚卸载掉的vmware给装上,耐着性子等vmware装完,重启电脑,在vmware里面安装 pop_os 到固态硬盘,装着倒挺快,安装中途发现 mbr 分区bios模式,于是停止安装,vmware里面设置为uefi模式,重新安装。

进入安装环境之后,去把镜像改成国内的,加快安装过程的下载速度。

折腾了两个多小时,终于安装成功。

重启进入bios,关闭硬盘的uefi引导项,保存,从pop_os启动,修改源为国内镜像。

虚拟机安装

先安装宿主机环境,apt一把梭。

sudo apt install virt-manager qemu -y

挂载物理磁盘

然后virt-manager里面创建虚拟机,添加物理磁盘,使用/dev/sda失败,最后搜到需要使用/dev/disk/by-id/blablab的路径方式添加。

uefi启动

启动失败,想起来原本是uefi,默认创建的虚拟机是bios,去搜索qemu uefi,搜到可以在创建完虚拟机之后再启用编辑,就可以把bios设置切换为uefi,随便添加哪个ovmf的 fd,这里有个坑,ovmf.ms.fd并不代表microsoft,目前仅仅是到到常规ovmf.fd符号链接,ovmf.secboot.fd是用来做secure boot开发测试用的,需要自己制作公私钥,并不能是微软的secure boot。所以常规的ovmf.fd就够了。

无限自动修复

切换uefi之后,启动。没蓝屏,但是无限进入preparing automatic repairing画面,然后进入启动失败选择其他方式启动界面。

初步判断是驱动问题,搜了一圈,找到foderavirt-io驱动包 iso,挂载之后,在启动失败界面选择命令行模式,切换到光驱目录后,drvload装载virstor相关的驱动,退出,启动。还是无限进入这个界面。

再盲猜是嵌套虚拟化问题,启动失败界面选择安全模式进入 win10,关闭hyper-v,同时bcdedit关闭hypervisor

bcdedit /set hypervisorlaunchtype off

重启,成功进入 win10。qemu默认网络为nat,办公的时候有远程桌面接入需求,必须直接暴露在办公网。

桥接

virt-manager死活都没法添加bridge类型,明明别人的教程里面都是两步创面网络,我这儿直接一步到位。

改换思路,直接nm-connection-editor添加,nmtui界面添加,虚拟机里面连上之后都没网络。

无奈之下,改成桥接到mac tap,暴露在办公网,但是hostguest之间没法互通。但是周末远程接入,是够用了。

周六用家里的 pop_os 做实验,发现用nmcli创建,然后将网桥启用,也就是up一下就行……感谢u2b上大佬的视频

sudo nmcli conn show --active
sudo nmcli conn add type bridge con-name br0 ifname br0
sudo nmcli conn add type ethernet slave-type bridge con-name bridge-br0 ifname ens0 master br0
sudo nmcli conn up br0

然后把虚拟机的网卡桥接br0就行。

virt-io

想象中virt-io设备由qemu加速,应该会快些,就把所有可以的虚拟设备,都改成virt-io

然后进系统一看,设备管理器里面几个问号,网卡也没了。幸好刚刚的virt-io驱动 iso 没删,装载,点击里面的msi进行安装。成功~~

tpm

公司的安全要求中,工作盘必须加密,不想装第三方加密软件,就使用了win自带的bitlocker,然而这货要求tpm模块启用,虚拟机里面透传tpm passthrough失败,只能上软的模拟了。

根据要求按照依赖包。其中gnutls-bin决定了swtpm_cert可否编译,所以一定要全给装了,不然启动不了就很尴尬。

然后有一点很重要,--prefix=/usr,默认的安装路径是/usr/local,这会导致virt-manager内调用swtpm_setup失败。

模拟tpm安装成功后,虚拟机设置tis类型的2.0版本tpm,启动win10即可,另外启用bitlocker后一定要备份好密钥,使用微软在线账号的情况下,允许将密钥备份到账号上,通过账号找回。每个tpm模拟会将对应tpm的数据保存起来,系统崩溃会,大概率这个文件是会丢失的,所以备份的bitlocker密钥就在这时候起作用了。

远程桌面客户端

这个听取 linux 群某菜大佬的推荐,用remmina准没错。RDP & VNC都支持。

远程桌面服务端

gnome-remote-desktop,也就是 pop_os 和 ubuntu 自带的软件,是兼具VNCRDP功能的,洁癖患者不想再装。根据 g.r.d官方的教程RDP也启用。

家里的 mac 远程到家里的 pop 。mac 自带 VNC能控制鼠标,但是画面只有一块儿方形的灰色,Paralles ClientRDP直接连上之后就进程闪退。

几番倒腾:xRDPFreeRDP-shadow-x11,前者会让你反复输密码,后者直接连接中断。

在公司用同事电脑走RDP,能通能显示,VNC也能通,在官网发现,g.r.d必须登陆后才能远程通,且对n卡支持不好。

作罢,这远程桌面就等g.r.d官方更新修复吧。

openvpn

通过界面导入openvpn的配置文件,添加otp用户名,密码设置为每次都询问。连接,失败;查看日志,报 CA 的验证算法 too weak,需要设置tls-cipher "DEFAULT:@SECLEVEL=0",然而界面里面没这选项,没法设置。

直接去/etc/Network-Manager下改配置文件,然而那个文件是中间产物,每次都会重新生成,改了也没有卵用。

参考 stack exchange 上的方法,通过nmcli命令进行导出,修改再导入,能进入密码错误重新输入的界面,查看日志,是没有用户名。没法通过界面添加用户名,因为只要通过一次界面保存,上面的SECLEVEL修改就会失效。

放弃界面,老老实实用命令连接吧

sudo openvpn xxx.ovpn

tap vs tun

macOS High Sierra之后就自带tun驱动了,而且TunnelBlicktap驱动还会反复被警告,于是想着将配置文件里面的tap改成tun

未完待续~~