前言:

个人陆陆续续使用过很多 Linux 发行版,而最终选择了 Gentoo Linux 。最近也是准备和统信深度的朋友们合作,测试 Deepin Desktop Environment(深度桌面)在 Gentoo 上的移植,于是为了了解 Deepin 社区版原始使用情况,我将文案台式机从之前的 Gentoo 系统,迁移到 Deepin 社区发行版。

如果你是通过搜索引擎看到这篇文章,期望我全方面的测评深度社区发行版 Linux 的话,那就错了,那样的话,还不如去看我之前做过的视频。

而如果你想从这篇文章中获得如何正确或者最方便安装深度系统的方法,那也来错地方了,因为,一个 Gentoo 用户是不会愿意使用一个“受限”的操作系统的。

这里提到的受限,并不是说 Deepin 操作系统是一个受限的操作系统,或者说这个系统软、硬件生态过于保守。而是想表达我自己对操作系统的一种追求——可定制性。

而这篇文章的意义在于,如何打造一个方便我自己使用的 Deepin Linux 系统。

系统安装:

传统的系统安装,我之前做了视频教程,如果有兴趣的朋友可以看这里,当然,如果你网络情况比较“优异”,可以看这里

在视频中我谈到将 Deepin Linux 安装到 Btrfs 和 ZFS 两种不同的文件系统上。下面我会简洁的叙述将深度系统安装到 ZFS 文件系统上的过程。


在开始之前,我不得不再次谈及我对 ZFS 文件系统的喜爱。如今的 Btrfs 很优秀了,但是 ZFS 能够借助现代计算机大内存,高速 NVME 硬盘,实现更加有效的文件读写;另外通过快照管理,ZFS 具有几乎无法“摧毁”的能力,并且可以非常灵活的管理整个系统,即便,硬盘坏了,也不用担心,只需要把快照搬运过来,或者手动换块好硬盘就能方便搞定。真正意义上的“系统永不重装”。


安装前准备:

  • 安装的电脑要能联网
  • 需要一个 debian liveusb 启动盘
  • 完全备份好已有数据
  • 平常心

计算机不论是笔记本还是台式机,一定要能够连接网络,因为安装的 Deepin 的系统要从源抓取;安装和启动的 Live USB 系统最好是正统的 Debian ,大家可以到中科大或者清华镜像去下载,个人推荐中科大,原因是有每周构建版,这样最新能够方便安装。

系统安装(以下操作均在 root 下完成):

进入 Debian 的 LiveUSB 之后,首先是修改默认 Live 环境的源,切换成国内镜像,这样方便下载和安装工具。这里我使用的中科大的源,大家根据自己的网络情况酌情设置。

vim /etc/apt/sources.list
deb https://mirrors.ustc.edu.cn/debian/ sid main contrib non-free

这里会使用到 Debian 的 sid 源,这个源的好处是能够获得最新版本 zfs-linux 版本。随后是安装一些基本工具和 Live 环境下的 ZFS 文件系统工具。

apt update; apt install --yes gdisk initramfs-tools openssh-server build-essential linux-headers-$(uname -r) debootstrap dkms dpkg-dev zfs-dkms zfsutils-linux dosfstools

完成之后,我用命令来启用 ZFS 内核模块:

modprobe zfs

下面就是创建文件系统阶段,我采用最简单的方法,一个 /boot ,一个 / ,那么 /bootvfat 文件系统,/ 目录用 ZFS 文件系统。假设有一块储存设备是 /dev/sda ,我们可以考虑使用 cfdisk 这个命令进行分区,假设 /dev/sda1 作为 /boot/dev/sda2 作为我们的根目录,随后,mkfs.vfat -n BOOT /dev/sda1 格式化成 vfat 文件系统,/dev/sda2 做成 ZFS 文件系统,具体命令是:

