歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Slackware Linux技術內幕之包管理機制

鄭重聲明:本文從行文構思到章節安排均由本人獨自完成,未參考任何網文,書籍、雜志。沒有任何侵權行為。文中內容如果是參考網文的,我均已做明確標示.

簡介:包管理機制是Slackware區別於其他Linux 發行版的重要的甚至是本質的區別。Slackware的包管理機制簡單、靈活、高效、安全,用戶透明性大,可定制程度高。因為Slackware的標准包管理工具皆為Shell腳本,這樣,你可用簡單而又方便的對其進行修改、移植。但是也存在一些不足之處,比如沒有靈活的網絡安裝模式等。本文對 Slackware的包管理進行全面詳細的介紹。

第一部分 Slackware標准包管理

一、簡介

包管理機制是Slackware區別於其他Linux 發行版的重要的甚至是本質的區別。Slackware的包管理機制簡單、靈活、高效、安全,用戶透明性大,可定制程度高。因為Slackware的標准包管理工具皆為Shell腳本,這樣,你可用簡單而又方便的對其進行修改、移植。但是也存在一些不足之處,比如沒有靈活的網絡安裝模式等。本文對 Slackware的包管理進行全面詳細的介紹。

二、基本架構

所使用的文件及目錄:

/bin/installpkg:用於安裝Slackware包

/sbin/removepg:用於刪除Slackware包

/sbin/explodepkg:用於解壓Slackware包

/sbin/upgradepkg:用於更新Slackware包

/sbin/makepkg:用於制做Slackware包

/sbin/pkgtool:用於安裝|刪除|查看Slackware包

/bin/tar-1.13:用於安裝、解壓等

/bin/dialog:用於生成基於文本的圖形界面

install-packages:Slackware CD下使用的shell腳本

tagfile:用於說明包的安裝優先級別

/var/log/packages:保存已安裝的Slackware包的基本信息

/var/log/scripts:保存已安裝的Slackware包的安裝腳本

/var/log/removed_packages:保存已刪除的Slackware包的基本信息

/var/log/removed_scripts:保存已刪除的Slackware包的安裝腳本

三、命令使用說明

1.explodepkg---解壓

它主要用來對Slackware的tgz包進行維護,只是簡單的解壓.tgz包,並不運行解壓目錄下的install或/var/log/setup目錄下的安裝腳本。explodepkg解壓tgz包,然後通過對其中的文件進行修改、升級,最後再用 makepkg制做Slackware可用的tgz包。explodepkg也可以 對多個tgz 包逐個進行解壓,格式如下:

#explodepkg package1.tgz package2.tgz ...

提示:explodepkg實際上用的是tar進行解壓,運行explodepkg和運行tar xzvf package1.tgz效果完全一樣!

警告:explodepkg(實際上所有的那些工具包括installpkg|removepkg等)所用的tar版本不得>1.13(默認使用1.13),否則不穩定。查看/bin目錄,可以發現裡面同時有tar-1.13和tar-1.14.

2.installpkg---安裝

使用Slackware,你免不了用用到它。installpkg提供了豐富的參數,使得包的安裝簡單、靈活、安全而又 快捷。下面是常用參數簡介:

-warn:在標准輸出上顯示出將安裝哪些包,哪些包將會被覆蓋,強烈建議使用該選項!

-root:自定義安裝目錄而不采用默認的目錄。在制做LiveCD時你也許少不了要使用該項。

-menu:使用該項後會跳出一個文本圖形,讓你選擇安裝/不安裝/退出。一般用於其他程序調用installpkg進行安裝的情況,當然你喜歡圖形界面,也可以試試.

-tagfile:指定安裝使用的tagfile文件,該文件用於說明包的安裝屬性(自動|建議|可選|忽略).

其他的參數請man installpkg.

使用實例:

#installpkg package.tgz
#installpkg -warn package.tgz
#installpkg -warn -install package.tgz
#installpkg -menu -root /usr/local package1.tgz package2.tgz
#installpkg -menu -root /usr/local -tagfile/b]./tagfile package1.tgz package2.tgz

3.removepkg --刪除

removepkg提供多種格式讓你可用非常輕松的刪除已經安裝的Slackware包,刪除過程會完整的顯示哪些包已被刪除。你可用指定該包的全名、基本名,例如:已經安裝了一個名為test-1.0-i386-1.tgz 的包,那麼可用如下格式進行刪除:

#removepkg test-1.0-i386-1.tgz
#removepkg test-1.0-i386-1
#removepkg test.tgz
#removepkg test

提示:

你可用通過查看/var/log/packages來得知你已經安裝了哪些Slackware包。

removepkg刪除前會進行包的依賴性檢查(這就是為什麼運行該命令一段時間後你才能看到deleting的輸出信息),並且只刪除那些沒有依賴關系的包。可見其安全性!

removepkg刪除軟件包後會將/var/log/packages下的相應項移至/var/log/removed_packages.而將安裝腳本從/var/log/scripts移至/var/log/removed_packages

removepkg也提供一些可選參數,請man removepkg.

4.upgradepkg --更新

upgradepkg將一個老的Slackware .tgz包升級到一個新的版本。它將新版本的軟件包安裝到系統上,並且刪除那些在新版本中沒有的老版本的文件。

如果新老版本的軟件包名字一樣(比如都為package.tgz)。那麼我們只要如下操作,就可完成包的更新:

#upgradepkg package.tgz

通常新老版本的Slackware包名字是不一樣的,比如一個是package1.pkg(老),一個是package2.tgz(新),那麼,操作為:

#upgradepkg package1.tgz%package2.tgz

注意:

%前後不能有空格!

進行更新前,請備份相應的配置文件(比如/etc下)。如果要強行安裝新的配置文件,請手動刪除老配置文件。

提示:

如果要指定在某目錄下(比如/mnt)進行更新而不是默認的/,那麼操作如下:

ROOT=/mnt upgradepkg package.tgz

一些參數提供額外的功能,使更新更靈活方便。具體請man 8 upgradepkg.

5.makepkg --制作

1)為什麼要制作Slackware包?

我認為:

並非所有的軟件都有Slackware支持的tgz包供使用,自己制作可以方便下次使用也可提供給別人使用。

使用Slackware包(而不是源代碼)方式進行安裝,可以方便以後對之進行維護(刪除|更新等)。

2)制作方法:

這裡為以制做cce的Slackware包為例,說明makepkg的使用方法。

首先制作一個臨時目錄,以便將所有要制做成軟件包的文件放於此目錄。假設為works,則建立目錄:

# mkdir /works

接著解壓cce-0.51.tar.gz:

# tar zxvf cce-0.51.tar.gz

進入解壓目錄,進行configure,注意configure的參數應該指定安裝目錄為/works,如下:

# cd cce-0.51
# ./configure --prefix=/works

接下來,進行make,make install:

# make && make install

現在/works目錄即為cce的主要程序以及其他文檔的存放點。我們進入該目錄,然後makepkg:

# cd /works; makepkg cce.tgz

makepkg會將/works目錄下的所有文件以tar和GNUzip工具打包壓縮成Slackware可用的.tgz包。如果在此過程中遇到符號鏈接的問題,makepkg會制做一個建立這些文件鏈接的腳本(script),並詢問你是否將這些腳本寫入install/doinst.sh文件中,並將該目錄下的鏈接文件刪除。我們一般選擇yes,讓makepkg自動處理那些鏈接問題。這樣就會生成一個doinst.sh文件(存放該文件的install目錄也會建立),其內容簡單,就是建立這些鏈接的腳本(或者說命令)。當我們使用installpkg進行安裝時,便可使用doinst.sh建立那些符號鏈接。

接下來,makepkg會詢問是否將所有文件的權限設置為755 (rwxr-xr-x)並將所有者設為root.root.基於安全考慮也應選yes.

現在makepkg就開始進行包的制作了,一會兒就好了。現在你就可以使用installpkg安裝/works目錄下的cce.tgz了。當然現在我們可以刪除/works目錄:

# rm -rf /works

包制作已經完成,如果你又想往裡面加入其他文件,或者對其中的文件進行修改,那麼可以使用explodepkg對包進行解壓,增加|修改後,重復以上步驟,直到你滿意為止!

注意:

makepkg制作軟件包只適合於使用autoconf automake 這些自動配制工具規則的軟件。

如果想將編譯好的文件復制到指定目錄,便於制作tgz包,可以在make install 後加上DESTDIR=/YOUR_DIR 或 ROOT=/YOUR_DIR 或 prefix=/YOUR_DIR ( 推薦率由前往後) 。(由hupeng923提供)

最好不在./configure的時候加 --prefix=/YOUR_DIR (想安裝到此目錄除外)。因為在 ./confiure 後加了--prefix=/work 後,編譯出的二進制文件可能會保留指向/work的鏈接,打包成tgz讓別人安裝後,二進制文件可能還會搜索/work的路徑。我自己做過這樣的實驗。(由hupeng923提供)

軟件包的描述文件--slack-desc的制作

這是一個附加(或者非必須)部分,makepkg不會為你建立一個slack-desc文件,為了制作一個標准的Slackware包,我建議大家在制作Slackware時制作此文件!slack-desc也位於install目錄下,該文件要遵循一定的格式,否則不會被顯示!

"#"開始的行為注釋。行長度不得超過表尺的右邊界,共11行,哪怕你的描述沒有那麼多,要要保證有11行,當然這可用空行補上。如下源文件:

# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description. Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in. You must make
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
   |-----handy-ruler--------------------------------------------------------------|
kdebase: kdebase (KDE base package)
kdebase:
kdebase: Core applications for the K Desktop Environment. Included are: kdm
kdebase: (replacement for xdm), kwin (window manager), konqueror (filemanager,
kdebase: web browser, ftp client), konsole (xterm replacement), kicker
kdebase: (application starter and desktop pager), kaudio (audio server),
kdebase: kdehelp (viewer for kde help files, info and man pages), kthememgr
kdebase: (system for managing alternate theme packages) plus other KDE
kdebase: components like kcheckpass, kikbd, kscreensaver, kcontrol, kfind,
kdebase: kfontmanager, kmenuedit, and kappfinder.
kdebase:

6.pkgtool--工具集

簡介:pkgtool可以讓你在交互式的圖形界面下進行包的安裝|刪除,以及查看已安裝的包。當然,通過它我們還可以進行一些基本的系統配置(比如鼠標|時區|Lilo|服務等)。

工作機理:

Current:調用/sbin/installpkg安裝當前目錄下的Slackware支持包。

Other:調用/sbin/installpkg安裝指定目錄下的Slackware支持包。

Remove:掃描/var/log/packages目錄,返回已安裝包的清單。選定欲刪除的包後,調用 / sbin/removepkg進行刪除。

View:掃描/var/log/packages目錄,返回已安裝包的基本包名(除去.tgz剩下的部分)清單。

Floppy:調用/sbin/installpkg安裝指定軟驅設備上的Slackware包。

Setup:使用/var/log/setup目錄下的setup.*文件(比如setup.05.fontconfig)進行基本的系統配置。你可以刪除此目錄下的文件使Setup中設置項也相應刪除。反之,也可以加入自己的setup.文件!

四、Slackware包管理機制的問題

安裝時包的依賴性管理差,默認缺少依賴性包也會安裝上Slackware包。

沒有網絡安裝模式,只能從本地安裝Slackware包。

如果采用的是源代碼方式安裝軟件包,那麼標准包管理機制對這些包的管理維護似乎顯得束手無策。

相應的解決辦法得依靠外來得Slackware包管理工具。

第二部分 外來Slackware包管理工具

一、SWARET ---網絡安裝模式的實現!

1.簡介:

swaret可以進行包的安裝、升級、重裝,下載 Slackware包,補丁、源代碼等等。重要的是,swaret支持依賴性檢查,能很好的跟蹤、解決依賴包的丟失問題。swaret使用多個Slackware

Linux鏡像站通過http/ftp/rsync或者本地軟件庫進行包的安裝。swaret還有i18n支持.

