2009/03/31

[ FBSD ] FreeNAS Rsync to Operate (Pull/Push)

rsync 是一套非常棒的 OpenSource 檔案備份同步軟體,因為 rsync 在備份資料時有方向性(Pull/Push),因此將此測試做個簡單的記錄以方便未來使用,過程是在兩台FreeNAS (Server/Client) 下操作,備份方式直接使用 SSH 連進 Client 端那台機器下 command 操作,FreeNAS 為 FreeBSD 所打包的嵌入式 NAS 系統因此基本操作都跟 FreeBSD 一樣。為何不用 FreeNAS WebGUI 上直接設定 rsync ?因為小弟在使用 FreeNAS 的 WebGUI 設定 rsync 時上遇到權限上的備份問題,且 WebGUI 對方向性(Pull/Push)的設定沒那麼彈性,因此我的用戶端才改為 command 操作,待測試 Ok 便可寫個 shell script 加入 crontab 就可用定時去同步備份。

環境:

B (192.168.1.8) Server 端
使用 WebGUI 開啟Port 873 的 rsync 服務,同時分享出名稱為 office 的備份目錄。
A (192.168.1.9) Client 端
用 SSH 直接連進機器使用 commnad line 操作。

操作方式:

A 機器上操作( 將 A 機器上要備份的 /mnt/office/main 目錄檔案送到 B 機器的 office 分享資料夾中)。

# rsync -avzrtopg --delete-after /mnt/office/main 192.168.1.8::office

A 機器上操作( 將 B 機器上分享的 office 檔案夾取回到 A 機器的 /mnt/office/main 分享資料夾中)。

# rsync -avzrtopg --delete-after 192.168.1.8::office /mnt/office/main/

下 command 的基本原則。

# rsync (參數) (Source來源端) (Destination目的端)

參數說明:

* -a, –archive archive mode,檔案模式。
* -v, –verbose increase verbosity,觀看過程。
* -z, –compress compress file data,壓縮資料。
* -P, – equivalent to –partial –progress,顯示程序進度%。
* -delete , –delete files that don't exist on the sending side (參數 -after 表示完成同步後再刪除),保持二台機器資料的一致性。

Ref.

http://www.samba.org/ftp/rsync/rsync.html

2009/03/27

[ FBSD ] The System File Types atime mtime ctime

在系統中所有的檔案文件都有3種時間狀態保存於檔案中,我們可利用檔案時間的特性來寫 Shell Script 程式做定時清空目錄資料夾。

atime (Access Time) 是檔案文件最後一次讀的時間或執行文件的時間。
mtime (Modified Time) 是檔案文件最後一次寫的時間,是會在我們寫入檔案文件時隨文件的內容更改而更改。
ctime (Create Time) 是檔案建立或狀態改變的時間,當有寫入文件、更改擁有者、權限或link設定時 i-node 會隨著內容的更改而更改。

下面的 Script 是使用 Create Time 來判斷網路磁碟上的檔案文件是否放置超過1小時,如果檔案文件超過1小時就刪除,我們使用 cmin 用分鐘來計算。


#!/bin/sh

echo "Begin find and delete one hour files."
find /FS2/ftp/*/* -name "*" -cmin +60 -exec rm -rf {} \;
echo "The one hour before ftp files had delete."


PS:甚麼是 i-node?當一個檔案要儲存於硬碟的時候,會分配到一個 i-node 指標,它指示檔案存放在硬碟上的實體位置,以及其它的一些相關資訊。

2009/03/20

[ FBSD ] FreeBSD iSCSI Setup

iSCSI, Internet SCSI(Small Computer System Interface) 應用越來越普遍,在 FreeBSD上裝來玩看看,環境為兩台主機,伺服器端 target 的 IP 為 192.168.1.9,用戶端 initiator 的 IP 則相同網段的任意 IP。

1. 安裝 FreeBSD iSCSI 的伺服器端 target

# cd /usr/ports/net/iscsi-target # 使用 ports 直接安裝
# make install clean; rehash

# vi /usr/local/etc/iscsi/targets
# extents file start length
extent0 /tmp/iscsi-target0 0 2GB

# target flags storage netmask
target0 rw extent0 192.168.1.0/26

# vi /etc/rc.conf # 開機自動啟動 iSCSI target
iscsi_target_enable="YES"

# /usr/local/etc/rc.d/iscsi_target start # 手動啟動 iSCSI target
Starting iscsi_target.
Reading configuration from `/usr/local/etc/iscsi/targets'
target0:rw:192.168.1.0/26
extent0:/tmp/iscsi-target0:0:2147483648
DISK: 1 logical unit (4194304 blocks, 512 bytes/block), type iscsi fs
DISK: LUN 0: 2048 MB disk storage for "target0"
TARGET: TargetName is iqn.1994-04.org.netbsd.iscsi-target

# ls -l /tmp # 查看 tmp 目錄下是否多了個 2G 大小的 iscsi-target0 檔

-rw-r--r-- 1 root wheel 2147483648 Mar 19 09:33 iscsi-target0


2. 設定 FreeBSD iSCSI 的用戶端 initiator

# vi /boot/loader.conf # 讓開機可以自動載入 iscsi_initiator 核心模組
iscsi_initiator_load="YES"

# kldload iscsi_initiator # 手動載入 iscsi_initiator 核心模組
# kldstat # 查看有無載入 iscsi_initiator.ko
Id Refs Address Size Name
1 6 0xc0400000 97f830 kernel
2 1 0xc4c71000 f000 iscsi_initiator.ko

# iscontrol -d -t 192.168.1.9 # 測試 iSCSI 連線
TargetName=iqn.1994-04.org.netbsd.iscsi-target:target0
TargetAddress=192.168.1.9:3260,1

# iscontrol -c /etc/iscsi.conf -n target0 # 啟動 iSCSI session
iscontrol[2664]: running
iscontrol[2664]: (pass0:iscsi0:0:0:0): tagged openings now 0
iscontrol[2664]: cam_open_btl: no passthrough device found at 0:0:1
iscontrol[2664]: cam_open_btl: no passthrough device found at 0:0:2
iscontrol[2664]: cam_open_btl: no passthrough device found at 0:0:3
iscontrol: supervise starting main loop

#cat /var/log/messages # 會有下面兩行訊息表示 /dev/da0 介面已經被建立
Mar 19 09:45:11 ntut kernel: da0 at iscsi0 bus 0 target 0 lun 0
Mar 19 09:45:11 ntut kernel: da0: Fixed Direct Access SCSI-3 device

# newfs /dev/da0 # 格式化 /dev/da0 檔案系統
/dev/da0: 2048.0MB (4194304 sectors) block size 16384, fragment size 2048
using 12 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
super-block backups (for fsck -b #) at:
160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976, 3387328, 3763680, 4140032

# mkdir /mydata # 建立目錄
# mount /dev/da0 /mydata # 掛載檔案系統
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/da0 2026030 4 1863944 0% /mydata

3. 用戶端 FreeBSD 如何開機自動掛載 iSCSI 硬碟?參考網路上前人所寫的 Shell Script 開機可以自動掛載啟動檔

# vi /etc/rc.d/iscsi


#!/bin/sh

# PROVIDE: iscsi
# REQUIRE: NETWORKING
# BEFORE: mountcritremote
# KEYWORD: shutdown

. /etc/rc.subr

name="iscsi"
start_cmd="iscsi_start"
stop_cmd="iscsi_stop"
rcvar="iscsi_enable"
required_modules="iscsi_initiator:iscsi"

iscsi_start()
{
${iscsi_command} -c ${iscsi_config} -n ${iscsi_nickname}
if [ -f ${iscsi_fstab} ]; then
devs=`sed -e '/^#/d' < ${iscsi_fstab} | cut -f 1`
for xdev in $devs
do
i=10
echo "Wait for $xdev"
while [ $i -ne 0 ]
do
[ -c $xdev ] && break
sleep 1
i=$(($i-1))
done
done

echo "mount -a -F ${iscsi_fstab}"
mount -a -F ${iscsi_fstab}
fi
}

iscsi_stop()
{
if [ -f ${iscsi_fstab} ]; then
echo "umount -a -F ${iscsi_fstab}"
umount -a -F ${iscsi_fstab}
fi
killall -HUP ${iscsi_command}
}

load_rc_config $name

: ${iscsi_enable="NO"}
: ${iscsi_command="iscontrol"}
: ${iscsi_nickname="target0"}
: ${iscsi_config="/etc/iscsi.conf"}
: ${iscsi_fstab="/etc/iscsi.fstab"}

run_rc_command "$1"

# chmod 555 /etc/rc.d/iscsi # 改變權限

# vi /etc/iscsi.fstab # 設定開機掛載 HD
/dev/da0 /mydata ufs rw 3 3

# vi /etc/rc.conf # 加入開機自動執行
iscsi_enable="YES"

4. 如何使用 AES 加密檔案系統掛載 iSCSI

# kldload geom_eli.ko # 載入核心加密模組 GEOM_ELI
# kldstat # 查看載入的核心模組
Id Refs Address Size Name
1 9 0xc0400000 97f830 kernel
2 1 0xc4c71000 f000 iscsi_initiator.ko
3 1 0xc4f93000 10000 geom_eli.ko
4 1 0xc4fa3000 23000 crypto.ko
5 1 0xc4fc6000 a000 zlib.ko

# geli init /dev/da0 # 初始化 /dev/da0 需輸入密碼 , 這邊採用 AES 加密
Enter new passphrase:
Reenter new passphrase:

# geli attach /dev/da0 # 加密 /dev/da0 輸入剛剛加密密碼
Enter passphrase:

# cat /var/log/message # 查看核心 log
Mar 19 09:54:43 ntut kernel: cryptosoft0: on motherboard
Mar 19 09:59:48 ntut kernel: GEOM_ELI: Device da0.eli created.
Mar 19 09:59:48 ntut kernel: GEOM_ELI: Encryption: AES-CBC 128
Mar 19 09:59:48 ntut kernel: GEOM_ELI: Crypto: software

# /boot/loader.conf # 加入開機自動載入 GEOM_ELI 加密模組
geom_eli_load="YES"

# newfs -U -L mydata /dev/da0.eli # 格式化加密檔案系統
/dev/da0.eli: 2048.0MB (4194300 sectors) block size 16384, fragment size 2048
using 12 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
with soft updates
super-block backups (for fsck -b #) at:
160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976, 3387328, 3763680, 4140032

# cat /var/log/message # 查看核心 log 可發現多了區塊標籤 ufs/mydata
Mar 19 10:04:58 ntut kernel: GEOM_LABEL: Label for provider da0.eli is ufs/mydata.

# mkdir /mydata # 建立檔案目錄
# mount /dev/ufs/mydata /mydata # 掛載檔案目錄
# df # 查看檔案目錄
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ufs/mydata 2026028 4 1863942 0% /mydata

Add.

如何在 Windows 運行 Initiator 用戶端 ?

Vista/2K8 已經內建支援 iSCSI 用戶端軟體 XP/2K 則需到微軟官網下載軟體安裝方可運行 iSCSI
http://www.microsoft.com/downloads/details.aspx?familyid=12cb3c1a-15d6-4585-b385-befd1319f825&displaylang=en

Ref.

http://ivoras.sharanet.org/freebsd/iscsi-eli.html
http://www.cyberciti.biz/faq/freebsd-iscsi-initiator-howto/
http://shell.peach.ne.jp/aoyama/archives/45

2009/03/17

[ FBSD ] FreeBSD network interface traffic monitor

vnstat 是針對網路卡介面做流量統計監控程式。

# cd /usr/ports/net/vnstat # 直接使用 ports 安裝 vnstat
# make install clean ; rehash

# vnstat --testkernel # 測試核心是否可以運作 vnstat
This test will take about 60 seconds.
[==============================] done.

Detected boot time variation during test: 0
Maximum boot time variation set in config: 15

The current kernel doesn't seem to suffer from boot time variation problems.
Everything is ok.

# vnstat -u -i fxp0 # 第一次執行會自行建立跟網卡名稱相同的DB, 放在 /var/db/vnstat 目錄下
Error:
Unable to read database "/var/db/vnstat/fxp0".
-> A new database has been created.
# vnstat -u -i fxp0 # 手動再更新一次

# cat /usr/local/share/doc/vnstat/vnstat-cron # 查看 vnstat 程式的 crontab 範例檔
*/5 * * * * root if [ -x /usr/local/bin/vnstat ] && [ `ls -l /var/db/vnstat/ | wc -l` -ge 1 ]; then /usr/local/bin/vnstat -u; fi

# crontab -e # 將 vnstat-cron 內容加到 crontab 裡讓 vnstat 5分鐘更新一次資料庫
*/5 * * * * root if [ -x /usr/local/bin/vnstat ] && [ `ls -l /var/db/vnstat/ | wc -l` -ge 1 ]; then /usr/local/bin/vnstat -u; fi

範例:

# vnstat -l -i fxp0 # 查看即時流量 Tx/Rx 及進出網卡封包數量
Monitoring fxp0... (press CTRL-C to stop)

rx: 0.03 kB/s 1 p/s tx: 0.19 kB/s 0 p/s

參數說明:

-h : 24hr 的流量統計
-d : 一個月每天的流量統計
-m : 一年每月的流量統計
-t : Top 10 的流量統計
-w : 過去七天與上週跟本週的流量總計

Ref.

http://humdi.net/vnstat/
http://www.sqweek.com/sqweek/index.php?p=1