BigAdmin System Administration Portal
使用 pkgman 公用程式管理 Solaris 主機上的套裝軟體
Print-friendly VersionPrint-friendly Version
This content is submitted by a BigAdmin user. It has not been reviewed for technical accuracy by Sun Microsystems, though it may have been lightly edited to improve readability. If you find an error or would like to comment on the article, please contact the submitter or use the comment field at the bottom of the article. Community submissions may not follow Sun trademark guidelines. For information on Sun trademarks, please see http://www.sun.com/suntrademarks/.
 
 

Derek Olsen,2008 年 1 月

簡介

此技術秘訣描述 pkgman,這是一個套裝軟體管理公用程式,可針對在 SPARC 或 x86 平台上執行 Solaris 8、9 或 10 作業系統的主機,將其套裝軟體維持在理想的狀態中。此技術秘訣說明如何安裝 GTK+ (用於建立圖形式使用者介面的多平台工具組,可自 Sunfreeware.com 取得),進而使用 pkgman

注意:此文件中的範例使用 Solaris 10 作業系統。

目錄

此文包含下列主題:

背景

在 Solaris 主機上增加或移除套裝軟體並不難。但是,若您有為數眾多的主機,而這些主機執行套裝軟體需求不同的多種 Solaris 作業系統版本,前述作業即可能變得很麻煩。

在主機啟動後,若出現安裝其他套裝軟體的請求,會發生什麼情況?您是否有可靠來源可供您查看自己是否已在某處使用此軟體?或者,此請求的解決方式是否取決於由誰加以回應?如何確定已安裝相同版本的套裝軟體實例,使主機配置不致變動?若您必須把 PostgreSQL 的升級分段推展到開發、測試與生產環境,應如何處理?您是否有標準程序可執行此作業?或許您有,那我就不需要花時間建置 pkgman

就我擔任 Solaris 管理員的經驗而言,為了找出上述問題的理想解決方案,我吃了不少苦頭,而我遇到的其他人也有類似的困境。我先前管理套裝軟體的方法,問題出在解決方案的複雜性太高。這使我成為唯一可輕鬆推展新套裝軟體、升級套裝軟體或回收套裝軟體的人。但是,我有時也會想要休假或要請病假,因此我決定重頭來過。

此文件的目的在於說明如何安裝及配置 pkgman,以便管理套裝軟體。範例的重點是從 Sunfreeware.com 安裝 GTK+ (2.12.0) 套裝軟體。安裝 GTK+ 套裝軟體是一個很實際的好例子,可讓您對是否值得在工作室中使用 pkgman 有充分的概念。

pkgman 的需求

我們將從 pkgman 的需求開始說明,因為每個工作室都有特定參數需要操作。

  • 執行 pkgman 時需要 Ruby 1.8.X 版(我計劃在 2008 年 1 月對 Ruby 1.9.X 進行測試)。
  • 要安裝的 Solaris 套裝軟體必須採用資料流格式。
  • 要安裝的套裝軟體必須可在本機透過 HTTP 訪問。

安裝 pkgman

若您覺得這些需求尚可接受,接著就安裝 pkgman

http://code.google.com/p/pkgman/downloads/list 上的下載清單中,下載標示為「latest stable version」的 tarball。tarball 的名稱為 pkgman-<版本編號>.tar.gz

將 tarball 解壓縮。結果會出現名為 pkgman-<版本編號> 的目錄。

或者,您也可以使用 Subversion 取出 pkgman 儲存區。下列指令會取出 pkgman Subversion 儲存區而放入名為 pkgman 的目錄中:

svn checkout http://pkgman.googlecode.com/svn/trunk/ pkgman

將目錄切換至 pkgman 目錄的根目錄。

setup 程序檔會使用 /usr/local 做為部署 pkgman 的前綴。因此可執行檔會移至 /usr/local/bin 中,而配置檔案會移至 /usr/local/etc 中。setup 程序檔也會變更 shebang 行,以符合 Ruby 在您主機上的路徑。

ruby setup.rb
---> bin
<--- bin
---> conf
<--- conf
---> bin
<--- bin
---> conf
<--- conf
rm -f InstalledFiles
---> bin
mkdir -p /usr/local/bin/
install pkgman.rb /usr/local/bin/
<--- bin
---> conf
mkdir -p /usr/local/etc/
install pkgman.yaml /usr/local/etc/
<--- conf

若要將 pkgman 安裝到不同的目錄中,您應執行下列動作。在此,我將目錄前綴從 /usr/local 變更為我的主目錄:

