系統的備份

天有不測風雲,可能天災也可能人禍,基本的系統一張光碟或是一塊軟碟片加上網路即可輕鬆搞定,但是最花時間的重要設定及使用者資料要重建可是件不小的工程,如果平時能將重要檔案及使用者資料備份起來,就可以省去很多的復原的時間。

在 FreeBSD 中已經內建好一些和備份有關的指令,例如:tar , dump , restore , dd , cpio , pax , ...... 至於要使用哪個工具則視個人喜好及需求囉!我個人習慣用 tar 來備份像 /etc , /usr/local/etc , ...... 等以目錄或檔案為主的設定檔,如果像使用者的資料 (/home) 及信箱 (/var/mail) 是放在單獨的 partition 則是利用 dump 備份及用 restore 來還原。

下面就來看看如何用 tar 及 dump 完成基本的備份工作。

1.tar

tar (tape archive) 原本是設計用來將文件打包到磁帶中的,我們也可以將檔案或是目錄打包成一個單一的檔案,必要時再用同一個程式來將資料全部還原或是只解開部份的資料,正因為它可以備份檔案或目錄,深受大家的愛用。

常用參數:

* 指定動作 :
-c create,新增一個備份檔
-t list,顯示備份檔中的檔案清單
-x extract,解開備份檔中的檔案

* 指定檔案:
-f file,讀/寫指定的檔案

* 壓縮方式:
-z gzip,備份的東西要用 gzip 壓縮/解壓縮
-y bzip,備份的東西要用 bzip 壓縮/解壓縮,也可以用 -j

* 其它:
-p permissions,保留原來的權限
-v verbose,備份的內容要顯示在畫面
-C (大寫 C),cd 先切換目錄

由於 tar 的功能非常的多,指令可用的選項令人眼花瞭亂,下面只示範最常用的,有興趣再自己用 man tar 好好的研究囉!

1.1 以 tar 打包要備份的資料

如果沒有什麼特殊需求,利用 tar 備份檔案只要用到 -c (新增) ,-p (保留權限設定),-f (指定檔名),頂多再加個 -v 看一下打包的過程。

例如:
tar -cpvf /home/backup/etc.tar /etc

上例將 /etc 目錄中所有的檔案打包到 /home/backup/etc.tar 中。

也可以同時備份多個目錄,將要打包的清單(以空白分隔)接在最後面即可。下面的例子將 /etc , /usr/local/etc 打包在 etc.tar 中:

tar -cpvf /home/backup/etc.tar /etc /usr/local/etc

我們也可以使用:

tar -czpvf /home/backup/etc.tgz /etc

和前面的例子比較,多了個參數 z ,也就是將 tar 打包完的檔案再利用 gzip 壓縮,所以新產生有經過壓縮處理的備份檔我們也將檔名命名為 etc.tgz (.tgz 結尾),也有人用 .tar.gz ,端看個人習慣。

咦~好奇的人可能會想到 FreeBSD 的 packages 檔名好像叫 *.tgz 或 *.tbz,和 tar , gzip , bzip 有沒有關啊?有興趣可以找個 FreeBSD 的 package ,用 tar 來打開包裝看看哦!!

另外,比較一下這兩個同樣是備份 /usr/local/etc 的指令有何不同?

tar -czvf /home/backup/local.etc.1.tgz /usr/local/etc
tar -czvf /home/backup/local.etc.2.tgz -C /usr/local etc

由於 tar 預設在備份時會儲存檔案的路徑 (但是自動去掉開頭的第一個斜線) ,也就是 /usr/local/etc/rc.d 在 local.etc.1.tgz 中會變成 usr/local/etc/rc.d,如果我們連 usr/local 都不想要,打包時可以利用 -C (大寫字母) 這個參數來控制路徑的保留層次,像前面第二個例子加了 -C /usr/local ,tar 會先切換至 /usr/local 目錄才備份 etc,所以在 local.etc.2.tgz 中 /usr/local/etc/rc.d 變成 etc/rc.d 儲存起來。


1.2 查看 tar 打包的檔案

要查看以 tar 打包的檔案只要利用 -t 這個動作參數即可。

例如:

