[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
}
}
- 整體設置裏nodaemon要設爲false,這樣你纔是後臺運行
- source是源目錄,target是目標目錄,需要注意的是如果你的目錄後面加了/,那麼它只會拷這個目錄下的所有文件(而不會把這個目錄也拷過去)。比如這裏是把/home/core整個目錄拷到/home-Bak/core目錄,如果我source寫的是/home/core/,那麼就會把core目錄下的所有文件(不包括core目錄)拷過去
- 文檔裏介紹了rsync、ssh和direct三種模式,雖然說direct快,但還是推薦使用rsync,因爲後者能把文件、文件權限、屬性等一大堆東西都拷過去(前提是目標目錄也得是同樣的分區格式,比如我是ext4),如果拷到ntfs那就沒轍了,都是777。
- delete=startup是指同步的時候只做新增和覆蓋操作,不會刪除目標目錄裏的內容,只會在開機的時候執行完全同步(白話文:source裏你刪了一個文件之後,同步的時候不會把target裏對應的文件刪掉,這個操作只會在開機的時候執行)
- 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] lsyncd實時同步搭建指南——取代rsync+inotify
[3] lsyncd github
[4] 官方配置文檔