zpool create \
-o ashift=12 \
-o cachefile= \
-O compression=lz4 \                              ##现在我开始使用 zstd-fast 了
-O normalization=formD \
-O acltype=posixacl \
-O relatime=on \
-O xattr=sa \
-O mountpoint=none \
-R /mnt/deepin \
rpool /dev/sda2 \
-f

当然,大家也可以根据自己的实际情况作出参数的调整。随后用一连串命令,完成文件系统挂载到 /mnt/deepin 目录,以便后续进行 debootstrap 操作。

zfs create -o canmount=off -o mountpoint=none rpool/ROOT
zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/default
mkdir -p /mnt/deepin
zfs mount rpool/ROOT/default
mkdir -p /mnt/deepin/boot
mount -t vfat /dev/sda1 /mnt/deepin/boot

创建好之后,可以使用 df -h 命令检查下文件系统挂载情况:

1-1 检查挂载

在原始的 debootstrap 的配置文件中,是没有深度社区系统的 codename 脚本的,于是可以做一个符号链接创建 apricot codename

ln -s /usr/share/debootstrap/scripts/buster /usr/share/debootstrap/scripts/apricot

当然,sid 也可以替换 buster 作为模板。

下面开始 debootstrap 安装基础系统:

debootstrap --arch=amd64 --no-check-gpg apricot /mnt/deepin https://community-packages.deepin.com/deepin/

完成后,进行一些基础配置:

mkdir /mnt/deepin/etc/zfs
cp /etc/zfs/zpool.cache /mnt/deepin/etc/zfs/
echo uos > /mnt/deepin/etc/hostname                ##我自己改成自己喜欢的名字
vim mnt/deepin/etc/hosts

再最后一行添加一行(其实加不加好像都不重要)

127.0.1.1	${hostname}.localdomain	${hostname}

配置下网卡使用 dhcp 服务:

ip addr show                                       ##显示网络连接和网络相关设备

vim /mnt/deepin/etc/network/interfaces.d/<设备名>    ##创建一个网络设备配置文件,内容如下:

auto <设备名>
iface <设备名> inet dhcp

配置系统的源,分别创建下列三个文件:

vim /mnt/deepin/etc/apt/sources.list                                       ##主源

deb https://community-packages.deepin.com/deepin/ apricot main contrib non-free
deb-src https://community-packages.deepin.com/deepin/ apricot main contrib non-free


vim /mnt/deepin/etc/apt/sources.list.d/appstore.list

deb https://community-store-packages.deepin.com/appstore eagle appstore    ##商店源

vim /mnt/deepin/etc/apt/sources.list.d/printer.list 

deb https://community-packages.deepin.com/printer eagle non-free          ##打印机驱动源,非自由部分

首先用 blkid | grep /dev/sda1 查看 UUID ,创建 /etc/fstab 文件:

UUID=${BOOT UUID}         /boot          vfat          defaults 0 2

开始 chroot

cp --dereference /etc/resolv.conf /mnt/deepin/etc/
mount --rbind /dev  /mnt/deepin/dev
mount --rbind /proc /mnt/deepin/proc
mount --rbind /sys  /mnt/deepin/sys
mount -t tmpfs tmpfs /mnt/deepin/run
chroot /mnt/deepin /usr/bin/bash --login

现在开始准备进一步系统安装:

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 1C30362C0A53D5BB
##添加深度源公钥

curl -fsSL https://download.opensuse.org/repositories/home:houge/Debian_10/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/home_houge.gpg > /dev/null
##添加我利用 openSUSE OBS 构建的 zfs-linux 所有 deb 包需要的公钥

echo 'deb http://download.opensuse.org/repositories/home:/houge/Debian_10/ /' | sudo tee /etc/apt/sources.list.d/home:houge.list
##添加我的源

原本这里我建议大家自己本地构建 zfs-linux ,但后来觉得门槛太高,还是选择简化。如果大家希望自己构建深度下的 zfs-linux 所有 deb 包,可以参考 openZFS 官方文档