tar -tvf /home/backup/etc.tar

上例會將 /home/backup/etc.tar 中的檔案清單顯示出來。

如果備份時有用 gzip 壓縮過則可以加上 -z :

tar -tzvf /home/backup/etc.tgz

如果備份時用 bzip 壓縮過則加上 -y 或是 -j:

tar -tyvf /home/backup/etc.tbz

1.3 解開 tar 打包的檔案

要解開 tar 封裝的檔案是利用 -x 這個動作參數,再搭配 -z , -y (-j) 解壓縮。如果想保留原來的權限設定則要記得使用 -p,至於要不要使用 -C (大寫字母) 則要看當初在打包時有沒有使用及自己想要放置的路徑而定,最容易犯的毛病大多是解錯路徑,所以在使用 -x 解開時一定要記得先用 -t 查看一下當初是怎麼打包的,最保險的方法是先解到一個暫存的地方,再將需要的檔案複製/搬移到目的地。

將 /home/backup/etc.tgz 中的東西在目前所在的目錄解開:

tar -xzvf /home/backup/etc.tgz

將 /home/backup/etc.tgz 中的東西在 /home 中解開:

tar -xzvf /home/backup/etc.tgz -C /home

將 /home/backup/etc.tgz 中的東西在 /home 中解開,並保留原始的權限:

tar -xzpvf /home/backup/etc.tgz -C /home

1.4 只解開 tar 打包的部份檔案

只解出 /home/backup/etc.tgz 中的 etc/group , etc/master.passwd 兩個檔案:

tar -xzvf /home/backup/etc.tgz etc/group etc/master.passwd

將 /home/backup/etc.tgz 中凡是叫 etc/rc* 通通解開,其它的不要:

tar -xzvf /home/backup/etc.tgz 'etc/rc*'

將 /home/backup/etc.tgz 中的檔案解開,但是 rc.d 目錄中的東西不要:

tar -xzvf /home/backup/etc.tgz --exclude='rc.d/*'

以上提到的方法也可以應用在打包時 (-c) 及查看清單時 (-t) 。


1-5 利用 tar 直接複製整個目錄到另一個目錄中

利用 tar 和 pipe 的技巧,可以做整個目錄直接複製,不過這個方法並不保證完整哦,畢竟它的方式不若 dump + restore 完備。

假設我想把 /usr 中所有的東西複製到 /mnt/usr 中,就執行底下的指令:

tar cf - /usr | (cd /mnt ; tar xvfBp -)

2. dump 及 restore

前面提過的 tar 可以針對目錄或檔案來備份,而 dump 則是以 block 為處理單位,針對整個檔案系統(分割區)來備份,可以更完整的保持系統的原貌不會有所缺漏,以 dump 備份的資料可以用 restore 再還原回來。

2.1 以 dump 將整個 partition 備份至一個檔案

使用過 Norton ghost 的人應該知道裡面有個選項是將 MS Windows 或 Linux 系統的某個分割備份到映像檔中,下面則是利用 dump 做類似的動作,將某個分割區備份至一個檔案。

假設 /home 是一個單獨的分割區 (/dev/ad0s1h),而 /backup 是一個空間夠大的目錄,我們可以執行:

# dump -0uaf /backup/home.dump /home

上面的例子以 level 0 將 /home 所在的分割區備份至 /backup/home.dump 中。

參數說明:

* -0 以 level 0 備份,也就是完整備份,level 可以為 0~9,level 1 則只備份 level 0 後有異動的部份。
* -u update,備份完成後自動更新 /etc/dumpdates 的內容(記錄分割區代號、level、備份日期)。
* -a auto-size,略過可儲存空間大小的檢查。
* -f file,將備份的資料輸出到後面參數指定的檔案,也可以是一個硬體(device file)或是標準輸出 (-)。

2.2 以 restore 還原檔案

以 dump 備份的分割區我們可以用 restore 將檔案還原出來,就像利用 ghost 把映像檔再寫入 partition 一樣,不過 restore 也可以只解出部份檔案。不過在使用 restore 要注意的是,restore 並不會幫我們將 partition 做格式式,而且,它是將內容解在目前所在的目錄,所以要記得先做好格式化並切換到要還原的目錄。

例如想把 /home dump 完的備份 ( /backup/home.dump ) 還原到 /mnt/new (/dev/ad1s1e) 這個 partition 中,如果 /dev/ad1s1e 已經格式化好,而且已經 mount 到 /mnt/new ,就可以執行以下指令:

# cd /mnt/new
# restore -rf /backup/home.dump

完成後,/mnt/new 就可以看到原來 /home 的中的資料。

如果只想還原備份中的部份檔案怎麼辦呢?

restore 提供 -i 的參數來進行交談式的還原,我們可以利用這個方法來指定要還原的部份,例如,只想由 /home 的備份檔 home.dump 中還原 /home/gsyan , /home/students 的資料,我們可以執行:

# restore -if /backup/home.dump

出現 restore > 的提示符號後,我們就可以下指令,例如:輸入問號 (?) 即可列出可用的指令,

restore > ?
Available commands are:
ls [arg] - list directory
cd arg - change directory
pwd - print current directory
add [arg] - add `arg' to list of files to be extracted
delete [arg] - delete `arg' from list of files to be extracted
extract - extract requested files
setmodes - set modes of requested directories
quit - immediately exit program
what - list dump header information
verbose - toggle verbose flag (useful with ``ls'')
help or `?' - print this list
If no `arg' is supplied, the current directory is used

為了達到範例的目標,我們要用 add 來新增要還原的檔案清單,用 extract 執行還原,下面是還原出 /home/gsyan 及 /home/studens 至目前分割區的步驟,黑體字的部份是自行輸入的部份:

restore > add gsyan students
restore > extract
You have not read any tapes yet.
If you are extracting just a few files, start with the last volume
and work towards the first; restore can quickly skip tapes that
have no further files to extract. Otherwise, begin with volume 1.
Specify next volume #: 1
set owner/mode for '.'? [yn] y
restore >

要結束只要輸入 quit 按 Enter 鍵即可跳出 restore 。

2.3 以 dump 及 restore 做 partition 對 partition 的對拷

將分割區 dump 給標準輸出,再讓 restore 由標準輸入還原在新的 partition 就能達到 partition 對 partition 對拷的目的,底下是進行對拷的流程:

1. 切好新的 partition
2. 以 newfs 將 partition format 好
3. 將新的 partition mount 好
4. 切換至新的 partition 中
5. 以 dump & restore 進行備份及還原

 ※ 1-2 的步驟可以執行 /stand/sysinstall ,然後選取 Configure 利用裡面的 Fdisk 和 Label 進行分割及格式化

例如:想要將 /home (/dev/ad0s1h) 上的所有資料備份到新硬碟上的 partition (/dev/ad2s1h),執行:

# newfs /dev/ad2s1h (如果已經格式化過則可省略)
# mount /dev/ad2s1h /mnt (如果已經 mount 好則可省略)
# cd /mnt
# dump -0uaf - /home | restore -rf -
# cd /
# umount /mnt

特別注意 dump 及 restore 並沒有指定檔名,而都用了一個減號 ( - ),對 dump 來說,是將 partition 的資料一個 block 一個 block 的送向標準輸出,而 restore 則是由標準輸入讀入並還原。

2.4 以 dump & restore 備份整顆硬碟

如果想將整顆硬碟的資料拷至另一顆新硬碟,以最笨的方法就是先用 /stand/sysinstall 將新硬碟切割好,再利用 dump & restore 把各 partitions 一一對拷即可,程序如下:

1. 將新硬碟接好後,以重新開機。

2. 執行 /stand/sysintall
* 選取 Configure
* 選取 Fdisk 切給 FreeBSD 用的 partions
* 選取 Label 進入 Disklabel Editor
* 注意:在設定 disklabel 時 mount point 要先照原來的架構設定
* 在存檔前先移到各 partition 後按 M 修改 mount point 至 /mnt 下的暫存目錄,不然可能會有錯誤
* 按 W 存檔並開始 format New H.D. (newfs)

3. 離開 sysinstall

4. umount -A 解除所有 mount 上來的 filesystem

5. mount -a 重新掛上系統預設的 filesystem

6. 開始備份各 partition

7. 將新硬碟的 / (例如:/dev/da1s1a) 掛上來

mount /dev/da1s1a /mnt

8. 將新硬碟 /etc/fstab 中的 /dev/xxx 改成合適的

ee /mnt/etc/fstab

2.5 dump + ssh 進行異地備份

dump 和 restore 其實有相對應的 rdump 和 rrestore 可進行遠端的備份及還原,不過 r 系統的指令的安全性較需考量,我們可以利用 ssh 來進行較安全的連線。

假設現在想把名為 mail 上掛在 /home 的這個 partition 異地備份至名為 bkserver 主機上的 /backup 目錄 ,我們可以進行以下程序來備份。

* 準備工作
o 在 bkserver 上準備一個備份登入用的專用帳號,假設就叫 bk 好了!!
o 檢查 bkserver 備份專用的目錄 /backup 是否可被備份專用帳號 ( bk ) 寫入。
o 在 mail 上因為要執行 dump 必須是 root ,所以屆時必須由 root 執行 ssh 遠端登入 bkserver,所以要為 mail 上 root 以 ssh-keygen 準備登入用的 "公開金鑰" 。
o 將 root@mail 的公開金鑰置入 bkserver 上帳號 (bk) HOME 的 .ssh/authorized_keys 中。
* 進行備份

準備工作中比較麻煩的部份應該遠端登入用的金鑰,製作流程如下:
2.5.1 連線測試

我們先在 mail 上以 root 的身份登入 mail,然後遠端登入 bkserver (假設在 bkserver 上已經建好 bk 這個帳號)

# ssh bk@bkserver

如果是第一次連線,應該會出現下面的問題詢問是否儲存遠端主機的識別資料,類似下面:

The authenticity of host 'bkserver.test.edu.tw (192.168.1.5)' can't be established.
DSA key fingerprint is 2b:cc:89:80:bc:77:45:83:47:ae:b6:29:51:f5:15:33.
Are you sure you want to continue connecting (yes/no)?

輸入 yes 即可,ssh 會將資料存入 ~/.ssh/know_hosts ,下次就不會有同樣的問題。

接著輸入 bk 的登入密碼,如果成功登入就完成連線測試,輸入 exit 登出,準備進行登入用金鑰的製作。

2.5.2 製作金鑰

我們希望在進行遠端備份能夠不用輸入密碼自動登入遠端主機執行備份儲存的工作,所以要先在 mail 上用 ssh-keygen 來產生 ssh 登入用的金鑰對。

先確認已經在本機 ( mail ) 上用執行 dump 指令的 root 帳號登入哦!然後由 root 執行:

ssh-keygen -d

接著應該會出現以下的對話:

Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
a6:62:05:95:92:79:2a:71:2d:73:3b:7d:0e:e7:39:26 root@mail.test.edu.tw

如果希望登入時不用輸入密碼直接登入,只要通通按 Enter 回所有問題即可。

執行完會在 /root/.ssh 中產生 id_dsa 和 id_dsa.pub ,後面那個就是我們要放在 bkserver 裡 bk 帳號下的金鑰。

接著我們要把 /root/.ssh/id_dsa.pub 複製到遠端主機 (bkserver) 裡備份專用帳號 (bk) 個人目錄的.ssh/authorized_keys 中。

如果 bkserver 的 ~bk/.ssh/authorized_keys 不存在,我們直接把前面在 mail 上 root 帳號產生的 id_dsa.pub 上傳過去即可,在 mail 上以 root 執行:

scp ~/.ssh/id_dsa.pub bk@bkserver:.ssh/authorized_keys

不過要記得先幫 bk 建好 .ssh 的目錄哦!不然會發生錯誤。

如果 authorized_keys 早已存在,我們可以先將 id_dsa.pub 傳到 bkserver 上,然後再將 id_dsa.pub 中的內容貼到 ~bk/.ssh/authorized_keys 新的一行。

如果前面的步驟完成了,我們在 mail 以 root 執行 ssh bk@bkserver 應該就可以不用輸入密碼遠端登入囉!

2.5.3 遠端備份

做好前面的準備工作後,我們就可以在 mail 上將某個 partition 備份到位於遠端的 bkserver 上了。

例如:

# dump -0uaf - /home | ssh -c blowfish bk@bkserver dd of=/backup/mail.home.dump

上面的例子在 mail 上執行,將掛在 mail /home 的 partition 備份起來,並以 bk 帳號遠端登入 bkserver 儲存在 bkserver 的 /backup/mail.home.dump 裡。

如果想省一些空間則可以順便用 gzip 壓縮後再傳給 bkserver,指令改為:

# dump -0uaf - /home | gzip -2 | ssh -c blowfish bk@bkserver \
dd of=/backup/mail.home.dump

freebsd snapshot and iso mount

在freebsd提供了一個很好用的備份功能就是可以快速的把目前這個分區的資料照下來,之後在慢慢備份,而原本的服務還可以運作,這真的非常的方便。

注意:檔案系統快照只能用在獨立的「檔案系統」

* 對檔案系統做快照

/dev/ad4s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad4s1e on /Backup (ufs, local, soft-updates)
/dev/ad4s1d on /Document (ufs, local, soft-updates)

# mksnap_ffs /Backup /Backup/test.snap

* 將快照掛載並觀看作檔案備份

# mdconfig -a -f /Backup/test.snap -u 0 (載入到/dev/md0的裝置)
# mount -r /dev/md0 /mnt (把載入到md0掛到/mnt下,因為快照不可修改,所以要用唯讀)

* 移除快照檔

# umount /mnt (先卸載裝置)
# mdconfig -d -u 0 (釋放md0裝置在memory中的佔用)
# rm -rf /Backup/test.snap

* 掛載iso檔

# mdconfig -a -f xxx.iso -u 0 (載入到/dev/md0的裝置)
# mount_cd9660 /dev/md0 /mnt

* 卸載iso檔

# umount /mnt
# mdconfig -d -u 0

可以使用mdconfig -l指令來看看目前是否有此md裝置存在。

freebsd mount 其它檔案系統

整理一下freebsd除了一般的掛載外還有其它的檔案系統掛載,包含linux的proc檔案系統還有devfs檔案系統。

* freebsd的proc檔案系統

預設這是不會掛載的因為有安全性的問題,但是因為跑X所以通常會掛起來,因為某些程式需要到proc裡面去看行程的狀態。

# mount ‐t procfs proc /proc

或加入到/etc/fstab裡面
proc /proc procfs rw 0 0


* linux的proc檔案系統

通當如果有裝linux_base的話這個就可能要開,也是一樣因為一些程式需要用到proc裡面的資訊,像是htop它需要看proc裡面的資訊所以要求這功能一定要啟動。

# mount ‐t linprocfs linproc /compat/linux/proc

或加入到/etc/fstab裡面
linproc /compat/linux/proc linprocfs rw 0 0


* freebsd的devfs檔案系統

管理目前系統上所有的device和生成device node,只有做實驗還有自己玩的時候(jail)會掛載,因為系統啟動的時候在rc.d裡面就會自動啟動掛載了。

# mount ‐t devfs devfs /dev

VIM進階設定

最近去coscup2009才發現原來有把vim用到神領域的人,真有超佩服他的,所以最近又在玩vim的一些功能,以下是我的一些心得分享。

* 編碼的設定

我的環境是zh_TW.UTF-8那如果別人給我一個big5編碼的檔不就不能開了,不過vim會做轉碼的動作,所以可以放心。

在.vimrc裡面加入
set fencs=utf-8,big5 "vim開檔自動判斷檔案編碼先從utf-8開始
set fenc=utf-8 "建立新檔的時候以什麼編碼建立
set enc=utf-8 "vim所使用的內部編碼

簡單來說三個例子

1、檔案編碼為utf-8

開啟vim的時候由fencs所指定的清單來判斷檔案的內部編碼,此時判斷為utf-8,而它與我們vim的內部編碼相同都是utf-8,所以直接就可以正確顯示。

2、檔案編碼為big5

開啟vim的時候由fencs所指定的清單來判斷檔案的內部編碼,此時判斷為big5,而它與我們vim的內部編碼不同,我們內部編碼是utf-8,所以vim會呼叫iconv把讀出來的big5轉換成utf-8編碼,就可以正確顯示,而如果我們修改完內容寫回檔案的時候,vim又會將utf-8自動轉換成big5寫回檔案。

