前言简述:

简述: 本文普及一些 GNU / Linux 的常见名词和背后的背后故事;简单介绍 ArchLinux 所处的地位和社区氛围,以及为备受程序员推崇的原因;和 DDE 是如何移植其他发行版(eg:Arch)上的。

前半段 主要涉及是 GNU / Linux 的历史,解释一些十分常见的但少有仔细思考缩写单词含义,和其背后的历史小故事,普及一些开源只是和理念,以及简单阐述为何很多人要选择开源活动?做这件事情的动机和意义是什么?以及能够收获到什么?

中间半段 主要介绍 ArchLinux 这个具有特色的发行版以及其社区氛围;

最后一段 主要介绍 DDE 是如何移植到 ArchLinux上的,并且举例两例子。

本文字数比较多,建议按照拆开的三段脉络来看,或可以只关注你感兴趣的一部分:


[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


对于 GNU/Linux 的一点理解:

对于 GNU/Linux 的认知:

​ 这个 GNU / Linux 一看很容易,二看会深思。这里附上个人看法,或续大家看法不一样,欢迎探讨思考。

先看对于下面的单词的理解「来自 GNU 官网介绍」:

GNU工程: 是要开发一个完全自由的类似Unix的系统 :GNU (GNU’s Not Unix! 的首字母递归缩写—这是对Unix的技术思想致敬的一种方法,同 时表达GNU有所不同)。其基本目标和一贯目标是提供一个和Unix兼容的100% 自由软件的操作系统。

GNU操作系统: 是一款使用 Hurd 内核,且同时附带有很多自由软件包的操作系统 。但 Hurd 缺少一些重要功能,因此未被广泛使用; GNU 软件包包括以用户为导向的应用程序、实用程序、工具、应用库、甚至游戏,一个操作系统能够为其用户提供的所有程序。比较出名的有 C 编译器 gcc、文本编辑器、图形库等。其所有提供的软件都是自由软件。

Linux(内核): 是由 Linus Torvalds 完成的 Linux 系统内核

GNU/Linux 操作系统: 等价于一个被改动的 GNU 系统(未使用 Hurd 内核) + Linux内核。

现在最流行的 Linux 发行版,实际上是使用的是一个“被改动的 GNU 系统(未使用 Hurd 内核) + Linux内核“ ,然鹅,由于许多用户的混淆,现在此发行版本被简称为 Linux 操作系统 ,更简的称呼版本为 Linux ;但是其实名称应该是 GNU/Linux 操作系统


自由软件:

自由软件意味着用户可以自由地运行,拷贝,分发,学习,修改并改进该软件。 只和自由有关,和价格无关。“自由软件”尊重用户的自由,并且尊重整个社区。

实际上,自由软件的官方定义一直在微调,可以自行查看历史修改

如果一个软件是自由软件,那么它必须为用户提供以下四项基本自由:

  • 自由度0:无论用户出于何种目的,必须可以按照用户意愿,自由地运行该软件。
  • 自由度1:用户可以自由地学习并修改该软件,以此来帮助用户完成用户自己的计算。作为前提,用户必须可以访问到该软件的源代码。
  • 自由度2:用户可以自由地分发该软件的拷贝,这样就可以助人。
  • 自由度3:用户可以自由地分发该软件修改后的拷贝。借此,用户可以把改进后的软件分享给整个社区令他人也从中受益。作为前提,用户必须可以访问到该软件的源代码。

自由与非自由软件的分类:

自由软件就表示免费软件吗?可以不负责任的白嫖吗?使用它们应该付出什么代价不? 自由软件(Free Software)不等价于 免费软件(Freeware); 但是通常来说,自由软件在使用的同时,一定会获取对应的源码,且大部分软件都是免费的,但是也能做到有偿使用。广泛的来说,这里的软件都是可以免费白嫖的,人们通常也不需要付出代价;对应使用这些软件的时候,这个软件的开发人员们也不会承担任何的责任(设想一下,一个上亿的合同签订,使用某开源软件 / 自由软件来书写此文档,突然崩溃,照成合同签订延期,啊,,,那这,,,想要扯皮,,,难道谁能够保证自己软件不出 bug ?)

自由软件: 简单理解,大部分都是免费软件,但是也可以有偿收费,但是必须提供源代码。

非自由软件: 简单理解,该软件的使用、分发、或者修改,都是被禁止的,或者说需要获取授权许可才可以这些操作。

开源软件: 通常被表示为自由软件一类软件,但实际上两者差别很大,如只有极少的开源软件不是自由软件。

专有软件(私有软件): 简单理解,是非自由软件的同义词,但是其中一些软件是被允许非商业性的修改和再分发。

免费软件: 没有官方的明确定义,但它通常被用于指代那些允许再分发但禁止修改(并且其源代码不可获得)的软件包。其不等于自由软件。

共享软件: 若是想要使用其软件的副本,只需支付少许的费用就可以获取副本使用许可,且大多数都是源码不可获取。

私人软件: 为某一群指定用户开发的软件。用户保存和使用他们,且不会以源代码和二进制方式对公众发布。

商业软件: 私人软件不等价与商业软件。大部分商业软件都是专有软件,但是也有商业化的自由软件,也有非商业化的专有软件。

上面只是我们比较关心和经常看到的一些软件的说法和定义,实际上,还有很多其他种类的软件:公有领域软件、Copyleft 软件、非 copyleft 的自由软件、使用包容型许可证的软件、使用 GPL 许可的软件、GNU 操作系统、GNU 程序、GNU 软件、FSF 拥有版权的 GNU 软件等,关于他们详细的,可以参考 自由与非自由软件的分类


GNU / Linux 个人感想:

对于前辈们从事于 GNU / Linux 开发,为我们提供开放的源码,可以使得我们自由的、免费的和方便的学习软件编程、和可以了解 Linux 操作系统的构建们和运行原理。对于想要彻替代闭源软件的,感觉他们就是用爱发电,并且还一直发电了很多年,靠着自己的兴趣支撑,邀请着其他志同道合的开源者们,一起做着斗争,希望有一天,所有人所有方面和学科,都能够使用自由操作系统和自由软件。个人感觉这是一个崇高且仍重而道远的理想;他们有着自己的原则、想法、不为金钱为驱动力,只是去用实际行动,为了宣扬自己的理念和去实践开源文化和社区发展。做这样一件事,感觉他们纯粹且自由的人,是真正热爱生活和热爱生命、热爱贡献的、做着纯粹的兴趣的事情。 谁又不喜欢做一些自己想做的事情呢?何况其意义深远~~




对于 Arch Linux 的一点理解:

楔子:

GNU / Linux 发行版、由于开源理念、任何人都可以按照自己想法来修改,加上时间的积累,所以产生了诸多的发行版~;他们有着各自的理念,常见的一种表现形式为,各自为战,而在根本问题上,又能保持协调统一,基调来看,属于百花争鸣;


ArchLinux 是什么?

ArchLinux一款独立的 Linux 发行版 ,既不是继承于 Debian 系,也不是继承于 Red Hat 系、也没有继承于Slackware 系。想不到吧?和我们比较熟悉的 Ubuntu、Fedora、CentOS、UOS、Deepin 没有上下游关系。(当听到有人问它是继承于哪一个?当时我很震惊,,,Arch,,,)

在下图来看,它是处于箭头所在位置,下方的的是它的下游:


ArchLinux 历史:

早期: 加拿大程序员和吉他师 Judd Vinet 从 2001 年早期开始开发 Arch Linux,并在2002年3月11日正式发行0.1版。

中期: 这个图表见证了Arch Linux 社区的稳步扩大. 而且从早期开始,Arch 就树立起了 开放、友好和社区互助的形象

ArchWiki 的诞生: 2005年7月8日,用 MediaWiki 搭建的 ArchWiki 开始运行

A. Griffin 时代: 2007下半年,Judd Vinet 退出了Arch的开发,并把统治权交给美国程序员 Aaron Griffin, 也就是 Phrakture,目前他依然是 Arch 开发者。

Arch 安装脚本: 2012 年 7 月的 Arch Linux 安装介质中 弃用了 基于菜单的 Arch 安装框架(AIF),改为使用Arch 安装脚本 (arch-install-scripts)。

Systemd 时代: 2012 到 2013 年间 Arch 用 Systemd 替换了 System V init

抛弃 i686 支持: 鉴于在开发者和社区中 i686 架构的使用程度逐渐式微,i686支持已经于2017年11月底被抛弃

项目的领导角色和选举: 2020 年初,Arch 开始用新的流程选择未来的领袖,详情记载在 DeveloperWiki:Project Leader。Aaron Griffin 决定不再担任项目领导,Arch 通过选举方式正式确认 Levente Polyak 为新的领导,结果记录在 这里


ArchLinux 理念:

Keep It Simple, Stupid (保持简单,且一目了然)

简洁

Arch Linux 将简洁定义为:避免任何不必要的添加、修改和复杂增加。它提供的软件都来自原始开发者(上游),仅进行和发行版(下游)相关的最小修改。

  • 不包含上游不愿意接受的补丁。绝大部分 Arch 下游补丁都已经被上游接受,下一个正式版本里会包含。
  • 配置文件也是来自上游,仅包含发行版必须的调整,比如特殊的文件系统路径变动。Arch 不会在安装一个软件包后就自动启动服务。
  • 软件包通常都和一个上游项目直接对应。仅在极少数情况下才会拆分软件包。
  • 官方不支持图形化配置界面,建议用户使用命令行或文本编辑器修改设置。

现代

Arch尽全力保持软件处于最新的稳定版本,只要不出现系统软件包破损,都尽量用最新版本。Arch采用滚动升级策略,安装之后可以持续升级。

Arch向GNU/Linux用户提供了许多新特性,包括systemd初始化系统、现代的文件系统、LVM2/EVMS、软件磁盘阵列(软RAID)、udev支持、initcpio(附带mkinitcpio)以及最新的内核。

实用

Arch 注重实用性,避免意识形态之争。最终的设计决策都是由开发者的共识决定。开发者依赖基于事实的技术分析和讨论,避免政治因素,不会被流行观点左右。

Arch Linux 的仓库中包含大量的软件包和编译脚本。用户可以按照需要进行自由选择。仓库中既提供了开源、自由的软件,也提供了闭源软件。实用性大于意识形态.

以用户为中心

许多 Linux 发行版都试图变得更“用户友好”,Arch Linux 则一直是,永远会是“以用户为中心”。此发行版是为了满足贡献者的需求,而不是为了吸引尽可能多的用户。Arch 适用于乐于自己动手的用户,他们愿意花时间阅读文档,解决自己的问题。

Arch 鼓励每一个用户 参与 和贡献,报告和帮助修复 bugs,提供软件包补丁和参加核心 项目:Arch 开发者都是志愿者,通过持续的贡献成为团队的一员。Archers 可以自行贡献软件包到 Arch 用户仓库, 提升 ArchWiki 文档质量, 在 论坛, 邮件列表, IRC 中给其它用户提供技术支持. Arch Linux 是全球很多用户的选择,已经有很多国际社区提供帮助和文档翻译。


ArchLinux 用户:

​ 由于各发行版的理念不一样,而意识决定行为,使得最终的产物和受到欢迎程度也大不相同;与商业版对应的社区版本、通常都会建立自己的 社区,会在普通用户、爱好者、贡献者和开发者之间,构建一个沟通桥梁。

​ 对于各个社区版本的 Linux 来说;一种是面对普通小白用户的(大部分的 Debian系 发行版);另外一种是面对有一定编程基础的爱好者(Red Hat系和一些其它包管理系);两者通常会给出不一样水平层次反馈,更加惊喜的是,后者有时候还是直接帮助我们将 bug 修复好~,为发行版添砖加瓦。而这大多数是由与单纯的爱好和热情,没有利益所得,纯粹的用爱发电~;通常来说,Archlinux 的用户群体主要是有一定基础的编程的贡献者, 也有一部分被安利过来的尝鲜小白~

​ 其中 ArchLinux 发行版,凭借优秀和独特的理念,吸引了很多的爱好者(且对贡献者极其友好)。因为其是完全由用户和社区来决定的发行版中,且整个系统极其精简、采用滚动更新, 这对于爱好开源文化的程序员来说, 是有着比较崇高的地位,且其有着良好极其优秀的和多语言的 WiKi 文档。通常其文章属于短小精悍,可以让我们更加自由的理解计算机底层的原理。


ArchLinux 群组:

ArchLinux 发行版,其走向完全又社区来确定,在用户群体中,挑选出受信任用户(TU),来进行一些帮助管理,和决定,对于有争议之处,就采取集体线上开会,然后投票来通过某一项事物的决定;社区的构成,部分由如下构成:

  • Arch Linux 官方论坛 : 「官方、英文」论坛交流区域

  • Arch Linux 中文论坛 : 「非官方、中文」论坛交流区域,不仅是新手之地,还可遇到十年多的老 Arch 热心用户帮

  • 中文 IRC 频道 #archlinux-cn : 一个古老的全球性的匿名聊天室

  • ArchLinux 的WiKi : Arch 的百科全书,通常更新及时,且支持常见语言版本,必备工具(wiki介绍)。

  • ArchLinux 的 Aur 仓库 : AUR 包是用户自己产生的内容,然后上传包的仓库,其中极大的丰富国内一些常用 win 软件的移植,但记得使用它们造成的后果得自负,没有任何人需要为其负责~

  • #archlinux-cn : Tg 的 Arch 群组,只聊 Arch 的问题和解决方案「中文」

  • Arch Linux : Tg 的频道,跟进 Arch Linux 日常踩坑预警,翻译官方新闻, testing 测试预警等

  • #archlinux-cn-offtopic :Tg 的 Arch Linux 相关人员的日常讨论群

  • 其他更多群组 : 其他更多群组,和交流群的指引


ArchLinux 社区文化:

一开始就筛选精准用户 ,从开始安装 ArchLinux 系统开始,步骤就比一些带有 GUI 程序安装器的软件要繁琐的多,且全程命令行安装(现在还必须有网络),当然,初次安装该系统,会让很多人感觉困难,在安装系统中,就可以过滤掉一些“伪用户”,从而确保后面留下的都是精准和有动手能力的群体用户。且 Arch 有自己的想法,其并不以吸引尽可能多的用户为目的,只是安安心心的做好自己的事情,凡事都自己动手,丰衣足食。

软件仓库是丰富且更新迅速的,且除了官方的 community 仓库,里面已经包含常用和已经检测过的软件报另外还有 AUR 仓库 archlinuxcn,都是用户可以自定义自己上传任何内容的软件包,且不用对其负任何责任。还有

各种管理包和工具等,都是尽可能最新的版本

经常更新的 WiKi 帮助手册,和对应的多语言版本,通常也更新比较及时,当然,引文版本的永远是最新最全的;

良好的社区交流氛围、Archer 都懂技术的热心者 ,无论是在哪里的社区交流~,都会很舒适和得到你想答案

Arch 发行版完全由社区用户群、UT 和开发者来决定其发展和走向,不会受到商业版本的干扰进程。

ArchLinux 发行版是为了满足贡献者的需求,而不是为了吸引尽可能多的用户。Arch 适用于乐于自己动手的用户,他们愿意花时间阅读文档,解决自己的问题。


DDE与Arch 的关系:

DDE 移植 Arch 流程:

​ 这里讲述一下 DDE 移植到 ArchLinux 的简单步骤,交代下背景,DDE 主要是在 UOS V20 + Qt 5.11.3 上开发出来的,而 Arch 上的 Qt 永远都是最新的,已经到 5.15.0 了,直接编译经常会遇到失败的情况,需要补充相应的头文件的等~

  1. github 仓库中,选取所需要的仓库
  2. 选取其最新的 tag 编号的代码,clone 到本地 ArchLinux 机器上面
  3. 在最新的环境中 Qt 5.15.x 中进行编译
    1. 若没有问题,则进行 第 5 步骤
    2. 若有问题,则修改源码,直到编译通过;将修改部分的代码,以补丁 path 的形式提交到 github,等待合并进入 github 仓库,然后此部分被打补丁到下一个 tag 中
  4. 找一个打包者,准备进行打包~
  5. 其编写 PKGBUILD 脚本 (包含 ArchLinux 在构建软件包时所需要的信息的 shell 脚本)
  6. 执行 makepkg ,生成 *.pkg.tar.zst 包,其可以被 pacman -U 本地包 直接进行安装
  7. 进行测试,上面都没有问题之后,就推送到 ArchLinux 的 服务器上面,提供所有人下载

细节:

​ 其中,比较耗费时间的地方就是,编写 PKGBUILD 脚本,和在 Arch 上面进行测试~;这里将该脚本描述一下,在本机中,可以复制 /usr/share/pacman/PKGBUILD.proto 作为副本,重命名为 PKGBUILD 编写该脚本。


附两个实例:

第一个:

一个 DDE 仓库的自己的实际例子:deepin-qt5integration:若是不理解,可以自行参看下一个带注释的例子

# Maintainer: Felix Yan <felixonmars@archlinux.org>

pkgname=deepin-qt5integration
pkgver=5.1.0.5
pkgrel=1
pkgdesc='Qt platform theme integration plugins for DDE'
arch=('x86_64')
url="https://github.com/linuxdeepin/qt5integration"
license=('GPL3')
depends=('dtkwidget' 'libqtxdg' 'deepin-qt5platform-plugins')
makedepends=('xcb-util-renderutil' 'deepin-file-manager')
groups=('deepin')
source=("$pkgname-$pkgver.tar.gz::https://github.com/linuxdeepin/qt5integration/archive/$pkgver.tar.gz")
sha512sums=('f161836d2429d232e5c20fbb99da584ad8cb46e418c5cf419b639fa53004c6aa67ab2596f63bbeee49d9dd9445e34ac73a03baa24320488577c5265d88412953')

build() {
  cd qt5integration-$pkgver
  qmake-qt5 PREFIX=/usr
  make
}

package() {
  cd qt5integration-$pkgver
  make INSTALL_ROOT="$pkgdir" install
}

第二个:

​ 此为个人实际项目的编写的 PKGBUILD 脚本例子,源码在 master 分支, 构建脚本在 archliux 分支,编译运行成功的结果在 日志

# This is an example PKGBUILD file. Use this as a start to creating your own,
# and remove these comments. For more information, see 'man PKGBUILD'.
# NOTE: Please fill out the license field for your package! If it is unknown,
# then please put 'unknown'.

# Maintainer: xmuli <xmulitech@gmail.com>     # 包的维护者
pkgname=chinesschess                          # 包的名称(由小写字母 @ . _ + - 构成)
_pkgname=chinessChess                         # 自己添加的变量 (因 pkgname 要求全小写,而仓库源码中有大写)
_pkgname2=ChineseChess                        # 自己添加的变量 (最后项目生成的文件名)
pkgver=5.6.0                                  # 包的版本号 (不可有连字符 -)
pkgrel=1                                      # 包的发布号码
epoch=                                        # 用于强制升级软件包 (一般不允许使用)
pkgdesc="Network battle game written in Qt (available on LAN)"  # 软件包的详细描述
arch=('x86_64')                               # 包所能够生成并且使用的架构的序列
url="https://github.com/xmuli/chinessChess"   # 包的官网
license=('GPL3')                              # 采用的许可证
groups=()                                     # 软件包所在的包组
depends=()                                    # 软件包的生成和运行时,必须先行安装的软件列表
makedepends=()                                # 仅在软件生成时,需要的软件包列表
checkdepends=()                               # 运行测试组件时需要,而运行时不需要的包列表
optdepends=()                                 # 可选的软件包(可看作本软件的插件)
provides=()                                   # 说明当前包提供的功能 (若使用,则需加上替代版本号)
conflicts=()                                  # 与当前软件包发生冲突的包 与功能的列表
replaces=()                                   # 会因安装当前包而取代的过时的包的列表
backup=()                                     # 当包被升级或卸载时,应当备份的文件(的路径)序列
options=()                                    # 允许重载 makepkg 的部分 (在 /etc/makepkg.conf 中)
install=                                      # .install 脚本的名称 (值应和 pkgname 相同)
changelog=                                    # 软件包的更新日志的文件名
source=("$_pkgname-$pkgver::https://github.com/xmuli/$_pkgname/archive/v$pkgver.tar.gz")  # 源码的下载地址
noextract=()                                  # 在 source 中列出,但不应该在运行 makepkg 时被解包的文件列表
md5sums=('5abae73968ea0104e99b816bf0b720fe')  # 完整性校验值
validpgpkeys=()                               # PGP 指纹列表


prepare() {                                   # 准备
	cd $srcdir
    echo $srcdir
}

build() {                                     # 构建
	cd $_pkgname-$pkgver
	mkdir bin
    cd bin
    qmake ..
    make -j$(nproc) 
}

check() {                                     # 检查
	cd $_pkgname-$pkgver
}

package() {                                   # 包
	cd $_pkgname-$pkgver
	# make install
    cd bin/
    ./$_pkgname2
}

参考: