Slackware Linux技術內幕之--包管理機制(轉)

amyz發表於2007-08-10
Slackware Linux技術內幕之--包管理機制(轉)[@more@]

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

  簡介:包管理機制是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

  提示:

  1. 你可用透過檢視/var/log/packages來得知你已經安裝了哪些Slackware包。
  2. removepkg刪除前會進行包的依賴性檢查(這就是為什麼執行該命令一段時間後你才能看到deleting的輸出資訊),並且只刪除那些沒有依賴關係的包。可見其安全性!
  3. removepkg刪除軟體包後會將/var/log/packages下的相應項移至/var/log/removed_packages.而將安裝指令碼從/var/log/scripts移至/var/log/removed_packages
  4. removepkg也提供一些可選引數,請man removepkg.

  4.upgradepkg --更新

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

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

      #upgradepkg package.tgz

  2. 通常新老版本的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的使用方法。

  1. 首先製作一個臨時目錄,以便將所有要製做成軟體包的檔案放於此目錄。假設為works,則建立目錄:

      # mkdir /works

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

      # tar zxvf cce-0.51.tar.gz

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

      # cd cce-0.51

    # ./configure --prefix=/works

  4. 接下來,進行make,make install:

      # make && make install

  5. 現在/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包管理機制的問題

  

  1. 安裝時包的依賴性管理差,預設缺少依賴性包也會安裝上Slackware包。
  2. 沒有網路安裝模式,只能從本地安裝Slackware包。
  3. 如果採用的是原始碼方式安裝軟體包,那麼標準包管理機制對這些包的管理維護似乎顯得束手無策。

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

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

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

  1.簡介:

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

  Linux映象站透過http/ftp/rsync或者本地軟體庫進行包的安裝。swaret還有i18n支援.

  2.安裝:

  你可以從網上下載swaret的slackware(. tgz)包進行安裝。推薦從 下載。最新版本(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使用的代理地址,格式為:

       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.主要特色:

  1. 使用標準的Slackware包管理工具(installpkg 等).
  2. 支援網路安裝模式,且可指定多個映象站,還支援斷點續傳。
  3. 支援使用正規表示式進行搜尋。
  4. 方便從一個Slackware發行版升級到另一個。
  5. 方便的解決包的依賴、衝突等問題。

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

  2.下載安裝

  可從 下載,然後安裝。

  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為例:

  1. 解壓,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/“軟體包名稱”目錄下。如果你現在不建立,在生成軟體包時將提醒你是否建立這個目錄和複製相關檔案,如果你再選擇否,那麼製作的軟體包將沒有文件。

  2. 現在開始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...了。

  提示:

  

  1. /var/log/下的那些目錄(比如packages)可以不建立,在執行以上工具時,會自動建立!
  2. 必須將tar-1.13複製過去,否則執行以上工具會出現警告資訊,原因前文已述。
  3. dialog 用於生成文字圖形介面,也需要複製。

  2.移植到BSD:

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

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

  注意點:

  1. 一些程式執行時可能會出現庫檔案找不到的問題,我們可以結合ldd,ldconfig等工具將Linux下的相應庫檔案複製到BSD下。如果僅僅是版本的問題,那麼可以簡單的做個符號連結。
  2. 有些Linux軟體,要依賴於/proc檔案系統才能執行,我們可以在BSD下執行ln -s /proc /usr/compat/linux/proc.
  3. 涉及到執行平臺問題,請安裝linux_base進行Linux 模擬。

三、附錄

  1.參考資料:

  1. man 8 installpkg|removepkg|explodepkg|upgradepkg|pkgtool
  2. installpkg|removepkg|explodepkg|upgradepkg|pkgtool的原始碼
  3. man 8 swaret
  4. man 8 swaret.conf
  5. checkinstall FAQ

  2.更新日記

  1. 2004-07-04 Freebird釋出版本v1.0
  2. 2004-07-04 hupeng923關於包製作中符號連結及臨時目錄的問題。v1.0.1

  3.後記

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

  Email:

  freebird@cnfug.org

  -OR-

  freebird@linuxsir.org

  -OR-

  

  -OR-

  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-941370/,如需轉載,請註明出處,否則將追究法律責任。

相關文章