3、開新檔案

由於設定fenc=utf-8所以檔案在建立的時候就會以utf-8來編碼,雖然不設定的話,預設vim會讀取目前locale所使用的語系來建立檔案,但是如果常常語系改來改去的話,常常建立的檔案自己都不知道是什麼編碼,所以加入這個設定。

* 視窗分割

vim可以把一個視窗分割成幾個視窗,可以縱切也可以橫切,通常我使用縱切的話分割成左右兩個畫面,這樣可以同時開兩個程式碼而且可以對照著看內容,非常的方便。

ctrl+w, v 切割垂直分割
ctrl+w, n 切割水平分割
ctrl+w, q 關閉分割
ctrl+w, - 縮小分割大小
ctrl+w, + 放大分割大小
ctrl+w, = 平均分割大小
ctrl+w, 方向鍵 移動聚焦視窗

* 在程式碼中加速移動(必學)

※注意:要在normal mode下
[{ or [( 找左邊界第一個出現的{ or (
]} or ]) 找右邊界第一個出現的} or )
f@ or f" 向右找第一個出現匹配的符號或字元
$ 移到行尾,等於END
^ 移到行首,等於HOME
H 移到畫面最上方
M 移到畫面中間
L 移到畫面最下方
c$ 修改到行尾
d% 移除到行尾
dw 移除一個單字
d^ 移除到行首
% 找最近的() or {}

範圍選取技

