2005年1月16日

[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 了。

實作方式如下:
  1. 先安裝 rsync 軟體。

  2. 設定 zaurus 上的 samba,請參考 [PDA] Zaurus C760 新手筆記 (9) - 連上網路芳鄰

  3. 設定 Windows 上的分享目錄。

  4. 剪下下面的 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"
  5. 執行此 script。然後就可以檢查是否有同步成功了。

這項工作其實是我在 [Linux] Debian on My ThinkPad R40 (5) - 無線網路的設定 中,所提及想做的工作之一。

不過這樣的型態只適合作為文件的備份,而不適合作為檔案系統的備份。因為在 samba 下,檔案的權限及擁有者等屬性消失了,且鏈結都只單純地以檔案的型式存在,所以無法作為將來復原的依據。(所以我只用這備份 /home/zaurus/Documents (就是 samba 下的 Main_Memory) 下的檔案,全系統的檔案備份,我還是依靠 rsync + ssh。)

另一個問題是遇到日文或其它 codepage 的檔名,samba 一概視而不見。不過還好,我大概只會用中文的檔名。


沒有留言: