2009年3月27日 星期五

LVM 快速筆記

作者: Baron. Wan

在公司的 file server 需要添加硬碟之際, 查看了一下, 發現當初是用 LVM 的方式製作, 本來在一個單純增加硬碟的動作, 卻因為我許久沒接觸, 而且之前也是淺玩一下而已, 所以想說利用網站上提供的程序來執行, 沒有去判斷與現實的環境來做比較, 終至慘遭嚴重的後果!

原因是自己在添加新的硬碟的程序: pv --> vg --> lv --> resize2fs, 看似沒錯, 其實是大錯!!! 因為新的硬碟在產生 8e 的type (lvm) 之後, reboot後, 接下來應該先做 mke2fs -j 的動作, 而網站上大多在 lv 動作完成後才做 format 動作(由於我之前的硬碟內已有資料之故, 因而我做完 lv 動作之後, 緊接就做了 resize2fs...), 所以當我使用 resize2fs 來變更 lvm 容量大小時, 開始發生了錯誤, 以至於無法卸載, 在強制卸載之後, 資料就救不回來了 !! 儘管我後來採用 fsck.ext3 -b 32768 企圖來挽救 superblock 與 inode 等資料, 最終仍是回天乏力.

======================================
以下是 LVM 的正常程序:
@ 第一次建立
1. 用 fdisk 產生一個 type 為 8e (lvm) 的 partition, 假設為 sdb1
2. reboot 後, 執行: mke2fs -j /dev/sdb1 <-- 產生 ext3 的格式 3. pvcreate /dev/sdb1 <-- 引入一顆 lvm 的 partition ** 可用 pvscan 查看引入lvm資訊, 引入lvm的容量大小.
4. vgcreate -s 16M main /dev/sdb1 <-- 掛載 /dev/sdb1 並建立新的 lvm group "main". ** 可用 vgdisplay 查看掛載的容量, -s 是 PE值, 16M 最大可到 1TB 的掛載容量, 預設值是 4M (表示最大可到 256MB掛載容量).
5. lvcreate -L +160G -n home main <-- 建立一個大小為 160GB 的邏輯磁碟 home, 它屬於 main 的 lvm group 當中. ** -L 參數可加入的容量大小, 需要先用 vgdisplay 來查看 free 值 (可掛載空間).
** 兩顆以上(含兩顆) 掛載才需執行 (ex): resize2fs /dev/main/home

@ 添加硬碟容量, 假設新的磁碟分割為 sdc1
1. 先 fdisk 一個 partition 為 8e (lvm) 的 type.
2. reboot 後, 執行 ext3 格式化: mke2fs -j /dev/sdc1
3. ** 要導入 lvm 之前, 原 lvm 磁碟需先卸載 umount
4. 執行 : pvcreate /dev/sdc1 引入到 LVM
5. 執行: vgextend main /dev/sdc1 掛載
6. 先 vgdisplay 查看 free 還有多少空間 ( ex: 120.5GB )
7. 如要全部加入: lvextend -L +120.5G /dev/main/home
8. 此時需要做 resize 來修改邏輯 lvm 容量 : resize2fs /dev/main/home
9. mount 回去, 看一下容量: df -h , 容量已變更完成.

@ 卸載 LVM , 注意: 此動作等同用 fdisk delete 掉一個 partition 一樣嚴重. 請勿輕易嘗試.
1. 先 umount
2. lvremove /dev/main/home --> 會提示是否確定要 remove (y/n)
3. vgchange -a n main
4. vgremove main
5. pvremove /dev/sdc1
6. 卸載完成.
[注意] 如尚未 reboot, 修復回來的機率很高.

2009年3月20日 星期五

Linux 厲害的備份工具

作者: Baron. Wan

前些日子, 公司的老大(我們公司協理,我們都稱它老大), 希望我能將公司以前製作的一個 客制化 OS (Debain Linux OS) 做一整個備份, 當時在想, 怎樣可以把 Linux 的 partition 作成 image, 那時第一個浮現腦海的竟然是 Ghost , 但自己卻不希望使用它, 原因用它又必須搞一個 Dos 的開機片, 想想覺得麻煩至極, 後來又想到 linux 上有個指令好像可以試試: dd . 不錯, 這是一個可以把整個磁區 copy 出來的好工具, 但以前不太有機會用到它, 如今要用才知道對它實在不是很熟, 也因此趕緊翻書, 上網...查資料, 想不到網站上對於 dd 這個指令也是備受推崇, 深獲好評阿, 呵呵 ^^

dd 的參數其實也是蠻好記的, if (input 輸入端) , of (output 輸出端), bs ( 多少 blocks), count (次數, 以 bs 為基礎, ex: bs=512, count=10 >>> 512x10=大小).
以下開始來介紹這個好用的工具:
dd if=/dev/sda of=mbr_boot.img bs=512 count=1
上述指令會產生 mbr_boot.img 檔, 容量為 512 bytes, 內容則是硬碟上第一個磁區前512bytes 的資料(MBR), 詳記關於 boot 的相關重要資料, 當然也包含磁碟切割的內容...等等.

dd if=/dev/sda1 of=system_backup.img
上 述指令會將整個 sda1 partition 備份起來成 system_backup.img , 容量就是整個 partition 大小, 很大的 = =! 初次備份我也被這個容量嚇一跳, 哇!! ~ 怎麼這麼大呀? 沒辦法, 人家是一個bit一個bit的來作業, 可是沒有偷懶呢!!

如果想將它容量縮小, 當然就只能靠壓縮了.
gzip -9 system_backup.img
這是最高的壓縮比, 會生出 system_backup.img.gz 的壓縮檔案.

由於上述這樣實做, 等於是兩次工, 簡直可以用曠日費時來比擬, 後來在網路上看到有人將它一次搞定:
dd if=/dev/sda1 gzip -9 > /var/tmp/system_backup.img.gz

接下來是還原的方式了.
gzip -dc /var/tmp/system_backup.img.gz |dd of=/dev/sda1

如果沒有壓縮, 可以直接這樣用:
dd if=system_backup.img of=/dev/sda1

實做到此, 你一定也會想說, 疑? 那這個可不可以用在 windows 的備份上阿, 呵呵, 說實在的, 我想應該也行, 目前正在測試中 ^^~

2009/03/27: OK. 我想結果出爐了, dd 比 ghost 還要神奇: 它在備份 windows (NTFS) 的 partition or disk 時, windows 不需做封裝的動作即可執行備份動作(ghost 需先做封裝, 因為 windows 有 uuid 唯一值之故), 唯獨備份過程時間漫長. 但記得需同時備份 mbr 與 system. 還原時也必須連同 mbr 一起還原方可.

2009年3月17日 星期二

解決 sendmail 負荷, 當與 mysql 搭配時的設定方式.

研究者: Baron. Wan

Sendmail:

# 每秒連線數(ex: 每秒可3個連線數, 超過時會放慢連線的速度)
O ConnectionRateThrottle=3

# 如果系統處理的郵件非常多,使得單一次佇列處理大到難以控制, 以至於系統資源到了極限,可設定該值.
O MaxQueueRunSize=500

# 單一隊列時的平均負荷,超出時,會放在佇列 (當郵件的平均負荷值超過QueueLA值時, 信件會暫不處理並放在佇列中)
O QueueLA=16 (8*CPU數)

# 平均負荷拒絕臨界點, 最近一分鐘內,在 run queue中等待執行的形成平均數過高時, 會拒絕外來smtp連線, 並產生錯誤(connection refuse)
O RefuseLA=24 (12*CPU數)

# 文件系統用來接受標準SMTP(簡單郵件傳輸協議)郵件的隊列中的最少的自由塊數目 (越小,被攻擊的機率高)
O MinFreeBlocks=4000

#針對大量 User unknown, 收到第n封信件後開始放慢
(Possible SMTP RCPT flood, throtting) ex: 第15封信件後開始放慢
BadRcptThrottle=15

# 以下這兩個數值, 當queue 存放量大時, 經由這兩個數值的調整大小, 可較為快速的處理 queue, 不至於造成 mail 的塞車.

# limit on number of concurrent queue runners
O MaxQueueChildren=100

# maximum number of queue-runners per queue-grouping with multiple queues
O MaxRunnersPerQueue=25


**********************************************************

mysql:

[mysqld]
bind-address=127.0.0.1
max_connections=32000
(默認100,最大值16384)
max_allow_package=2M

基本 sendmail 連線設定

研究者: Baron. Wan

1. 架設 Bind (DNS) 時, 在 options { 當中, 把 listen-on 註解掉能可以傾聽所有. allow-query 註解掉, 遠端就可查詢的到.

2. sendmail.cf 設定

#file containing names of hosts for which we receive email
Fw/etc/mail/local-host-names ==> 在 local-host-name 中加入 localhost

#Hosts for which relaying is permitted ($=R)
FR-o /etc/mail/relay-domains ==> 在 relay-domains 中加入 mail server domain name

# 將IP設為0.0.0.0 , 如設定 127.0.0.1 或是 192.168.0.x , 皆會使得mail server只接受這個 ip 的遞送
O DaemonPortOptions=Port=smtp,Addr=0.0.0.0, Name=MTA

"smart" relay host 設定
交由 msa.hinet.net 代為轉送信件, 就相當於由別台郵件伺服器發信.(Realy)
DSmsa.hinet.net

定義 Mail From 的名稱 (ex: mail from: user@example.com.tw)
DMexample.com.tw

系統除 localhost外, 也由 /etc/mail/local-host-name 中尋找代收的 domain name
Fw/etc/mail/local-host-name


3. access 的設定

Connect:192.168.0 RELAY ==> 允許來自 192.168.0/24 的網段 relay
Connect:mail.sample.com.tw RELAY ==> 允許 mail server 's domain Relay
Connect:.example.com.tw RELAY ==> 允許來自 example.com.tw 的位址 Relay 結束後用
另外, 還有 DISCARD(丟棄), REJECT(拒絕), OK(無條件允許) 等設定方式; 建議採用 DISCARD, 以避免造成 sendmail 負擔!
makemap hash access.db <>

4. 讓 sendmail 可驗證大小寫帳號

搜尋 Mlocal, 添加如字串中的紅色字 F=1sDFMAw5:/|@qSPFhun9; 預設 sendmail 是忽略大寫的帳號, 因此若要讓大寫帳號可使用, 則必須添加這個 'u'



[相關 sendmail.cf 設定可參考 http://www.sendmail.org/m4/tweaking_config.html]