轉(zhuǎn)自:https://blog.csdn.net/taiyang1987912/article/details/41457333
第一部分:PKGBUILD 和 makepkg
其實(shí),我使用 Archlinux 的時(shí)間并不是很長。可是,就是在這半年的時(shí)間內(nèi),我感覺我學(xué)到了很多的東西,對 GNU/Linux 有了更多的了解,也在這個(gè)過程中深深地愛上了 Archlinux 這個(gè)發(fā)行版。
首先聲明一下,我不是一個(gè)程序員,從來沒有寫過真正的 Code,頂多是寫一點(diǎn) scripts,或者做一些簡單的網(wǎng)頁什么的。和很多人一樣,我對計(jì)算機(jī)的接觸是從 DOS/Windows 開始的。Windows 的圖形界面很容易學(xué)。可是時(shí)間長了,Windows 就會(huì)運(yùn)行的越來越慢,我的硬盤上也就會(huì)有很多我根本不知道是什么的東西。而且,在 Windows 上很多東西都是設(shè)定好的,改變起來非常不容易。不要跟我提注冊表,那個(gè)東西實(shí)在是讓我一頭霧水。還有,大部分 Windows 上的軟件都不是自由軟件。這意味著人們很難了解這些軟件內(nèi)部的情況,你可能在毫無察覺的情況下就中了病毒或木馬。
所以,為了能夠完全了解和控制我每天工作生活要用的計(jì)算機(jī),我開始學(xué)著使用 GNU/Linux。我一開始是用 Mandriva(那個(gè)時(shí)候還叫 Mandrake Linux)。后來是 Ubuntu(也包括其他一些 Debian 為基礎(chǔ)的發(fā)行版)。Wow!我一用上 Ubuntu 就有了完全不同的感覺。特別是非常好用的 apt-get,加上龐大的自由軟件庫,讓我大開眼界。可是在使用 Ubuntu 一段時(shí)間以后,我發(fā)現(xiàn)這個(gè)平臺實(shí)在和 Windows 非常相似。Gnome 和 KDE 的界面都是在模仿 Windows。更糟糕的是,Ubuntu 會(huì)在一開始安裝一些亂七八糟的東西,大大影響了我的電腦的運(yùn)行速度。我需要一點(diǎn)一點(diǎn)把我不用的東西去掉,這個(gè)過程真的很不爽。我開始問自己為什么要放棄 Windows 呢?
Ubuntu 有一個(gè)很大很好的用戶社區(qū),很多問題都可以在討論區(qū)得到解決。然而,Ubuntu 的用戶完全要依賴 Maintainer。我就有過這樣的經(jīng)歷,在發(fā)現(xiàn)一個(gè) Bug 后得到很多其他人的確定,可是 Maintainer 遲遲不作修改。還有,也許有很多人都很想用一個(gè)比較新的軟件,但是大家都要等到有人能夠而且愿意作 Maintainer 之后,這個(gè)軟件才會(huì)在 Repository 里出現(xiàn)。我或許能夠在調(diào)試后自己從源代碼編譯,可是我要如何和別人分享我的成果呢?
其實(shí),各種 Linux 發(fā)行版在本質(zhì)上沒有什么不一樣。大家使用的軟件都是要從源代碼編譯生成可以運(yùn)行的二進(jìn)制碼。如果沒有 rpm、apt-get 或者 pacman,我們也是可以快樂生活的。只不過,我們的生活會(huì)變得麻煩一些。如果要從源碼安裝一個(gè)軟件,我們通常是要做如下的步驟:wget http://somewhere.org/source/package.tar.gz(下載源代碼)tar xvzf package.tar.gz (解壓縮)cd package (進(jìn)入源代碼目錄)./configure (設(shè)定)make (編譯)make install (安裝)
如果我們要像這樣安裝一個(gè)兩個(gè)軟件是沒有什么問題的。但是如果我們要對付成百上千的軟件/類庫的話,這樣的土辦法是行不通的。于是出現(xiàn)了不同的 Linux 發(fā)行版,他們之間的區(qū)別只是在于如何管理成百上千的軟件,特別是不同軟件/類庫之間互相依存的關(guān)系,也就是 dependency 的問題。
大多數(shù) Linux 發(fā)行版都是以二進(jìn)制包為基礎(chǔ)的,這其中又分 Redhat(還有 SUSE、Fedora 等)、Debian(還有 Ubuntu、PCLinux 等)和 Slackware 陣營。為了解決管理大量軟件包的問題,這些發(fā)行版采取了這樣一個(gè)辦法。他們找了一群大牛程序員來作 Maintainer,這些 Maintainer 負(fù)責(zé)把源代碼編譯成二進(jìn)制碼,加上一些控制信息(比如如何安裝、dependency 等),然后一起打包放在服務(wù)器上。所以,最終用戶根本不用接觸源代碼。如果你有興趣的話,你可以抓一個(gè) Debian 的 DEB 文件下來研究一下:wget http://somewhare.org/package.debar vx package.deb
你會(huì)發(fā)現(xiàn)你多了三個(gè)文件:debian-binarycontrol.tar.gzdata.tar.gz
然后再用 tar tzvf 命令看一看 control.tar.gz 和 data.tar.gz 里面有什么東東,你就明白神奇的 dpkg/apt-get 是怎么一回事情了。
二進(jìn)制包固然是很方便,但是這種辦法有一個(gè)很大的問題。那就是最終用戶受到 Maintainer 很大的控制。比如說,我們并不知道 Maintainer 在編譯的過程中是如何設(shè)定的(./configure)。如果我們要用不同的設(shè)定,就要自己從源代碼從頭開始。另外,如果某一個(gè) Maintainer 心術(shù)不正,在二進(jìn)制包里面加了木馬程序,我們這些最終用戶是很難查覺的。還有,設(shè)想一下如果某一個(gè) Maintainer 外出休假了,那么你的軟件也就不能及時(shí)更新了。
所以,也有一些發(fā)行版采取了完全不同的辦法,這些發(fā)行版是以源代碼為基礎(chǔ)的。Gentoo 就是其中的代表。如果你用過 Gentoo 你就會(huì)知道 ebuild 文件。你如果有興趣,可以從 http://gentoo-package.com 抓一個(gè) ebuild 文件研究一下。你會(huì)明白 Gentoo 的用戶其實(shí)從 Gentoo 得到的只有這些 ebuild 文件,在每一個(gè) ebuild 文件里包含了安裝使用一個(gè)軟件需要的所有信息(從哪里下載源代碼、如何編譯、如何安裝還有 Dependency 的問題等)。之后,Gentoo 的用戶用 emerge 命令按照 ebuild 文件的指示編譯、安裝一個(gè)軟件。這樣做的好處是,Gentoo 的用戶可以一目了然地了解每一個(gè)軟件的編譯、安裝的過程。如果需要的話,Gentoo 的用戶可以修改 ebuild,按照自己的需要編譯一個(gè)軟件。
我也用過 Gentoo。不過對于我這樣的初學(xué)者,Gentoo 實(shí)在是太復(fù)雜了,有太多的參數(shù)要設(shè)定,ebuild 的編寫也不是那么簡單。還有,Gentoo 幾乎不提供任何二進(jìn)制包,所以絕大部分的軟件都要從源代碼編譯,這是一個(gè)非常慢的過程。其實(shí)在大部分情況下,用戶對一些軟件的設(shè)定都是差不多的,沒有必要讓每一個(gè) Gentoo 的用戶都從頭編譯。所以,我需要找到一個(gè)發(fā)行版,既有 Debian 的易用性,又有 Gentoo 的靈活性。
我因此找到了 Archlinux。那么 Archlinux 又是如何解決從源代碼到二進(jìn)制碼的問題呢?Archlinux 使用了 makepkg 這樣一個(gè)工具。makepkg 會(huì)按照 PKGBUILD 文件生成一個(gè)二進(jìn)制包。有些時(shí)候,makepkg 還需要 install 文件(主要用來顯示提示信息、備份用戶設(shè)置等)和其他的配置文件。那么 PKGBUILD 是什么呢?PKGBUILD 和 Gentoo 的 ebuild 一樣,包含了安裝使用一個(gè)軟件需要的所有信息。下面是 dwm(一個(gè)非常非常簡捷、高效的窗口管理器)的 PKGBUILD 文件:
pkgname=dwm 軟件名稱pkgver=4.7pkgrel=1 版本信息pkgdesc="A dynamic window manager for X"url="http://www.suckless.org/wiki/dwm" 軟件說明和網(wǎng)站arch=('i686' 'x86_64') 適用平臺license=('MIT') 版權(quán)depends=('libx11') Dependencyinstall=dwm.install install 文件source=(http://www.suckless.org/download/$pkgname-$pkgver.tar.gz \? ? config.h) 要下載的源文件md5sums=('827b128514a3edb87e208e84fee0eb3f'? ? ? ? '395e9a25f65605c4891e74c644b91530') md5 驗(yàn)證碼
build() {
? cd $startdir/src/$pkgname-$pkgver
cp ../config.h .
make X11INC=/usr/include/X11 X11LIB=/usr/lib/X11 || return 1
? make PREFIX=/usr DESTDIR=$startdir/pkg install || return 1
install -m644 -D LICENSE $startdir/pkg/usr/share/licenses/$pkgname/LICENSE && \
install -m644 -D README $startdir/pkg/usr/share/doc/$pkgname/README
} 編譯的過程
我們可以注意到在“編譯的過程”這個(gè)部分,很多代碼都和我們在 shell 里編譯的命令一樣。對!Archlinux 不要求用戶學(xué)習(xí)太多新的東西,PKGBUILD 很容易理解,因?yàn)槔锩娑际腔镜?shell 命令。
好,我們把 PKGBUILD,dwm.install 和 config.h(dwm 比較特殊,config.h 包含所有的配置信息,所以要在編譯之前提供。其他的軟件大多依靠外部的配置文件,像是 .bashrc 等)放在一個(gè)新的目錄里之后。我們執(zhí)行:
makepkg
之后,你會(huì)發(fā)現(xiàn)這個(gè)目錄里出現(xiàn)了一些新的東西,包括:dwm-4.7-1-x86_64.pkg.tar.gz dwm-4.7.tar.gz
兩個(gè)文件,還有兩個(gè)目錄srcpkg
通過比較這些文件、目錄里的內(nèi)容和 PKGBUILD,你就會(huì)明白 makepkg 到底做了些什么:
根據(jù) source 里的內(nèi)容下載了源代碼文件 dwm-4.7.tar.gz;
通過 md5 驗(yàn)證碼確定下載的源代碼文件和 PKGBUILD 的作者使用的是一致的;
把源代碼文件解壓縮到 ./src/$pkgname-$pkgver (也就是 ./src/dwm-4.7);
按照 build() 里的內(nèi)容編譯源代碼,并把編譯好的內(nèi)容放在 ./pkg 里;
在 ./pkg 里加上其他的一些信息,包括 .PKGINFO 和 .INSTALL,也就是 dwm.install 的拷貝;
把 ./pkg 里面的內(nèi)容打包形成 dwm-4.7-1-x86_64.pkg.tar.gz。
那么,我們有了一個(gè) .pkg.tar.gz 這樣一個(gè)二進(jìn)制包之后,我們要如何安裝呢?我們要使用這樣一個(gè)命令:
pacman -U dwm-4.7-1-x86_64.pkg.tar.gz
這個(gè)命令又完成了那些事情呢?
首先,二進(jìn)制包被解壓縮;
按照 .INSTALL 的內(nèi)容執(zhí)行一定的命令;
二進(jìn)制包里面的內(nèi)容會(huì)被拷貝到相應(yīng)的目錄(你注意到二進(jìn)制包內(nèi)的目錄結(jié)構(gòu)了嗎?);
在 /var/lib/pacman/local 這個(gè)目錄中建立 dwm-4.7-1 這樣一個(gè)目錄;
這個(gè)目錄里包含了四個(gè)文件 depends、desc、files 和 install;
depends 記錄了 dependency,desc 是軟件說明,files 記錄了每一個(gè)安裝到系統(tǒng)上的文件的路徑,install 就是 .INSTALL 的拷貝。
從這以后,pacman 正是通過檢查 /var/lib/pacman/local 里的內(nèi)容來管理軟件包的。比如說,在執(zhí)行 pacman -R dwm 的過程中,pacman 首先在 /var/lib/pacman/local 找到了 dwm-4.7-1 這個(gè)目錄,然后根據(jù) files 的內(nèi)容刪除已安裝的內(nèi)容。Dependency 也是通過 depends 計(jì)算的。
OK!我已經(jīng)解釋了 PKGBUILD 的基本結(jié)構(gòu)和 makepkg 的過程。基本上是兩步:從 PKGBUILD 到 .pkg.tar.gz 包,再從二進(jìn)制包安裝到系統(tǒng)。這樣一種辦法有很多好處。首先,PKGBUILD 非常方便用戶交流。我的一個(gè) PKGBUILD 如果編譯成功了,就可以給別人用。PKGBUILD 的內(nèi)容一目了然,不但有助于學(xué)習(xí),也再不用擔(dān)心木馬的問題了。
另外,我通過一個(gè)小例子展現(xiàn) Archlinux 的靈活性在哪里。比如,我要對 dwm 有自己的設(shè)置,也就是自己的 config.h,那我應(yīng)該怎么做呢?我會(huì)做如下的事情:
編輯 config.h,另存為 myconfig.h;
編輯 PKGBUILD,把所有的 config.h 替換為 myconfig.h;
把 pkgrel 變成 2。
之后通過 makepkg,我會(huì)得到一個(gè)文件 dwm-4.7-2-x8664.pkg.tar.gz,這個(gè)和原來的 dwm-4.7-1-x8664.pkg.tar.gz 可以區(qū)別開。我可以安裝 dwm-4.7-2-x8664.pkg.tar.gz,如果有問題我還可以通過 pacman -U dwm-4.7-1-x8664.pkg.tar.gz 來安裝原來的二進(jìn)制包。我還可以用同樣的辦法生成一系列的 .pkg.tar.gz 包,這在軟件的安裝調(diào)試過程中非常有用。
好了,今天就講到這里。有些人也許變得更疑惑了,因?yàn)樵?TOY 的“打造完美的 Linux 桌面 — Arch Linux 2007.08-2”系列中并沒有提到 PKGBUILD 的問題,所有的軟件都是通過 pacman -S 來安裝的。
沒關(guān)系,如果你理解了 makepkg 和 PKBGUILD,那么在我下一次談到 AUR 和 ABS 之后,你就能完全明白了。
實(shí)例:
# Maintainer: Sven-Hendrik Haase
# Contributor: jepaan
pkgname=client
pkgver=1.0
pkgrel=1
pkgdesc="tools"
arch=('i686' 'x86_64')
license=('MIT')
depends=('qt4' )
makedepends=('qt4')
install=${pkgname}.install
url=('')
source=("./${pkgname}-${pkgver}.tar.gz")
md5sums=('SKIP')
build() {
? ? cd ${srcdir}/${pkgname}-${pkgver}
? ? qmake-qt4
? ? make
}
package()? {
? ? cd ${srcdir}/${pkgname}-${pkgver}
? ? #make PREFIX=/usr DESTDIR=$pkgdir install
? ? mkdir -p ${DESTDIR}${PREFIX}/bin
? ? mkdir -p ${pkgdir}/usr/share/icons
? ? mkdir -p ${pkgdir}/usr/share/applications
? ? install -Dm755 client ${pkgdir}/usr/bin/client
? ? install -Dm755 ${srcdir}/client_logo.png? ${pkgdir}/usr/share/icons/
? ? install -Dm644 ${srcdir}/client.desktop ${pkgdir}/usr/share/applications/client.desktop
}
pre_remove() {
? pid=`ps -ef | grep client | grep -v grep | grep -v pacman | awk '{print $2}'`
? if [ -n "$pid" ]; then
? ? kill -9 "$pid"
? fi
}
makepkg -p PKGBUILD_client? 或 makepkg -f -p PKGBUILD_client
我非常高興看到我關(guān)于 PKGBUILD 和 Makepkg 的文章在?LinuxTOY?受到了歡迎。我想先針對一些讀者的回復(fù)談一點(diǎn)題外話。我先聲明我一點(diǎn)也沒有要詆毀 Debian 或 Gentoo 的意思,他們都是非常偉大的發(fā)行版,都有自己的特色。其實(shí)大多數(shù)的發(fā)行版都可以自己去定制,從而達(dá)到類似的目的。比如說,有的人提到 Gentoo 也有二進(jìn)制包,比如像 Openoffice 這樣的怪物。然而,我個(gè)人以為比較不同的發(fā)行版關(guān)鍵是要看它最核心的設(shè)計(jì)思想。比如說,Gentoo 根本就不是為了使用二進(jìn)制包設(shè)計(jì)的。你要是都想用二進(jìn)制包,就別費(fèi)勁用 Gentoo 了。關(guān)于 Debian 陣營的發(fā)行版,我也想講幾句。正如一些朋友的回復(fù)所講,DEB/apt-get 是非常好的管理工具,軟件庫也非常的大。我的筆記本現(xiàn)在還在用 elive,也是 Debian 的分支。我不喜歡 Debian 系列的發(fā)行版的原因不是它不能定制,而是他們非常依靠 Maintainer。我們可以自己做 DEB 包,然后呢?你的 DEB 包什么時(shí)候才能進(jìn)入軟件庫呢?還有,只有你自己知道你的 DEB 是怎么做的,別人不能了解你編譯打包的過程。Debian 本身打包的過程沒有 Archlinux 的 PKGBUILD 來的簡單明了。只要比較 Debian 的 Maintainer 手冊和 Archlinux 的 Wiki 就可以看出這一點(diǎn)。
選擇什么樣的發(fā)行版完全是要看個(gè)人需要。我選擇 Archlinux,是因?yàn)樗?dāng)初設(shè)計(jì)的時(shí)候就是要滿足“KISS Rule”,也就是“Keep It Simple, Stupid”。或者說像愛因斯坦講得:“Everything should be made as simple as possible, but no simpler”。Archlinux 的所有配置基本都是非常相似的腳本,加上簡單靈活的 PKGBUILD 和 pacman,其實(shí)關(guān)于 Archlinux 本身真的沒有太多新的東西要學(xué)習(xí)。大家有興趣可以看看“Arch Compared To Other Distros”。Archlinux 實(shí)際上是強(qiáng)迫用戶從零開始自己定制自己的系統(tǒng),在這個(gè)過程中也就真正了解了 Linux 本身。
好了,現(xiàn)在言歸正傳談一談 AUR 和 ABS。
AUR 是指 Archlinux User-community Repository,也就是 Archlinux 用戶社區(qū)的軟件庫。我們現(xiàn)在回憶一下在 Archlinux 中我們把源代碼變成可以運(yùn)行的二進(jìn)制碼需要哪些文件。我們需要:PKGBUILD,可能還有 .install 文件,加上一些補(bǔ)丁和必要的配置文件(像 dwm 的 config.h)。這樣就足夠了!當(dāng)你成功使用 PKGBUILD 編譯安裝了一個(gè)新軟件之后就可以通過 AUR 和其他的人分享你的成果了。具體的步驟是:
tar -zcvf package.tar.gz package-dir?把 package-dir 中所有所需的文件打包(包括 PKGBUILD,.install,patch 和其他的 config 等)
前往?http://aur.archlinux.org?選擇"Submit”(參照下圖),并把你的 package.tar.gz 上傳
AUR 會(huì)自動(dòng)根據(jù)你的 PKGBUILD 內(nèi)容把你的 Package 加到 AUR 里來。就是這么簡單!那么有人會(huì)問:“別的用戶要如何使用 AUR 呢?”
這個(gè)就更簡單了,我們還是用一張截圖來解釋:
首先下載“Tarball”(紅色的圈圈),這個(gè) Tarball 和你上傳的內(nèi)容是一樣的,無非是 PKGBUILD 什么的;
tar xvzf package.tar.gz?然后解壓縮;
然后的步驟你應(yīng)該知道了,那就是 makepkg 還有 pacman -U。
不過需要提醒的是,為了對自己負(fù)責(zé),你應(yīng)該在編譯之前讀一下 PKGBUILD 和 .install 的內(nèi)容,確定里面沒有惡意的代碼。另外,我建議你一般不要以 root 的身份進(jìn)行 makepkg。其實(shí),makepkg 本身也做了這樣的限制,你不加— asroot 的選項(xiàng)是不能 makepkg 的。這是因?yàn)椋琺akepkg 會(huì)執(zhí)行 PKGBUILD 里 build() 部分的代碼。想一想,如果有人在 build() 這部分加了這么一句“rm -r /home”,你就死定了!
如果你注意到,在每個(gè) AUR Package 的網(wǎng)頁上都有投票(綠色的圈圈)和回復(fù)的功能(藍(lán)色的圈圈)。這些是幫助用戶反饋意見的。
有些性急的朋友可能要問這個(gè) AUR 和 pacman 取得的二進(jìn)制包有什么聯(lián)系?你應(yīng)該記住,只要是 Archlinux,所有的東西一定是從 PKGBUILD 開始的。你通過 pacman 得到的二進(jìn)制包也是從 PKGBUILD 編譯而成的。在你的 /etc/pacman.conf 有很多 Repository 的設(shè)置,其中的 [core] 和 [extra] 是由 Archlinux 的核心成員維護(hù)的,這些軟件庫里的軟件由于特別重要,每個(gè)人都要用,所以 Archlinux 的開發(fā)人員把二進(jìn)制包提前做好,你就可以通過 pacman 取得了。然而,和 Debian 的 Maintainer 機(jī)制不一樣,最終的用戶可以很容易的了解這些軟件的編譯過程。如果需要的話,最終用戶可以改變設(shè)置,重新編譯這些軟件。最典型的情形就是自己編譯 kernel 的時(shí)候。這要通過 ABS 來解釋清楚。ABS,也就是 Archlinux Build System。首先我們要安裝 ABS:
pacman -S abs
vi /etc/abs/abs.conf?編輯 ABS 的配置文件;
你會(huì)看到這樣一行 SUPFILES=(core extra !unstable community !testing),把你需要的 Repo 之前的 ! 去掉;
然后以 root 身份執(zhí)行 abs
之后又要如何使用 ABS 呢?ABS 所作的事情無非是把所有 Repo 里的軟件的 PKGBUILD 下載到你本地的硬盤中。這些 PKGBUILD 都放在了 /var/abs 中。你能通過 pacman 直接安裝的二進(jìn)制包其實(shí)也都是按照 ABS 的內(nèi)容編譯的。下面我還是用 dwm 的例子解釋 ABS 的使用:
su
cd /var/abs?你可以看到這個(gè)目錄里有 core,extra,community 三個(gè)子目錄,正如 abs.conf 中的設(shè)定;
mkdir local?建立一個(gè) local 目錄,用來放你自己需要的軟件的 PKGBUILD
chown username:usergroup ./local makepkg?要以非 root 身份進(jìn)行
exit?退出 su
cd local
cp -r ../community/x11/dwm ./?從 ABS 中拷貝 dwm 的內(nèi)容
cd dwm
下面不用我說了,你在這個(gè)目錄里可以看到三個(gè)文件 PKGBUILD、dwm.install、config.h。你于是可以用 makepkg 和 pacman -U 來按照自己喜歡的方式安裝 dwm。
OK,你實(shí)際已經(jīng)清楚了解了 ABS 和 pacman 的關(guān)系,那么 AUR 又和 ABS 還有 pacman 有什么聯(lián)系呢?說的直白一點(diǎn),你上傳到 AUR 的 PKGBUILD 要足夠“有品”才能直接通過 pacman 使用。對于“有品”,我是這樣定義的。你的 PKGBUILD 要有很多人用(很多人投票),沒有惡意代碼,沒有太多的 Bug……而判定你的 PKGBUILD 夠不夠“有品”的人是一些叫作 TU(Trusted User)的人。這些人的工作是檢查 AUR,關(guān)注那些特別受歡迎的 PKGBUILD。之后,他會(huì)仔細(xì)檢查,確定這些 PKGBUILD 是不是安全。然后,他們會(huì)給這些 PKGBUILD 打上安全的標(biāo)簽,并且把這些 PKGBUILD 從 unsupported(我們上傳的 PKGBUILD 一開始都是在 unsupported 中)移到 community 的 Repo 中。
在 community repo 里面的 PKGBUILD 會(huì)提前編譯好,如果你在 /etc/pacman.conf 中開了 community repo,你就可以直接使用這些軟件的二進(jìn)制包了。也許有一天,你當(dāng)初上傳的 PKGBUILD 變得特別重要,這個(gè)軟件可能被移到 testing,extra 或者 core 的 repo 中。補(bǔ)充一點(diǎn),testing repo 里面一般是需要測試,又準(zhǔn)備放到 core 或者 extra 中的軟件。
Archlinux 就是這樣,非常靈活。既有 pacman 這樣好的二進(jìn)制包管理工具,又有 ABS 和 AUR 這樣方便的源代碼服務(wù)。通過 ABS,你可以完全控制你自己的系統(tǒng)到底是如何建立的。如果在 pacman -Ss 的時(shí)候找不到一個(gè)軟件,你可以到 AUR 去找,如果還是找不到,為什么不自己試著從源代碼開始,寫一個(gè) PKGBUILD 然后放到 AUR 中和別人分享呢?
說到這里,我希望我已經(jīng)把 Archlinux 最核心的東西講明白了。有些人說我的文章寫得比 wiki 里的文章清楚。其實(shí),我寫的東西只是在順序上不一樣。我是從 PKGBUILD 開始講到 AUR 和 ABS,再到 pacman。這個(gè)順序和 Archlinux 實(shí)際的開發(fā)過程是一致的,所以邏輯上容易理解很多。如果你從 pacman 入手反過來讀,你可能就完全錯(cuò)過了理解 Archlinux 核心概念的機(jī)會(huì)。
TOY 會(huì)很快再寫一篇關(guān)于 yaourt 的文章,yaourt 是一個(gè)把 pacman 和 AUR 結(jié)合起來的很好用的工具。有了 yaourt,你不需要去 AUR 網(wǎng)站也能在 shell 下直接取得 AUR 的 package,還方便了投票的過程。
如果大家對某些問題感興趣,可以留言告訴我,我會(huì)盡量把我了解的用這樣比較容易理解的文章與大家交流。
在這一部分中,我們將簡單介紹 Yaourt 的安裝和使用。此部分上接?PKGBUILD 和 makepkg、AUR 和 ABS。
就一般情況而言,當(dāng) Archlinux 用戶需要使用 AUR 中的包時(shí),往往會(huì)執(zhí)行到?AUR 官方網(wǎng)站查找所需的包、下載該包的 Tarball 文件、在命令行下對 Tarball 文件解壓、通過 makepkg 編譯打包、最后使用 pacman 安裝這樣一個(gè)過程。仔細(xì)打量這個(gè)過程,你是否覺得稍微有些繁瑣呢?有解決的方案嗎?回答是肯定的。這就是我們今天將要介紹的主角──Yaourt。
Yaourt 簡介
Yaourt 是一個(gè)由 Julien Mischkowitz 所編寫的 Bash 腳本,它是將 Pacman 與 AUR 這兩者相結(jié)合的絕佳工具。通過 Yaourt 安裝 AUR 中的包十分方便,它不僅簡化了上述繁瑣的過程,而且把這一過程半自動(dòng)化,使用者只需在它的交互模式中簡單的回答幾個(gè)問題即可。此外,Yaourt 支持將結(jié)果以鮮亮的顏色輸出,非常搶眼。
安裝 Yaourt
除了在 Archlinux 的 AUR 中可以找到?Yaourt?外,archlinuxfr 這個(gè)源中也包含 Yaourt。我們采用后者來安裝 Yaourt。首先,將下列內(nèi)容添加到 /etc/pacman.conf 文件:[archlinuxfr]Server = http://repo.archlinux.fr/i686
如果你的系統(tǒng)是 64 位,那么可以使用:[archlinuxfr]Server = http://repo.archlinux.fr/x86_64
接著,我們可以執(zhí)行下面的命令來安裝 Yaourt:
pacman -Sy yaourt
另外,我們將 aurvote 和 customizepkg 這兩個(gè)包也裝上,前者用于對喜歡的包投票,而后者是定制 PKGBUILD 所需的:
pacman -S aurvote customizepkg
同時(shí),你需要為 aurvote 建立一個(gè)配置文件 .aurvote (位于 ~/ 目錄下):user=你的 AUR 帳號pass=該帳號的密碼
如果你沒有 AUR 帳號,可到?http://aur.archlinux.org/account.php?注冊一個(gè)。
Yaourt 實(shí)戰(zhàn)
為了說明 Yaourt 的使用,我們以一個(gè)實(shí)例來進(jìn)行。譬如,我對?Phatch?這個(gè)批量圖片處理程序非常喜歡,我希望在 Archlinux 中安裝它。首先,我們來看一下,在 Archlinux 中是否存在 Phatch:
yaourt phatch
Yaourt 在搜索后返回如下結(jié)果:1 aur/phatch 0.1.bzr435-1 Phatch is a simple to use cross-platform GUI Photo Batch Processor.==> Enter n° (separated by blanks, or a range) of packages to be installed Example: '1 6 7 8 9' or '1 6-9'==> ----------------------------------------------
從該結(jié)果我們可以斷定,Phatch 在 Archlinux 的 AUR 中。現(xiàn)在,我們只需按 1 就可以安裝它了。
在顯示一些輸出信息后,Yaourt 會(huì)讓你作出第一個(gè)選擇:是否編輯 PKGBUILD 文件。按 Y 回答并輸入你喜歡的文本編輯器后,你可以針對 PKGBUILD 的內(nèi)容進(jìn)行修改。==> Edit the PKGBUILD (recommended) ? [Y/n] ("A" to abort)==> ----------------------------------------------
然后,Yaourt 會(huì)詢問是否繼續(xù)編譯。我們的回答當(dāng)然是 Y。==> Continue the building of 'phatch'? [Y/n]==> ----------------------------------------------
接著,Yaourt 詢問是否安裝已編譯好的包,同樣回答 Y 即可。==> Continue installing 'phatch'? [Y/n]==> [v]iew package contents [c]heck package with namcap==> ----------------------------------------------
最后,Yaourt 將檢查投票情況,并問你是否要投票,按 Y 選擇投票,按 n 表示不投票。==> Checking for phatch's vote statusYou have already voted for phatch inclusion/keeping in [community]
綜觀 Yaourt 的命令行選項(xiàng),與 Pacman 非常相似。關(guān)于 Yaourt 的更加詳細(xì)的用法,通過 man yaourt 可以獲得參考。其實(shí),除了從 AUR 安裝包外,Yaourt 也可以從 Archlinux 的源安裝包,此不贅述。
參考:
PKGUILD:https://wiki.archlinux.org/index.php/PKGBUILD_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29
ABS:https://wiki.archlinux.org/index.php/Arch_Build_System_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29
Archlinux:https://linuxtoy.org/archives/archlinux-pkgbuild-aur-and-abs.html
pkg.tar.xz包:http://ftp.isoft.zhcn.cc/
?在archlinux中用gcc編譯一個(gè)程序的時(shí)候,gcc中途退出,提示:virtual memory exhausted: Cannot allocate memory。
?????? 后來我終于注意到,在開的應(yīng)用程序多的時(shí)候,編譯就出問題,有時(shí)會(huì)出現(xiàn)上述提示,有時(shí)會(huì)直接卡到X崩潰;但應(yīng)用程序比較少的時(shí)候,編譯就很順利。那個(gè)時(shí)候,我終于意識到,跟要編譯的程序的代碼無關(guān),好像跟自己機(jī)器的內(nèi)存有關(guān)。
于是,在編譯的時(shí)候,果斷開?htop?觀察,發(fā)現(xiàn)gcc編譯還是很吃內(nèi)存的,本來只有2GB的內(nèi)存,開個(gè)firefox本來就要占不少,開個(gè)Emacs又占去不少,再加上雜七雜八的,留給gcc的內(nèi)存就只剩下400MB左右了,然后一運(yùn)行make,內(nèi)存就直接飆升,直到吃滿。
??????? 我終于意識到當(dāng)初在裝Arch時(shí)犯下的錯(cuò)誤,2GB的內(nèi)存是多么少,而swap空間又是多么重要。好在,Linux系統(tǒng)的可配置性極高,但如果要調(diào)整磁盤分區(qū)增加一個(gè)swap分區(qū)的話,可能不太現(xiàn)實(shí),萬一把磁盤弄掛掉那悲劇可就不是一點(diǎn)兩點(diǎn)了,好在普通文件也能達(dá)到同樣的效果,于是,果斷創(chuàng)建一個(gè)文件來作為swap空間。
創(chuàng)建一個(gè)文件:
# dd if=/dev/zero of=/swapfile bs=1M count=512
利用dd命令在根分區(qū)創(chuàng)建了一個(gè)swapfile文件,大小為512MB。
給這個(gè)文件加上正確的權(quán)限:
# chown root:root /swapfile
# chmod 0600 /swapfile
讓只有root用戶有權(quán)限訪問。
設(shè)置swap空間:
# mkswap /swapfile
激活這個(gè)剛剛創(chuàng)建的swap空間:
# swapon /swapfile
在經(jīng)過以上步驟后,這個(gè)文件就可以作為swap空間來用了,可以使用?free -m?命令查看swap空間的使用情況。
上述步驟后的swap空間在重啟之后是需要手動(dòng)再次設(shè)置的,所以,如果要在啟動(dòng)時(shí)就自動(dòng)激活的話,需要將下面的關(guān)于swap文件的配置行寫入/etc/fstab?:
/swapfile none swap defaults 0 0