ArchLinux的灵魂.docx
- 文档编号:8605162
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:122.14KB
ArchLinux的灵魂.docx
《ArchLinux的灵魂.docx》由会员分享,可在线阅读,更多相关《ArchLinux的灵魂.docx(10页珍藏版)》请在冰豆网上搜索。
ArchLinux的灵魂
本文由读者NingBao所撰写,其中包括Archlinux的PKGBUILD、AUR及ABS等内容。
这是该文的第一部分,主要介绍PKGBUILD和makepkg。
既然现在有NingBao朋友来做这件事情,那么我的《打造完美的Linux桌面──ArchLinux2007.08-2》就算完结了。
等NingBao朋友写完后,我打算出个全面修订的电子版本,方便大家阅读。
作者/NingBao
第一部分:
PKGBUILD和makepkg
其实,我使用Archlinux的时间并不是很长。
可是,就是在这半年的时间内,我感觉我学到了很多的东西,对GNU/Linux有了更多的了解,也在这个过程中深深地爱上了Archlinux这个发行版。
首先声明一下,我不是一个程序员,从来没有写过真正的Code,顶多是写一点scripts,或者做一些简单的网页什么的。
和很多人一样,我对计算机的接触是从DOS/Windows开始的。
Windows的图形界面很容易学。
可是时间长了,Windows就会运行的越来越慢,我的硬盘上也就会有很多我根本不知道是什么的东西。
而且,在Windows上很多东西都是设定好的,改变起来非常不容易。
不要跟我提注册表,那个东西实在是让我一头雾水。
还有,大部分Windows上的软件都不是自由软件。
这意味着人们很难了解这些软件内部的情況,你可能在毫无察觉的情况下就中了病毒或木马。
所以,为了能够完全了解和控制我每天工作生活要用的计算机,我开始学着使用GNU/Linux。
我一开始是用Mandriva(那个时候还叫MandrakeLinux)。
后来是Ubuntu(也包括其他一些Debian为基础的发行版)。
Wow!
我一用上Ubuntu就有了完全不同的感觉。
特别是非常好用的apt-get,加上庞大的自由软件库,让我大开眼界。
可是在使用Ubuntu一段时间以后,我发现这个平台实在和Windows非常相似。
Gnome和KDE的界面都是在模仿Windows。
更糟糕的是,Ubuntu会在一开始安装一些乱七八糟的东西,大大影响了我的电脑的运行速度。
我需要一点一点把我不用的东西去掉,这个过程真的很不爽。
我开始问自己为什么要放弃Windows呢?
Ubuntu有一个很大很好的用户社区,很多问题都可以在讨论区得到解决。
然而,Ubuntu的用户完全要依赖Maintainer。
我就有过这样的经历,在发现一个Bug后得到很多其他人的确定,可是Maintainer迟迟不作修改。
还有,也许有很多人都很想用一个比较新的软件,但是大家都要等到有人能够而且愿意作Maintainer之后,这个软件才会在Repository里出现。
我或许能够在调试后自己从源代码编译,可是我要如何和别人分享我的成果呢?
其实,各种Linux发行版在本质上没有什么不一样。
大家使用的软件都是要从源代码编译生成可以运行的二进制码。
如果没有rpm、apt-get或者pacman,我们也是可以快乐生活的。
只不过,我们的生活会变得麻烦一些。
如果要从源码安装一个软件,我们通常是要做如下的步骤:
wgethttp:
//somewhere.org/source/package.tar.gz(下载源代码)tarxvzfpackage.tar.gz(解压缩)cdpackage(进入源代码目录)./configure(设定)make(编译)makeinstall(安装)
如果我们要像这样安装一个两个软件是没有什么问题的。
但是如果我们要对付成百上千的软件/类库的话,这样的土办法是行不通的。
于是出现了不同的Linux发行版,他们之间的区别只是在于如何管理成百上千的软件,特别是不同软件/类库之间互相依存的关系,也就是dependency的问题。
大多数Linux发行版都是以二进制包为基础的,这其中又分Redhat(还有SUSE、Fedora等)、Debian(还有Ubuntu、PCLinux等)和Slackware阵营。
为了解决管理大量软件包的问题,这些发行版采取了这样一个办法。
他们找了一群大牛程序员来作Maintainer,这些Maintainer负责把源代码编译成二进制码,加上一些控制信息(比如如何安装、dependency等),然后一起打包放在服务器上。
所以,最终用户根本不用接触源代码。
如果你有兴趣的话,你可以抓一个Debian的DEB文件下来研究一下:
wgethttp:
//somewhare.org/package.debarvxpackage.deb
你会发现你多了三个文件:
debian-binarycontrol.tar.gzdata.tar.gz
然后再用tartzvf命令看一看control.tar.gz和data.tar.gz里面有什么东东,你就明白神奇的dpkg/apt-get是怎么一回事情了。
二进制包固然是很方便,但是这种办法有一个很大的问题。
那就是最终用户受到Maintainer很大的控制。
比如说,我们并不知道Maintainer在编译的过程中是如何设定的(./configure)。
如果我们要用不同的设定,就要自己从源代码从头开始。
另外,如果某一个Maintainer心术不正,在二进制包里面加了木马程序,我们这些最终用户是很难查觉的。
还有,设想一下如果某一个Maintainer外出休假了,那么你的软件也就不能及时更新了。
所以,也有一些发行版采取了完全不同的办法,这些发行版是以源代码为基础的。
Gentoo就是其中的代表。
如果你用过Gentoo你就会知道ebuild文件。
你如果有兴趣,可以从http:
//gentoo-抓一个ebuild文件研究一下。
你会明白Gentoo的用户其实从Gentoo得到的只有这些ebuild文件,在每一个ebuild文件里包含了安装使用一个软件需要的所有信息(从哪里下载源代码、如何编译、如何安装还有Dependency的问题等)。
之后,Gentoo的用户用emerge命令按照ebuild文件的指示编译、安装一个软件。
这样做的好处是,Gentoo的用户可以一目了然地了解每一个软件的编译、安装的过程。
如果需要的话,Gentoo的用户可以修改ebuild,按照自己的需要编译一个软件。
我也用过Gentoo。
不过对于我这样的初学者,Gentoo实在是太复杂了,有太多的参数要设定,ebuild的编写也不是那么简单。
还有,Gentoo几乎不提供任何二进制包,所以绝大部分的软件都要从源代码编译,这是一个非常慢的过程。
其实在大部分情况下,用户对一些软件的设定都是差不多的,没有必要让每一个Gentoo的用户都从头编译。
所以,我需要找到一个发行版,既有Debian的易用性,又有Gentoo的灵活性。
我因此找到了Archlinux。
那么Archlinux又是如何解决从源代码到二进制码的问题呢?
Archlinux使用了makepkg这样一个工具。
makepkg会按照PKGBUILD文件生成一个二进制包。
有些时候,makepkg还需要install文件(主要用来显示提示信息、备份用户设置等)和其他的配置文件。
那么PKGBUILD是什么呢?
PKGBUILD和Gentoo的ebuild一样,包含了安装使用一个软件需要的所有信息。
下面是dwm(一个非常非常简捷、高效的窗口管理器)的PKGBUILD文件:
pkgname=dwm软件名称
pkgver=4.7
pkgrel=1版本信息
pkgdesc="AdynamicwindowmanagerforX"
url="http:
//www.suckless.org/wiki/dwm"软件说明和网站
arch=('i686''x86_64')适用平台
license=('MIT')版权
depends=('libx11')Dependency
install=dwm.installinstall文件
source=(http:
//www.suckless.org/download/$pkgname-$pkgver.tar.gz\
config.h)要下载的源文件
md5sums=('827b128514a3edb87e208e84fee0eb3f'
'395e9a25f65605c4891e74c644b91530')md5验证码
build(){
cd$startdir/src/$pkgname-$pkgver
cp../config.h.
makeX11INC=/usr/include/X11X11LIB=/usr/lib/X11||return1
makePREFIX=/usrDESTDIR=$startdir/pkginstall||return1
install-m644-DLICENSE$startdir/pkg/usr/share/licenses/$pkgname/LICENSE&&\
install-m644-DREADME$startdir/pkg/usr/share/doc/$pkgname/README
}编译的过程
我们可以注意到在“编译的过程”这个部分,很多代码都和我们在shell里编译的命令一样。
对!
Archlinux不要求用户学习太多新的东西,PKGBUILD很容易理解,因为里面都是基本的shell命令。
好,我们把PKGBUILD,dwm.install和config.h(dwm比较特殊,config.h包含所有的配置信息,所以要在编译之前提供。
其他的软件大多依靠外部的配置文件,像是.bashrc等)放在一个新的目录里之后。
我们执行:
makepkg
之后,你会发现这个目录里出现了一些新的东西,包括:
dwm-4.7-1-x86_64.pkg.tar.gzdwm-4.7.tar.gz
两个文件,还有两个目录 srcpkg
通过比较这些文件、目录里的内容和PKGBUILD,你就会明白makepkg到底做了些什么:
1.根据source里的内容下载了源代码文件dwm-4.7.tar.gz;
2.通过md5验证码确定下载的源代码文件和PKGBUILD的作者使用的是一致的;
3.把源代码文件解压缩到./src/$pkgname-$pkgver(也就是./src/dwm-4.7);
4.按照build()里的内容编译源代码,并把编译好的内容放在./pkg里;
5.在./pkg里加上其他的一些信息,包括.PKGINFO和.INSTALL,也就是dwm.install的拷贝;
6.把./pkg里面的内容打包形成dwm-4.7-1-x86_64.pkg.tar.gz。
那么,我们有了一个.pkg.tar.gz这样一个二进制包之后,我们要如何安装呢?
我们要使用这样一个命令:
pacman-Udwm-4.7-1-x86_64.pkg.tar.gz
这个命令又完成了那些事情呢?
1.首先,二进制包被解压缩;
2.按照.INSTALL的内容执行一定的命令;
3.二进制包里面的内容会被拷贝到相应的目录(你注意到二进制包内的目录结构了吗?
);
4.在/var/lib/pacman/local这个目录中建立dwm-4.7-1这样一个目录;
5.这个目录里包含了四个文件depends、desc、files和install;
6.depends记录了dependency,desc是软件说明,files记录了每一个安装到系统上的文件的路径,install就是.INSTALL的拷贝。
从这以后,pacman正是通过检查/var/lib/pacman/local里的内容来管理软件包的。
比如说,在执行pacman-Rdwm的过程中,pacman首先在/var/lib/pacman/local找到了dwm-4.7-1这个目录,然后根据files的内容删除已安装的内容。
Dependency也是通过depends计算的。
OK!
我已经解释了PKGBUILD的基本结构和makepkg的过程。
基本上是两步:
从PKGBUILD到.pkg.tar.gz包,再从二进制包安装到系统。
这样一种办法有很多好处。
首先,PKGBUILD非常方便用户交流。
我的一个PKGBUILD如果编译成功了,就可以给别人用。
PKGBUILD的内容一目了然,不但有助于学习,也再不用担心木马的问题了。
另外,我通过一个小例子展现Archlinux的灵活性在哪里。
比如,我要对dwm有自己的设置,也就是自己的config.h,那我应该怎么做呢?
我会做如下的事情:
1.编辑config.h,另存为myconfig.h;
2.编辑PKGBUILD,把所有的config.h替换为myconfig.h;
3.把pkgrel变成2。
之后通过makepkg,我会得到一个文件dwm-4.7-2-x8664.pkg.tar.gz,这个和原来的dwm-4.7-1-x8664.pkg.tar.gz可以区别开。
我可以安装dwm-4.7-2-x8664.pkg.tar.gz,如果有问题我还可以通过pacman-Udwm-4.7-1-x8664.pkg.tar.gz来安装原来的二进制包。
我还可以用同样的办法生成一系列的.pkg.tar.gz包,这在软件的安装调试过程中非常有用。
好了,今天就讲到这里。
有些人也许变得更疑惑了,因为在TOY的“打造完美的Linux桌面—ArchLinux2007.08-2”系列中并没有提到PKGBUILD的问题,所有的软件都是通过pacman-S来安装的。
没关系,如果你理解了makepkg和PKBGUILD,那么在我下一次谈到AUR和ABS之后,你就能完全明白了
第二部分:
AUR和ABS
我非常高兴看到我关于PKGBUILD和Makepkg的文章在 LinuxTOY 受到了欢迎。
我想先针对一些读者的回复谈一点题外话。
我先声明我一点也没有要诋毁Debian或Gentoo的意思,他们都是非常伟大的发行版,都有自己的特色。
其实大多数的发行版都可以自己去定制,从而达到类似的目的。
比如说,有的人提到Gentoo也有二进制包,比如像Openoffice这样的怪物。
然而,我个人以为比较不同的发行版关键是要看它最核心的设计思想。
比如说,Gentoo根本就不是为了使用二进制包设计的。
你要是都想用二进制包,就别费劲用Gentoo了。
关于Debian阵营的发行版,我也想讲几句。
正如一些朋友的回复所讲,DEB/apt-get是非常好的管理工具,软件库也非常的大。
我的笔记本现在还在用elive,也是Debian的分支。
我不喜欢Debian系列的发行版的原因不是它不能定制,而是他们非常依靠Maintainer。
我们可以自己做DEB包,然后呢?
你的DEB包什么时候才能进入软件库呢?
还有,只有你自己知道你的DEB是怎么做的,别人不能了解你编译打包的过程。
Debian本身打包的过程没有Archlinux的PKGBUILD来的简单明了。
只要比较Debian的Maintainer手册和Archlinux的Wiki就可以看出这一点。
选择什么样的发行版完全是要看个人需要。
我选择Archlinux,是因为它当初设计的时候就是要满足“KISSRule”,也就是“KeepItSimple,Stupid”。
或者说像爱因斯坦讲得:
“Everythingshouldbemadeassimpleaspossible,butnosimpler”。
Archlinux的所有配置基本都是非常相似的脚本,加上简单灵活的PKGBUILD和pacman,其实关于Archlinux本身真的没有太多新的东西要学习。
大家有兴趣可以看看“ArchComparedToOtherDistros”。
Archlinux实际上是强迫用户从零开始自己定制自己的系统,在这个过程中也就真正了解了Linux本身。
好了,现在言归正传谈一谈AUR和ABS。
AUR是指ArchlinuxUser-communityRepository,也就是Archlinux用户社区的软件库。
我们现在回忆一下在Archlinux中我们把源代码变成可以运行的二进制码需要哪些文件。
我们需要:
PKGBUILD,可能还有.install文件,加上一些补丁和必要的配置文件(像dwm的config.h)。
这样就足够了!
当你成功使用PKGBUILD编译安装了一个新软件之后就可以通过AUR和其他的人分享你的成果了。
具体的步骤是:
1.tar-zcvfpackage.tar.gzpackage-dir 把package-dir中所有所需的文件打包(包括PKGBUILD,.install,patch和其他的config等)
2.前往 http:
//aur.archlinux.org 选择"Submit”(参照下图),并把你的package.tar.gz上传
AUR会自动根据你的PKGBUILD内容把你的Package加到AUR里来。
就是这么简单!
那么有人会问:
“别的用户要如何使用AUR呢?
”
这个就更简单了,我们还是用一张截图来解释:
1.首先下载“Tarball”(红色的圈圈),这个Tarball和你上传的内容是一样的,无非是PKGBUILD什么的;
2.tarxvzfpackage.tar.gz 然后解压缩;
3.然后的步骤你应该知道了,那就是makepkg还有pacman-U。
不过需要提醒的是,为了对自己负责,你应该在编译之前读一下PKGBUILD和.install的内容,确定里面没有恶意的代码。
另外,我建议你一般不要以root的身份进行makepkg。
其实,makepkg本身也做了这样的限制,你不加—asroot的选项是不能makepkg的。
这是因为,makepkg会执行PKGBUILD里build()部分的代码。
想一想,如果有人在build()这部分加了这么一句“rm-r/home”,你就死定了!
如果你注意到,在每个AURPackage的网页上都有投票(绿色的圈圈)和回复的功能(蓝色的圈圈)。
这些是帮助用户反馈意見的。
有些性急的朋友可能要问这个AUR和pacman取得的二进制包有什么联系?
你应该记住,只要是Archlinux,所有的东西一定是从PKGBUILD开始的。
你通过pacman得到的二进制包也是从PKGBUILD编译而成的。
在你的/etc/pacman.conf有很多Repository的设置,其中的[core]和[extra]是由Archlinux的核心成员维护的,这些软件库里的软件由于特别重要,每个人都要用,所以Archlinux的开发人员把二进制包提前做好,你就可以通过pacman取得了。
然而,和Debian的Maintainer机制不一样,最终的用户可以很容易的了解这些软件的编译过程。
如果需要的话,最终用户可以改变设置,重新编译这些软件。
最典型的情形就是自己编译kernel的时候。
这要通过ABS来解释清楚。
ABS,也就是ArchlinuxBuildSystem。
首先我们要安装ABS:
1.pacman-Sabs
2.vi/etc/abs/abs.conf 编辑ABS的配置文件;
3.你会看到这样一行SUPFILES=(coreextra!
unstablecommunity!
testing),把你需要的Repo之前的!
去掉;
4.然后以root身份执行abs
之后又要如何使用ABS呢?
ABS所作的事情无非是把所有Repo里的软件的PKGBUILD下载到你本地的硬盘中。
这些PKGBUILD都放在了/var/abs中。
你能通过pacman直接安装的二进制包其实也都是按照ABS的内容编译的。
下面我还是用dwm的例子解释ABS的使用:
1.su
2.cd/var/abs 你可以看到这个目录里有core,extra,community三个子目录,正如abs.conf中的设定;
3.mkdirlocal 建立一个local目录,用来放你自己需要的软件的PKGBUILD
4.chownusername:
usergroup./localmakepkg 要以非root身份进行
5.exit 退出su
6.cdlocal
7.cp-r../community/x11/dwm./ 从ABS中拷贝dwm的内容
8.cddwm
下面不用我说了,你在这个目录里可以看到三个文件PKGBUILD、dwm.install、config.h。
你于是可以用makepkg和pacman-U来按照自己喜欢的方式安装dwm。
OK,你实际已经清楚了解了ABS和pacman的关系,那么AUR又和ABS还有pacman有什么联系呢?
说的直白一点,你上传到AUR的PKGBUILD要足够“有品”才能直接通过pacman使用。
对于“有品”,我是这样定义的。
你的PKGBUILD要有很多人用(很多人投票),没有恶意代码,没有太多的Bug……而判定你的PKGBUILD够不够“有品”的人是一些叫作TU(TrustedUser)的人。
这些人的工作是检查AUR,关注那些特别受欢迎的PKGBUILD。
之后,他会仔细检查,确定这些PKGBUILD是不是安全。
然后,他们会给这些PKGBUILD打上安全的标签,并且把这些PKGBUILD从unsupported(我们上传的PKGBUILD一开始都是在unsupported中)移到community的Repo中。
在communityrepo里面的PKGBUILD会提前编译好,如果你在/etc/pacman.conf中开了communityrepo,你就可以直接使用这些软件的二进制包了。
也许有一天,你当初上传的PKGBUILD变得特别重要,这个软件可能被移到testing,extra或者core的repo中。
补充一点,testingrepo里面一般是需要测试,又准备放到core或者extra中的软件。
Archlinux就是这样,非常灵活。
既有pacman这样好的二进制包管理工具,又有ABS和AUR这样方便的源代码服务。
通过ABS,你可以完全控制你自己的系统到底是如何建立的。
如果在pacman-Ss的时候找不到一个软件,你可以到AUR去找,如果还是找不到,为什么不自己试着从源代码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ArchLinux 灵魂