2.安裝:

你可以從網上下載swaret的slackware(. tgz)包進行安裝。推薦從 http://www.linuxpackages.net 下載。最新版本(2004-7-04)為swaret-1.6.2-noarch-1.tgz:

#installpkg swaret-1.6.2-noarch-1.tgz

注意:swaret必須使用到一些工具,比如pkgtool,wget,grep,bc等,如果沒有安裝,請在運行前安裝。

3.配置:

#cp /etc/swaret.conf.new /etc/swaret.conf

現在開始編輯/etc/swaret文件:

VERSION:設置你所使用的Slackware的版本,主要用來解決包的依賴及其他問題,比如設置為 10.想使用Slackware Current你要設置為

VERSION=current。

LANGUAGE:定義狀態以及錯誤信息的輸出使用的語言。很不幸沒有中文,不過你自己可以翻譯/usr/share/swaret-VERSION/swaret.lang.ENGLISH為swaret.lang.CHINESE,然後將此項設置為CHINESE!

ROOT:設置你將要下載的Slackware包的根目錄,例如:

ROOT=ftp://ftp.nluug.nl/pub/os/Linux/distr/slackware/slackware-$VERSION

可以是HTTP/FTP/RSYNC或者本地文件地址。可以設置多個ROOT項。

DEP_ROOT:類似ROOT,但是還包括庫文件的地址。僅當DEPENDENCY=1時使用。

REPOS_ROOT: 定義遠程或者本地軟件庫的地址。

RANDOMR:設置為1,讓swaret隨機選擇你指定的多個slackware包鏡像站。

USEPKGDESC:若為1,匹配Slackware包的描述文件中含有指定關鍵字的包。

EXCLUDE:設置不進行安裝|更新的軟件包,這裡可以使用正則表達式。

DEPENDENCY:是否讓swaret進行依賴性檢查以及處理。1為是,0為否。

DSEARCHLIB:是否讓swaret在本機上搜索ldconfig找不到而又存在於本機上的庫文件。

DSEARCHM:是否使用slocate搜索丟失的庫文件。

MD5CHECK:是否對Slackware包或源代碼進行MD5校驗。默認為1.

GPGCHECK:是否對Slackware包或源代碼進行GPG簽名檢查。

DESC:是否在升級|安裝過程中顯示包的相關信息。

CACHE_DIR:下載的軟件包放在何處。默認為/var/swaret。

LOG:是否將重要信息寫入日志文件。

LOG_FILE:將swaret所有的操作寫入該日志文件。默認為/var/log/swaret。

WARNINGS:是否讓swaret顯示警告信息。

INFORMATION:是否讓swaret顯示信息。

NIC:你通過什麼網絡界面(interface)下載軟件包.例如網卡eth0.

PROGRESS:指定下載進度所采用的顯示格式。

TIMEOUT:規定wget 和 rsync的超時時間界限。

RETRIES:規定wget 和 rsync的重試次數。

PASSIVE_FTP:如果你在防火牆後運行swaret,設置為1。

WGET_PROXY:指定wget使用的代理地址,格式為:

http://proxy.some-domain- name.domain:HTTP_PROXY_PORT

RSYNC_PROXY:指定RSYNC使用的代理地址,格式為Host:Port。

4.使用:(詳見swaret的how_to_use文件)

使用舉例:

#swaret --upgrade package
#swaret --install package
#swaret --reinstall package
#swaret --remove package
#swaret --get package
#swaret --dep package

二、slapt-get/slapt-gui---使用標准Slackware管理工具,模擬Debian的apt-get!

slapt-gui是slapt-get的一個圖形用戶界面,這裡我只詳細介紹slapt-get.

1.主要特色:

使用標准的Slackware包管理工具(installpkg 等).

支持網絡安裝模式,且可指定多個鏡像站,還支持斷點續傳。

支持使用正則表達式進行搜索。

方便從一個Slackware發行版升級到另一個。

方便的解決包的依賴、沖突等問題。

注意:要求Slackware的版本為9.1或更高。其他要求預先安裝的軟件參見slapt的README.

2.下載安裝

