顯示具有 linux 標籤的文章。 顯示所有文章
顯示具有 linux 標籤的文章。 顯示所有文章

2013年4月9日 星期二

Foxit Reader for amd64 Linux

Foxit Reader is my favorite pdf reader when I was a Windows XP user. It has superior performance and much lighter than Adobe Reader. I wouldn't say Adobe Reader for Linux is worse, but most of the time I just want to read my pdf document without any special functions, therefore, I would definitely choose Foxit Reader on my Linux.

Foxit Reader for Linux provides three types of binries: bz2, rpm and deb. Though the rpm and deb files are for i386 only, they can still be installed on amd64(x86_64). Debian users may find it not that direct to install i386 deb, the complaint message is architecture conflicting. To resolve this issue for Debian, a force option is a must:

dpkg --force-architecture -i FoxitReader_1.1.0_i386.deb
However, followed by launching FoxitReader is an error message:
error while loading shared libraries: libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory
No need to be panic. Let's check if we really miss this library:
locate libgtk-x11-2.0.so.0
and my Ubuntu did have this library:
/usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.10
The root reason for the missing-shared-object message is that the FoxitReader was built for i386 Linux thus it needs i386 version of libgtk-x11. What you gotta do is to install libs for i386:
aptitude install libgtk2.0-0:i386 libstdc++6:i386
For Debian amd64 users, some obstacles may be encountered. Debian amd64 will not allow users to install an i386 deb, therefore you need to let dpkg search i386 packages by executing:
dpkg --add-architecture i386 && apt-get update
to let Debian amd64 aware i386 repository. For other distributions, the package name will be similar libgtk2.0.i386 or something like that. The command of it is FoxitReader, now you may feel free to use Foxit Reader on your Linux.

Share

2013年2月27日 星期三

File differencing/comparison on Linux

某天我為了比較RHEL6.1與6.3在我們lab裡開機訊息的不同,驚見Mars大師用了一套叫WinMerge的軟體,可以分析兩個檔案的相異之處,而且還可以分析、合併資料夾,而且是用GPL發布的喔,建議在windows底下可以用這款WinMerge來作差異辨識。

Fig1. WinMerge Logo。

Fig2. 比較的對象可以是兩個檔案,也可以是兩個資料夾。

Fig3. 如果某些檔案指出現在某個目錄,WinMerge用『僅左邊』『僅右邊』來表示,雖然我個人不習慣這樣表示,但左右兩邊的路徑表示算清楚,不至於搞混。

Fig4. RHEL6.3與RHEL6.1開機訊息的比較。WinMerge貼心的用灰色代表沒有重複過的字串,黃色區域代表有重複但是數值不同的相似區域。沒錯,開啟RHEL6.3的時候產生Call Trace,系統就開不起來了。

在Linux底下其實也有許多選擇,不過我還蠻推一個輕便的gtk小程式:Meld:

Fig5. 別小看Meld,他可是很神的!

Fig6. 與WinMerge不同,他利用漏斗表示某些內容是顯示在對比檔案的哪個區塊內。可以用滑鼠在左有兩邊檔案自由滾動。

Fig7. 用Meld的好處是我可以很輕易的以某一行訊息為基準,比較上下內容的差異性。對我只看log的需求來說,已經綽綽有餘了。

或許你有想過diff就是最傳統比較檔案異同的指令,不過我承認我從來沒看懂過,特別是當兩個檔案差距很大的時候。看看下圖各位看不看得懂:

Fig8. 遇到複雜一點的檔案,diff會讓人看得更困擾。

如果你不喜歡meld的話,可能需要參考這篇:WinMerge Alternatives.

Share

2012年6月27日 星期三

zypper筆記

zypper簡史

zypper是在SUSE Linux下的套件管理程式引擎(ZYpp library, 或是libzypp)最重要的指令。也是PackageKit的後端程式(Back-ends),目的是提供一個高階的套件管理程式,協助使用者解決套件相依性的問題、提供解決方案並且自動化設定。 也就是說,使用指令zypper來控制套件跟使用YaST管理套件是相同的行為。

zypper提供的功能主要有:

  1. 自動化安裝、升級以及移除套件
  2. 能夠管理多個套件庫來源URI(Universal Resource Identifier, 可以是localdir, local ISO, NFS, http, ftp, samba, etc.)
  3. 提供比rpm更彈性的管理、查詢功能。

Repositories

一個SuSE Linux標準的repostories設定檔,是放置在/etc/zypp/repos.d/底下,任何以.repo結尾的檔案都會被視為一個套件庫。以一個普通的SLES11.1.repo為例,格式如下:

[SLES11.1]
name=SLES11.1 repostory
enabled=1
autorefresh=1
baseurl=http://192.168.20.1/SLES11.1/x86_64
path=/
type=yast2
keeppackages=0
  1. zypper使用兩種『名稱』:Alias(別名)與Name(名稱描述)。其中[]內為Alias,name則為名稱描述。
  2. enabled必須設定為1才算啟動,這點與yum的定義剛好相反。
  3. autorefresh定義了是否要自動更新套件庫。以ISO檔或是固定來源(例如SLES)的套件庫可設定為0以節省時間。
  4. baseurl可以是local filesystem, ISO, http, https, ftp, nfs, obs等等。URL的來源不需要指定architecture,這會自動由/etc/zypp/zypper.conf或是/etc/zypp/zypp.conf來決定。
  5. path代表從baseurl底下直接視為此套件庫的根目錄。如果是type是yast2或是rpm-md的話,baseurl底下能找到repodata這個資料夾,此時path即可設定為根目錄(/)。
  6. type定義了套件庫類型。zypper能接受三種套件庫類型:yast2(傳統suse套件庫)、rpm-md(相容yum套件庫)以及plaindir(一個包含rpm檔案的資料夾)。
  7. keeppackages定義了安裝或更新完成後是否要從cache裡刪除檔案。

zypper的指令格式如下:

zypper  [--global-options]  <command>  [--command-options]  [args]
雖然有許多command,但是好記卻是zypper的特點--每一個command都有其縮寫,若能熟練縮寫則能減輕許多負擔。例如addrepos可以簡寫為ar,search可簡寫成se,remove可簡寫成rm。格式順序是重要的,但是不要強記--應以自己理解的步調為主。
這裡列舉幾個常見的Global Options:
  • -h (--help):
  • 顧名思義,列出一些重要的commands/options。
  • -q (--quiet):
  • 安靜模式,最常用於shell script裡放進crontab裡使用。
  • -n (--non-interactive):
  • 使zypper的流程變成自動化,但是未必所有情況都會自動回答yes。
  • --no-gpg-checks:
  • 若遇到需要GPG key驗證的時候,可以略過不進行檢查並繼續執行動作。
  • --gpg-auto-import-keys:
  • 若遇到套件庫要求匯入GPG key時能自動匯入。
請務必注意Global Options必須寫在command之前,若寫在command之後會被視為command-options。例如我想要安裝k3b跟net-snmp並移除emacs,過程中自動回答yes並視需要自動匯入GPG,則應該像是這樣:
zypper -q --gpg-auto-import-keys install -yf -d k3b net-snmp -emacs
這串冗長的指令被install一分為二:左側所有的options都是global-options,右側則都是command-options。新版的libzypp會把--no-gpg-checks與--gpg-auto-import-keys定義為Repository Options,但對於語法沒有衝突。

1. 新增套件庫來源:zypper addrepo(ar)

新增一個http站台為例:

zypper ar -f http://192.168.20.1/SLES11.1/x86_64 SLES11.1
-f (--refresh)加入並且立即更新套件資料庫。沒有-f時,zypper預設是不autorefresh的。
後面的網址部份是baseurl,SLES11.1則是Alias。由於我們沒有設定其他參數,因此其他設定會被指定成預設值,例如:enabled=1,type=yast2以及keeppackages=0。如果想要新增一個本地端的ISO檔作為repo,可以這麼定義:
zypper ar -t yast2 -n "SLES11.1 repostory" "iso:/?iso=/home/maxsolar/tftpboot/ISOs/SLES/SLES11sp1_x86_64.iso" "SLES11.1 iso"
以下分別是local DVD, NFS4, ftp以及https的範例:
zypper ar "dvd:/subdir?devices=/dev/sr0,/dev/sr1" DVD
zypper ar "nfs4://nfs-server/exported/path?mountoptions=ro" NFS
zypper ar "cifs://servername/share/path/on/the/share?user=usern&pass=password" SAMBA
zypper ar "ftp://user:password@server/%2fhome/user/path/to/media/dir" FTP
zypper ar "https://user:password@server/path?proxy=foo&proxyuser=me&proxypass=password" WEB
其中-c (--check)是定義加入此repo時檢查其可用性,如果有位置指定錯誤則會馬上得知。
-n (--name)定義了名稱描述。在不定義name時,name==alias。
alias是必要的參數,他不需要任何其他option來引用他。由於ISO檔的資料是固定不變的,因此不使用-f使其永遠不autorefresh以增進效能。

再看另一個例子:把swyear大大個人維護的repo拿來使用:
zypper ar -cdG -n "swyear opensuse" -p 70 -t rpm-md http://download.opensuse.org/repositories/home:/swyear/SLE_11_SP1/ swyear
  • -d (--disable)
  • 加入但不使用此repo。
  • -G (--no-gpgcheck)
  • 不檢查gpg key。
  • -p (--priority)
  • 指定一個不為0的整數作為優先權。

新增一個repo檔至套件庫:

zypper ar -r SLES11.1-kiso.repo
其實更簡單的方式,就是把這個repo檔直接放到/etc/zypp/repos.d/裡,那麼你幾乎可以忘記這個功能。

2. 查詢套件庫:zypper repos(lr)

現在可以查詢剛剛已經加入套件庫有哪些:

zypper repos
# | Alias                          | Name                               | Enabled | Refresh
--+--------------------------------+------------------------------------+---------+--------
1 | SLES11.1                       | SLES11.1                           | Yes     | Yes
2 | SLES11.1 iso                   | SLES11.1 repository                | Yes     | No
3 | swyear                         | swyear opensuse                    | No      | Yes 

事實上同一套件有可能被多個套件庫所維護。以Debian系列來說,系統預設會安裝版本號最新的套件;而SuSE系列的Linux則是依優先權(priority)來安裝,使用-d來查看所有細節(details):
zypper lr -d
# | Alias                          | Name                               | Enabled | Refresh | Priority | Type   | URI
--+--------------------------------+------------------------------------+---------+---------+----------+--------+--------------------
1 | SLES11.1                       | SLES11.1                           | Yes     | Yes     |   99     | yast2  | http://192.168.20.1/SLES11.1/x86_64/
2 | SLES11.1 iso                   | SLES11.1 repository                | Yes     | No      |   99     | yast2  | dir:///home/maxsolar/tftpboot/ISOs/SLES/SLES11sp1_x86_64.iso
3 | swyear                         | swyear opensuse                    | No      | Yes     |   70     | rpm-md | http://download.opensuse.org/repositories/home:/swyear/SLE_11_SP1/
 
需特別注意priority=1表示最高優先權,若不指定優先權則預設為99。你還需要知道哪些重要的小功能呢?
  • -P (--sort-by-priority):
  • 依優先權排序。
  • -U (--sort-by-uri):
  • 依URI排序。
  • -N (--sort-by-name):
  • 依名稱排序。
  • -e (--export):
  • 將所有套件庫匯出至一個檔案。
zypper lr -e foo.repo

3. 刪除與修改套件庫:zypper removerepo(rr)/modifyrepo(mr)/namerepo(nr)

   3.1 刪除套件庫(removerepo)有三個控制項:id(#)、URI以及Alias,任意一項都可以:

zypper rr 1
等同於
zypper rr SLES11.1
等同於
zypper rr http://192.168.20.1/SLES11.1/x86_64/

   3.2 修改套件庫(modifyrepo)有四個控制項:id(#)、URI、Alias以及name,建議用最直覺的id即可。可以修改的options族繁不及備載,這裡僅列出幾項作拋磚引玉之用:

zypper modifyrepo
  • -e (--enable)與-d(--disable):
  • 啟用與停用。
  • -r (--refresh)與-R(--no-refresh):
  • 啟用/停用自動更新。
  • -p (--priority) <positive-integer>:
  • 設定大於0的整數作為優先權。
  • -n (--name) <name string>:
  • 指定一個字串作為name。
  • -k (--keep-packages)與-K(--no-keep-packages):
  • 安裝/更新後,套件是否保留在cache裡。
  • -a (--all):
  • 將規則套用到所有套件庫。
假設我要把#1變成優先權為10,#2改變name為SLES11_ISO_repo並啟用autorefresh,把#3設定為啟用並且將所有repos都設定keeppackages=1:
zypper mr -p 10 1
zypper mr -rn SLES11_ISO_repo 2
zypper mr -e 3
zypper mr -ka
或許你已經注意到,modifyrepo並不能修改Alias,想要修改Alias必須使用namerepo這個子指令。

   3.3 修改套件庫名稱(namerepo)也有四個控制項:id(#)、URI、Alias以及name,建議用最直覺的id即可。他的目的就只有一個--修改Alias:

zypper nr 2 SLES11_ISO_image

4. 查詢套件:zypper search(se)/info(if)/what-provides(wp)

   4.1 查詢套件(search)的方式相當靈活,在此我先列出常用的options再加以靈活運用:

  • -s (--details):
  • 顯示詳盡訊息
  • -d (--search-descriptions):
  • 連套件描述的文字也納入搜尋。
  • -r (--repo) <alias|name|#|URI>
  • 指定套件庫內容來搜尋。
  • --match-exact <STRING>
  • 指定某一精確的字串來搜尋。
例如我想知道套件名稱有包含snmp的套件:
zypper se snmp -s
kernel的種類太多,只想精確搜尋kernel-syms:
zypper se --match-exact kernel-syms
S | Name        | Summary                              | Type      
--+-------------+--------------------------------------+-----------
  | kernel-syms | Kernel Symbol Versions (modversions) | package   
  | kernel-syms | Kernel Symbol Versions (modversions) | srcpackage
這裡的type與使用zypper repos顯示的type意義是不同的。repos裡的type是套件庫的種類;search裡的type是套件本身的種類,有package(一般正常的rpm檔)、pattern(推薦的套件群組)、product(必須安裝的套件群組)以及srcpackage(原始碼)。此時不指定type時,package為預設類別。 只搜尋#1套件庫,套件描述裡包含kvm的套件呢?
zypper se -r 1 -d kvm
想找kernel開頭的套件:
zypper se kernel-*

   4.2 查詢套件詳細訊息(info)需要給定一個正確的套件名稱,先search之後再使用info是個好方法。

zypper if expect

   4.3 查詢某個檔案或套件事由誰提供(what-provides)

zypper wp libldap-2.4.so.2

5. 安裝套件:zypper install(in)/source-install(si)

   5.1 install的基本格式為

zypper install [options] <name|capability|rpm_file_uri>
安裝swyear提供的k3b到系統上:
zypper in k3b -r swyear
也可以寫成
zypper in swyear:k3b
安裝多個rpm檔:
zypper in http://192.168.20.1/progs/madedit/MadEdit/MadEdit-0.2.9/madedit-0.2.9-1.x86_64.rpm ~/progs/Adobe/AdbeRdr9.4.7-1_i486linux_enu.rpm
安裝同時移除套件:
zypper in vim-enhanced -gcin
安裝某一個缺少檔案所帶來的套件:
zypper in 'libXfixes.so.3'
安裝所有以kernel-開頭的套件:
zypper in kernel-*
強制/重新安裝:
zypper in iperf -f
有些好用的options應該要知道:
  • -f (--force):
  • 強制/重新安裝套件。
  • -y (--no-confirm):
  • 遇到問答一律回答yes。
  • -l (--auto-agree-with-licenses):
  • 自動同意軟體授權同意條款。
  • -R (--no-force-resolution)與--force-resolution:
  • 在interactive模式下,zypper預設會幫我們算出解決方案並執行之(--force-resolution);然而在non-interactive模式下,由於顧慮到系統安全,因此放棄自動執行解決方案(--no-force-resolution)以便讓使用者有機會手動解決問題。
    interactive/non-interactive模式是屬於Global Options,這些options必須要比zypper的command更早被使用。
  • -D (--dry-run):
  • 只做測試,不會真的進行安裝。
  • -d (--download-only):
  • 只下載而不進行安裝。
例如:
zypper --non-interactive --no-gpg-checks in -flR iperf
也就是我執行一個非互動式的安裝,不檢查gpg,強制安裝iperf並同意授權條款,若發生錯誤則仍然自動執行解決方案。

   5.2 source-install相對容易多了,他只要接一個原始碼的套件名稱即可。使用si之前需要先使用search:

zypper se -t srcpackage udev
S | Name | Summary                                           | Type      
--+------+---------------------------------------------------+-----------
  | udev | A rule-based device node and kernel event manager | srcpackage
得知這個原始碼套件名稱就是udev,接著就可以進行安裝。
zypper si udev
si預設會把需要編譯該套件的其他套件一起裝起來。

6. 移除套件:zypper remove(rm)

remove的功能很明確,就是移除套件。下列只有幾個簡單的options可供選擇:

  • -t (--type):
  • 指令套件類別。
    zypper rm -t srcpackage udev
  • -R (--no-force-resolution):
  • 不強制使用解決方案。移除時遇到套件相依性問題,系統預設會使用計算出來的解決方案。想要自己手動選擇方案,需要使用-R。
  • -u (--clean-deps):
  • 一同移除沒被使用到的套件。
  • -D (--dry-run):
  • 純粹只是測試,不進行真正更動。

7. 刷新/清空套件庫:zypper refresh(ref)/clean(cc)

   7.1 利用zypper refresh來更新套件庫的快取。若套件庫被標示為不更新(autorefresh=0)的則不受影響。當使用只執行更新時,其實有四種類型的資料會牽涉其中:

  1. metedata
  2. 包含repository metadata(套件大小、版本、相依性等資訊)以及raw metadata(套件的時間戳記、sha1校驗碼以及位置)。
  3. database
  4. libzypp資料庫。
  5. raw data
  6. 就是rpm, source rpm以及patch等實體檔案。
  7. service
  8. 目前版本的zypper(1.5.1)支援的服務僅有Repository Index Service(RIS),訂閱這個服務可以自動管理所有的套件庫,並且由此服務所建議的方案來維護系統上的套件。
refresh預設只會更新metadata,而這也是大部分系統管理員預期的行為。不同的參數可控制細部的行為,可參閱manpages以取得細節。

   7.2 利用zypper clean來清除套件庫的快取(/var/cache/zypp*)。預設只清除套件本身(raw data),如果想要徹底清除metadata並開始一個新的更新,下列參數可能需要:

  • -m (--metadata)
  • 只清除repository metadata,所有已下載的套件都會被保留。
  • -M (--raw-metadata)
  • 所有metadata都清除,但已下載的套件都會被保留。
  • -a (--all)
  • 所有metadata都清除,連已下載的套件都一併刪除。
因此在網路頻寬充裕的情況下,啟動更新前最佳的模式應該是:
zypper clean -a

8. 更新/列舉更新系統:zypper update(up)/dist-upgrade(dup)

update的行為與dist-upgrate僅差別在範圍大小,參數都是共用的。有幾個參數可以特別注意:

  • -r (--repo)
  • 指定某套件庫來源進行更新。
  • -l (--auto-agree-with-licenses)
  • 自動同意license。通常還會搭配-y表示同意
  • --force-resolution
  • 更新預設的行為是--no-force-resolution,會提示解決方案由使用者決定。使用force表示採用zypper所計算出的最佳解決方案。
  • -D (--dry-run)
  • 一個測試性質的動作,不影響系統狀態。
假設不預先執行zypper refresh,光是執行zypper update就會先執行refresh的動作。update會更新所有metadata,並且更新、下載安裝套件之後,再更新database。
update的行為是更新已安裝的套件,但dist-upgrade的行為著重在系統的升級,例如更新了repo之後,利用dup從SLES11.1升級至SLES11.2,此時會安裝新版本所建議的套件、更新原本安裝的套件,也會移除新版本所廢除的套件。

9. 檢查使用舊套件之程序:zypper ps

在經歷update或是dist-upgrade之後,系統總會提示使用者要執行zypper ps已檢查有哪些套件或檔案已被更新但系統仍持續佔用(occupied)。他沒有參數,只具參考價值;對於仍持續被系統佔用的舊套件只有重開機之後才能使用更新後的套件/檔案。

這份筆記並不適用於zypper 0.5(例如SLES10)。因為SLES10並不讀取repo檔案,zypper的使用效率也很低落;想在SLES10使用zypper必須自行參考他所提供的manpages。

Share

2010年11月8日 星期一

LPIC-1 passed

9/27我趕在出國前趕快把LPIC考一考,11/2巨匠email通知我可以來領取我的LPIC-1證照了。從考上到領到證照,大約35天左右。不過我人在澳洲,所以請老婆代領。考過LPIC-1其實沒有想像中的興奮,因為RHCE跟NCLP這類實機考試都通過了,考LPIC只是把先前的考試卷在出國前趕緊用掉而已。不過話雖如此,我覺得LPIC的證照還蠻好看的。

9/24考101,才考700分...9/27考102,竟然630...更低


過了一天才收到信

這張卡片真的很漂亮唷!

2010年10月11日 星期一

Linux+MacOSX+Windows Triple Boot on Macbook Pro

keywords:Linux, Mac, XP, 多重開機, MacBook pro

我在2009年買了一台15吋的MacBook pro,一直到最近才開始比較有時間去玩他。MacOSX本身當然沒有什麼大問題,但是想到要在MacBook pro上面裝linux跟WinXP就感到很刺激,可以預期的是,因為是intel的cpu,所以os本身應該沒有大問題;但是週邊設備(例如解析度、亮度、觸控版、音效、視訊、有線/無線網路, etc.)就真的很難保證。本文僅作為一篇經驗分享文,沒有太多的技術在內,僅作為筆記分享給需要的看官。

EFI與BIOS

BIOS(Basic Input/Output System)幾乎是普羅大眾學習電腦都會碰到的東西,有著跟pc一樣古老的歷史。簡而言之,他掌控了開機時的自我檢測,包含電壓、記憶體、cpu、硬碟等週邊設備。雖然所有配備都日新月異的在進步,但是bios卻是依然停留在16位元的環境。由於bios自我檢測之後會自動尋找第一個開機的裝置,如果是硬碟,則會尋找他的MBR(master boot record)。而MBR又有非常多的限制,只能有四個主要分割區,如果要安裝多個系統則需要小心維護MBR。這麼多年下來,bios的缺點依然沒有被改進。目前支援GUID的作業系統可以參考wikipedia的資料
EFI(Extensible Firmware Interface)不但完全擁有BIOS的功能,而且他其實就是一個小型的os,扮演作業系統與韌體之間溝通的角色。能載入硬體的驅動程式,所以在EFI裡可以使用滑鼠、鍵盤。EFI使用的是GUID的分割表方式(或類型),有別於BIOS使用的是ms-dos的分割表模式,使得硬碟能有128個主要分割區,開機管理程式也不再放在MBR(當然,EFI也可以支援MBR),而是會放在GPT(GUID partition table),開機時由EFI去控制要開進哪一個含有作業系統flag的分割區。比起傳統的MBR,要安裝多個os,GPT確實方便且強大多了,只是他會佔用第一個主要分割區,而且不會自動隱藏。

行前準備

  1. MaxOSX Snow Leopard安裝光碟
  2. Windows XP安裝光碟
  3. MintLinux 9安裝光碟
  4. 決定讓三個os都能讀取的檔案系統:hfsplus
  5. 完全不使用bootcamp
  6. 決定安裝順序:MacOSX->Windows->Linux

MacOSX的安裝與硬碟配置

我是從頭重新安裝MacOSX的,為此我還買了一個1T的硬碟來取代裡面原本的250G小硬碟--對於重度使用virtual machine的我,使用固定大小的映像檔需要很大的空間。由於1T的硬碟比較厚,所以MacBook/MacBook Pro系列的才能裝,Air可就裝不下了!

如果你有安裝Leopard(10.5)的經驗--兩片DVD,總共安裝時間大約要兩個小時,非常辛苦;Snow Leopard(10.6)是大幅修改kernel(雖然Apple說是重新撰寫kernel),使得10.6有較好的效能、功能以及較短的安裝時間(約30分鐘左右)。

10.6是我額外去買的,NT 1090,比起windows,我覺得便宜又值得。
安裝MacOSX時,請先到磁碟工具裡,把該硬碟分割成四個分割區(事實上MacOSX會分成五個分割區,第一個就是GPT所佔的分割區啦,約200MB左右)。我對於這顆硬碟的劃分是:120G的hfs+(journalled)給MacOSX,40G的ext4給LinuxMint,100G的fat-32給windows,剩下所有的空間都切成hfs+(journalled),到時候可以在linux裡讀寫hfs+分割區。分割時,給定一個辨識度高的標籤非常重要。

(上圖是我安裝完MacOSX之後在額外安裝NTFS-3g才會有的結果,關於ntfs-3g,請詳閱後面內容。而MacOSX預設並不支援linux的檔案系統,因此就暫時格式化成fat-32或是hfs+都無所謂。)
不選擇其他檔案系統當成共用的分割區,有如下的原因:

  1. Windows僅拿來打電動用,並不拿來上網或是工作,甚至是聽音樂看影片也不會,因此可以讀取hfs+就可以。
  2. 在Linux跟MacOS下讀寫NTFS都必須透過fuse/macfuse,速度很慢;Linux目前對於hfs+讀寫支援得相當不錯,速度也很不賴(寫入稍慢,刪除非常快!!)
  3. hfs+是MacOSX預設的檔案系統格式。vfat非常容易造成磁區破碎分佈的情形,而且單一檔案大小又有4G的限制。
(當然如果你有其他的需求,自然要依據您的需求作調整。)
劃分安裝MacOSX的分割類型時,請選擇GUID,否則會無法順利安裝MacOS;另外我會建議安裝MacOSX的分割區最好是MacOS類型+日誌式+區分大小寫,這樣屆時在linux底下才會有比較高的相同感--畢竟linux下的檔案系統都是區分大小寫的。

在劃分時,我遇到無法重新格式化或是切分割區時,我不熟MacOSX底下的指令,我只好塞入linux的live CD去把所有分割區刪掉,再重新開進mac安裝光碟以進行安裝。由於linux的fdisk指令不支援GPT,你必須使用parted/gparted來製作一個可以安裝Mac的分割表。

由於需要跟linux共用資料,因此如果每個檔案都有不同的uid/gid是很麻煩的事情。你可以選擇讓Linux配合BSD的傳統配置(uid/gid=501/20),也可以讓Mac配合linux--我選擇後者。在Debian系列的linux裡,第一個使用者的uid/gid都會是1000,安裝完MacOSX之後,我們就把Mac裡的uid/gid改成1000吧!

sudo su -
dscl . -change /Users/maxsolar UniqueID 501 1000
dscl . -change /Users/maxsolar PrimaryGroupID 20 1000
chown -R 1000:1000 /Users/maxsolar
如果沒有錯誤訊息,表示變更已經完成。請不要作任何動作,直接重開機。
再次進入Mac--這個時候我的gid=1000並沒有相對應的群組名稱,但根本無關痛癢--unix世界是認uid/gid,而非名稱。由於我有使用終端機的需求,因此有兩行需要加入~/.profile:
export PS1="\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] "
alias ls='ls -FG'
如果一切ok的話,請按左上角的蘋果,點選軟體更新,讓系統保持在安裝好patch的狀態。

ntfs-3g for Mac的安裝

NTFS檔案系統在linux下穩定的讀寫已經行之有年,透過fuse的技術,我們一樣可以在user space使用NTFS。mac上使用ntfs也是透過fuse,但是卻是跟linux世界不同的fuse;為了有所區別,Tuxera公司把它稱為MacFuse,總之是相同的原理,讓Mac可以認識ntfs並且在上面進行讀寫。速度不能跟原生的hfsplus相提並論就是了。

Windows的安裝

務必確定windows的分割區是最後一個(或是第四個)分割區。由於Windows只認得MBR,在MBR與GPT混雜(hybrid)的情況下,WindowsXP必須要在最後一個(但不能超過第四個)分割區才能成功安裝,否則會出現:

"下列檔案遺漏或損毀,無法啟動Windows:
system32\hal.dll
請重新安裝一份上列檔案的拷貝"
事實上你的windows裡是有這個檔案的,boot.ini的設定也完全沒錯,但如果不是把windows放在最後一個(最多不超過四)磁區,這個問題就會一直存在。
假設你的分割區已經配置完成,塞入xp光碟並重開機之後,按住c不放以進入光碟開機,並依照你的規劃選定windows要安裝的分割區。

(利用Mac的diskutil工具都會有128MB的間距,或許有他的意義吧!?只要注意GPT會佔去第一個分割區,我說的第四個是包含GPT分割區。)
安裝完成後,請update以安裝所有修補程式,並且塞入Snow Leopard光碟,裡面包含支援Macbook Pro的所有驅動程式。

安裝好bootcamp驅動程式之後,會發現可以看到MacOSX的hfsplus分割區了!但是第五個分割區卻讀不到,這就是windows XP只認得MBR的證據--只認得4個主要分割區,而GUID則全為主要分割區,所以我所標示的DATA分割區在windows裡是看不到的。不過即使裝了驅動程式,hfsplus檔案系統對windows來說還仍然是read only,需要安裝像MacDrive這類商用軟體才能在windows讀寫hfs檔案系統。

linux的安裝

筆者安裝的是LinuxMint 9,我想其他套linux也是大同小異,只需要額外安裝一些套件即可,只要注意鍵盤格式要選擇USA-Macintosh,以及開機管理程式安裝在自己的root分割區(本例而言是sda3)

LinuxMint是基於ubuntu的封裝版,因此就跟ubuntu一樣,安裝後會自動顯示偵測到廠商私有的驅動程式。我的這台MacBookPro是nvidia Geforce 9400M;當系統剛安裝好時,xorg是載入nouveau(opensource的nvidia晶片驅動程式)可以使用F1/F2調節亮度,但是安裝完nvidia私有驅動程式之後,螢幕亮度會到達100%,而且沒有任何控制鍵可以調低亮度。
為此,我們必須手動使亮度降低才能繼續工作:

smartdimmer -s 20
smartdimmer是nvidia控制亮度的一個小程式。當xorg載入的是nvidia的模組時,原本在gnome裡面所有控制亮度的小工具都失效了,也因此只好手動調整亮度。-s表示設定(set),20表示20%的意思。事實上我們還需要一些步驟來修改Macbook,務必執行上一步驟使亮度降低,否則眼睛一定受不了。

增加Mactel-PPA套件庫:

add-apt-repository ppa:mactel-support
aptitude會自動增加套件庫並且下載公開金鑰,一切都是自動化。當然,請務必更新套件庫:
aptitude update
我們來安裝一些必要的套件:
aptitude install applesmc-dkms bcm5974-dkms gnome-power-manager isight-firmware-tools macfanctld mbp-nvidia-bl-dkms nvidia-bl-dkms pommed xfree86-driver-synaptics xserver-xorg-input-synaptics xserver-xorg-video-intel pommed gnome-alsamixer
以上的套件除了安裝for macbook週邊的firmware之外,還需要pommed daemon幫助我們調整預設亮度。請修改/etc/pommed.conf
#
# Configuration file for pommed
#

# General configuration
general {
# fnmode: functions keys first (no need to use fn) or last
# Value is either 1 or 2, effect is hardware-dependent
fnmode = 2
}

# sysfs backlight control
# nVidia machines, will fall back to nv8600gmt if not supported by the kernel
lcd_sysfs {
# The sysfs backlight control is a generic interface provided
# by the Linux kernel for backlight control on most graphic cards.
# The brightness range can differ depending on the hardware.

# initial backlight level [12] (0 - 15, -1 to disable)
init = 10
# step value (1 - 2)
step = 2
# backlight level when on battery [6] (1 - 15, 0 to disable)
on_batt = 8
}

# ATI X1600 backlight control (MacBook Pro v1 & v2)
lcd_x1600 {
# initial backlight level [200] (0 - 255, -1 to disable)
init = -1
# step value (1 - 127)
step = 10
# backlight level when on battery [80] (1 - 255, 0 to disable)
on_batt = 80
}

# Intel 945GM, 965GM backlight control (MacBook v1-v4, MacBook Air v1)
lcd_gma950 {
# initial backlight level [0x6f] (0x1f - 0x94 usually, -1 to disable)
init = -1
# step value (0x01 - 0x20)
step = 0x0f
# backlight level when on battery [0x40] (0x1f - 0x94 usually, 0 to disable)
on_batt = 0x40
}

# nVidia GeForce 8600M GT/9400M/9600M GT backlight control
# (MacBook Pro v3-v5, MacBook v5, MacBook v2)
lcd_nv8600mgt {
# initial backlight level [12] (0 - 15, -1 to disable)
init = 10
# step value (1 - 2)
step = 2
# backlight level when on battery [6] (1 - 15, 0 to disable)
on_batt = 6
}

# Audio support
audio {
# Use amixer or alsamixer/alsamixergui to determine the sound card
# and the mixer elements to use here.

# sound card to use
card = "default"
# initial volume [80] (0 - 100%, -1 to disable)
init = -1
# step value (1 - 50%)
step = 10
# beep on volume change
beep = yes
# mixer element for volume adjustment
volume = "PCM"
# mixer element for muting the speakers
speakers = "Front"
# mixer element for muting the headphones
headphones = "Headphone"
}

# Keyboard backlight control
kbd {
# default value for automatic backlight (0 - 255)
default = 100
# step value (1 - 127)
step = 10
# ambient light thresholds for automatic backlight (0 - 255)
on_threshold = 20
off_threshold = 40
# enable/disable automatic backlight
auto = yes
# idle timer - switches off keyboard backlight automatically (timeout in seconds, -1 to disable)
idle_timer = 60
# idle tickms - timer tick rate in milliseconds
idle_tickms = 2000
}

# CD/DVD drive ejection
eject {
# enable/disable eject key
enabled = yes
# CD/DVD device
device = "/dev/dvd"
}

# Beeper
beep {
# enable/disable beeper
enabled = no
# WAV file to use (from pommed: goutte.wav or click.wav in /usr/share/pommed)
beepfile = "/usr/share/pommed/goutte.wav"
}

# Apple Remote - deprecated
# Note: the appleir driver is required for this to work; this driver has been
# obsoleted with Linux 2.6.22, so unless you are running a kernel < 2.6.22 or
# use the appleir driver on a newer kernel, this won't work.
# You should use LIRC instead.
appleir {
# enable/disable the appleir support
enabled = no
}
紅字的區域是我們要注意的地方--啟用fn鍵來控制最上面的快捷鍵,以及啟動時的預設亮度。設定完之後讓pommed重新啟動吧!
invoke-rc.d pommed restart
這個時候,你應該需要使用fn鍵來調整亮度了。

利用gnome-alsamixer關閉靜音狀態:
這個時候,我們的linux還是啞巴狀態,原因是預設輸出(front speaker)是mute狀態,文字介面的alsamixer並沒有辦法變更mute狀態,我們必須呼叫gnome-alsamixer才能關閉靜音:

確認mute沒有打勾,這樣linux就會有聲音了。當初為了找沒有發聲的原因,幾乎要翻遍了所有設定檔...

使linux可讀寫hfs檔案系統:
由於我們需要讀寫hfsplus,所以我安裝了以下的套件:

sudo aptitude install hfsplus hfsprogs hfsutils
安裝好之後,我們已經可以建立並掛載hfsplus檔案系統了。在linux下我們看看分割區長什麼樣子吧:
WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          26      204819+  ee  GPT
Partition 1 does not start on physical sector boundary.
/dev/sda2   *          26       15691   125829120   af  HFS / HFS+
/dev/sda3           15707       20929    41943040   ef  EFI (FAT-12/16/32)
/dev/sda4           20945      121585   808392368   af  HFS / HFS+
我們在安裝時所切的三個分割區其實是sda{2,3,4},sda1則是GPT的所在。我不清楚MacOS為什麼要在每個分割區之間都隔了一個128MB大小的空間,好在我們只浪費三個128MB...
我希望在家目錄下新增兩個資料夾來放sad2與sda4,先改個/etc/fstab先:
LABEL=MacOSX   /home/maxsolar/MacOSX   hfsplus   defaults,user,users,force   0   0
LABEL=DATA   /home/maxsolar/DATA   hfsplus   defaults,user,users,force   0   0
由於linux並未正式支援hfs+的寫入,需注意參數必須加上force才能掛載為可讀寫模式。

Linux與MacOSX共用目錄架構:
在家目錄建立DATA與MacOSX兩個資料夾之後,可以用一般使用者身份掛載:

mkdir ~/{MacOSX,DATA}
mount ~/DATA
chown maxsolar:maxsolar ~/DATA
mount ~/MacOSX
chown maxsolar:maxsolar ~/MacOSX
chown能成功的關鍵在於你必須有在fstab加入force參數,否則永遠都會是read-only的檔案系統,即使你已經在Mac把你的uid/gid改掉了,也是枉然。

接著,我們希望家目錄下的一些目錄可以共享:

cd $HOME
rm -r Desktop && ln -s MacOSX/Users/maxsolar/Desktop .
rm -r Downloads && ln -s MacOSX/Users/maxsolar/Downloads .
rm -r Documents && ln -s MacOSX/Users/maxsolar/Documents .
rm -r Music && ln -s MacOSX/Users/maxsolar/Music .
rm -r Pictures && ln -s MacOSX/Users/maxsolar/Pictures .
rm -r Public && ln -s MacOSX/Users/maxsolar/Sites Public
ln -s MacOSX/Users/maxsolar/Movies .

啟用多點觸控:兩指翻頁而非側邊翻頁
到Preferences-->Mouse,到touchpad分頁啟動他!
到目前為止,兩套os檔案可以互通,無線網路、ethernet、視訊都可以使用了,要進入linux只需要按住option鍵,就可以選擇開機磁區;看起來十分美好不是嗎?

rEFIt的迷思

rEFIt是Mac機器上把EFI給視覺化的工具,簡而言之就是一個圖形介面的開機選單程式。我曾經下載了rEFIt來安裝,也成功的出現了三個作業系統的畫面,非常開心!

但是在後續開機進入MacOSX的時候,就無法成功開進MacOSX。在linux底下我用fsck檢查hfs+,發現有幾個block位置不正確,被修正之後才能順利開機;但是下次要進入MacOSX又是同樣的情形。所幸利用cmd+s進入單人模式,出現提示指令進行檔案系統的檢查,又發現有block位置異常,修復之後又可以開機了。我不知道這是什麼原因,但是在我移除rEFIt並且塞入Snow Leopard光碟修復MacOSX分割區之後,就在也沒有這種情形發生了;我不知道各位會不會有這種情形,但是我在也不會再去使用rEFIt了。進入MacOSX是預設值,要進入Linux/Windows只需要按住option鍵,會看到有另一個標示著『Windows』的硬碟,選擇他之後就會看見可愛的grub2選單了。

雖然硬碟裡有三個os,但是EFI的選單還是只會有兩個,且第二個一定是Windows(真鳥)。

一些未解的問題:

  • 鍵盤背光燈:
  • 鍵盤背光無法控制--你可以讓他暫時暗下來,但隨後又恢復亮度;只要鍵盤閒置他就會自動關閉,鍵盤一有動作,無論任何情況都會有50%的亮度顯現。
  • 在linux下的觸控版:
  • 在linux底下用觸控版移動視窗不能用兩點觸控,但可以使用雙擊+移動,也可以使用單點不放+移動。雖然不太方便,但習慣就好。
    無法支援MacOSX下的三指/四指觸控的功能,這點很可惜,即使在Windows底下也是如此。
  • 沒有print screen鍵、number以及insert鍵:
  • 沒有number跟insert鍵只是小問題,在windows打電動時需要trianer時,熱鍵不能用阿@__@|||,但是linux底下沒有printscreen鍵,每次都要點"Take Screenshots",很辛苦。
  • iSight會自動隨亮度變化,調整螢幕亮度:
  • 這應該算是好事,只是每次光線變化調整亮度都是調到100%,眼睛差點瞎掉,只好趕快用smartdimmer調低亮度,有點惱人。
  • 在linux環境下,耗電較兇:
  • 我自己的感覺是相同工作下,比MacOSX環境少了2小時左右。MacOSX在正常使用下幾乎可以到8小時的使用時間,linux大約只能撐6小時。
  • grub無法成功啟動MacOSX,無論是32或64bits
  • 如果我把linux的開機管理程式安裝在MBR,事實上是裝在GPT最前面128Kb的"Protective MBR"。然而這會導致Macbook一開機就進入了grub,而grub的預設值卻無法成功啟動MacOSX,我也不知道原因為何。但如果我安裝在sda3,那麼預設還是進入MacOS,如果要選擇進到XP或是Linux,就按個option鍵來切換。
    option鍵所能夠顯示的開機選單最多就三個:MacOS,非MacOS以及光碟機(或是firewire/USB),如果實體硬碟上有多個os,也只會顯示兩個而已,我覺得蠻不親切的,而且另一個系統的標籤預設是"Windows",我覺得蠻不好的,但找不到地方改。

參考文章:

2010年7月26日 星期一

Memory for crash kernel not within permissible range

這個問題會發生在所有Redhat-based Linux上,包含Scientific Linux,當然更包含了虛擬機器下的Redhat-based linux--在開機時出現:「Memory for crash kernel (0x0 to 0x0) notwithin permissible range」的訊息。


CentOS 的開機畫面。


RHEL5 的開機畫面。


ScientificLinux 的開機畫面。

這個警告寫得太像錯誤訊息,以至於雖然能夠成功開機,但是小心一點的管理員卻會擔憂這代表什麼意思。事實上,這是kdump(Kernel dump daemon)的訊息。這只是一個提示訊息(informational message),只要在init.d裡面拿掉kdump,或是安裝時選擇不安裝kdump即可。由於在開機時,系統不會知道你是否有為crash kernel保留一份記憶體位置,所以嚴格說來這是給kernel dump的服務所提供的訊息,是可以安心的忽略他的。如果你已經取消kdump開機時啟動,但仍然出現這個問題,那麼就當做沒看到吧!
雖然redhat的開發人員已經出面解釋這不是bug也可以從容的忽略他,但是許多人還是罵翻這個message,因為他讓太多網管人員花太多的時間在google這個近乎無用的訊息上。

論壇上許多網友建議的做memory test,更新或是手動編譯一個kernel都是於事無補的,請別浪費時間在這上面。

chroot初體驗

chroot是linux上一個可以讓你限制根目錄的有趣指令。在unix的世界裡,萬物的源頭就是/,就算是/的上一層目錄也還是根目錄本身。也就是說,任何使用者都無法離開/,就像是你永遠跨越不了宇宙的邊界,除非你已經不屬於該宇宙的一部分。

今天研究室學妹laptop上的opensuse遇到了一個有趣的問題。開機到stage2之後,無法掛載根目錄,其錯誤訊息是:『unknown "reiserfs" filesystem』。這在Redhat系列的linux並不意外,因為他們並不打算讓使用者不自訂kernel的情況下去使用reiserfs以及reiser4。反之,opensuse則是預設以reiserfs為檔案系統。很顯然是kernel不認識這個filesystem,但是是什麼原因使得kernel不認識filesystem呢?

我只是合理的猜測--更新kernel的過程中,或是在執行SuSEConfig之前更新的process被中斷。後來學妹也說因為太久沒更新,結果更新的清單一大疊,很可能是因為要回家前更新還沒有完成,所以就中斷這個process。跟Debian不同:Debian的更新是把所有的套件都抓下來之後再逐個安裝,Redhat/SuSE系列則是下載一個安裝一個,或許恰好是在安裝新的kernel時被終止,留下了一個沒有設定完成的kernel。

由於根檔案系統無法被掛載,我只剩下最基本的ls/mount等指令可用,連關機都不行@_@||| ...在Debian的liveCD裡,我無法利用rpm或是yast替opensuse安裝一個新的kernel上去;於是,我想到chroot。

mkdir /Virtual
mount /dev/sda1 /Virtual
mount --bind /proc /Virtual/proc
mount --bind /sys /Virtual/sys
mount --bind /dev /Virtual/dev
chroot /Virtual
這個時候,我就擁有了opensuse的環境,雖然此時此刻所使用的kernel是debian的。由於我急著希望有一個可以正常開機的kernel,因此就先更新kernel吧!
zypper update kernel-default
Debian重開機之後,原本的硬碟載入grub,到了stage2就可以成功掛載root檔案系統了!第一次使用chroot就有不錯的經驗,chroot真是好物!

延伸閱讀:
Tetralet大哥的好文:使用 debootstrap 來建立 CHROOT 環境

2010年4月25日 星期日

dpkg速記

deb的基本安裝過程:
dpkg是Debian底層的套件管理程式,其上還有強大的apt,在其上更有非常強大的aptitude管理系統。Debian系列的linux,如Ubuntu, B2D, LinuxMint等,都是使用dpkg作為底層的套件管理程式。不過由於apt以及aptitude過於強大,許多使用者對於dpkg的熟悉度往往少於Redhat系的使用者對於rpm的熟悉度;本文僅作為一個Debian的死忠支持者對dpkg指令的一篇速記,希望對於Debian迷以及Ubuntu Linux的技術人員亦能有所幫助。
dpkg能用來查詢、安裝以及設定deb檔;如同rpm,dpkg亦使用dpkg資料庫紀錄每個套件安裝、設定、移除等詳細資訊。一個標準的deb檔命名方式如下:

Filename_version-release_arch.deb
例如madedit_0.2.9-1_amd64.deb,madedit就是套件名稱,0.2.9為版本號,1為釋出番號,amd64則表示x86_64位元的平台。安裝一個deb的流程大致如下:
  1. 解開control file
  2. 從dpkgdb檢查系統是否已安裝此套件且版本相同;如果有,則執行prerm script,再執行preinst script。
  3. 備份舊的binaries,解開新的bineries並複製到設計好的位置。
  4. 從dpkgdb檢查系統是否已安裝此套件但版本不同;如果有,則執行postrm script。
  5. 備份舊的config檔,解開新的config檔並複製到設計好的位置。
  6. 執行postinst script。
dpkg有兩個姊妹:dpkg-deb以及dpkg-query。不過dpkg的action以及options能涵蓋大部分這兩個指令的功能,因此本文就僅提dpkg常用的功能。

安裝

dpkg的基本語法是:

dpkg action options
例如
dpkg --install --force-architecture foo.deb
--install對於dpkg而言是action,而--force-architecture則是action的微調選項。 dpkg的安裝並不進行gpg公開金鑰的驗證,而是在apt或是aptitude的部份進行檢查,因此有別於rpm系列的模式。安裝一個deb檔只需要-i(--install)命令:
dpkg -i foo.deb
一個deb的安裝大致可將上述流程一分為二:先解開這個deb檔到檔案系統中並寫入到dpkgdb裡,然後才進行設定。事實上,--install可以手動分成兩個步驟完成:
dpkg --unpack foo.deb
dpkg --configure foo
當然,你也可以在執行一次configure:
dpkg-reconfigure foo
很可惜,dpkg並不支援安裝一個網路上的deb檔,如果你想學rpm的方式:
dpkg -i http://altruistic.lbl.gov/mirrors/ubuntu/pool/universe/x/xosview/xosview_1.8.3+debian-18_i386.deb
你一定會得到錯誤訊息:
dpkg: error processing http://altruistic.lbl.gov/mirrors/ubuntu/pool/universe/x/xosview/xosview_1.8.3+debian-18_i386.deb (--install):
 cannot access archive: No such file or directory
Errors were encountered while processing:
 http://altruistic.lbl.gov/mirrors/ubuntu/pool/universe/x/xosview/xosview_1.8.3+debian-18_i386.deb

升級

嚴格來說,dpkg並沒有從deb去升級套件的指令。從deb的安裝流程來看,dpkg只要遇到版本比系統上的還新,就會自動移除舊的套件並安裝新的套件,備份舊的設定檔並套用新的設定檔。當然,自動移除舊套件這類prerm/preinst script都需要deb套件維護人員的細心維護。如果deb被粗心的維護,這個流程恐怕就不能如預期跑完。

重新安裝/強迫安裝

dpkg並沒有重新安裝這個觀念。使用--install遇到同版本的套件,並不會重新安裝,但是卻會再次執行--configure。如果想要重新安裝而不透過apt/aptitude,則需要移除套件才能再次安裝。
忽略套件的衝突進行強迫安裝。

dpkg -i --force-conflicts foo.deb
忽略套件的相依性進行強迫安裝。
dpkg -i --force-depends foo.deb
忽略套件相依性的版本問題。如果只是版本問題而非缺乏套件相依性,可以用這個option試試看。
dpkg -i --force-depends-version foo.deb
忽略套件的相依性,並且將套件的Desired status(稍後會提到)設定為hold進行強迫安裝。
dpkg -i --force-hold --force-depends foo.deb
更新設定檔時保留舊設定。最常用於安裝新版本的套件。如果想用新的設定檔,則改為--force-confnew。
dpkg -i --force-confold foo.deb
如果你是x86_64的機器,可是binaries只有for x86且沒有source code可供編譯,可以試試看安裝x86的deb。
dpkg --install --force-architecture foo_i386.deb
強迫安裝一個更舊的套件。需注意降級套件並不會顯示任何套件衝突或是相依性問題。使用時不要拿系統主要的套件來嘗試。
dpkg --install --force-downgrade foo.deb
強迫安裝一個套件。利用--refuse停止複寫系統內的檔案,並用--force強制忽略相依性及衝突性來安裝deb檔。
dpkg --install --refuse-overwrite --force-depends --force-conflicts foo.deb

不過這些強迫安裝的套件,都會因為使用apt/aptitude而被移除。

LPI level I也喜歡考這幾個options:
指定一個deb資料夾來安裝(-R/--recursive):

dpkg -iR foo/
安裝時若遇相依性問題,一律拒絕版本降級(-G/--refuse-downgrade):
dpkg -iG foo.deb
安裝時若遇到相同版本的套件,就略過不處理(-E/--skip-same-version):
dpkg -iE *.deb
檢視未安裝完全的套件(-C/--audit):
dpkg -C
-C/--audit並沒有額外options,如果檢視的結果沒有任何輸出,表示所有套件均正確被安裝及設定。

查詢已安裝的套件

1.以最常見的vim為例,查詢某套件的安裝狀態訊息(-l, --list)

dpkg -l vim
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ 名稱         版本         簡介
+++-==============-==============-============================================
ii  vim            2:7.2.245-2ubu Vi IMproved - enhanced vi editor
輸出結果的狀態欄位為"ii "共三個欄位。
第一個欄位為Desire status(也稱為Selection status),是系統管理員設定某套件將要執行的更動,例如
  1. u(unknown)
  2. i(install)
  3. r(remove)
  4. p(purge,連設定檔也移除)
  5. h(hold,維持版本號)
這個欄位是被特別設定的。例如你要把vim的Desired status設定成hold,也就是不更新此套件:
echo "vim hold" | dpkg --set-selections
可以在試試看dpkg -l vim:
hi  vim            2:7.2.245-2ubu Vi IMproved - enhanced vi editor
可以發現Desired status已經是hold住了。--set-selections只接受stdin,若想知道某個套件的Desired status,就使用--get-selections吧:
dpkg --get-selections vim
vim      install
第二個欄位為Package status(或稱為actual status),是套件目前的狀態
  1. N(not-installed)
  2. dpkg --purge所致,不留設定檔。
  3. C(config-files)
  4. dpkg --remove所致,只剩下設定檔了。
  5. H(half-installed)
  6. 不完全安裝,常見於其他套件執行--force-breaks所影響。
  7. U(unpacked only)
  8. dpkg --unpack之後的結果。
  9. F(half-configured or failed configured)
  10. 是一個設定失敗的套件,通常會是一個服務。
  11. A(triggers-awaited)
  12. 表示下次系統執行apt/aptitude時,會等待某個套件的觸發而觸發,使之變更到Selection status。
  13. P(triggers-pending)
  14. 表示下次系統執行apt/aptitude時會觸發這個套件使之變更到Selection status。
  15. i(installed)
  16. 一個正常的安裝狀態。
第三個欄位為Package Flags(套件旗標),只有一個flag:
r(reinst-required)
出現這個flag表示該套件被標示為broken,他不能夠被移除,並且會嘗試在下次執行apt/aptitude時重新安裝。
我們常用dpkg -l | grep foo來查詢某個套件的狀態,而不要列出一大堆不必要的欄位資訊。

2.查詢某套件的詳細資訊,包含相依性、衝突套件等(-p, --print-avail/-s, --status)
dpkg -p(-s) vim
Package: vim
Priority: optional
Section: editors
Installed-Size: 1516
Maintainer: Debian Vim Maintainers 
Architecture: i386
Version: 1:7.1.314-3+lenny2
Replaces: vim-common (<< 1:7.1-175+1)
Provides: editor
Depends: vim-common (= 1:7.1.314-3+lenny2), vim-runtime (= 1:7.1.314-3+lenny2), libacl1 (>= 2.2.11-1), libc6 (>= 2.7-1), libgpm2 (>= 1.20.4), libncurses5 (>= 5.6+20071006-3), libselinux1 (>= 2.0.59)
Suggests: ctags, vim-doc, vim-scripts
Conflicts: vim-common (<< 1:7.1-175+1)
Size: 776664
...描述省略

3.列出套件所包含的檔案(-L, --listfile)
dpkg -L vim
/usr
/usr/bin
/usr/bin/vim.basic
/usr/share
/usr/share/bug
/usr/share/bug/vim
/usr/share/bug/vim/presubj
/usr/share/doc
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/vim
/usr/share/doc/vim

4.查詢某檔案由哪個套件提供(-S, --search)
dpkg -S /etc/apache2/apache2.conf
apache2.2-common: /etc/apache2/apache2.conf

查詢一個deb檔

1.查詢一個deb檔所包含的檔案(-c, --contents)

dpkg -c xosview_1.8.3+debian-18_i386.deb
drwxr-xr-x root/root         0 2009-09-28 21:17 ./
drwxr-xr-x root/root         0 2009-09-28 21:16 ./etc/
drwxr-xr-x root/root         0 2009-09-28 21:16 ./etc/X11/
drwxr-xr-x root/root         0 2009-09-28 21:16 ./etc/X11/app-defaults/
-rw-r--r-- root/root     11382 2009-09-28 21:16 ./etc/X11/app-defaults/XOsview
drwxr-xr-x root/root         0 2009-09-28 21:16 ./usr/
drwxr-xr-x root/root         0 2009-09-28 21:16 ./usr/share/
drwxr-xr-x root/root         0 2009-09-28 21:16 ./usr/share/applications/
-rw-r--r-- root/root       153 2009-09-28 21:16 ./usr/share/applications/xosview.desktop
drwxr-xr-x root/root         0 2009-09-28 21:16 ./usr/share/pixmaps/
-rw-r--r-- root/root     11447 2009-09-28 21:16 ./usr/share/pixmaps/xosview.xpm
2.查詢一個deb檔的詳細資訊(-I, --info)
dpkg -I xosview_1.8.3+debian-18_i386.deb
(-I是大寫的i,不是小寫的L喔!)
 new debian package, version 2.0.
 size 110050 bytes: control archive= 1210 bytes.
      30 bytes,     1 lines      conffiles            
     704 bytes,    16 lines      control              
     717 bytes,    11 lines      md5sums              
     185 bytes,     7 lines   *  postinst             #!/bin/sh
     160 bytes,     5 lines   *  postrm               #!/bin/sh
 Package: xosview
 Version: 1.8.3+debian-18
 Architecture: i386
 Maintainer: Ubuntu Developers 
 Original-Maintainer: Kartik Mistry 
 Installed-Size: 328
 Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.4.0), libx11-6
 ...以下省略

移除(--remove/--purge)

dpkg -r foo
刪除一個套件。需記得dpkg不會幫您解決相依性、套件衝突問題;如果有這些問題,dpkg -r並不會成功動作。
dpkg -P foo
刪除一個套件。並且連設定檔一同刪除。

解開deb(dpkg -x):

dpkg -x foo.deb /path
解開這個deb安裝後的目錄樹。但是真正能控制deb的設定檔並不會被解出來。要一窺deb控制檔的奧秘,你必須使用ar:
ar x foo.deb
可以發現有control.tar.gz、data.tar.gz、debian-binary這三個檔案,其中control.tar.gz便包含了許多安裝前後的script:
./postinst
./postrm
./conffiles
./md5sums
./control
而data.tar.gz就是真正要安裝到檔案系統的內容。

參考文獻:
1. Debian System -- concept and technology
2. A practical guide to Ubuntu Linux
3. Man page of dpkg
4. 次世代Ubuntu Linux完全手冊,第五章

2010年4月24日 星期六

YUM筆記

YUM簡史

YUM(Yellow dog Updater, Modified)是Redhat系列的linux最重要的套件管理程式,他的前身是YUP(Yellow dog UPdater)。Yellow Dog很多人是很陌生的,他是在早期運行在IBM的power平台上的linux,也是使用rpm based。當時能夠跑在power上的linux大概就只有Debian以及Redhat/Fedora Linux;後來在社群不斷地維護、改善下,就產生了重大的改版--YUM。

很顯然的,YUP或是YUM的出現是因為rpm的相依性、版本、套件間衝突的問題用手動很難解決,必須要依靠一個機制來自動替我們解決所有相依性地獄(dependency hell)的問題。yum提供的服務大致有四項:

  1. 自動解決相依性問題
  2. 能夠用command自動化管理,也能有圖形化介面(pirut)
  3. 能夠管理多個套件庫來源
  4. 能夠跟rpm一樣精確的管理套件的版本以及適用平台的種種情況

Repostories

一個Redhat Linux標準的repostories設定檔,是放置在/etc/yum.repos.d/底下,任何以.repo結尾的檔案都會被視為一個套件庫。以一個RHEL5.repo為例,他的格式如下:

[Server]
name= Server catagory
enable = 1
baseurl=http://192.168.2.254/RHEL5/Server/
gpgcheck=0

[VT]
name= Virtualization catagory
enable = 1
baseurl=http://192.168.2.254/RHEL5/VT/
gpgcheck=0

[Cluster]
name= Cluster catagory
enable = 1
baseurl=http://192.168.2.254/RHEL5/Cluster/
gpgcheck=0

[ClusterStorage]
name= ClusterStorage catagory
enable = 1
baseurl=http://192.168.2.254/RHEL5/ClusterStorage/
gpgcheck=0
其中,[XX]就是yum認定的repo category名稱;利用enable變數可以開關一個category。習慣上相同來源不同的category會放在同一個.repo便於維護,當然你也可以將所有來源寫成同一個檔案,或是每個category都獨立成一個.repo,yum都能夠正確解讀。
想知道有哪些categories是enable/disable,或是全部列出,可以使用repolist:
yum repolist all
repo id             repo name                                    status
Cluster             Cluster catagory                             enabled:     32
ClusterStorage      ClusterStorage catagory                      enabled:     30
RHEL5               RHEL5                                        disabled
Server              Server catagory                              enabled:  2,797
VT                  Virtualization catagory                      enabled:     34
rhel-debuginfo      Red Hat Enterprise Linux 5Server - i386 - De disabled
rhel-debuginfo-beta Red Hat Enterprise Linux 5Server Beta - i386 disabled
rpmforge            Red Hat Enterprise 5Server - RPMforge.net -  enabled: 10,305
rpmforge-testing    Red Hat Enterprise 5Server - RPMforge.net -  disabled
repolist: 13,198

安裝(install)

yum有著非常直觀的命令列:install用來安裝數個套件:

yum install foo1 foo2 foo3
如果你的機器是x86_64,你還可以選擇安裝x86版本的套件,此時只要在多指定名稱即可:
yum install f001.x86_64 f002.x86 f003
對於沒有指定平台的套件,如果套件庫兩者都存在,則兩種平台都會安裝;因此還是強烈建議把平台名稱也寫上去。yum的運行機制會先更新yumdb,然後從dbcache裡得知所有套件資訊,因此當你執行yum install foo時,yum已經更新了他的yumdb,並且列出滿足安裝該套件所需要額外安裝的套件,並等待徵求你的同意。有時候你想自動回答yes,那麼就加個-y:
yum install foo3 -y
不過如果你沒有匯入gpg公開金鑰,yum下載完rpm會拒絕你繼續安裝。解決的方法是在.repo檔裡設定gpgcheck=0,或是直接使用nogpgcheck:
yum install foo3 --nogpgcheck -y
如果想忽略訊息,就加個-q吧。當然,你可以用yum安裝一個rpm,讓yum幫你解決惱人的相依性問題(如果yum可以解決的話):
yum localinstall foo3-1.2.3-5.el5-x86_64.rpm
or
yum localupdate foo3-1.2.3-9.el5-x86_64.rpm
yum也支援安裝一個群組套件,這比較少用到,除非你知道有哪些群組套件可用:
yum groupinstall "GNOME Desktop Environment"
當然,yum也可以讓你很容易的重新安裝:
yum reinstall foo

更新(update/upgrade)

更新是很重要的事情。除非一個系統只專門為了某項服務而設立(例如網格計算之類的高速電腦),或是在一個非常封閉的環境裡(例如無法連入的私有網路),否則更新套件以及安全性更新是很重要的。update就是最常用的更新指令:

yum update foo2 foo2
這樣一來便能夠更新這兩個套件。如果不加任何套件名稱,則系統內所有套件都會被更新。yum也可以讓你只看看有哪些東西需要更新,而不會真的更新:
yum check-update
另一個類似的用法:upgrade
yum upgrade
其實等同於
yum update --obsoletes
讓套件的更新會刪除已淘汰(repo不再被維護)的舊套件。通常這個指令只建議做同版本的升級(例如CentOS 4.3->4.4),如果想要從CentOS4.4升級到目前的5.4,恐怕還是建議拿光碟升級或重灌系統。
或是讓你降級安裝:
yum downgrade foo1

許多關鍵的server並不希望更新kernel或是gcc版本,我們可以從yum的設定檔下手:在/etc/yum.conf多加一行
exclude=kernel gcc
就可以防止被yum升級。

移除(remove/erase)

利用remove或是erase:

yum remove foo1 -y
利用yum remove比rpm -e來得方便多了,因為yum能自動幫我們解決相依性的問題。

查詢(list/search/info)

list可使用的對象分成七大類:installed(已安裝套件), available(所有repos裡的套件), updates(可供更新套件), extras(已安裝但不在repos裡), obsoletes(系統內已被repos廢棄的套件), recent(新被加入到repos的套件)以及all(所有安裝到系統的套件)。list可提供套件名稱的模糊搜尋。要查看有沒有可以更新的套件:

yum list updates
查看有沒有安裝http:
yum list installed http*
查看整個套件庫有多少套件:
yum list avaliable | wc -l
search則是比list提供更廣義的搜尋。利用search可以提供套件名稱、描述、摘要以及與該套件相關的模糊搜尋。
yum search python
便會發現所有欄位包含python都會被納入搜尋範圍。
info會列出套件的詳細資訊。如果只下yum info,則會列出所有套件庫內的套件資訊,那是非常龐大且沒有幫助的訊息。一樣可以用list的規範:
yum info installed | grep nfs
當然,info也可以直接指定套件名稱,但也僅限於套件名稱的模糊搜尋:
yum info nfs*
其他的類別就各憑需求去執行囉。

進階查詢(provides/whatprovides)

provides與whatprovides是相同的意義,通常用在尋找某個檔案是由哪個套件所帶來的

yum provides /etc/passwd
setup-2.5.58-1.el5.noarch : A set of system configuration and setup files.
Repo        : Server
Matched from:
Filename    : /etc/passwd

setup-2.5.58-7.el5.noarch : A set of system configuration and setup files.
Repo        : installed
Matched from:
Other       : Provides-match: /etc/passwd
如果有多個repos,就會有多比資料。provides也可提供套件的模糊搜尋。

清除(clean)

cache指的是rpm本身。yum從站台下載下來的rpm都會存在暫存資料夾下安裝,但是安裝成功後並不會幫你清除。

yum clean packages
可以清除的對象還有headers/metadata/dbcache等。你可以直接用一個all代表清除全部:
yum clean all
刪除某套件的cache

建立一個自己的repo

建立一個yum repo比想像中更容易,你只要把rpm放在一個指定的目錄下,就可以建立一個repo:

createrepo -v /path/to/rpmrepo
這個指令在於產生一個repodata的目錄,內含filelists.xml.gz這類重要的檔案。產生一個新的.repo把這個位置加進來,可以是local硬碟file://,也可以是ftp://,也可以是http://。

參考文章:
1. Redhat Enterprise Linux Administration Unleashed, Chapter 3.
2. YUM的使用-PHP5網管實驗室
3. 使用 yum 來做套件管理並建置 yum Server

2010年4月23日 星期五

rpm速記

rpm的基本安裝過程:
RPM(Redhat package Manager)是Redhat系的linux最必須要熟知的套件管理程式,許多非Redhat系的linux也沿用這個管理程式,例如SuSE Linux, Mandirva以及其衍生的PCLinuxOS等。rpm的功能非常完備,比起dpkg管理程式更勝一籌。
rpm的所有動作都會與rpmdb進行互動,也就是透過rpm所安裝的程式都能夠被記錄下來;手動安裝的程式則不在db內,因此也無法享受這方面的便利性。安裝、移除、升級rpm時都會更新rpmdb,但是仍然可以手動更新:

rpm --rebuilddb
rpm檔的命名遵循一定的格式:
Filename-version-release.arch.rpm
例如GConf2-2.14.0-9.el5.i386.rpm,其中的GConf2就是檔案名稱,2.14.0為版本號,9為釋出番號,el5.i386表示這是一個適用於RHEL5 x86平台的rpm檔。一個rpm的安裝會有下列過程:
  1. 檢查數位簽章
  2. 進行相依性檢查
  3. 執行pre script
  4. 複製檔案內容至指定位置
  5. 執行post script

GPG(GNU Private Guard) key數位簽章驗證

GPG key(或稱為signature key)是rpm的發行商應該提供的一個數位簽章(也就是一組公開金鑰)在安裝前rpm會進行檢查。如果rpm檔沒有數位簽章,或是rpmdb沒有紀錄該發行商的公鑰,則rpm數位簽章認證則會出錯:

rpm --checksig http://192.168.2.254/RHEL5/Server/GConf2-2.14.0-9.el5.i386.rpm
http://192.168.2.254/RHEL5/Server/GConf2-2.14.0-9.el5.i386.rpm: 
(SHA1) DSA sha1 md5 (GPG) NOT OK (MISSING KEYS: GPG#37017186)
假設我們想匯入GPG key到系統裡,應該用--import:
rpm --import http://192.168.2.254/RHEL5/RPM-GPG-KEY-redhat-release
我再試一次:
rpm --checksig http://192.168.2.254/RHEL5/Server/GConf2-2.14.0-9.el5.i386.rpm
http://192.168.2.254/RHEL5/Server/GConf2-2.14.0-9.el5.i386.rpm: 
(sha1) dsa sha1 md5 gpg OK
其中,--checksig可以用-K來代替。GPG key的簽章校驗失敗並不會讓安裝無法進行,只是rpm被包裹成類似cpio的格式,沒辦法輕易得知裡面的內容是否被有心人士更動過,因此匯入發行商的公開金鑰進行數位簽章的認證其實是常被忽略但極為重要的一個步驟。

安裝:

rpm -ivh foo.rpm
其中,-i表示install, -v為verbose,-h則是用50個#(hash marks)來顯示進度。如果你對debug rpm感興趣,你還可以用-vv顯示更詳盡的內容。
rpm -i --test foo.rpm
非常有趣的一種方式,利用--test測試安裝,過程並不會真的安裝,而是把-i之後的結果先印給使用者。如果結果符合預期,可以把--test拿掉進行真正的安裝。

升級:

rpm的升級可用兩種方式:

rpm -Uvh foo.rpm
-U表示Upgrade and install的意思。如果系統內已經有舊版本的套件,則會移除後再安裝新版本;如果沒有既有套件,則等同於-i全新安裝;這也是很多人常用-Uvh來安裝rpm的原因。
rpm -Fvh foo.rpm
-F為Freshen之意,意思比upgrade更像upgrade。使用-F,系統內必須已經安裝了較舊或相同版本的套件,她並不會像-U自動升級安裝。
需切記核心的升級要使用-i全新安裝,而不要使用-U/-F。原因是rpm -U會移除舊的kernel並安裝新的,但是我們並無法確定新核心是否有問題,甚至不確定能否正常開機。使用-i進行一個新的安裝,一旦新核心有問題,還可以開回舊核心繼續作業。

重新安裝:

rpm -ivh --replacepkgs foo.rpm
雖然名為replace,但是就是reinstall的意思。適用於相同版本號的套件。
rpm -ivh --replacefiles foo.rpm
如果既有檔案與foo.rpm會安裝到系統的檔案有重複或是套件間有conflict,則會覆蓋掉系統的舊檔案,也就是忽略套件間衝突
rpm -ivh --oldpackage foo.rpm
如果為了讓某些程式可以跑,需要舊一點的套件(最常見的就是舊版的gcc),你可能需要downgrade你的套件。利用--oldpackage指定一個比現有套件還舊的package來安裝。強制安裝一個rpm檔,完全忽略相依性未解決的問題。如果你根本不想理會到底是降級到舊版本或是覆蓋舊檔的問題,你可以用--force代替上面三個範例:
rpm -ivh --force foo.rpm
完全等同於
rpm -ivh --replacefiles --replacepkgs --oldpackage foo.rpm
不過這樣硬幹並非好事,而且還是沒辦法解決相依性的問題。如果你只想忽略相依性而強制安裝,應該用--nodeps:
rpm -ivh --nodeps foo.rpm
如果你是x86_64的機器,可是binaries只有for x86且沒有source code可供編譯,可以試試看安裝不同arch的rpm:
rpm -ivh --ignorearch foo.x86.rpm
如果你的硬碟空間非常有限,系統又跑的是你再熟悉不過的服務跟指令,你可以選擇不裝man pages:
rpm -ivh --excludedocs foo.rpm
如此一來雖然你可以執行一個命令,但是沒有他的man page。

移除:

rpm -e foo
不用接版本號就可以移除(erase)該套件。假設該套件同時安裝了x86及x86_64兩種版本,則只好辛苦一點,指定全名:
rpm -e foo-version-arch

查詢已安裝的rpm檔:

印出套件名稱及版本號:

rpm -q foo
如果要列出系統所安裝『所有』套件,則可用
rpm -qa
來觀察。不過-qa列出的資訊太過龐雜,因此較常見的用法是搭配grep搜尋關鍵字:
rpm -qa | egrep "*samba*"
當然,也可以利用-qa來列出系統已安裝的public key:
rpm -qa gpg-pubkey
如果知道套件名稱,想知道他的詳細訊息(info):
rpm -qi foo
如果想知道系統的某個檔案(file)是由哪個套件提供,可以使用-f:
rpm -qf /etc/passwd
反之,如果你想知道這個rpm究竟裝了哪些東西到你的系統(這恰好是windows最不希望使用者知道的...),可以讓rpm列表(list):
rpm -ql foo
不過,列出的訊息實在太多了,應該可以使用grep撈出有用的資訊,看看有哪些是doc,又有哪些是設定檔;你可以用-qd指查詢docs
rpm -qd foo
或是-qc來查看conf檔:
rpm -qc foo
或是進一步查看套件的相依性:
rpm -q --requires foo
這個指令應該反過來理解:foo套件(或指令)需要哪些套件(或檔案)。例如,python指令需要哪些套件或libs:
rpm -q --requires python
/bin/sh  
/usr/bin/env  
libbz2.so.1  
libc.so.6
...以下略  
相反的,查詢某套件提供了哪些指令或libs,例如,python提供了哪些套件跟libs:
rpm -q --provides python
Distutils  
_bisect.so  
_bsddb.so  
_codecs_cn.so
...中間略  
python = 2.4.3-27.el5
顯示python提供了Distutils套件等,也提供了python自己。
rpm -q --provides foo
跟上面相反:foo套件提供了哪些能力。例如:
rpm -q --provides passwd
config(passwd) = 0.73-1
passwd = 0.73-1
與--provides/--requires類似的兩個options分別是--whatprovides與--whatrequires。
rpm -q --whatprovides python
python-2.4.3-27.el5
rpm -q --whatprovides /etc/passwd
setup-2.5.58-7.el5
被查詢的對象可以是一個檔案,也可以是套件本身。python由python-2.4.3-27.el5提供而來,/etc/passwd則由setup-2.5.58-7.el5而來。
rpm -q --whatrequires bash
info-4.8-14.el5
gpm-1.20.1-74.1
initscripts-8.45.30-2.el5
ypbind-1.19-12.el5
sysklogd-1.4.1-46.el5
vixie-cron-4.1-77.el5_4.1
sendmail-8.13.8-8.el5
squid-2.6.STABLE21-6.el5
vnc-server-4.1.2-14.el5_3.1
bash套件被這些套件所依賴。
rpm -q --whatrequires `which bash`
bash-3.2-24.el5
iproute-2.6.18-11.el5
gpm-1.20.1-74.1
groff-1.18.1.1-11.1
iputils-20020927-46.el5
xorg-x11-filesystem-7.1-2.fc6
crontabs-1.10-8
...族繁不及備載
/bin/bash這個檔案被更多的套件所依賴,不難想像linux就是一個大量shell script架構出來的系統。透過--provides/--whatprovides/--requires/--whatrequires這四個參數就可以把rpm的相依性完全釐清,只是在使用--what參數時總是容易令人混淆。 甚至你也可以檢查這個套件在安裝時的狀態(status):
rpm -qs foo

查詢一個rpm檔:

很幸運的,剛剛我們所列出的options都還可以繼續沿用,要查詢一個rpm檔而不是已經安裝的套件名稱,只需要多加一個-p即可。例如查詢一個rpm的info:

rpm -qpi foo.rpm
想知道這個rpm究竟包含哪些binaries以及libraries:
rpm -qp --provides foo.rpm
以及她需要哪些套件或libs:
rpm -qp --requires foo.rpm
甚至你可以清楚的查看安裝這個rpm的blockquote script以及post script:
rpm -qp --script foo.rpm
在安裝前就先看看這個rpm會裝哪些東西到系統裡:
rpm -qpl foo.rpm
當然還是可以搭配--what,只是別忘了記得加-p

patch檔的查詢:

很多時候我們會下載一個小的patch檔而非一整個全新的rpm,要查看這個rpm patch會更新哪些檔案只需要多一個-P:

rpm -qPpl foo.patch.rpm
有了先前的經驗,我們也可以知道某patch套件更新了哪些檔案:
rpm -qPl foo
當然,你更可以查詢整個系統所有被patch過的檔案有哪些:
rpm -qaP

稽核(Verifying)rpm檔;

稽核rpm檔是比較rpm安裝在檔案系統內的檔案與rpmdb所紀錄的檔案資訊做比較。比對的項目有八項:

  1. file size
  2. 檔案大小是否改變 (S)
  3. file type
  4. 檔案狀態(權限、類型)是否被改變 (M)
  5. MD5 checksum
  6. 以md5sum指令進行計算 (5)
  7. device
  8. 裝置檔是否改變 (D)
  9. linkage
  10. 是否指向另一檔案 (L)
  11. owner
  12. user是否改變 (U)
  13. group
  14. group是否改變 (G)
  15. mtime
  16. 修改時間 (T)
例如,檢查vim套件有哪些檔案被修改過:
rpm -V vim-common
S.5....T  c /etc/vimrc
校驗rpm的結果用上述八個欄位表示,上面的結果表示vimrc在安裝之後大小改變,因此md5 checksum也必定改變,修改時間也改變了。"."表示從未改變。假設這個檔案被移除了,則會顯示missing;如果你是用一般使用者的身份查詢系統檔案,很可能因為權限不足而產生"?"的狀態,請切至root執行rpm -V即可正常檢查。

解開rpm:rpm2cpio

rpm2cpio能解一個rpm檔導入cpio解開成檔案。利用上面所學檢查系統是否有rpm2cpio這個程式:

rpm -qf `which rpm2cpio`
可見這個指令就是包含在rpm套件裡面。
rpm2cpio foo.rpm | cpio -idmv
其中,-i表示解開一個cpio檔,-d建立目錄樹(man pages上說cpio只會解檔案不解目錄,但我測試結果,加不加-d是相同效果),-m使還原後能保留mtime,-v為詳細輸出。
如果只是要查看rpm內容,可以不需要輸出:
rpm2cpio foo.rpm | cpio -vt

參考文獻:
1. Redhat Linux網路及系統管理指南(學貫),第26章
2. 鳥哥的私房菜第23章
3. How To Extract an RPM Package Without Installing It.

2010年4月9日 星期五

批次修改圖片大小-convert

最近在BBS上看到有網友詢問如何利用convert指令做批次轉換。在先前的批次修改圖片大小裡有提到一些方法。不過當時我一直忘記把script寫上來,今天特地補上。

#!/bin/bash

for files in *.ps; do
    name=$(echo $files | cut -d. -f1).pdf
    convert $files $name
done

這個作法的好處就是只要修改.ps跟.pdf這兩個關鍵字即可。當然他不是一個完美script-- 你還可以讓他變得更人性:

#!/bin/bash
## Author: Jim T. Tang (http://maxubuntu.blogspot.com)
if [ -z $1 -a -z $2 ]; then
    echo "usage: $0 jpg png";
    exit 0;
elif [ -z $2 ]; then
    echo "need target format. e.g. ps"
else
    for files in *.$1 ; do
        name=$(echo $files | cut -d. -f1).$2
        convert $files $name
        echo "$name is made."
    done
fi 

2010年3月9日 星期二

終於拿到NCLP證照了(二)!

這個標題很奇怪,但我不得不說一下...Novell這間公司有時候證照辦得太多,也是很容易出錯的。終於拿到NCLP award!這篇文章中,可以發現我只收到NCLA,但是我考的NCLP呢?我從未拿到。由於我從認證資料庫裡查到我確實有CLP的紀錄在,因此也就沒有多疑,即使我沒有拿到紙本的NCLP證照!不過我越想越不對,前幾天又寫信給Novell負責教育訓練的窗口,我列出我所拿到的證照,也就是我在終於拿到NCLP award!這篇文章所列出的證照是否為NCLP所應該有的全部:

Greeting Sir,
In August 2008, I passed NCLP exam.
yesterday I get a Linux Technical Specialist cert in my email box, 
I suddenly found that what I got is a NCLA certification, 
but what I should take is the NCLP cert, right? 
the attached files are what i have, may I know if these are all licences for a NCLP passer?
if these are all for a NCLP passer, why what we got is NCLA instead of NCLP?
if there is NCLP certification but for some reason I never receive awarded emails from Novell,
would you please resend it to me?

And the final question is for NCLP11. If I pass NCLP11 in the future,
will Novell award me both NCLA and NCLP or NCLP only?
thank you! 
--------------------------------
Name: JIM TING TANG
Registration Key:  CSP-XXXXXXXXXX
Candidate ID: 100XXXXX
Email:  maxXXXXXXX@gmail.com
Phone:  886XXXXXXXXXX
Test:  Certified Linux Professional 10

Test Dates:
      08/31/2008  14:30
      08/31/2008  17:00
---------------------------------

我想知道CLP11是不是還會像以前一樣同時送CLA,他的回答如下:

Hello Jim,

Your CLP 10 is showing in your certification progress as completed. I have re-sent the pdf file to you for your certificate. If you complete the CLP you will also be a CLA. Thanks,

Tyler

果然,剛剛我就收到了睽違快要兩年的NCLP證照...雖然已經是過往雲煙了,但這種心情很奇怪,沒啥高興的感覺,我想這大概就是遲來的正義的感覺吧!而且也解決了一個小疑點:即使是SLES 11的版本,拿到NCLP還是一樣同時擁有NCLA的證照,不會改變。

Dear JIM TING TANG:

Congratulations! On behalf of Novell Technical Training, it is a pleasure to grant you the title of:

Novell Certified Linux Professional (Novell CLP)
SUSE Linux Enterprise Server 10

Your Certification ID number is: 100XXXXX

Novell CLP certification allows you access to the Novell Certification Community. From the Community, you may connect to “My Certifications” to view and update your information. Please check this often and keep your contact information updated.

The first time you access the Novell Certification Community, you will need the Registration ID and exam date from your recent exam. All of this information can be found on the score report you received when you took your exam. Please email edcustomer@novell.com if you have any questions.

In order to do our part to protect the environment, Novell is "going green" and discontinuing the mailing of hard copy certificates. I encourage you to print out your attached PDF certificate and display it proudly.

I commend you for your commitment, dedication, and effort in earning the Novell Certified Linux Professional certification.

Sincerely,

MaryJo Swenson
Executive Director
Novell Technical Training

所以雖然我很開心收到了證照,但我還是很客氣的跟他小抱怨了一下,請他補寄紙本的證照給我!

2010年3月4日 星期四

Firefox/Chrome遇到flash方塊字

這個問題已經持續好幾個版本了,問題雖然知道是出在字型設定,但為何問題出在字型就不是我感興趣的部份。大致爬了一下大家的blog都提到了/etc/fonts/conf.d/49-sansserif.conf這個檔案。他是一個軟連結,來源是/etc/fonts/conf.avail/49-sansserif.conf。他原本是這樣:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
  3. <fontconfig>
  4. <!--
  5.  If the font still has no generic name, add sans-serif
  6. -->
  7.     <match target="pattern">
  8.         <test qual="all" name="family" compare="not_eq">
  9.             <string>sans-serif</string>
  10.         </test>
  11.         <test qual="all" name="family" compare="not_eq">
  12.             <string>sans-serif</string>
  13.         </test>
  14.         <test qual="all" name="family" compare="not_eq">
  15.             <string>monospace</string>
  16.         </test>
  17.         <edit name="family" mode="append_last">
  18.             <string>sans-serif</string>
  19.         </edit>
  20.     </match>
  21. </fontconfig>

由於他只是一個軟連結,把他幹掉就可以正常顯示字型。但你如果希望讓flash使用系統其他字型,請繼續往下看。

我系統的預設字型是Sans,不過我也可以把他改成我們要的樣子。

sudo rm /etc/fonts/conf.d/49-sansserif.conf
接著,產生一個新的49-sansserif.conf檔案,把字型的部份用喜歡的字型取代,例如Mac的儷黑體:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
  3. <fontconfig>
  4. <!--
  5.  If the font still has no generic name, add sans-serif
  6. -->
  7.     <match target="pattern">
  8.         <test qual="all" name="family" compare="not_eq">
  9.             <string>LiHei Pro</string>
  10.         </test>
  11.         <test qual="all" name="family" compare="not_eq">
  12.             <string>LiHei Pro</string>
  13.         </test>
  14.         <test qual="all" name="family" compare="not_eq">
  15.             <string>LiHei Pro</string>
  16.         </test>
  17.         <edit name="family" mode="append_last">
  18.             <string>LiHei Pro</string>
  19.         </edit>
  20.     </match>
  21. </fontconfig>
  22.  

重新啟動你的chrome/firefox,應該就可以看見正常的字體了!

參考來源:
FourDollars Blog
FireFox中文flash方塊字的問題