[PDA] Zaurus C760 新手筆記 (11) - rsync + samba 備份中文檔名的檔案
大概很多人都用過 rsync 來備份 zaurus 上的檔案,不過這一遇到中文檔名的檔案就破功了。rsync 不會視檔案編碼系統的不同來轉譯檔名,中文檔名的檔案一備份到 Windows 或 Linux,檔名就變成一堆亂碼。
另一個不方便之處是 Windows 上一般都不支援 rsync,還須得要自行安裝軟體 (我是用 cygwin + openssh + rsync)。
不過在試完 samba 後,忽然有個想法:既然 samba 可以轉譯 utf8 的檔名為 codepage 950 (差不多就是 BIG5 啦!),那只要用 zaurus 來 mount 自身分享的檔案,雖然在 zaurus 自身 mount point 上看到的檔名是一堆亂碼,不過只要在 codepage 950 的系統上,那些亂碼就會變成正常的中文字。而且只要 zaurus 上有 rsync,就不用擔心 Windows 系統上是否要安裝 rsync 了。
實作方式如下:
這項工作其實是我在 [Linux] Debian on My ThinkPad R40 (5) - 無線網路的設定 中,所提及想做的工作之一。
不過這樣的型態只適合作為文件的備份,而不適合作為檔案系統的備份。因為在 samba 下,檔案的權限及擁有者等屬性消失了,且鏈結都只單純地以檔案的型式存在,所以無法作為將來復原的依據。(所以我只用這備份 /home/zaurus/Documents (就是 samba 下的 Main_Memory) 下的檔案,全系統的檔案備份,我還是依靠 rsync + ssh。)
另一個問題是遇到日文或其它 codepage 的檔名,samba 一概視而不見。不過還好,我大概只會用中文的檔名。
另一個不方便之處是 Windows 上一般都不支援 rsync,還須得要自行安裝軟體 (我是用 cygwin + openssh + rsync)。
不過在試完 samba 後,忽然有個想法:既然 samba 可以轉譯 utf8 的檔名為 codepage 950 (差不多就是 BIG5 啦!),那只要用 zaurus 來 mount 自身分享的檔案,雖然在 zaurus 自身 mount point 上看到的檔名是一堆亂碼,不過只要在 codepage 950 的系統上,那些亂碼就會變成正常的中文字。而且只要 zaurus 上有 rsync,就不用擔心 Windows 系統上是否要安裝 rsync 了。
實作方式如下:
- 先安裝 rsync 軟體。
- 設定 zaurus 上的 samba,請參考 [PDA] Zaurus C760 新手筆記 (9) - 連上網路芳鄰。
- 設定 Windows 上的分享目錄。
- 剪下下面的 script,存成文字檔放到 zaurus 上,權限改為 700。(2005/01/21 修正了部份 script)
#!/bin/bash
TIME_START=`date`
function check_mount () {
mount | grep "^$1" > /dev/null
if [ $? -ne 0 ]; then
smbmount "$1" "$2" -o "username=$3,password=$4"
if [ $? -ne 0 ]; then
let $5=1
check_umount
exit 1
fi
let $5=1
else
check_umount
exit 1
fi
}
function check_umount () {
if [ $LOCAL_UMOUNT -eq 1 ]; then
smbumount "$LOCAL_MOUNT"
fi
if [ $REMOTE_UMOUNT -eq 1 ]; then
smbumount "$REMOTE_MOUNT"
fi
}
LOCAL_SHARE="//localhost/home"
LOCAL_MOUNT="/mnt/sync/local" <-- 掛載本地端的掛載點,若沒有此目錄要先建立
LOCAL_USER="root"
LOCAL_PASS="xxxxx" <-- root 在 本地端的 samba 密碼
LOCAL_DIR="Main_Memory" <-- 在本地端 samba 下,須同步的目錄
LOCAL_UMOUNT=0
REMOTE_SHARE="//netbios_name/share_name" <-- 遠端分享的位址
REMOTE_MOUNT="/mnt/sync/remote" <-- 掛載遠地端的掛載點,若沒有此目錄要先建立
REMOTE_USER="aaaaa" <-- 遠地端的使用者帳號
REMOTE_PASS="yyyyy" <-- 遠地端的使用者密碼
REMOTE_DIR="."
REMOTE_UMOUNT=0
check_mount "$LOCAL_SHARE" "$LOCAL_MOUNT" "$LOCAL_USER" "$LOCAL_PASS" LOCAL_UMOUNT
check_mount "$REMOTE_SHARE" "$REMOTE_MOUNT" "$REMOTE_USER" "$REMOTE_PASS" REMOTE_UMOUNT
rsync -avSc --delete "$LOCAL_MOUNT/$LOCAL_DIR" "$REMOTE_MOUNT/$REMOTE_DIR"
check_umount
TIME_END=`date`
echo "From: $TIME_START"
echo "To: $TIME_END" - 執行此 script。然後就可以檢查是否有同步成功了。
這項工作其實是我在 [Linux] Debian on My ThinkPad R40 (5) - 無線網路的設定 中,所提及想做的工作之一。
不過這樣的型態只適合作為文件的備份,而不適合作為檔案系統的備份。因為在 samba 下,檔案的權限及擁有者等屬性消失了,且鏈結都只單純地以檔案的型式存在,所以無法作為將來復原的依據。(所以我只用這備份 /home/zaurus/Documents (就是 samba 下的 Main_Memory) 下的檔案,全系統的檔案備份,我還是依靠 rsync + ssh。)
另一個問題是遇到日文或其它 codepage 的檔名,samba 一概視而不見。不過還好,我大概只會用中文的檔名。
沒有留言:
張貼留言