amtoaer

晓风残月

叹息似的渺茫,你仍要保存着那真!
github
x
telegram
steam
nintendo switch
email

配置世紀互聯版onedrive,實現網絡共享文件夾

背景#

很久之前就想有一個網路共享文件夾,即一個既能在本地當做普通文件夾使用,也能通過互聯網訪問到的文件夾。

大致對比了一下這些可能能夠用於實現該功能的服務:

服務優點缺點
以百度雲為代表的國內網盤存儲空間大linux支持差,訪問速度慢
google drive/mega等國外網盤linux客戶端支持存儲空間較小,國內速度慢甚至無法連通
各類oss服務(例:阿里雲oss官方掛載支持,速度無限制存儲費用、流量費用、請求費用累計,代價昂貴
伺服器空閒存儲空間可通過sftp訪問受伺服器帶寬限制,使用效果並不理想

可以看到各個服務各有優缺點。但最近,我發現了另一款產品:世紀互聯版onedrive。它是微軟委託國內的世紀互聯運營的,對比onedrive國際版,一方面其數據中心位於北京 / 上海,極大地優化了國內用戶的訪問速度;另一方面,淘寶有大量低價號販售,五六十塊即可買到 “永久” 的5T存儲空間(此處存疑)。上網查詢,發現這個世紀互聯版onedrive在本地可以通過魔改rclone實現掛載,在雲端可以使用魔改oneindexzfile等開源項目實現瀏覽器訪問(不走伺服器流量,無限速),完美滿足我的需求,於是入了個,準備開搞。

需要#

  1. 一台自己的電腦
  2. 一台伺服器
  3. 開放 api世紀互聯版onedrive帳號(一定要是開放 api的!)

雲端#

先說簡單的雲端訪問,我使用的是zfile(因為它配置簡單,原生支持世紀互聯onedrive)。

接下來操作以ubuntu為例,centos請移步官方文檔

ssh到伺服器,首先安裝依賴:

sudo apt install -y openjdk-8-jre-headless unzip

下載項目,解壓並給予可執行權限:

cd ~
wget https://c.jun6.net/ZFILE/zfile-release.war
mkdir zfile && unzip zfile-release.war -d zfile && rm -rf zfile-release.war
chmod +x zfile/bin/*.sh

啟動項目:

~/zfile/bin/start.sh

接下來訪問http://你的公網ip:8080/#/install進行配置。其中的訪問令牌和刷新令牌需要訪問這個網址登錄帳號後獲取,填寫成功之後點擊確認即配置完成,可以在網頁訪問到你的onedrive雲盤了!

本地#

接下來配置稍微複雜點兒的本地掛載。

以下內容轉載自znov 的博客,因為他是在伺服器掛載,而我是在本機,所以做了少量修改。(windows 只需要進行前三步,未經過實測)。

  1. 世紀互聯 OneDrive 獲取 CLIENT_IDCLIENT_SECRET

    1. 打開該網頁登錄帳號。
    2. 左側找到Azure Active Directory點擊
      左側找到 應用註冊 點擊
      上方找到 新註冊 點擊
      名稱:onedrive
      受支持的帳戶類型:任何組織目錄(第二個)
      重定向 URL:http://localhost:53682
      點擊註冊
      找到 應用程序(客戶端) ID 複製保存
      左側找到 證書和密碼 點擊
      下方 客戶端密碼 - 新建客戶端密碼
      說明:onedrive
      截止期限:默認 一年內
      點擊 添加,複製保存
      左側找到 API 權限 點擊
      添加權限:Microsoft Graph - 委託的權限:全部勾選(這裡經我測試只勾選File欄即可)
  2. 安裝配置rclone

  3. 此處下載rclone世紀互聯版

    該文件來源於全球主機論壇愛純粹大佬,因為原博客的下載鏈接速度很慢,所以另存了一份。希望大家下載的同時可以順便去原博客評論支持一下!

  4. linux在當前目錄打開terminal,執行

    sudo mv ./rclone的文件名 /usr/bin/rclone
    sudo chmod +x /usr/bin/rclone
    

    windows請自行查閱如何將文件添加到環境變量中。

    注:此步驟非必須,如未執行則將以下語句的rclone改為rclone的路徑形式。

  5. 輸入rclone config進行如下配置

    e) Edit existing remote
    n) New remote
    d) Delete remote
    r) Rename remote
    c) Copy remote
    s) Set configuration password
    q) Quit config
    e/n/d/r/c/s/q> n
    name>onedrive
    Type of storage to configure.
    Enter a string value. Press Enter for the default ("").
    Choose a number from below, or type in your own value
     1 / 1Fichier
       \ "fichier"
     2 / Alias for an existing remote
       \ "alias"
     3 / Amazon Drive
       \ "amazon cloud drive"
     4 / Amazon S3 Compliant Storage Provider (AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, etc)
       \ "s3"
     5 / Backblaze B2
       \ "b2"
     6 / Box
       \ "box"
     7 / Cache a remote
       \ "cache"
     8 / Citrix Sharefile
       \ "sharefile"
     9 / Dropbox
       \ "dropbox"
    10 / Encrypt/Decrypt a remote
       \ "crypt"
    11 / FTP Connection
       \ "ftp"
    12 / Google Cloud Storage (this is not Google Drive)
       \ "google cloud storage"
    13 / Google Drive
       \ "drive"
    14 / Google Photos
       \ "google photos"
    15 / Hubic
       \ "hubic"
    16 / JottaCloud
       \ "jottacloud"
    17 / Koofr
       \ "koofr"
    18 / Local Disk
       \ "local"
    19 / Mail.ru Cloud
       \ "mailru"
    20 / Mega
       \ "mega"
    21 / Microsoft Azure Blob Storage
       \ "azureblob"
    22 / Microsoft OneDrive
       \ "onedrive"
    23 / OpenDrive
       \ "opendrive"
    24 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
       \ "swift"
    25 / Pcloud
       \ "pcloud"
    26 / Put.io
       \ "putio"
    27 / QingCloud Object Storage
       \ "qingstor"
    28 / SSH/SFTP Connection
       \ "sftp"
    29 / Transparently chunk/split large files
       \ "chunker"
    30 / Union merges the contents of several remotes
       \ "union"
    31 / Webdav
       \ "webdav"
    32 / Yandex Disk
       \ "yandex"
    33 / http Connection
       \ "http"
    34 / premiumize.me
       \ "premiumizeme"
    Storage>22
    ** See help for onedrive backend at: https://rclone.org/onedrive/ **
    
    Microsoft App Client Id
    Leave blank normally.
    Enter a string value. Press Enter for the default ("").
    client_id>輸入上面“應用程序(客戶端)id”
    Microsoft App Client Secret
    Leave blank normally.
    Enter a string value. Press Enter for the default ("").
    client_secret>輸入上面申請到的“值”
    OneDrive operated by 21Vianet (世紀互聯).
    Enter a boolean value (true or false). Press Enter for the default ("false").
    is_21vianet_version>true
    Edit advanced config? (y/n)
    y) Yes
    n) No
    y/n>n
    Use auto config?
     * Say Y if not sure
     * Say N if you are working on a remote or headless machine
    y) Yes
    n) No
    y/n>y
    之後會自動打開一個網頁,在這個網頁裡進行登錄,然後繼續..
    Choose a number from below, or type in an existing value
     1 / OneDrive Personal or Business
       \ "onedrive"
     2 / Root Sharepoint site
       \ "sharepoint"
     3 / Type in driveID
       \ "driveid"
     4 / Type in SiteID
       \ "siteid"
     5 / Search a Sharepoint site
       \ "search"
    Your choice> 1
    Found 1 drives, please select the one you want to use:
    0: OneDrive (business) id=******
    Chose drive to use:>0
    Found drive 'root' of type 'business', URL: https://alphaone-my.sharepoint.cn/personal/***
    Is that okay?
    y) Yes
    n) No
    y/n>y
    y
    q
    
  6. 進行掛載

    linux需要安裝fuse,各大發行版不一樣就不詳述了,我的manjaro自帶。

    命令如下:(其中的 / 表示需要掛載到本地的onedrive路徑,/mnt/表示本機的掛載路徑,可對應修改)

    掛載命令:rclone mount onedrive:/ /mnt/ --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000
    
    後台掛載命令:nohup rclone mount onedrive:/ /mnt --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000 >/dev/null 2>&1 &
    
    卸載命令:fusermount -qzu LocalFolder onedrive
    
  7. 使用掛載腳本

    這個掛載腳本能夠實現基本的掛載、卸載和重新掛載功能,之後使用的話就沒有必要輸入那麼長的命令了。腳本如下:

    #!/bin/bash
    # ------------------------------------------
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    ### BEGIN INIT INFO
    # Provides:          rclone
    # Required-Start:    $all
    # Required-Stop:     $all
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Start rclone at boot time
    # Description:       Enable rclone by daemon.
    ### END INIT INFO
    # ------------------------------------------
    # 以上兩條橫線之間的內容不自啟的話可以去掉(個人覺得自啟的話去掉應該也沒啥影響)
    
    NAME_BIN="rclone"
    NAME="onedrive"
    REMOTE='/' #需要掛載到本地的onedrive路徑,可修改
    LOCAL='/mnt/' #掛載到本地的哪個文件夾,可修改
    
    Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m"
    Info="${Green_font_prefix}[信息]${Font_color_suffix}"
    Error="${Red_font_prefix}[錯誤]${Font_color_suffix}"
    RETVAL=0
    
    check_running(){
        PID="$(ps -C $NAME_BIN -o pid= |head -n1 |grep -o '[0-9]\{1,\}')"
        if [[ ! -z ${PID} ]]; then
            return 0
        else
            return 1
        fi
    }
    do_start(){
        check_running
        if [[ $? -eq 0 ]]; then
            echo -e "${Info} $NAME_BIN (PID ${PID}) 正在運行..." && exit 0
        else
            fusermount -zuq $LOCAL >/dev/null 2>&1
            mkdir -p $LOCAL
            /usr/bin/rclone mount $NAME:$REMOTE $LOCAL --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000 >/dev/null 2>&1 &
            check_running
            if [[ $? -eq 0 ]]; then
                echo -e "${Info} $NAME_BIN 啟動成功 !"
            else
                echo -e "${Error} $NAME_BIN 啟動失敗 !"
            fi
        fi
    }
    do_stop(){
        check_running
        if [[ $? -eq 0 ]]; then
            kill -9 ${PID}
            RETVAL=$?
            if [[ $RETVAL -eq 0 ]]; then
                echo -e "${Info} $NAME_BIN 停止成功 !"
            else
                echo -e "${Error} $NAME_BIN 停止失敗 !"
            fi
        else
            echo -e "${Info} $NAME_BIN 未運行"
            RETVAL=1
        fi
        fusermount -zuq $LOCAL >/dev/null 2>&1
        fusermount -zuq $LOCAL1 >/dev/null 2>&1
    }
    do_status(){
        check_running
        if [[ $? -eq 0 ]]; then
            echo -e "${Info} $NAME_BIN (PID $(echo ${PID})) 正在運行..."
        else
            echo -e "${Info} $NAME_BIN 未運行 !"
            RETVAL=1
        fi
    }
    do_restart(){
        do_stop
        do_start
    }
    case "$1" in
        start|stop|restart|status)
        do_$1
        ;;
        *)
        echo "使用方法: $0 { start | stop | restart | status }"
        RETVAL=1
        ;;
    esac
    exit $RETVAL
    

    假設該腳本被保存為rcloned,首先給予可執行權限:

    chmod +x rcloned的路徑
    

    之後可以選擇將其移動到環境變量中,使用的時候手動執行rcloned start

    sudo mv rcloned的路徑 /usr/bin/rcloned
    # 每次使用時
    rcloned start
    

    也可以選擇像原文那樣設置為開機自動運行(可能不支持所有發行版):

    sudo mv rcloned的路徑 /etc/init.d/rcloned
    sudo /etc/init.d/rcloned start
    

截圖#

image

碎碎念#

本來打算稍微寫寫水一篇文章的,沒想到一不小心寫了這麼多...

中間某些步驟寫的過分詳細了,希望大家閱讀的時候不要嫌我囉嗦 orz

參考#

  1. zfile 官方文檔

  2. znov 的博客

  3. Zephyr 雜貨鋪(我購買帳號的地方)

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。