可從 http://www.linuxpackages.net 下載,然後安裝。

3.配置:

配置文件為/etc/slapt-getrc,主要設置項為:

WORKINGDIR:本地工作目錄,如/var/slapt-get。

EXCLUDE:不進行操作的軟件。

SOURCE:下載源。

4.使用:

#slapt-get --install pkg_name

其他參數及使用方法詳見slapt-get的FAQ,或者參閱Debian的apt-get的使用方法。

三、 checkinstall --安裝包制作聖手!

注:此節大部分參照struggle兄的文章完成。

1.簡介:

同樣的,checkinstall可以將源代碼方式提供的安裝包(autoconf+automake)制做成Slackware支持的tgz包。但是checkinstall卻不局限於制作Slackware包,它同樣可以制作rpm和deb包。所以為稱之為"聖手"

2.使用:

我們仍然以上面的安裝cce-0.51.tar.gz為例:

解壓,configure,make

# tar zxvf cce-0.51.tar.gz
#cd cce-0.51
#./configure     #注意此處並無prefix參數
#make

注意:下面將運行checkinstall,但在運行此命令前你需要在當前目錄下創建一個對這個軟件包的描述文件description-pak,但你也可以不創建它,推薦你做這一步。

其格式簡單,比如:

CCE
CCE lets you display and input Chinese/Japanese/Korean in lots of OS. It works
in both console
mode and X Windows(through GGI/SDL library). CCE supports both frame buffer(Linux
and FreeBSD
only) and VGA(640x480x16 colors) display. CCE also includes lots of GB/GBK/Big5
input methods
like Intelligent Pinyin, Zhuyin, WuBi, CangJie, DaYi, etc.

另外還可以在當前目錄下創建4個特殊的腳本文件preinstall-pak, postinstall-pak, preremove-pak和postremove-pak。

preinstall-pak在被安裝之前執行,postinstall-pak在被安裝之後執行,preremove-pak在被刪除之前執行,postremove-pak在被刪除之後執行。同樣,這4個腳本文件不是必須的。

如果要制作的軟件有一些特殊的要求,比如創建一個特殊的用戶或者組,這4個腳本就有作用了。 然後在當前目錄下創建一個doc-pak的目錄,這個目錄是用來存放軟件的相關文檔的。比如說README,INSTALL, COPYING, Changelog, TODO, CREDITS等文件。這些文件在安裝軟件包時將被拷到/usr/doc/“軟件包名稱”目錄下。如果你現在不創建,在生成軟件包時將提醒你是否創建這個目錄和拷貝相關文件,如果你再選擇否,那麼制作的軟件包將沒有文檔。

現在開始checkinstall:

#checkinstall

如果開始你沒有創建doc-pak目錄,此時將會提示你是否創建。按y自動創建和拷貝,按n取消。 下面checkinstall將創建安裝軟件包,checkinstall默認安裝命令是make install,你得根據你的軟件安裝說明具體而定,有些軟件的安裝命令不是make install,而是其他,你則換成

checkinstall make modules_install
checkinstall install.sh
checkinstall setup

等形式。這樣,我們也可以把一些以二進制包發布的軟件用checkinstall創建為Slackware的軟件包,只要再checkinstall後面加上安裝指令作為參數即可。(編程入門網)

下一步checkinstall將會詢問創建什麼軟件包,

Please choose the packaging method you want to use.
Slackware [S], RPM [R] or Debian [D]?

選擇s創建slackware的pkg軟件包,選r創建redhat的rpm軟件包,選d創建debian的deb軟件包。我們選擇s繼續。

This package will be built according to these values:
1 - Summary: [ cce-0.51 2 - Name: [ cce ]
3 - Version: [ 0.51 ]
4 - Release: [ 1 ]
5 - License: [ GPL ]
6 - Group: [ Applications/System ]
7 - Architecture: [ i386 ]
8 - Source location: [ cce-0.51
9 - Alternate source location: [ ]
Enter a number to change any of them or press ENTER to continue:

checkinstall給出一個菜單讓你選擇修改軟件包的一些屬性,想修改就按對應的數字鍵,否則回車繼續。我們按7修改軟件包的系統平台,

Enter the architecture type:i686
This package will be built according to these values:
1 - Summary: [ cce-0.51 ]
2 - Name: [ cce ]
3 - Version: [ 0.51 ]
4 - Release: [ 1 ]
5 - License: [ GPL ]
6 - Group: [ Applications/System ]
7 - Architecture: [ i686 ]
8 - Source location: [ cce-0.51 ]
9 - Alternate source location: [ ]
Enter a number to change any of them or press ENTER to continue:e:

然後回車繼續,checkinstall將會在當前目錄生成制作好的pkg軟件包並安裝它。

我們的軟件包創建到此成功結束。

第三部分 其他

一、漢化pkgtool(包括installpkg、removepkg等)工具

如何使用一個完全中文的pkgtool?很簡單!你只要將那些工具裡的非命令翻譯成中文就行了。如果你的系統已經設置好了中文環境,那麼現在就可用在虛擬終端下運行那些你翻譯過的工具了,怎麼樣,中文出來了吧?!如果你的系統還沒有中文環境,那麼請到網上搜索一下,漢化Slackware的文章滿天都是。

注意:現在你只能在虛擬終端下看到中文,在實際的控制台下還是一片亂碼。要能在實際的控制台下也可使用中文的pkgtool,你又必須漢化終端,或者裝上某些軟件(例如cce、zhocn等)來使之支持中文。我們一般采用後者.而對於安裝盤上的漢化,難度稍大。所以漢化,其實很不徹底,似乎也不叫漢化了。

二、Slackware標准包管理機制的移植

1、移植到其他Linux發行版

移植Slackware的標准包管理到其他Linux發行版是一件簡單、可行的事情。當下面說明如何將Slackware的包管理移植到其他Linux發行版(在Turbo Linux10上測試成功):

假設:

Slackware----/dev/hda10 (/)

TurboLinux --/dev/hda7 (/)

具體操作:

進入Turbo Linux,然後:

#mkdir /mnt/hda10
#mount /dev/hda10 /mnt/hda10
#cp /mnt/hda10/sbin/*pkg /sbin
#cp /mnt/hda10/sbin/pkgtool /sbin
#cp /mnt/hda10/bin/dialog /bin
#cp /mnt/hda10/bin/tar-1.13 /bin

現在就可以運行installpkg|removepkg...了。

提示:

/var/log/下的那些目錄(比如packages)可以不建立,在運行以上工具時,會自動建立!

必須將tar-1.13復制過去,否則運行以上工具會出現警告信息,原因前文已述。

dialog 用於生成文本圖形界面,也需要復制。

2.移植到BSD:

當然!我們也可以將之移植到BSD上,但這樣似乎完全沒有必要,畢竟BSD的包管理已經十分強大了。作為測試,我簡單說明一下。

具體操作同上,但有些問題需要注意!

注意點:

一些程序運行時可能會出現庫文件找不到的問題,我們可以結合ldd,ldconfig等工具將Linux下的相應庫文件復制到BSD下。如果僅僅是版本的問題,那麼可以簡單的做個符號鏈接。

有些Linux軟件,要依賴於/proc文件系統才能運行,我們可以在BSD下運行ln -s /proc /usr/compat/linux/proc.

涉及到運行平台問題,請安裝linux_base進行Linux 模擬。

三、附錄

1.參考資料:

man 8 installpkg|removepkg|explodepkg|upgradepkg|pkgtool

installpkg|removepkg|explodepkg|upgradepkg|pkgtool的源代碼

man 8 swaret

man 8 swaret.conf

checkinstall FAQ

2.更新日記

2004-07-04 Freebird發布版本v1.0

2004-07-04 hupeng923關於包制作中符號鏈接及臨時目錄的問題。v1.0.1

3.後記

如果發現問題,請批評指正!有問題請聯系我:

Email:

[email protected]

-OR-

[email protected]

-OR-

http://www.linuxsir.org/bbs

-OR-

http://slack.linuxsir.org/

Copyright © Linux教程網 All Rights Reserved