ruby setup.rb all --prefix=$HOME
---> bin
<--- bin
---> conf
<--- conf
---> bin
<--- bin
---> conf
<--- conf
rm -f InstalledFiles
---> bin
mkdir -p /users/deet/bin/
install pkgman.rb /users/deet/bin/
<--- bin
---> conf
mkdir -p /users/deet/etc/
install pkgman.yaml /users/deet/etc/
<--- conf

安裝 GTK+ 套裝軟體

現在我們可在 /usr/local/bin/pkgman.rb (或您放置此程式的地方) 取得 pkgman,所以可以開始專注在重要的工作上,即安裝套裝軟體。

您可以判斷哪個 sunfreeware.com 鏡像最適合您用以下載套裝軟體。請查看可用鏡像清單

考量到頻寬成本,您應將套裝軟體下載到本地站點上,然後透過 HTTP 在本地使用。截至撰寫此文章前 (2007 年 12 月),您必須進行下載以執行 GTKk+ 的套裝軟體與版本如下:

atk-1.18.0
cairo-1.4.10
expat-1.95.5
fontconfig-2.4.2
freetype-2.3.1
glib-2.14.1
gtk+-2.12.0
jpeg-6b
libiconv-1.11
libpng-1.2.23
pango-1.18.2
render-0.8
renderproto-0.9.3
tiff-3.8.2
xrender-0.8.3
zlib-1.2.3

請留意,這些套裝軟體需要 libgcc 共用物件。在此範例中,我假設 libgcc 軟體已安裝。

如需安裝 libgcc,您可以在瞭解 config 檔案的設定方式後,加入 libgcc 套裝軟體記錄。

在您下載必要的套裝軟體後,您必須透過 HTTP 使其可用。此外,您必須將套裝軟體解壓縮,因為 pkgman 目前不支援壓縮的套裝軟體。透過現有的強化請求即可追蹤壓縮檔的處理情形。

若要將用 gzip 壓縮的套裝軟體解壓縮,您可以在用 gzip 壓縮的套裝軟體所在的目錄中執行下列指令:

for f in `ls *gz`; do gunzip $f; done

建構 pkgman.yaml 配置檔案

現在我們即將建構 pkgman.yaml 配置檔案。

我已從所安裝的 pkgman.yaml 檔案中移除註釋,避免此文的這一節變得混亂。配置檔案中包含相關資訊,指出哪些套裝軟體與程序檔設定應安裝或移除。程序檔設定中包含如套裝軟體位置與作業記錄方式等項目。

以下是我的環境中所呈現的 pkgman.yaml 檔案程序檔設定區段:

---
-
:http_host: jumpstart
:http_port: 1080
:http_uri: /jumpstart/pkgs/sfw
:logging: syslog
:syslog_facility: daemon
:syslog_level: notice

在大部分的環境中,您所需變更的部分有 http_hosthttp_porthttp_uri 鍵值。

例如,若您用以瀏覽站點上套裝軟體儲存區的 URL 是 http://10.30.1.22/solaris/support/extras,則您的 pkgman.yaml 設定區段將如下所示:

---
-
:http_host: 10.30.1.22
:http_port: 80
:http_uri: /solaris/support/extras
:logging: syslog
:syslog_facility: daemon
:syslog_level: notice

此時我不打算深入探究 pkgman.yaml 檔案的詳細資訊,但您可以藉由閱讀讀我檔案 (http://pkgman.googlecode.com/svn/trunk/README) 的「CONFIG FILE」一節,找到進一步的資訊。

現在,我們已完成設定區段,而必須為所要安裝的每個套裝軟體建構記錄。建構安裝記錄時所需的資訊包括套裝軟體名稱、套裝軟體版本、檔案名稱,以及套用記錄的主機。

讓我們從 atk 套裝軟體著手。您可以使用 pkginfo 指令判定套裝軟體名稱。此處,我在查詢套裝軟體檔案 atk-1.18.0-sol10-sparc-local,以判定套裝軟體名稱與套裝軟體版本:

[root@jumpstart /jumpstart/pkgs/sfw]$ pkginfo -l -d \
atk-1.18.0-sol10-sparc-local |egrep '(PKGINST|VERSION)'
PKGINST: SMCatk
VERSION: 1.18.0

您也可以透過 pkgparam 指令取得套裝軟體版本,如下所示:

[root@jumpstart /jumpstart/pkgs/sfw]$ pkgparam -f \
atk-1.18.0-sol10-sparc-local
VERSION
1.18.0

現在我們知道套裝軟體名稱是 SMCatk,套裝軟體版本是 1.18.0,而檔案名稱是 atk-1.18.0-sol10-sparc-local。因此我們會將這項資訊放入 pkgman.yaml 檔案的套裝軟體記錄中。

SMCatk 套裝軟體的安裝記錄如下所示:

-
:action: install
:name: SMCatk
:file: atk-1.18.0-sol10-sparc-local
:version: 1.18.0
:hosts: default

對於 hosts 鍵值,我們即將使用 default 值。hosts 鍵值的支援值在讀我檔案中有詳細說明。

為了將設定區段與套裝軟體記錄結合在一起,讓我們看看目前的 pkgman.yaml 檔案是何樣貌。簡單來說,下列 pkgman.yaml 檔案指出套裝軟體 SMCatk 1.18.0 版應安裝在執行 pkgman 的所有主機上。套裝軟體檔案名稱為 atk-1.18.0-sol10-sparc-local,此檔案可從 http://jumpstart:1080/jumpstart/pkgs/sfw/atk-1.18.0-sol10-sparc-local 進行下載。

此外,所有輸出都將由 syslog 使用優先權 daemon.notice 記錄下來。若記錄已配置為「syslog」,則記錄將只會放在 syslog,而不會傳送任何資料到您的終端機。

---
-
:http_host: jumpstart
:http_port: 1080
:http_uri: /jumpstart/pkgs/sfw
:logging: syslog
:syslog_facility: daemon
:syslog_level: notice
-
:action: install
:name: SMCatk
:file: atk-1.18.0-sol10-sparc-local
:version: 1.18.0
:hosts: default

現在我們必須將其餘套裝軟體增加至 pkgman.yaml 檔案。

其實您可以挑選一兩個套裝軟體,並建構套裝軟體記錄,然後將您的結果與下列已完成之 pkgman.yaml 檔案進行比較。套裝軟體的順序並不重要,因為所有內容最後都會以未排序的陣列呈現。

---
-
:http_host: cfhost
:http_port: 80
:http_uri: /jumpstart/pkgs/sfw
:logging: syslog
:syslog_facility: daemon
:syslog_level: notice
-
:hosts: default
:file: atk-1.18.0-sol10-sparc-local
:version: 1.18.0
:name: SMCatk
:action: remove
-
:hosts: default
:file: cairo-1.4.10-sol10-sparc-local
:version: 1.4.10
:name: SMCcairo
:action: remove
-
:hosts: default
:file: expat-1.95.5-sol10-sparc-local
:version: 1.95.5
:name: SMCexpat
:action: remove
-
:hosts: default
:file: fontconfig-2.4.2-sol10-sparc-local
:version: 2.4.2
:name: SMCfontc
:action: remove
-
:hosts: default
:file: freetype-2.3.1-sol10-sparc-local
:version: 2.3.1
:name: SMCftype
:action: remove
-
:hosts: default
:file: glib-2.14.1-sol10-sparc-local
:version: 2.14.1
:name: SMCglib
:action: remove
-
:hosts: default
:file: gtk+-2.12.0-sol10-sparc-local
:version: 2.12.0
:name: SMCgtk
:action: remove
-
:hosts: default
:file: jpeg-6b-sol10-sparc-local
:version: 6b
:name: SMCjpeg
:action: remove
-
:hosts: default
:file: libiconv-1.11-sol10-sparc-local
:version: 1.11
:name: SMCliconv
:action: remove
-
:hosts: default
:file: libpng-1.2.23-sol10-sparc-local
:version: 1.2.23
:name: SMClibpng
:action: remove
-
:hosts: default
:file: pango-1.18.2-sol10-sparc-local
:version: 1.18.2
:name: SMCpango
:action: remove
-
:hosts: default
:file: render-0.8-sol10-sparc-local
:version: 0.8
:name: SMCrender
:action: remove
-
:hosts: default
:file: renderproto-0.9.3-sol10-sparc-local
:version: 0.9.3
:name: SMCrenpro
:action: remove
-
:hosts: default
:file: tiff-3.8.2-sol10-sparc-local
:version: 3.8.2
:name: SMCtiff
:action: remove
-
:hosts: default
:file: xrender-0.8.3-sol10-sparc-local
:version: 0.8.3
:name: SMCxrend
:action: remove
-
:hosts: default
:file: zlib-1.2.3-sol10-sparc-local
:version: 1.2.3
:name: SMCzlib
:action: remove

使用 pkgman

我們現在已安裝 pkgman,並已設定初始配置檔案,接著看看我們能做什麼。

首先,讓我說明一下 pkgman 指令行選項及其意義。

[root@jtest ~]$ which pkgman
/usr/local/bin/pkgman
[root@jtest ~]$ pkgman
Usage: /usr/local/bin/pkgman [ -n ] -f pkgman.yaml
-f [ /path/to/pkgman.yaml | http://server/path/to/pkgman.yaml ]
-n Just print what would happen without making any changes
-h print usage and exit

-n 引數是選擇性引數,可指出您要在模擬測試模式中執行 pkgman。在模擬測試模式中,不會對系統進行任何變更。您可以先使用模擬測試模式查看將在主機上安裝或移除哪些套裝軟體,再實際執行 pkgman

-f 引數是必要引數,其後會接著 pkgman.yaml 檔案的位置。此檔案可位於本機檔案系統上,亦可透過 HTTP 提供。有些站點不使用 cfengine 或類似工具將檔案推送至主機,因此我認為透過 HTTP 提供 pkgman.yaml 檔案將有所幫助。

現在讓我們實際執行 pkgman,並將其指向我們的配置檔案。哇!

在此第一個範例中,我將會在模擬測試模式中執行 pkgman。我會使用預設記錄配置,此做法在最後會將所有一切傳送至 /var/adm/messages。大家都可看見,我們所需的所有套裝軟體都已標示為需要安裝。

[root@jtest /]$ pkgman -n -f \
http://jumpstart:1080/jumpstart/pkgs/sfw/pkgman.yaml
[root@jtest ~]$ tail -16 /var/adm/messages
Dec 11 17:28:38 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCatk
Dec 11 17:28:39 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCcairo
Dec 11 17:28:40 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCexpat
Dec 11 17:28:41 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCfontc
Dec 11 17:28:42 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCftype
Dec 11 17:28:48 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCglib
Dec 11 17:29:07 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCgtk
Dec 11 17:29:08 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCjpeg
Dec 11 17:29:09 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCliconv
Dec 11 17:29:09 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMClibpng
Dec 11 17:29:11 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCpango
Dec 11 17:29:11 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCrender
Dec 11 17:29:11 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCrenpro
Dec 11 17:29:13 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCtiff
Dec 11 17:29:13 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCxrend
Dec 11 17:29:14 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCzlib

因此在此範例中,讓我們繼續下去,並執行不含模擬測試旗標的 pkgman,以進行實際安裝。從記錄輸出來看,所有一切似乎都顯示此作業執行正確。

[root@jtest /]$ pkgman -f \
http://jumpstart:1080/jumpstart/pkgs/sfw/pkgman.yaml
[root@jtest ~]$ tail -16 /var/adm/messages
Dec 11 17:33:40 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCatk> was successful.
Dec 11 17:33:44 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCcairo> was successful.
Dec 11 17:33:45 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCexpat> was successful.
Dec 11 17:33:51 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCfontc> was successful.
Dec 11 17:33:54 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCftype> was successful.
Dec 11 17:34:08 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCglib> was successful.
Dec 11 17:35:00 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCgtk> was successful.
Dec 11 17:35:02 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCjpeg> was successful.
Dec 11 17:35:04 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCliconv> was successful.
Dec 11 17:35:06 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMClibpng> was successful.
Dec 11 17:35:12 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCpango> was successful.
Dec 11 17:35:13 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCrender> was successful.
Dec 11 17:35:14 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCrenpro> was successful.
Dec 11 17:35:19 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCtiff> was successful.
Dec 11 17:35:21 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCxrend> was successful.
Dec 11 17:35:23 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCzlib> was successful.

讓我們再執行一次模擬測試模式的 pkgman,看看會有何結果。

這次我會變更 pkgman.yaml 檔案中的「logging」項目。此行先前顯示為 :logging: syslog。現在則顯示為 :logging: console。因此,任何需要執行的工作,都會報告至終端機。

[root@jtest ~]$ pkgman -n -f \
http://cfhost/jumpstart/pkgs/sfw/pkgman.yaml
[root@jtest ~]$

之所以未報告任何項目,是因為已經安裝所需的套裝軟體。但是為了取信於大眾,我們將再次檢查套裝軟體資料庫,以確定套裝軟體已確實安裝。

[root@jtest ~]$ pkginfo |grep SMC
application SMCatk atk
application SMCcairo cairo
application SMCexpat expat
application SMCfontc fontconfig
application SMCftype freetype
application SMCglib glib
application SMCgtk gtk+
application SMCjpeg jpeg
application SMClibpng libpng
application SMCliconv libiconv
application SMCpango pango
application SMCrender render
application SMCrenpro renderproto
application SMCtiff tiff
application SMCxrend xrender
application SMCzlib zlib

看來該有的都有了。現在,我們的主機已安裝 GTK+ 與必要的附屬套裝軟體。

現在您應可輕鬆地在任何其他要安裝 GTK+ 的主機上重複進行套裝軟體安裝。

JumpStart 安裝後程序檔

我的 JumpStart (使用 Flash 歸檔) 安裝後程序檔的下列部分,將說明我是如何將 pkgman 整合至 JumpStart 中。

我先前提到我只是使用 JumpStart 安裝所需的作業系統叢集,但其實並非全然如此,因為我在建立 Flash 歸檔前,將 Ruby 套裝軟體增加至作業系統。

我在安裝重新開機完成後執行 pkgman,因為並非所有套裝軟體都接受替代的根安裝方式。安裝前或安裝後程序檔中的程序內定路徑可能無法運作。

此外,我也在安裝後程序檔中進行一些其他設定工作,因此在此處納入 pkgman 執行,是很合邏輯的。在 Flash 安裝期間,任何位於 /etc/flash/reboot 中的程序檔都會在第一次開機時執行。此程序會在程序檔執行後移除重新啟動目錄及其內容,這麼做比建立暫時性 init 程序檔還好。

************* start postinstall **************
#!/bin/sh

create_reboot_script()
{
mkdir -p /a/etc/flash/reboot
cat >/a/etc/flash/reboot/firstboot.sh <<_EOF
#!/bin/sh

PATH=/usr/bin:/bin:/usr/local/bin:/usr/sbin:/sbin
export PATH

logger -p daemon.notice "Running firstboot script"

logger -p daemon.notice "Executing pkgman"
/usr/local/bin/pkgman -f /usr/local/etc/pkgman.yaml

logger -p daemon.notice "rebooting"
init 6
_EOF

chown root:root /a/etc/flash/reboot/firstboot.sh
chmod 755 /a/etc/flash/reboot/firstboot.sh
}

create_reboot_script
************* end postinstall ****************

在初次 JumpStart 後 pkgman 執行完成後,pkgman 的後續執行將由 cfengine 所觸發。我已將 cfengine 配置成在主機上有特定的觸發檔案 (/etc/.run_pkgman) 時執行 pkgman

當我必須部署套裝軟體修改時,目標主機很可能加入我的 cfengine 群組中。例如,當我要將 GTK+ 套裝軟體推送至 Solaris 工作站時,我會使用 cfengine 觸動 cfengine「工作站」群組中所有主機上的觸發檔案。

以下是我的 cfengine 檔案中可控制 pkgman 執行的片段:

classes:
solaris::
run_pkgman = ( FileExists(/etc/.run_pkgman) )

shellcommands:
run_pkgman::
"/usr/local/bin/pkgman -f /usr/local/etc/pkgman.yaml"
"/usr/bin/rm /etc/.run_pkgman"

我會對觸動觸發檔案等一次性工作使用專屬的 cfengine 檔案。若要觸發所有工作站上的 pkgman,我會將下列項目增加至用於一次性工作的 cfengine 檔案。在您推送 cfengine 變更後,請記得刪除此工作。

shellcommands:
workstations::
"/usr/bin/touch /etc/.run_pkgman"

摘要

這正好可以總結我們迅速討論過的 pkgman 相關內容。我們的目標在於從 sunfreeware.com 安裝 GTK+ 套裝軟體,而我們已完成此作業。

希望透過此範例,我提供了足夠的資訊讓您判斷 pkgman 是否值得您的深究。如需詳細資訊,請參閱讀我檔案

若有其他意見或疑問,請來信至 someword [at] gmail.com

感謝您撥冗閱讀。

關於作者

Derek 是一名資深的 UNIX/Linux 系統管理員。過去幾年來他對於自訂 JumpStart 安裝、套裝軟體管理與配置管理產生濃厚的興趣。他居住在美國奧勒岡州的波特蘭市,而工作地點也在這裡。閒暇時喜歡研究 Solaris 作業系統、喝啤酒,以及說服自己狗不是他的老大、他才是狗的主人。

The information and links on this page have been provided by a BigAdmin user. The submitter is solely responsible for such information and links. Sun is not responsible for the availability of external sites or resources, and does not endorse and is not responsible or liable for any content, advertising, products, or other materials on or available from such sites or resources. Sun will not be responsible or liable, directly or indirectly, for any actual or alleged damage or loss caused by or in connection with use of or reliance on the information posted here, or goods or services available on or through any external site or resource.
 
 

Comments (latest comments first)

Discuss and comment on this resource in the BigAdmin Wiki

Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin