### 介紹 Bacula是開源的網絡備份解決方案,通過它你可以構建強壯靈活的備份系統,但是bacula相對其他解決方案會稍顯笨重。但是備份系統在絕大多數的服務器基礎設施中尤其重要,數據恢復也是災備的重要環節。 通過這篇文章,我們將向你展示如何在CentOS7上安裝配置Bacula,並且制定一個每周備份本地文件(指備份Bacula本機)的任務。雖然通常不會這麽玩,但是這將會讓你更好的理解Bacula的用法。為你配置備份遠程主機打下基礎,我們會在下篇文章中介紹如何備份其他遠程的服務器。 ### 須知 你必須在CentOS7上有個擁有超級用戶(sudo)權限的用戶, 並且擁有足夠的空間來儲存你的備份。 配置好主機名 例如 ``` bacula.private.example.com ``` 可以使用 ``` hostnamectl --sethostname 主機名 ``` 來配置。 如果你對selinux不是很熟悉,你暫時還是把它給關掉吧。 關閉方法 ```bash sed 's/enable/disable/g' /etc/sysconfig/selinux ``` 重啟即可 ### Bacula組件介紹 盡管Bacula是由好幾個組件組成,但它遵循服務端-客戶端的備份模型;簡單的來講,我們將會更多地關註備份服務器和備份客戶端,而並不是Bacula的組件,當然,我們還是需要大概的了解下Bacula的組件,讓我們一起看看吧 一個Bacula服務器,我們通常會叫它備份服務器,由以下組件構成: - Bacula Director (DIR): 通過文件服務(File Daemon)和存儲服務(Storage Daemon)控制備份及還原操作 - Storage Daemon (SD): 讀取或寫入備份文件至存儲設備 - Catalog: 把已備份文件信息寫到數據庫,數據庫可以是 mysql 或者 PostgreSQL - Bacula Console: 供備份系統管理員使用的命令行工具,可以用來控制Bacula Director 註意: Bacula組件不需要在同時運行在同一服務器上,但是它們一起工作才能實現備份服務器的功能。 Bacula客戶端,即被備份的服務器,運行文件服務(File Damen)組件, Bacula服務器通過文件服務訪問需要備份的文件,我們通常也把這些服務器叫做備份客戶端或者客戶端。 正如我們介紹中說的那樣,我們將配置一個備份服務器並備份自己本地的文件系統,這意味著備份服務器也是備份客戶端,將運行文件服務組件。 讓我們開始配置吧。 ### 安裝Bacula和MySQL Bacula使用數據庫,例如MySQL或者PostreSQL,來管理備份記錄. 在本文中,我們將使用MySQL的替代軟件MariaDB. 通過yum安裝Bacula和MariaDB: ```bash sudo yum install -y bacula-director bacula-storage bacula-console bacula-client mariadb-server ``` 安裝完成後,啟動MariaDB: ```bash sudo systemctl start mariadb ``` 現在MariaDB已經安裝並已經運行,接下來通過以下腳本創建Bacula數據庫及用戶和表: ```bash /usr/libexec/bacula/grant_mysql_privileges /usr/libexec/bacula/create_mysql_database -u root /usr/libexec/bacula/make_mysql_tables -u bacula ``` 接下來,我們要運行一個簡單的安全腳本,它將會移除掉一些危險的默認配置並對訪問數據庫的權限進行簡單的配置。執行下面的命令: ```bash sudo mysql_secure_installation ``` 提示讓你輸入當前的數據庫root密碼,我們還沒有為root設置密碼所以留空就行了,直接Enter到下一步.接著會提示你是否設置root密碼,根據提示設置好root密碼.接下來的操作可以一路Enter到底, 使用默認設置即可,這些操作會移除掉一些示例用戶及數據庫,禁止root用戶遠程登錄,重載數據庫用戶權限,讓我們所做的操作立即生效. 現在我們需要為Bacula數據庫用戶設置密碼 使用root用戶進入MySQL console ```bash mysql -u root -p ``` 輸入你設置的root密碼 執行以下sql語句為bacula用戶設置密碼。註意將bacula_db_password換成你想設置的密碼 ```sql update mysql.user SET Password=PASSWORD(' bacula_db_password') WHERE User='bacula'; FLUSH PRIVILEGES; ``` 配置好後輸入exit退出MySql console 配置MariaDB開機啟動: ```bash sudo systemctl enable mariadb ``` #### 配置Bacula使用MySQL庫 默認情況下,Bacula使用PostgreSQL庫. 因為我們使用的是MySQL,所以我們需要配置使用MySQL替代下. 執行以下命令: ```bash sudo alternatives --config libbaccats.so ``` 你會看到一個提示, 輸入1(MySQL)確認即可 輸出如下 ```bash There are 3 programs which provide 'libbaccats.so'. Selection command ----------------------------------------------- 1 /usr/lib64/libbaccats-mysql.so 2 /usr/lib64/libbaccats-sqlite3.so *+ 3 /usr/lib64/libbaccats-postgresql.so Enter to keep the current selection[+], or type selection number: 1 ``` 到此為止,Bacula服務端(客戶端)組件都安裝好了. 接下來我們將創建備份和恢復目錄. #### 創建備份和恢復目錄 Bacula需要一個備份目錄用了存儲備份歸檔及一個恢復目錄用來恢復文件.如果你的系統有多個分區,請確保創建的目錄有足夠的空間. 讓我們創建新的目錄來滿足這一需要: ```bash sudo mkdir -p /bacula/backup /bacula/restore ``` 我們需要配置目錄的權限,只讓bacula進程(還有超級用戶)才能訪問這些目錄: ```bash sudo chown -R bacula:bacula /bacula sudo chmod -R 700 /bacula ``` 現在我們已經準備好開始配置Bacula Director. #### 配置Bacula Director Bacula的幾個組件必須獨立的配置才能保證功能的正常.所有組件的配置文件都在/etc/bacula目錄 我們從配置Bacula Director開始 用你最喜歡的文本編輯器打開Bacula Director配置文件,這裏我們使用vi: ```bash sudo vi /etc/bacula/bacula-dir.conf ``` ##### 配置Director Resource 找到Director Resourece,讓它監聽127.0.0.1(localhost),如下添加DirAddress這一行: ``` Director { # define myself Name = bacula-dir DIRport = 9101 # where we listen for UA connections QueryFile = "/etc/bacula/query.sql" WorkingDirectory = "/var/spool/bacula" PidDirectory = "/var/run" Maximum Concurrent Jobs = 1 Password = "@@DIR_PASSWORD@@" # Console password messages = Daemon DirAddress = 127.0.0.1 #添加這一行 } ``` 接著往下移動. ##### 配置Local Jobs Bacula job 是用來執行備份和恢復操作的.Job定義了一個任務將會如何操作,包括客戶端名字,備份文件等其他信息. 這裏,我們將配置一個job用來進行備份本地文件. 在Director配置文件中找到名字為"BackupClient1"的_Job_.把Name改成"BackupLocalFiles",如下所示: bacula-dir.conf — Rename BackupClient1 job ``` Job { Name = " BackupLocalFiles" JobDefs = "DefaultJob" } ``` 接下來找到名字為"RestoreFiles"的_Job_.在這裏你需要更改2處:把_job_的_name_給改成"RestoreLocalFiles",把_Where_改成"/bacula/restore".如下所示: bacula-dir.conf — Rename RestoreFiles job ``` Job { Name = " RestoreLocalFiles" Type = Restore Client=BackupServer-fd FileSet="Full Set" Storage = File Pool = Default Messages = Standard Where = /bacula/restore } ``` 這個配置了RestoreLocalFile任務將文件恢復至我們之前創建的文件夾/bacula/restore中. ##### 配置File Set Bacula FileSet定義了包含或者排除的文件或者目錄的信息,供Jobs使用。 找到"Full Set"這一塊兒(在"# List of files to be backed up"這行後面),這裏我們要改3處地方: 1. 添加gzip壓縮選項 2. 把_/usr/bin_改為_/_,因為我們要備份整個文件系統 3. 在Exclude section添加_File = /bacula _. 移除註釋後如下所示: bacula-dir.conf — Update "Full Set" FileSet ``` FileSet { Name = "Full Set" Include { Options { signature = MD5 compression = GZIP } File = / } Exclude { File = /var/lib/bacula File = /proc File = /tmp File = /.journal File = /.fsck File = /bacula } } ``` 讓我們再回顧下剛才所做的操作.首先我們打開gizp壓縮,然後設置備份路徑為_/_ 即根目錄,其次,排除掉_/bacula_目錄,因為我們不想多余的備份Bacula的備份和恢復文件. 註意: 如果你有在/分區之外的分區,你也想備份它的話,只要在FileSet中添加_include 掛載點_可以. 如果你在Jobs中經常使用大範圍的的FileSets,例如"Full Set",那麽你的備份比起指定範圍的備份會需要更多空間.例如,一個FileSet只包含自定義的配置文件或者數據庫或許就滿足你的備份需求了,不過需要你比較清楚安裝軟件並且知道配置文件的正確位置, 這樣備份就只占用很少一部分磁盤空間了. ##### 配置Storage Daemon Connection 在_Bacula Director_配置文件中, _Storage_ 定義了_Director_應該與哪個_Storage Daemon_連接. 我們接下來將配置_Storage Daemon_. 找到_Storage_, 把_Address_的_localhost_換成備份服務器的主機名(或者內網IP地址). 改完後應該和下面的差不多: bacula-dir.conf — Update Storage Address ``` Storage { Name = File # Do not use "localhost" here Address = backup_server_private_FQDN # N.B. Use a fully qualified name here SDPort = 9103 Password = "@@SD_PASSWORD@@" Device = FileStorage Media Type = File } ``` 這一步是很必要的,因為我們要讓_Storatge Daemon_監聽內網網卡,這樣遠程的客戶端才能連接它. ##### 配置 Catalog Connection 在Bacula Director配置文件中, Catalog定義了Director與數據庫的連接信息. 找到名字為_"MyCatalog"_(在"#Generic catalog service"這行後面),把_dbpassword換成我們前面設置好的密碼: bacula-dir.conf — Update Catalog dbpassword ``` # Generic catalog service Catalog { Name = MyCatalog # Uncomment the following line if you want the dbi driver # dbdriver = "dbi:postgresql"; dbaddress = 127.0.0.1; dbport = dbname = "bacula"; dbuser = "bacula"; dbpassword = " bacula_db_password" } ``` 這樣Bacula Director 就可以連接的MySQL數據庫了. ##### 配置Pool Pool定義了Bacula備份介質的配置信息,這裏我們將使用文件作為存儲卷(storage volumes),另外,我們會簡單的更新下標簽,以便正確的標註本地備份. 找到名字為_File_的Pool(在"# File Pool definition"這行下面),然後添加一行_Label Format_. 改為應該跟下面差不多: bacula-dir.conf — Update Pool: ``` # File Pool definition Pool { Name = File Pool Type = Backup Label Format = Local- Recycle = yes # Bacula can automatically recycle Volumes AutoPrune = yes # Prune expired volumes Volume Retention = 365 days # one year Maximum Volume Bytes = 50G # Limit Volume size to something reasonable Maximum Volumes = 100 # Limit number of Volumes in Pool } ``` 保存並退出編輯. 你已經完成_bacula Director的配置啦. ##### 檢查Director的配置 讓我們來檢查下配置文件會不會有語法錯誤: ```bash sudo bacula-dir -tc /etc/bacula/bacula-dir.conf ``` 如果沒有報錯信息,說明你的_bacula-dir.conf沒有語法錯誤. 接下來,我們將配置Storage Daemon #### 配置 Storage Daemon 我們的Bacula服務器已經配置的擦不多了,但是我們還需要配置_Storage Daemon_,這樣Bacula才知道把存儲放在哪兒. 用你最喜歡的文本編輯器打開SD(Storage Daemon),在這裏我們還是使用vi ```bash sudo vi /etc/bacula/bacula-sd.conf ``` ##### 配置 Storage Resource 在配置文件中找到Storage. 這個定義了SD進程將監聽信息. 添加_SDAddress_這個參數, 並賦予它備份服務器的IP地址或者FQDN主機名: bacula-sd.conf — update SDAddress ``` Storage { # definition of myself Name = BackupServer-sd SDPort = 9103 # Director's port WorkingDirectory = "/var/lib/bacula" Pid Directory = "/var/run/bacula" Maximum Concurrent Jobs = 20 SDAddress = backup_server_private_FQDN } ``` ##### 配置Storage Device 接下來,在配置文件中找到名字為"FileStorage"的_Device_,把_Archive Device_的配置更改為你的備份目錄: bacula-sd.conf — update Archive Device ``` Device { Name = FileStorage Media Type = File Archive Device = /bacula/backup LabelMedia = yes; # lets Bacula label unlabeled media Random Access = Yes; AutomaticMount = yes; # when device opened, read it RemovableMedia = no; AlwaysOpen = no; } ``` 保存並退出. ##### 驗證Storage Daemon配置文件 讓我們檢查下Storage Daemon配置文件是否有語法錯誤: ``` sudo bacula-sd -tc /etc/bacula/bacula-sd.conf ``` 如果沒有錯誤信息,則說明你的配置沒有語法錯誤. 我們已經完成了Bacula的配置.我們已經準備好重啟Bacula的各個組件了. #### 設置Bacula組件的密碼 每個Bacula組件,例如Director,SD和FD,它們在內部通信的時候都會需要到密碼(或許你已經在我們改配置文件的時候註意到了). 我們可以手動配置這些密碼,但是我們並不需要知道這些密碼.所以我們將使用下面的命令去生成這些密碼並把它替換到Bacula的配置文件中. 以下的命令生成Director的密碼. _bconsole_需要連接到_Director_,所以它也需要配置這個密碼: ```bash DIR_PASSWORD=`date +%s | sha256sum | base64 | head -c 33` sudo sed -i "s/@@DIR_PASSWORD@@/${DIR_PASSWORD}/" /etc/bacula/bacula-dir.conf sudo sed -i "s/@@DIR_PASSWORD@@/${DIR_PASSWORD}/" /etc/bacula/bconsole.conf ``` 以下的命令生成並配置_Storage Daemon的密碼. Director需要連接到SD,所以它也需要配置這個密碼: ```bash SD_PASSWORD=`date +%s | sha256sum | base64 | head -c 33` sudo sed -i "s/@@SD_PASSWORD@@/${SD_PASSWORD}/" /etc/bacula/bacula-sd.conf sudo sed -i "s/@@SD_PASSWORD@@/${SD_PASSWORD}/" /etc/bacula/bacula-dir.conf ``` 以下的命令生成並配置本地File Daemon(Bacula客戶端)的密碼.Director需要連接到這個FD.所以他也需要配置這個密碼: ```bash FD_PASSWORD=`date +%s | sha256sum | base64 | head -c 33` sudo sed -i "s/@@FD_PASSWORD@@/${FD_PASSWORD}/" /etc/bacula/bacula-dir.conf sudo sed -i "s/@@FD_PASSWORD@@/${FD_PASSWORD}/" /etc/bacula/bacula-fd.conf ``` 現在我們已經準備啟動我們的Bacula組件啦! #### 啟動Bacula組件 使用下面的命令啟動Bacula Director,Storage Daemon,還有本地的File Daemon: ```bash sudo systemctl start bacula-dir sudo systemctl start bacula-sd sudo systemctl start bacula-fd ``` 如果它們都正常啟動,執行下面的命令,讓這些服務都開機自動啟動: ```bash sudo systemctl enable bacula-dir sudo systemctl enable bacula-sd sudo systemctl enable bacula-fd ``` 讓我們來跑一個備份任務以來測試下Bacula. ### 測試備份任務 我們將使用_Bacula Console_來運行我們的第一個備份任務.如果它爬起來木有任何問題,那就說明我們配置對啦。 現在通過以下命令鍵入Console: ```bash sudo bconsole ``` 執行完你會看到一個_*_開頭的提示符. #### 創建Label 執行下面的命令: ``` label ``` 會提示你輸入一個卷名.輸入任何你喜歡的名字: ``` Enter new Volume name: MyVolume ``` 接著會讓你選擇使用哪個_Pool_,選擇2,使用我們前面配置的"File"就可以了: ``` Select the Pool (1-3): 2 ``` #### 手動運行備份任務 Bacula現在知道我們想讓備份數據寫在哪裏了.現在讓我們來執行我們的備份任務來驗證它是否正常工作: ``` run ``` 會提示你選擇一個任務.我們要執行的是"BackupLocalFiles",選擇"1"就好了: ``` Select Job resource (1-3): 1 ``` 在"Run Backup job"這個環節,檢查下詳細信息,然後輸入"yes"來運行這個任務: ``` yes ``` #### 檢查消息和狀態 當執行玩一個任務, Bacula會告訴你有一條新消息. 消息是運行運行的任務生成的。 使用下面的命令檢查消息: ``` messages ``` 消息應該會說"No prior Full backup Job record found", 並且備份任務已經執行.如果有任何錯誤或者不對的地方,消息會給你提示,為什麽任務沒有執行. 另一個查看任務狀態的方法是檢查Director的狀態.在bconsole裏執行: ``` status director ``` 如果運行正常,你應該可以看到你的任務正在運行.像下面這樣: Output — status director (Running Jobs) ``` Running Jobs: Console connected at 09-Apr-15 12:16 JobId Level Name Status ====================================================================== 3 Full BackupLocalFiles.2015-04-09_12.31.41_06 is running ==== ``` 當任務完成,它會移到已終止任務(Terminated Jobs)的報告裏面,像下面這樣: ``` Terminated Jobs: JobId Level Files Bytes Status Finished Name ==================================================================== 3 Full 161,124 877.5 M OK 09-Apr-15 12:34 BackupLocalFiles ``` 狀態"OK"表示備份任務運行沒有任何問題。恭喜你! 你已經有一個Bacula服務器的"Full Set"備份啦. 接下來的任務是測試恢復任務. ### 測試恢復任務 現在已經創建好了一個備份, 驗證它是否能被正確恢復是很重要的. 恢復命令將允許我們恢復已經備份的文件. #### 允許恢復全部任務 為了驗證,我們將恢復我們上個備份中的所有文件: ``` restore all ``` 會出現一個有很多選項的菜單,來確認那個是需要被恢復的.因為我們只有一個備份,讓我們選擇"Select the most recent backup" - 選擇5: ``` Select item (1-13): 5 ``` 因為這裏只有Bacula服務器這一個客戶端,所以它會自動被選擇. 接下來講問你選擇哪個FileSet.選擇"Full set",即選擇2: ``` Select FileSet resource (1-2): 2 ``` 接下來將會到一個包含備份文件中所有目錄結構的虛擬文件樹. 這個類shell的接口允許使用一些簡單的命令來標記和反標記恢復哪些文件. 因為我們一開始指定了"restore all",所以每個備份過得文件都已經被標記過了.被標記的文件開頭會有_*_. 如果你想要微調自己的選擇,你可以通過"cd"和"ls"命令切換目錄和列出文件,使用"mask"標記要被恢復的,"unmask"標記不被恢復.你可以通過鍵入"help"查看完整的命令列表. 當你完成你的選擇之後.敲入: ``` done ``` 確認你想要運行這個恢復任務: ``` OK to run? (yes/mod/no): yes ``` #### 查看消息和狀態 和backup任務一樣,在運行完恢復任務之後,你應該檢查下消息和Director的狀態. 檢查消息: ``` messages ``` 應該會說恢復任務已經結束,狀態是"Restore OK". 如果這裏有任何錯誤或者不對的地方,消息都會給你提示. 查看Director狀態是一種很好的方式用來查看恢復任務的狀況: ``` status director ``` 當你已經完成恢復任務,鍵入_exit_退出Bacula Console: ``` exit ``` ##### 驗證備份 驗證恢復任務有沒有真正的恢復你選擇的文件,你可以直接去看/bacula/restore這個目錄(我們在Director配置文件中的"RestoreLocalFiles"中定義過): ``` sudo ls -la /bacula/restore ``` 你應該會看到你根目錄中已被恢復的文件,正如我們前面在配置文件中定義的那樣包含哪些不包含哪些目錄.如果你因為文件丟失要嘗試文件恢復,那麽你可以復制這些恢復的文件到它們正確的位置. ##### 刪除已恢復的文件 你或許想刪掉恢復的文件,以便釋放磁盤空間. 執行下面的命令就可以: ```bash sudo -u root bash -c "rm -rf /bacula/restore/*" ``` 註意你必須以root用戶去執行這個rm命令.因為恢復文件的所屬用戶為root. ### 恭喜你 你已經知道了Bacula基礎配置,實現了備份和恢復你的本地文件系統.下一步要學習的時如何添加其他服務作為備份客戶端,這樣你才能在數據丟失的時候恢復它們. 下篇文章將向你展示如何添加其他,遠程的服務器作為Bacula Clients. 原文: https://www.digitalocean.com/community/tutorials/how-to-install-bacula-server-on-centos-7
Tags: 解決方案 數據恢復 服務器 enable 服務端
文章來源: