[料理佳餚] 在 CentOS 7 將 RAM Disk 內的檔案於關機前備份、開機後還原。

上一篇文章講到了在 Linux 環境底下建立 RAM Disk 來用,如果要讓它使用上跟一般的磁碟機相似的話,還差最後一哩路,那就是「重新開機之後檔案還在」,要做到這件事,概念上就是「關機前備份檔案」、「開機後還原檔案」,那我們來看一下在 CentOS 7 要怎麼做?(CentOS 8 一樣適用)

CentOS 自從 7 之後,全面改用 systemd 來管理開機時啟動的服務,捨棄了 Runlevel(但相容 Runlevel),所以本篇文章會用 systemd 的方式來設定關機前及開機後要執行的腳本,其他 Linux 發行版本的做法,就請各位朋友自行 Google 了。

備份及還原的指令

首先,是建立備份資料夾,執行下面指令,我們將備份料夾給建立起來。

sudo mkdir /mnt/tmpfs-backup

sudo chmod -R 777 /mnt/tmpfs-backup

備份跟還原就用 rsync 來做,指令就請參考下面:

# 備份
rsync -a --delete --recursive --force /mnt/tmpfs/ /mnt/tmpfs-backup/

# 還原
rsync -a --recursive --force /mnt/tmpfs-backup/ /mnt/tmpfs/

關機前執行的腳本

建立一個名稱為 shutdown-script.sh 的腳本檔案,放一些在關機前要執行的指令,那我們目前要做的也只有備份 /mnt/tmpfs 裡面的檔案而已,所以就把備份指令放進去。

#! /bin/bash

rsync -a --delete --recursive --force /mnt/tmpfs/ /mnt/tmpfs-backup/

systemd 是以 Unit 為執行單位,所以我就在 /usr/lib/systemd/system/ 底下,建立一個名稱為 shutdown-script.service 的 Service Unit 檔案,把它 Install 在 shutdown.target,執行的就是剛剛我們建立的 shutdown-script.sh 腳本。

[Unit]
Description=Run script at shutdown
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/bin/bash /usr/share/shutdown-script.sh
TimeoutStartSec=0

[Install]
WantedBy=shutdown.target

檔案建好後,我們把 shutdown-script.service 給 enable 起來。

sudo systemctl enable shutdown-script.service

開機後執行的腳本

我們依樣畫葫蘆,先建立名稱為 startup-script.sh 的腳本檔案,把檔案還原的指令放進去。

#! /bin/bash

rsync -a --recursive --force /mnt/tmpfs-backup/ /mnt/tmpfs/

在 /usr/lib/systemd/system 底下,建立名稱為 startup-script.service 的 Service Unit 檔案,把它 Install 在 basic.target,而且要在 sysinit.target 之後執行,原因是我們得確保 RAM Disk 有被 mount 起來,還要在其他服務存取 RAM Disk 之前還原檔案。

[Unit]
Description=Run script at startup
DefaultDependencies=no
After=sysinit.target

[Service]
Type=oneshot
ExecStart=/bin/bash /usr/share/startup-script.sh
TimeoutStartSec=0

[Install]
WantedBy=basic.target

檔案建好後,我們把 startup-script.service 給 enable 起來。

sudo systemctl enable startup-script.service

最後,我們就隨便放幾個檔案到 /mnt/tmpfs,然後把機器重新開機。

檔案成功在關機前被備份,並且在開機前還原。

參考資料

C# 指南 ASP.NET 教學 ASP.NET MVC 指引
Azure SQL Database 教學 SQL Server 教學 Xamarin.Forms 教學