这里需要重点说明一下,使用我的 openSUSE 下 OBS 构建的 zfs-linux 的 deb 安装,是没有问题的。但是这样构建的本质是有问题的,原则上任何一个发行版的包都应该由该发行版,针对特定时间的版本,由特定的底层来构建。如果选择混合搭配,比方我这样,Deepin 用 Debian 编译打包 deb 可能会对系统造成问题。类似的:Manjaro 安装 Archlinux 的包。

那么之所以在本例中可以使用的原因是 Debian Buster 发行版的底层和 Deepin 20.2.2 的底层基本保持一致,比方说 GCC 大版本号,一些开发库的大版本号,大体是一致的,所以安装到 zfs-linux 到 Deepin 再通过 DKMS 构建内核模块才能成功。

安装基本系统:

apt update; apt install linux-image-deepin-amd64 linux-headers-deepin-amd64 git curl gdebi initramfs-tools openssh-server network-manager console-setup vim locales wget sudo busybox grub-efi-amd64 shim-signed firmware-amd-graphics amd64-microcode efibootmgr firmware-realtek firmware-linux firmware-linux-free firmware-linux-nonfree dkms busybox libnvpair1linux libuutil1linux libzfs2linux libzfslinux-dev libzpool2linux python3-pyzfs pyzfs-doc spl spl-dkms zfs-dkms zfs-dracut zfs-initramfs zfs-test zfsutils-linux zfs-zed zsh --yes

因为目前 Debian 和 Deepin 中的 grub 版本还比较老,手动修复下 grub:

sed -i "s|rpool=.*|rpool=\`zdb -l \${GRUB_DEVICE} \| grep -E '[[:blank:]]name' \| cut -d\\\' -f 2\`|"  /etc/grub.d/10_linux

启动 systemd 必要的服务:

systemctl enable NetworkManager
systemctl enable zfs-import-cache zfs-import.target zfs-mount zfs-zed zfs.target

修改 initramfs 的模块配置文件,添加 zfs 模块:

vim /etc/initramfs-tools/modules
##在最后一行添加 zfs

使用命令重新生成 initramfs 文件:

update-initramfs -c -k all

完成后,一把梭 grub 配置就可以准备配置密码,重启了。

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=uos --recheck --no-floppy
##安装 grub

vim /etc/default/grub
##编辑 grub 启动内核指令

##在 GRUB_CMDLINE_LINUX_DEFAULT 部分添加
root=ZFS=rpool/ROOT/default       ##各位根据自己的实际情况调整

##刷新 grub
update-grub

最后配置 root 登录密码:

passwd

输入两次密码之后就可以 exit and reboot 了。最后进入系统之后,添加自己的用户名,配置组,配置密码就可以了,类似下面这样:

useradd -m -G kvm,sambashare,scanner,lpadmin,netdev,users,sudo,lp,video houge -s /bin/zsh
passwd houge

结尾就是安装深度桌面环境 DDE:

apt update; apt install dde -y

最后重启就能开始进入桌面环境,畅快使用深度社区发行版了。

Use Your Deepin Linux OS Like A Boss

开启支持 i386 库的支持(以下操作均在 root 权限下完成):

通过这样完成安装的朋友会惊讶的发现,市场里凡是利用 deepin-wine 打包的软件是无法安装的。解决的方法是:

apt-add-architecture i386
#或者
dpkg --add-architecture i386
#在 root 权限下运行

随后 apt update 一下,之前安装不了的软件就能安装了;当然,如果你运气和我一样不好,一般过段时间就自然能够安装,这个取决于人品。

维护 ZFS 文件系统(以下操作均在 root 权限下完成):

吐槽一下,Debian,Deepin 和 Ubuntu 这类发行版维护包真的很费劲,相比 Arch 和 Gentoo 繁琐很多。固定周期的 Linux 发行版底层固定,导致 DIY 真的变得极其繁琐。

总共有三种方法来进行维护:

  • 通过我的 openSUSE OBS 获取更新(或者你自己维护一个自己的 openSUSE OBS 源)。但问题如上述所说,存在混源问题,出问题,不要怪我,也不要怪 Deepin,要怪自己心太大。
  • 通过自己本地编译打包获得持续更新。通过刚刚那个链接,本地打包 zfs-linux 的所有 deb ,保持持续稳定更新。问题在于本地编译需要安装依赖和费一些时间在编译上,那么对于某些用户会很复杂和繁琐。
  • 那么为了解决上面的两个核心问题:不混源不本地编译。那就只有一个最硬核的操作本地搭建编译服务器deb 源服务器

这里需要强调,在 Deepin,Debian,Ubuntu 中混源是危险的,如果你心存侥幸,认为某次混源成功更新,系统也能保持稳定正常使用。但请注意,将来不一定保持正常。

所以最保险的方法是——自己对特定包进行本地维护。

搭建本地编译服务器和 deb 源服务器的前提:

至少一台性能强劲的电脑。我的意思是,CPU 的数量要多,硬盘和内存要大。那么最好的方法是利用 NAS 实现。NAS 安装 TrueNAS Scale 作为操作系统,完成后,创建一个虚拟机,用 Debian 系统,分配资源的思路是尽可能多分配 CPU 核心和内存,网络接口直通网卡。因为它扮演两个角色,编译和打包deb作为一台 deb 源服务器。下面的操作就是在这台 Debian 的虚拟机里的操作。其实过程超级简单

搭建编译服务器:

首先安装必要工具:

apt install pbuilder --yes

修改配置文件:

vim /etc/pbuilderrc                   #修改的主要内容如下:

MIRRORSITE=                           #添加深度的仓库
DEBOOTSTRAPOPTS=                      #定义 debootstrap 的参数
COMPRESSPROG=                         #为了最大化利用编译机的性能,使用 pigz 获得全部核心的加成

#这几个地方依次修改为:
MIRRORSITE=https://community-packages.deepin.com/deepin/

DEBOOTSTRAPOPTS=(
    '--variant=buildd'
    '--no-check-gpg'
    )

COMPRESSPROG="pigz"

其余内容不需要修改。

这个时候,就可以在本地创建一些文件夹,开始准备编译了,比方我在自己的目录下创建了 build 文件夹并 cd 进入。

可以用以下命令创建一个 Deepin 目前发行版 20.2.2 的基础编译环境:

ln -s /usr/share/debootstrap/scripts/buster /usr/share/debootstrap/scripts/apricot
pbuilder --create --distribution apricot --basetgz exp.tgz

完成后就会在该目录下有一个 exp.tgz 的包,后续利用命令就能在这个基础环境中开始编译,而编译具体可以分为两种方法,这两种方法我也都用上了,一种是你有 .dsc 文件情况下另一种是没有 .dsc 文件,比方编译内核。那么第一种的命令类似于下面这样:

pbuilder --build --basetgz exp.tgz xxx.dsc

整个编译会自动化进行,如果编译成功,会打包并放到下面这个目录下:/var/cache/pbuilder/result/ ,类似下图的样子:

1-2 打包好的 deb

如果没有 .dsc ,像我需要自己维护一份内核,以方便搭配 ZFS 使用,就需要下面这种方法,到 Deepin 的基础编译环境中构建 deb 包了。其实说白了,就是 chroot 环境:

pbuilder --login --basetgz exp.tgz      #构建完成后,一旦 exit , 所有内容销毁,包括构建好的 deb 包
pbuilder --login --basetgz exp.tgz --save-after-login #如果这样的话,即使 exit 后,整个环境会保留

通过上面这样构建出来的 deb 包,一般存放在 /var/cache/pbuilder/build/<数字>/<你指定的目录下>

搭建本地(局域网内)DEB 源服务器:

刚刚我们已经有 deb 包了,那么现在我们要让局域网内,或者说 NAS 上的虚拟机网段内的 Deepin 系统访问到 deb 源服务器,需要做一下准备:

  • reprepro
  • 签名和秘钥
  • Web 服务器

那么具体操作如下,首先安装 reprepro:

apt install reprepro --yes

在开始之前首先设置好 deb 源的时区和时间:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc
apt install ntpdate
ntpdate -s time.nist.gov

完成后,我们开始配置签名和秘钥,这里我用我自己的例子:

gpg --gen-key                     #通过这个命令生成一个秘钥

生成的秘钥大概是如下的样子:

1-3 生成秘钥

以上面这个秘钥为例,秘钥ID就是:33372332,我是怎么知道的呢?pub 那一行下方那一长串内容,最后8位就是你的 KeyID 了,这个要记住,我们后续有用。

下面开始创建我们仓库的目录,比方我的仓库存放在 /var/www/html/deepin 下,那么一系列命令是这样的:

mkdir -p /var/www/html/deepin
cd /var/www/html/deepin
mkdir -p conf db dists pool
touch conf/distributions                       #distributions 描述性文件
touch conf/options                             #options 描述仓库的一些选项

我的 distributions 是这么配置的:

Origin: deepin
Suite: apricot
Label: deepin
Codename: apricot            #与深度仓库的 codename 保持一致
Architectures: i386 amd64
Components: main             #因为我们并不是全方面打包,而是维护一些自用的包,全部放 main 就可以了
Description: Apt repository for DeepinZFS
SignWith: 33372332           #还记得我们的 KeyID 吗,那后八位

我的 options 部分并没有写内容,各位如果有希望配置的,需要搜索下文档。不过,如果你像我一样,只是自己用一用某些特有的包,不设置也不碍事。

下面将公钥导入到仓库目录:

gpg --export --armor 33372332 > /var/www/html/deepin/gpg-public.key         #那串数字是 KeyID

下面是安装一个 Web 服务器,我个人选择了 Apache2,因为完全不用设置,安装完成,启动服务,就能访问仓库目录了,类似这样:

1-4 仓库目录

如果你选择 nginx 之类的,相关配置,各位朋友再研究研究。

弄好这些之后,我们就需要利用 reprepro 来发布包了,为了方便传递 -b 参数,建议在仓库目录使用以下命令。

reprepro -b /var/www/html/deepin -C main includedeb apricot /<你之前编译并打包好的 deb目录>/*.deb
#以上是添加包,添加包会要求输入你秘钥的密码

reprepro -b /var/www/html/deepin -C main remove apricot <deb 的包名>
#以上是从仓库中移除包

现在可以在本地配置局域网的 deb 源了,首先把自己的公钥添加到 Deepin 系统中:

doas curl -s http://192.168.4.167/deepin/gpg-public.key | doas apt-key add -

完成后,配置本地的 apt 源:

vim /etc/apt/sources.list.d/houge.list
#新建自己的私有仓库

deb http://192.168.4.167/deepin/ apricot main
#添加自己的仓库地址,请修改为你自己的仓库 IP 地址

最后通过 apt update 刷源后就能正常使用了。

后记:

这是一种非常极客的使用 Deepin 社区发行版 Linux 的方法,适合那些有自己独立需求的朋友尝试和使用。而且这种方法可以举一反三。可以使用在素有基于 DEB 的 Linux 发行版中,让这些定制型比较弱的 Debian 系发行版具有更好的可塑性。

最后感谢 @Revy 朋友的帮忙和提供文档协助。

感谢如下两篇文章提供的灵感:

build deb package on archlinux

reprepro搭建deb仓库的正确技巧

3 thoughts on “使用统信 UOS Deepin 社区发行版 Linux 作为备用台式机主操作系统

  1. 这一系列操作感觉有一些眼花缭乱。请问博主,使用这样的操作安装 Deepin,相比于直接使用 Deepin 的 LiveCD, 可定制性得到了哪些提高呢?

    1. 相比于正统安装,可以定制并且使用树外文件系统 ZFS 作为根目录,另外可以通过自己维护的源使用自己定制内核,以及深度未打包的软件,比方我不喜欢用 sudo, 用 doas 作为替代,doas 深度源没有,只有自己维护一个

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注