※以下看到的"|"是「或」的意思
v | c | d + i | a + { | [ | " | '

v: visual
c: change
d: delete
i: inner object
a: an object
{},[],"",'': region

va{ 選取最小範圍的{}部份
vi{ 選取最小範圍的{}部份(但不包含{})
di" 移除最小範圍的""部份(但不包含"")
ci( 修改最小範圍的()部份(但不包含())
va{= 選取最小範圍的{}部份並排列整齊

* vim plugins

vim官網有非常多的plugin可以用,如果興趣可以自己上去慢慢找

NERD_tree.vim 目錄列表插件
taglist.vim 函式列表插件(需安裝ctags)

要加入plugin先在家目錄下面建立.vim/plugin目錄
> mkdir -p ~/.vim/plugin
之後把下載的plugin解壓縮之後都放到plugin目錄下面就行了,之後看一下它所附上的說明檔, 看要怎麼來設定使用這個插件,之後在加入對映的快速鍵來啟動插件。

> vim .vimrc 加入
"ctags command set for bsd
let Tlist_Ctags_Cmd = "/usr/local/bin/exctags"
"functional mapping
nmap <F1> :NERDTreeToggle<CR>
nmap <F2> :TlistToggle<CR>

我把F1, F2對映到這些plugin的啟動上面

* 總結

vim是個非常強大的編輯器,其實用起來像在打電動,所有很多的連續技,如果熟練的話,那麼寫程式或是編寫文件會大大的縮短時間,使工作更有效率。

* 附上投影片
Vim Hacks
View more documents from c9s.
freebsd的apci實在做的真是半調子,不過也不能這樣講,因為現在的硬體都客制化不依照規格走,所以也是難免,但最近因為 acpi的問題讓網卡都不能運作,除非把acpi的支援關掉,但是每次開機都要關這樣很麻煩,透過下面的設定就可以開機就關閉。

# vim /boot/loader.conf
加入 hint.acpi.0.disabled="1"

重新開機後
你會看到原先的開機選單中....
1. Boot FreeBSD [default]
2. Boot FreeBSD with ACPI disable
3. Boot FreeBSD in Safe Mode
4. Boot FreeBSD in single user mode
5. Boot FreeBSD with verbose logging
6. Escape to loader prompt
7. Boot FreeBSD with USB keyboard
8. Reboot

Select option, [Enter] for default
or [Space] to pause timer 10

變成了
1. Boot FreeBSD [default]
2. Boot FreeBSD with ACPI enable
3. Boot FreeBSD in Safe Mode
4. Boot FreeBSD in single user mode
5. Boot FreeBSD with verbose logging
6. Escape to loader prompt
7. Boot FreeBSD with USB keyboard
8. Reboot

Select option, [Enter] for default
or [Space] to pause timer 10

看到變成enable表示,選擇第二項目反而變成啟動載入acpi的支援
雖然在X下面活了這麼久,但是其實都不知道它的原理,今天找到了一篇文章對於整個概念寫的非常好,在此轉載一下。

* Fontconfig在桌面系統中的作用

KDE是類Unix系統中建立在X基礎上的一個主流桌面環境,對用戶來說,它提供了良好的圖形界面和語言切換機制,用以滿足來自不同國家、使用不同語言的用戶的使用需求,這種機制簡稱「國際化」。主要包括界面文字的翻譯,多種語言字體的管理、顯示的支持以及輸入法等等。這其中系統層面字體的管理和顯示的支持直接關係到文字的顯示效果,因此顯得尤為重要。在KDE系統中,字體管理、顯示的支持採用的是如下框架。

※架構: Fontconfig(字體配置)-->Freetype(字庫操作)-->xft(字體顯示)

Fontconfig:管理系統安裝的字體,根據應用程序的字體配置,match(匹配)一種字體,填充match字體的各種屬性。
Freetype:以Fontconfig匹配到的字體為參數,根據應用程序需要讀取相應的字庫。
xft:對需要顯示的語言文字進行顯示。

* X系統中字體的管理

作為KDE底層支持的X,它使用字體服務器(xfs)對安裝的字體進行管理,也稱之為「核心字庫管理系統」,基本配置原理是xfs使用可維護的字體安裝目錄和fonts.dir文件對字體進行操作。

X為之提供了一些工具來完成管理操作。例如:
mkfontdir,mkfontscale 用來生成安裝字體的 fonts.dir和fonts.scale。
xlsfonts 用來顯示安裝的字體。
xfd 用來顯示指定字庫的信息。
xset 用來管理字體服務器。

對於FreeBSD,在安裝了xorg 7.2並且X server運行的情況下,字體安裝目錄可用 xset q來查詢
shell>xset q
Font Path:
/usr/local/lib/X11/fonts/misc/,/usr/local/lib/X11/fonts/TTF/
/usr/local/lib/X11/fonts/OTF,/usr/local/lib/X11/fonts/Type1/
/usr/local/lib/X11/fonts/100dpi/,/usr/local/lib/X11/fonts/75dpi/
/home/dbhrscom/.fonts

上面顯示的是X系統安裝時定義的字體目錄。在這些目錄中,都有利用mkfontdir生成的fonts.dir(對於true type 字體需要使用mkfontscale 生成 fonts.scale,然後拷貝到fonts.dir中)。fonts.dir是個文本文件,裡面保存的是所在目錄的字體信息。關於這些信息的具體含義,可以參見X的man手冊,這裡不再贅述。

如果準備把一個字體安裝到X系統中,並且使用Xfs進行管理,大致需要以下過程:
1、建立一個目錄,並且把字庫文件拷貝到這個目錄下
2、運行mkfontdir或者mkfontscale,生成安裝字庫的fonts.dir文件
3、運行「mkfontdir -e 系統編碼目錄」生成encodings.dir文件
4、運行「xset +fp 字體目錄」或者「xset fp+ 字體目錄」,把字體目錄添加到xfs的字體目錄列表中。需要注意的是當字體目錄沒有fonts.dir這個文件時,這種添加字體目錄操作會失敗
5、運行「xset rehash」進行更新,確保新添加的字體可用

※注意:作為一種X系統的約定,安裝字體最方便的做法是把字體文件拷貝到「$HOME/.fonts/」目錄下,這樣省去了添加字體目錄的操作,而且xset +fp 是針對當前會話有效,如果準備系統啟動時有效,還要修改相關的配置文件。

* Fontconfig的字體管理

簡單的說Fontconfig是使用字體緩存的機制來進行字體管理的。這個Xfs有所不同。fontconfig提供fc-cache來建立這個緩存。

shell >fc-cache -v

/usr/local/lib/X11/fonts: skipping, 0 fonts, 12 dirs
/usr/local/lib/X11/fonts/100dpi: skipping, 398 fonts, 0 dirs
/usr/local/lib/X11/fonts/75dpi: skipping, 398 fonts, 0 dirs
/usr/local/lib/X11/fonts/Fonts: skipping, 4 fonts, 0 dirs
/usr/local/lib/X11/fonts/OTF: skipping, 23 fonts, 0 dirs
/usr/local/lib/X11/fonts/TTF: skipping, 13 fonts, 0 dirs
/usr/local/lib/X11/fonts/Type1: skipping, 29 fonts, 0 dirs
/usr/local/lib/X11/fonts/bitstream-vera: skipping, 10 fonts, 0 dirs
/usr/local/lib/X11/fonts/cyrillic: skipping, 0 fonts, 0 dirs
/usr/local/lib/X11/fonts/encodings: skipping, 0 fonts, 1 dirs
/usr/local/lib/X11/fonts/encodings/large: skipping, 0 fonts, 0 dirs
/usr/local/lib/X11/fonts/local: skipping, 0 fonts, 0 dirs
/usr/local/lib/X11/fonts/misc: skipping, 55 fonts, 0 dirs
/usr/local/lib/X11/fonts/util: skipping, 0 fonts, 0 dirs
/home/dbhrscom/.fonts: skipping, 0 fonts, 0 dirs
/var/db/fontconfig: not cleaning unwritable cache directory
/home/dbhrscom/.fontconfig: cleaning cache directory
fc-cache: succeeded

fc- cache的運行原理是掃瞄fontconfig的配置文件中定義的字體目錄,然後利用掃瞄的結果生成系統字體緩存。在這個fc-cache -v的運行結果中可以看到,它所掃瞄的路徑已經涵蓋了xfs所管理的系統字體路徑。但這並不表示fontconfig和xfs的繼承關係,fontconfig掃瞄這些目錄,完全是因為在配置文件fonts.conf中有這樣的定義!

<!-- Font directory list -->

<dir>/usr/local/lib/X11/fonts</dir>
<dir>~/.fonts</dir>

<!-- Font cache directory list -->

<cachedir>/var/db/fontconfig</cachedir>
<cachedir>~/.fontconfig</cachedir>

fc-cache所作的掃瞄都是基於以上的<dir></dir>定義。
這個配置文件在fontconfig最新版本中,默認放在下面的目錄中
/usr/local/etc/fonts/
而生成的字體緩存按照系統和當前用戶,分別存放到
/var/db/fontconfig
~/.fontconfig

這兩個目錄中,諸如下面所看到的

0c3f6abf7a2705d2e8570f7f70e9302d-x86.cache-2
1e99991e6eeb0b3e05d4185c886f4b19-x86.cache-2
2550ddc31d0b62d94bc27b0fea358aba-x86.cache-2
55cbb48b13195d29d336fd465f155e7b-x86.cache-2
75ff5e8ddb5aa19e5f229f72d89c73db-x86.cache-2

.cache-2 就是fc-cache的運行記號,fontconfig通過這個緩存來管理系統安裝的字體,也因為這種機制在系統中安裝字體變得非常簡單,只要把字體文件放到fonts.conf定義的目錄中,然後運行一下fc-cache。

由此看出,fontconfig和xfs相比,fontconfig提供了更加靈活的字體管理機制,目前系統中保持xfs和fontconfig並行工作的理由,只能是為必須使用xfs機制的程序提供一種支援。而作為KDE,它使用的就是fontconfig進行字體管理。舉例來說,KDE的控制中心有個「字體安裝」模塊,通過分析可知它進行字體安裝的原理就是自定義一個安裝路徑,放到fontconfig的配置文件中,然後把字體拷貝到自定義的目錄。

更完整的介紹請直參考 http://www.bsdlover.cn/html/16/n-116.html

firefox 加速

裝好firefox之後其實有很多功能都可以tun,可以透過在網址列直接輸入about:config可以進到修改firefox核心設定的部份

network.http.pipelining 改為 true
network.http.pipelining.maxrequests 改為 30

完成以上的工作就有簡單的加速功能了,之後在重啟firefox就行了