[linux] lsyncd 文件增量同步利器 用法

[linux] lsyncd 文件增量同步利器 用法

簡介

自從有一次不小心把home目錄刪沒了,還有一次調整分區大小不小心把home給格沒了,我就長心眼了。一定要數據備份。

然後統計了一下,我的個龜龜,30w個文件我拿備份啊,文件倒是不到(遷移了一部分在移動硬盤裏),但是qq聊天記錄那些亂七八糟的表情包啊小圖片啊,光這一部分就有8w個文件,淦。自然就想到了增量備份。

在這裏插入圖片描述

我比較懶就不發引用了,增量同步大致就有點像git倉庫,原理上是會根據文件差異來傳輸文件,而不是一股腦把所有文件都拷過去(當然它肯定沒法像git一樣回溯)

安裝、配置與使用

原理

其實lsyncd[3]它使用的工具是rsync+inotify。rsync是linux自帶的,幾乎所有發行版應該都有這個工具,你們也可以嘗試一下,直接rsync -av /home/core /tmp/xxx就好了。第一次拷因爲很大所以慢,但是在做出一些修改之後,第二次使用同樣的命令就非常快了,只會拷貝修改的文件,具體其它騷操作可以看這裏Linux文件同步工具-rsync[2]或者直接man一下手冊。

關於lsync的原理下面直接引用大佬的發言[1],本文主要參考的就是這篇了

Lysncd 實際上是lua語言封裝了 inotify 和 rsync 工具,採用了 Linux 內核(2.6.13 及以後)裏的 inotify 觸發機制,然後通過rsync去差異同步,達到實時的效果。我認爲它最令人稱道的特性是,完美解決了 inotify + rsync海量文件同步帶來的文件頻繁發送文件列表的問題 —— 通過時間延遲或累計觸發事件次數實現。另外,它的配置方式很簡單,lua本身就是一種配置語言,可讀性非常強。lsyncd也有多種工作模式可以選擇,本地目錄cp,本地目錄rsync,遠程目錄rsyncssh。

安裝

作爲arch系,aur裏怎麼可能沒有包,一頓yay -Sy lsyncd搞定。(yaourt已經過時啦趕緊yay用起來)

配置

這個包最騷的是它丫竟然沒有給默認配置,我:???

還好文檔還是有的,感謝大佬[1]做了大部分翻譯工作,歡迎直接參考,這邊只說幾個大佬網站上沒講的部分。

安好了之後並沒有任何指導,但你知道它是個daemon,所以問題不大,vim /usr/lib/systemd/system/lsyncd.service,就能看到它的daemon的配置文件

在這裏插入圖片描述

(這裏面註釋的是我自己寫後來刪掉了,其餘的應該和剛裝好沒什麼區別。)

紅線備註出來的部分便是配置文件了,當然你打開這個目錄的時候會發現它並沒有目錄,也沒有給默認配置,這就需要配置文件了,具體的規則在大佬的博客[1]裏寫得很清楚了,他是把原本的官方文檔[4]翻譯了一波。

這裏我對着我自己的配置簡單說一下要注意的地方

settings {
    nodaemon=false,
    maxProcesses=4
}

sync {
    default.rsync,
    source="/home/core",
    target="/run/media/core/Home-Bak/core",
    delay=4000,
    delete="startup",
    excludeFrom="/home/core/.config/lsyncd.exclude",
    rsync={
        binary="/usr/bin/rsync",
        archive=true,
        compress=false,
        verbose=false
    }
}

sync {
    default.rsync,
    source="/run/media/core/Data-2.5",
    target="/run/media/core/Data-3.5/Data-2.5",
    delay=7000,
    delete="startup",
    rsync={
        binary="/usr/bin/rsync",
        archive=true,
        compress=false,
        verbose=false
    }
}
  1. 整體設置裏nodaemon要設爲false,這樣你纔是後臺運行
  2. source是源目錄,target是目標目錄,需要注意的是如果你的目錄後面加了/,那麼它只會拷這個目錄下的所有文件(而不會把這個目錄也拷過去)。比如這裏是把/home/core整個目錄拷到/home-Bak/core目錄,如果我source寫的是/home/core/,那麼就會把core目錄下的所有文件(不包括core目錄)拷過去
  3. 文檔裏介紹了rsync、ssh和direct三種模式,雖然說direct快,但還是推薦使用rsync,因爲後者能把文件、文件權限、屬性等一大堆東西都拷過去(前提是目標目錄也得是同樣的分區格式,比如我是ext4),如果拷到ntfs那就沒轍了,都是777。
  4. delete=startup是指同步的時候只做新增和覆蓋操作,不會刪除目標目錄裏的內容,只會在開機的時候執行完全同步(白話文:source裏你刪了一個文件之後,同步的時候不會把target裏對應的文件刪掉,這個操作只會在開機的時候執行)
  5. delay是延遲多長時間同步,默認是15s,我感覺太短,設置成了3000s和7000s

使用

把配置文件寫好了之後sudo systemctl start lsyncd.service就能使用啦。

加入開機啓動列表:sudo systemctl enable lsyncd.service

常見問題與解決

開機自啓動但是我的可移動設備沒有掛載該怎麼辦?

對於kde平臺,在系統設置-開機和關機-後臺服務裏先啓用自動掛載服務

在這裏插入圖片描述

然後在系統設置-可移動設備裏有一個自動掛載配置,會有一個掛載選項,根據需求選擇登錄時掛載/連接時掛載即可。

在這裏插入圖片描述

其它桌面平臺應該都有類似的設置,靠你們自己找咯,反正我第一個接觸的桌面平臺就是manjaro-kde嘿嘿嘿

但是這裏還沒有結束,因爲你會發現設備的自動掛載是在sddm那個界面輸入了密碼之後才進行的,而使用sudo systemctl enable lsyncd.service會讓它在這之前就啓動服務。

所以這裏需要disable掉lsyncd這個服務:sudo systemctl disable lsyncd.service,然後讓每次輸入完密碼之後start服務。

具體做法是,系統設置-開機和關機-自啓動有個添加腳本,事先寫好一個可執行的腳本就好啦,然後添加進來就好啦。(我後來把ss和aria2cd都放這裏面了,感覺登錄之後再啓動的邏輯更好一點(畢竟屬於用戶自定義的啓動進程嘛)

在這裏插入圖片描述

最後一句,如果你的sudo需要輸入密碼的話這個部分就不好使了,自己visudo讓sudo命令執行特定指令不需要密碼吧。

如果我的可移動設備沒有連接會怎麼辦?

試試就知道了,這個daemon的狀態會fail,重新連接設備並且掛載之後sudo systemctl restart lsyncd.service即可。

對於筆記本來說這個服務開着很費電?

對於筆記本來說,其實開機自啓動並不夠友善,而且在使用電池或者沒有備份的設備(移動硬盤)沒有連接到電腦時很尷尬。前者會增加耗電量,降低續航,後者則會導致服務會fail。這裏還是以kde plasma平臺爲例講一下我的做法。

其實原理很簡單,寫好特定的腳本,在交流電和電池切換的時候觸發執行即可。

首先kde plasma桌面在系統設置-開機和關機-自動啓動有一個開機自啓動管理,要做的事情很簡單

  1. 寫一個腳本,用來打開這個服務(像我前面寫的那樣)

  2. 再寫一個腳本,用來關閉這個服務(像我前面寫的那樣)

  3. 找到配置電源設置,在交流供電和電池供電的運行腳本這裏執行我們特定的腳本(打開和關閉服務),如下圖

    在這裏插入圖片描述

參考資料

[1] lsyncd實時同步搭建指南——取代rsync+inotify

[2] Linux文件同步工具-rsync

[3] lsyncd github

[4] 官方配置文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章