
- Linux管理員教程
- 主頁
- CentOS概述
- 基本的CentOS Linux命令
- 檔案/資料夾管理
- 使用者管理
- 配額管理
- Systemd服務的啟動和停止
- 使用systemctl進行資源管理
- 使用cgroups進行資源管理
- 程序管理
- 防火牆設定
- 在CentOS Linux中配置PHP
- 在CentOS Linux中設定Python
- 在CentOS Linux中配置Ruby
- 在CentOS Linux中設定Perl
- 安裝和配置Open LDAP
- 建立SSL證書
- 安裝Apache Web伺服器CentOS 7
- 在CentOS 7上設定MySQL
- 設定Postfix MTA和IMAP/POP3
- 安裝匿名FTP
- 遠端管理
- CentOS中的流量監控
- 日誌管理
- 備份和恢復
- 系統更新
- Shell指令碼
- 包管理
- 卷管理
- Linux管理員實用資源
- Linux管理員快速指南
- Linux管理員 - 實用資源
- Linux管理員 - 討論
Linux管理員快速指南
Linux管理員 - CentOS概述
CentOS作為商業級Linux發行版中獨樹一幟的存在,忠實於Linux的開源本質。第一個Linux核心是由赫爾辛基大學的一名大學生(Linus Torvalds)開發的,並結合了Richard Stallman建立和推廣的GNU實用程式。CentOS擁有經過驗證的開源許可,可以為當今的商業世界提供動力。
CentOS已迅速成為世界上最著名的伺服器平臺之一。任何尋求就業的Linux管理員都一定會遇到“優先考慮CentOS Linux經驗”這樣的字眼。從初創公司到《財富》10強科技巨頭,CentOS已躋身全球伺服器作業系統的高階行列。
使CentOS區別於其他Linux發行版的是以下幾個方面的完美結合:
開源許可
致力於Linux專業的使用者群體
良好的硬體支援
堅如磐石的穩定性和可靠性
專注於安全性和更新
嚴格遵守企業環境所需的軟體打包標準
在開始學習之前,我們假設讀者具備Linux和管理基礎知識,例如:
什麼是root使用者?
root使用者的許可權
安全組和使用者的基本概念
使用Linux終端模擬器的經驗
基本的網路概念
對解釋型程式語言(Perl、Python、Ruby)的基本理解
網路協議,例如HTTP、LDAP、FTP、IMAP、SMTP
構成計算機作業系統的核心:檔案系統、驅動程式和核心
基本的CentOS Linux命令
在學習CentOS Linux管理員的工具之前,重要的是要注意Linux管理員命令列背後的理念。
Linux的設計基於Unix的“小型、精確的工具鏈,簡化大型任務”的理念。從根本上說,Linux通常沒有針對特定用途的大型單一用途應用程式。相反,它有數百個基本實用程式,當結合起來時,可以提供強大的功能,以高效的方式完成大型任務。
Linux理念的示例
例如,如果管理員想要列出系統上所有當前使用者,可以使用以下鏈式命令來獲取系統上所有使用者的列表。執行命令後,系統上的使用者將按字母順序列出。
[root@centosLocal centos]# cut /etc/passwd -d":" -f1 | sort abrt adm avahi bin centos chrony colord daemon dbus
可以使用以下命令輕鬆地將此列表匯出到文字檔案。
[root@localhost /]# cut /etc/passwd -d ":" -f1 > system_users.txt [root@localhost /]# cat ./system_users.txt | sort | wc –l 40 [root@localhost /]#
還可以將使用者列表與以後的匯出進行比較。
[root@centosLocal centos]# cut /etc/passwd -d ":" -f1 > system_users002.txt && cat system_users002.txt | sort | wc -l 41 [root@centosLocal centos]# diff ./system_users.txt ./system_users002.txt evilBackdoor [root@centosLocal centos]#
透過這種使用小型工具鏈來完成大型任務的方法,編寫執行這些命令的指令碼比定期自動傳送電子郵件結果要簡單得多。
每個Linux管理員都應該熟練掌握的基本命令包括:
在Linux世界中,管理員每天都使用**過濾**命令來解析日誌、過濾命令輸出以及使用互動式shell指令碼執行操作。如前所述,這些命令的功能在於它們能夠透過稱為**管道**的過程相互修改。
以下命令顯示CentOS主使用者字典中以字母a開頭的單詞有多少個。
[root@centosLocal ~]# egrep '^a.*$' /usr/share/dict/words | wc -l 25192 [root@centosLocal ~]#
Linux管理員 - 檔案/資料夾管理
為了介紹CentOS Linux中目錄和檔案適用的許可權,讓我們看一下以下命令輸出。
[centos@centosLocal etc]$ ls -ld /etc/yum* drwxr-xr-x. 6 root root 100 Dec 5 06:59 /etc/yum -rw-r--r--. 1 root root 970 Nov 15 08:30 /etc/yum.conf drwxr-xr-x. 2 root root 187 Nov 15 08:30 /etc/yum.repos.d
**注意** - 你將看到的三個主要物件型別是
**"-"** - 表示普通檔案
**"d"** - 表示目錄
**"l"** - 表示符號連結
我們將重點關注每個目錄和檔案的三個輸出塊:
- drwxr-xr-x : root : root
- -rw-r--r-- : root : root
- drwxr-xr-x : root : root
現在讓我們分解一下,以便更好地理解這些行:
d | 表示物件型別是目錄 |
rwx | 指示應用於所有者的**目錄**許可權 |
r-x | 指示應用於組的**目錄**許可權 |
r-x | 指示應用於世界的**目錄**許可權 |
root | 第一個例項指示目錄的所有者 |
root | 第二個例項指示應用組許可權的組 |
理解所有者、組和世界之間的區別非常重要。如果不理解這一點,可能會對託管網際網路服務的伺服器產生重大影響。
在我們給出實際示例之前,讓我們首先了解應用於目錄和檔案的許可權。
請查看下錶,然後繼續操作。
八進位制 | 符號 | 許可權 | 目錄 |
---|---|---|---|
1 | x | 執行 | 進入目錄並訪問檔案 |
2 | w | 寫入 | 刪除或修改目錄中的檔案 |
4 | r | 讀取 | 列出目錄中的檔案 |
**注意** - 當檔案應該在目錄中可讀時,通常會應用讀取和執行許可權。否則,使用者將難以處理檔案。停用寫入將確保無法重新命名、刪除、複製或修改檔案許可權。
將許可權應用於目錄和檔案
應用許可權時,需要理解兩個概念:
- 符號許可權
- 八進位制許可權
本質上,兩者相同,只是指代和分配檔案許可權的方式不同。有關快速指南,請學習並參考下表:
讀取 | 寫入 | 執行 | |
---|---|---|---|
八進位制 | 4 | 2 | 1 |
符號 | r | w | x |
使用**八進位制**方法分配許可權時,使用 3 位元組數字,例如:760。數字 760 轉換為:所有者:rwx;組:rw;其他(或世界)無許可權。
另一種情況:733 將轉換為:所有者:rwx;組:wx;其他:wx。
使用八進位制方法設定許可權有一個缺點。無法修改現有的許可權集。只能重新分配物件的整個許可權集。
現在你可能會想,總是重新分配許可權有什麼問題?想象一下大型目錄結構,例如生產 Web 伺服器上的`/var/www/`。我們要遞迴地從所有目錄的“其他”使用者那裡移除`w` 或寫入位。因此,強制只有在需要安全措施時才主動新增它。如果我們重新分配整個許可權集,我們將移除分配給每個子目錄的所有其他自定義許可權。
因此,這將給管理員和系統使用者都帶來問題。在某些時候,一個人(或多個人)需要重新分配所有被重新分配每個目錄和物件的整個許可權集而清除的自定義許可權。
在這種情況下,我們希望使用符號方法來修改許可權:
chmod -R o-w /var/www/
上述命令不會“覆蓋許可權”,而是修改當前許可權集。因此,請習慣於使用最佳實踐
- 僅使用八進位制分配許可權
- 使用符號修改許可權集
重要的是,CentOS管理員應該熟練掌握八進位制和符號許可權,因為許可權對於資料的完整性和整個作業系統都很重要。如果許可權不正確,最終結果將是敏感資料和整個作業系統都將受到損害。
在介紹完這些內容後,讓我們來看一些用於修改許可權和物件所有者/成員的命令:
- chmod
- chown
- chgrp
- umask
chmod:更改檔案模式許可權位
命令 | 操作 |
---|---|
-c | 類似於詳細模式,但只會報告所做的更改 |
-v | 詳細模式,輸出每個請求的診斷資訊 |
-R | 遞迴地將操作應用於檔案和目錄 |
chmod 將允許我們使用八進位制或符號許可權集更改目錄和檔案的許可權。我們將使用它來修改我們的作業和上傳目錄。
chown:更改檔案所有者和組
命令 | 操作 |
---|---|
-c | 類似於詳細模式,但只會報告所做的更改 |
-v | 詳細模式,輸出每個請求的診斷資訊 |
-R | 遞迴地將操作應用於檔案和目錄 |
chown 可以修改物件的所有者使用者和組。但是,除非需要同時修改兩者,否則通常使用 chgrp 來處理組。
chgrp:更改檔案或目錄的組所有權
命令 | 操作 |
---|---|
-c | 類似於詳細模式,但只會報告所做的更改 |
-v | 詳細模式,輸出每個請求的診斷資訊 |
-R | 遞迴地將操作應用於檔案和目錄 |
chgrp 將更改組所有者為提供的組。
實際操作
讓我們更改`/var/www/students/`中的所有子目錄作業,以便所有者組為`students`組。然後將`students`的根目錄分配給`professors`組。稍後,讓 Terry Thomas 博士成為`students`目錄的所有者,因為他負責學校所有計算機科學方面的學術工作。
正如我們所看到的,建立目錄時,目錄的狀態相當原始。
[root@centosLocal ~]# ls -ld /var/www/students/ drwxr-xr-x. 4 root root 40 Jan 9 22:03 /var/www/students/ [root@centosLocal ~]# ls -l /var/www/students/ total 0 drwxr-xr-x. 2 root root 6 Jan 9 22:03 assignments drwxr-xr-x. 2 root root 6 Jan 9 22:03 uploads [root@centosLocal ~]#
作為管理員,我們永遠不想將我們的root許可權交給任何人。但與此同時,我們需要允許使用者能夠完成他們的工作。因此,讓我們允許 Terry Thomas 博士對檔案結構進行更多控制,並限制學生可以執行的操作。
[root@centosLocal ~]# chown -R drterryt:professors /var/www/students/ [root@centosLocal ~]# ls -ld /var/www/students/ drwxr-xr-x. 4 drterryt professors 40 Jan 9 22:03 /var/www/students/ [root@centosLocal ~]# ls -ls /var/www/students/ total 0 0 drwxr-xr-x. 2 drterryt professors 6 Jan 9 22:03 assignments 0 drwxr-xr-x. 2 drterryt professors 6 Jan 9 22:03 uploads [root@centosLocal ~]#
現在,每個目錄和子目錄的所有者都是`drterryt`,所有者組是`professors`。由於`assignments`目錄用於學生提交作業,讓我們取消`students`組列出和修改檔案的許可權。
[root@centosLocal ~]# chgrp students /var/www/students/assignments/ && chmod 736 /var/www/students/assignments/ [root@centosLocal assignments]# ls -ld /var/www/students/assignments/ drwx-wxrw-. 2 drterryt students 44 Jan 9 23:14 /var/www/students/assignments/ [root@centosLocal assignments]#
學生可以將作業複製到`assignments`目錄。但他們不能列出目錄的內容、複製當前檔案或修改`assignments`目錄中的檔案。因此,它只允許學生提交已完成的作業。CentOS檔案系統將提供作業提交時間的日期戳。
作為`assignments`目錄的所有者:
[drterryt@centosLocal assignments]$ whoami drterryt [drterryt@centosLocal assignments]$ ls -ld /var/www/students/assignment drwx-wxrw-. 2 drterryt students 44 Jan 9 23:14 /var/www/students/assignments/ [drterryt@centosLocal assignments]$ ls -l /var/www/students/assignments/ total 4 -rw-r--r--. 1 adama students 0 Jan 9 23:14 myassign.txt -rw-r--r--. 1 tammyr students 16 Jan 9 23:18 terryt.txt [drterryt@centosLocal assignments]$
我們可以看到,目錄所有者可以列出檔案以及修改和刪除檔案。
umask 命令:提供建立檔案和目錄許可權時的預設模式
umask 是一個重要的命令,它為建立的檔案和目錄許可權提供預設模式。
umask 許可權使用一元反向邏輯。
許可權 | 操作 |
---|---|
0 | 讀、寫、執行 |
1 | 讀和寫 |
2 | 讀和執行 |
3 | 只讀 |
4 | 讀和執行 |
5 | 只寫 |
6 | 只執行 |
7 | 無許可權 |
[adama@centosLocal umask_tests]$ ls -l ./ -rw-r--r--. 1 adama students 0 Jan 10 00:27 myDir -rw-r--r--. 1 adama students 0 Jan 10 00:27 myFile.txt [adama@centosLocal umask_tests]$ whoami adama [adama@centosLocal umask_tests]$ umask 0022 [adama@centosLocal umask_tests]$
現在,讓我們更改當前使用者的 umask,並建立一個新的檔案和目錄。
[adama@centosLocal umask_tests]$ umask 077 [adama@centosLocal umask_tests]$ touch mynewfile.txt [adama@centosLocal umask_tests]$ mkdir myNewDir [adama@centosLocal umask_tests]$ ls -l total 0 -rw-r--r--. 1 adama students 0 Jan 10 00:27 myDir -rw-r--r--. 1 adama students 0 Jan 10 00:27 myFile.txt drwx------. 2 adama students 6 Jan 10 00:35 myNewDir -rw-------. 1 adama students 0 Jan 10 00:35 mynewfile.txt
我們可以看到,新建立的檔案比以前更嚴格了一些。
必須更改使用者的 umask,方法如下:
- /etc/profile
- ~/bashrc
[root@centosLocal centos]# su adama [adama@centosLocal centos]$ umask 0022 [adama@centosLocal centos]$
通常,CentOS 中的預設 umask 就足夠了。當我們遇到預設值為 0022 的問題時,通常是因為不同部門的不同組需要協作完成專案。
這就是系統管理員的作用所在,需要平衡 CentOS 作業系統的操作和設計。
Linux管理員 - 使用者管理
在討論使用者管理時,我們需要理解三個重要術語:
- 使用者
- 組
- 許可權
我們已經深入討論了應用於檔案和資料夾的許可權。在本章中,讓我們討論使用者和組。
CentOS 使用者
在 CentOS 中,有兩種型別的帳戶:
系統帳戶 - 用於守護程序或其他軟體。
互動式帳戶 - 通常分配給使用者以訪問系統資源。
這兩種使用者型別的主要區別在於:
系統帳戶 由守護程序用來訪問檔案和目錄。這些帳戶通常不允許透過 shell 或物理控制檯登入進行互動式登入。
互動式帳戶 由終端使用者用來透過 shell 或物理控制檯登入訪問計算資源。
有了對使用者的基本瞭解,現在讓我們為會計部門的 Bob Jones 建立一個新使用者。使用 adduser 命令新增新使用者。
以下是 adduser 常用開關:
開關 | 操作 |
---|---|
-c | 向用戶帳戶添加註釋 |
-m | 如果不存在,則在預設位置建立使用者主目錄 |
-g | 分配給使用者的預設組 |
-n | 不為使用者建立專用組,通常是使用者名稱組 |
-M | 不建立主目錄 |
-s | 除 /bin/bash 之外的預設 shell |
-u | 指定 UID(否則由系統分配) |
-G | 分配給使用者的附加組 |
建立新使用者時,請按如下方式使用 -c, -m, -g, -n 開關:
[root@localhost Downloads]# useradd -c "Bob Jones Accounting Dept Manager" -m -g accounting -n bjones
現在讓我們看看新使用者是否已建立:
[root@localhost Downloads]# id bjones (bjones) gid = 1001(accounting) groups = 1001(accounting) [root@localhost Downloads]# grep bjones /etc/passwd bjones:x:1001:1001:Bob Jones Accounting Dept Manager:/home/bjones:/bin/bash [root@localhost Downloads]#
現在我們需要使用 passwd 命令啟用新帳戶:
[root@localhost Downloads]# passwd bjones Changing password for user bjones. New password: Retype new password: passwd: all authentication tokens updated successfully. [root@localhost Downloads]#
使用者帳戶未啟用,不允許使用者登入系統。
停用使用者帳戶
有多種方法可以停用系統上的帳戶。這些方法範圍從手動編輯 /etc/passwd 檔案,甚至使用帶有 -l 開關的 passwd 命令。這兩種方法都有一個很大的缺點:如果使用者具有 ssh 訪問許可權並使用 RSA 金鑰進行身份驗證,他們仍然可以使用此方法登入。
現在讓我們使用 chage 命令,將密碼過期日期更改為之前的日期。此外,最好在帳戶中記下我們停用它的原因。
[root@localhost Downloads]# chage -E 2005-10-01 bjones [root@localhost Downloads]# usermod -c "Disabled Account while Bob out of the country for five months" bjones [root@localhost Downloads]# grep bjones /etc/passwd bjones:x:1001:1001:Disabled Account while Bob out of the country for four months:/home/bjones:/bin/bash [root@localhost Downloads]#
管理組
在 Linux 中管理組使管理員可以方便地將使用者組合到容器中,並應用適用於所有組成員的許可權集。例如,會計部門的所有使用者可能都需要訪問相同的檔案。因此,我們建立一個會計組,並新增會計使用者。
在大多數情況下,任何需要特殊許可權的操作都應該在組內完成。這種方法通常比只對一個使用者應用特殊許可權更省時。例如,Sally 負責報告,只有 Sally 需要訪問某些用於報告的檔案。但是,如果 Sally 有一天生病了,Bob 也要製作報告怎麼辦?或者報告的需求增加了怎麼辦?建立一個組後,管理員只需執行一次即可。新增使用者會根據需要進行更改或擴充套件。
以下是用於管理組的一些常用命令:
- chgrp
- groupadd
- groups
- usermod
chgrp - 更改檔案或目錄的組所有權。
讓我們為會計組中的人員建立一個目錄,用於儲存檔案和建立檔案目錄。
[root@localhost Downloads]# mkdir /home/accounting [root@localhost Downloads]# ls -ld /home/accounting drwxr-xr-x. 2 root root 6 Jan 13 10:18 /home/accounting [root@localhost Downloads]#
接下來,讓我們將組所有權授予會計組。
[root@localhost Downloads]# chgrp -v accounting /home/accounting/ changed group of ‘/home/accounting/’ from root to accounting [root@localhost Downloads]# ls -ld /home/accounting/ drwxr-xr-x. 2 root accounting 6 Jan 13 10:18 /home/accounting/ [root@localhost Downloads]#
現在,會計組中的每個人都對/home/accounting具有讀取和執行許可權。他們也需要寫入許可權。
[root@localhost Downloads]# chmod g+w /home/accounting/ [root@localhost Downloads]# ls -ld /home/accounting/ drwxrwxr-x. 2 root accounting 6 Jan 13 10:18 /home/accounting/ [root@localhost Downloads]#
由於會計組可能處理敏感文件,我們需要對其他使用者或世界使用者應用一些限制性許可權。
[root@localhost Downloads]# chmod o-rx /home/accounting/ [root@localhost Downloads]# ls -ld /home/accounting/ drwxrwx---. 2 root accounting 6 Jan 13 10:18 /home/accounting/ [root@localhost Downloads]#
groupadd - 用於建立一個新組。
開關 | 操作 |
---|---|
-g | 為組指定 GID |
-K | 覆蓋 /etc/login.defs 中 GID 的規範 |
-o | 允許覆蓋非唯一組 ID 不允許 |
-p | 組密碼,允許使用者自行啟用 |
讓我們建立一個名為 secret 的新組。我們將向組新增密碼,允許使用者使用已知密碼新增自己。
[root@localhost]# groupadd secret [root@localhost]# gpasswd secret Changing the password for group secret New Password: Re-enter new password: [root@localhost]# exit exit [centos@localhost ~]$ newgrp secret Password: [centos@localhost ~]$ groups secret wheel rdc [centos@localhost ~]$
實際上,組密碼很少使用。輔助組就足夠了,在其他使用者之間共享密碼並不是一個很好的安全做法。
groups 命令用於顯示使用者屬於哪個組。我們將在對當前使用者進行一些更改後使用它。
usermod 用於更新帳戶屬性。
以下是常見的 usermod 開關。
開關 | 操作 |
---|---|
-a | 追加,僅使用 -G 選項將使用者新增到輔助組 |
-c | 註釋,更新使用者註釋值 |
-d | 主目錄,更新使用者的主目錄 |
-G | 組,新增或刪除輔助使用者組 |
-g | 組,使用者的預設主組 |
[root@localhost]# groups centos centos : accounting secret [root@localhost]# [root@localhost]# usermod -a -G wheel centos [root@localhost]# groups centos centos : accounting wheel secret [root@localhost]#
Linux管理員 - 配額管理
CentOS 磁碟配額既可以啟用;在磁碟容量超過限制之前提醒系統管理員並拒絕使用者進一步訪問磁碟儲存。當磁碟已滿時,根據磁碟上存放的內容,整個系統可能會完全停止執行,直到恢復為止。
在 CentOS Linux 中啟用配額管理基本上是一個 4 步過程:
步驟 1 - 在 /etc/fstab 中為組和使用者啟用配額管理。
步驟 2 - 重新掛載檔案系統。
步驟 3 - 建立配額資料庫並生成磁碟使用情況表。
步驟 4 - 分配配額策略。
在 /etc/fstab 中啟用配額管理
首先,我們要備份我們的 /etc/fstab 檔案:
[root@centosLocal centos]# cp -r /etc/fstab ./
現在我們在當前工作目錄中有了已知工作/etc/fstab的副本。
# # /etc/fstab # Created by anaconda on Sat Dec 17 02:44:51 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/cl-root / xfs defaults 0 0 UUID = 4b9a40bc-9480-4 /boot xfs defaults 0 0 /dev/mapper/cl-home /home xfs defaults,usrquota,grpquota 0 0 /dev/mapper/cl-swap swap swap defaults 0 0
我們在要為使用者和組應用配額的卷或標籤的/etc/fstab選項部分進行了以下更改。
- usrquota
- grpquota
如您所見,我們使用的是xfs檔案系統。使用 xfs 時,會涉及額外的步驟。/home與 / 在同一磁碟上。進一步調查顯示 / 設定為 noquota,這是一個核心級掛載選項。我們必須重新配置核心引導選項。
root@localhost rdc]# mount | grep ' / ' /dev/mapper/cl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota) [root@localhost rdc]#
重新配置 XFS 檔案系統的核心引導選項
此步驟僅在以下兩種情況下才需要:
- 當我們正在啟用配額的磁碟/分割槽使用 xfs 檔案系統時
- 當核心在引導時將 noquota 引數傳遞給 /etc/fstab 時
步驟 1 - 備份 /etc/default/grub。
cp /etc/default/grub ~/
步驟 2 - 修改/etc/default/grub。
這是預設檔案。
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet" GRUB_DISABLE_RECOVERY="true"
我們要修改以下行:
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
為
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv =cl/swap rhgb quiet rootflags=usrquota,grpquota"
注意 - 正確複製這些更改非常重要。重新配置 grub.cfg 後,如果配置中出現任何錯誤,我們的系統將無法啟動。請在非生產系統上嘗試本教程的這一部分。
步驟 3 - 備份您的工作 grub.cfg
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
建立一個新的 grub.cfg
[root@localhost rdc]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-dbba7fa47f73457b96628ba8f3959bfd Found initrd image: /boot/initramfs-0-rescuedbba7fa47f73457b96628ba8f3959bfd.img done [root@localhost rdc]#
重啟
[root@localhost rdc]#reboot
如果所有修改都準確無誤,我們就不應該能夠向 xfs 檔案系統新增配額了。
[rdc@localhost ~]$ mount | grep ' / ' /dev/mapper/cl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota) [rdc@localhost ~]$
我們已經透過 grub 傳遞了 usrquota 和 grpquota 引數。
現在,再次編輯/etc/fstab以包含 /,因為/home在同一物理磁碟上。
/dev/mapper/cl-root/xfs defaults,usrquota,grpquota 0 0
現在讓我們啟用配額資料庫。
[root@localhost rdc]# quotacheck -acfvugM
確保已啟用配額。
[root@localhost rdc]# quotaon -ap group quota on / (/dev/mapper/cl-root) is on user quota on / (/dev/mapper/cl-root) is on group quota on /home (/dev/mapper/cl-home) is on user quota on /home (/dev/mapper/cl-home) is on [root@localhost rdc]#
重新掛載檔案系統
如果分割槽或磁碟與正在主動引導的分割槽分開,我們可以無需重新引導即可重新掛載。如果在根目錄 / 中引導的磁碟/分割槽上配置了配額,則可能需要重新引導作業系統。強制重新掛載並應用更改,重新掛載檔案系統的需要可能會有所不同。
[rdc@localhost ~]$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/cl-root 22447404 4081860 18365544 19% / devtmpfs 903448 0 903448 0% /dev tmpfs 919308 100 919208 1% /dev/shm tmpfs 919308 9180 910128 1% /run tmpfs 919308 0 919308 0% /sys/fs/cgroup /dev/sda2 1268736 176612 1092124 14% /boot /dev/mapper/cl-var 4872192 158024 4714168 4% /var /dev/mapper/cl-home 18475008 37284 18437724 1% /home tmpfs 183864 8 183856 1% /run/user/1000 [rdc@localhost ~]$
我們可以看到,正在使用 LVM 卷。因此,只需重新引導即可。這將重新掛載/home並將/etc/fstab配置更改載入到活動配置中。
建立配額資料庫檔案
CentOS 現在能夠使用 /home 上的磁碟配額。要啟用完全配額支援,我們必須執行quotacheck命令。
quotacheck 將建立兩個檔案:
- aquota.user
- aquota.group
這些檔案用於儲存已啟用配額的磁碟/分割槽的配額資訊。
以下是常見的 quotacheck 開關。
開關 | 操作 |
---|---|
-u | 檢查使用者配額 |
-g | 檢查組配額 |
-c | 應為每個啟用配額的檔案系統啟用配額 |
-v | 顯示詳細輸出 |
新增每個使用者的配額限制
為此,我們將使用 edquota 命令,後跟使用者名稱:
[root@localhost rdc]# edquota centos Disk quotas for user centos (uid 1000): Filesystem blocks soft hard inodes soft hard /dev/mapper/cl-root 12 0 0 13 0 0 /dev/mapper/cl-home 4084 0 0 140 0 0
讓我們看看每一列。
檔案系統 - 這是應用於使用者的每個檔案系統的配額。
塊 - 使用者當前在每個檔案系統上使用的塊數。
軟限制 - 設定軟限制的塊數。軟限制允許使用者在給定時間段內使用配額。
硬限制 - 設定硬限制的塊數。硬限制是允許的總配額。
inode - 使用者當前使用的 inode 數。
軟限制 - 軟 inode 限制。
硬限制 - 硬 inode 限制。
要檢查我們當前使用者的配額:
[centos@localhost ~]$ quota Disk quotas for user centos (uid 1000): Filesystem blocks quota limit grace files quota limit grace /dev/mapper/cl-home 6052604 56123456 61234568 475 0 0 [centos@localhost ~]$
以下是當用戶超過硬配額限制時給出的錯誤。
[centos@localhost Downloads]$ cp CentOS-7-x86_64-LiveKDE-1611.iso.part ../Desktop/ cp: cannot create regular file ‘../Desktop/CentOS-7-x86_64-LiveKDE- 1611.iso.part’: Disk quota exceeded [centos@localhost Downloads]$
我們可以看到,我們非常接近此使用者的磁碟配額。讓我們設定一個軟限制警告。這樣,使用者在配額限制過期前將收到預先通知。根據經驗,當用戶上班時需要花費 45 分鐘來清除檔案才能真正開始工作時,您會收到終端使用者的投訴。
作為管理員,我們可以使用repquota命令檢查配額使用情況。
[root@localhost Downloads]# repquota /home Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------------------------- root -- 0 0 0 3 0 0 centos -+ 6189824 56123456 61234568 541 520 540 6days [root@localhost Downloads]#
我們可以看到,centos 使用者已超過其硬塊配額,並且不能再在/home上使用任何磁碟空間了。
-+ 表示檔案系統上的硬配額已超過。
規劃配額時,需要進行一些計算。管理員需要知道:系統上有多少使用者?如何在使用者/組之間分配可用空間?檔案系統上的一個塊包含多少位元組?
根據可用磁碟空間定義以塊為單位的配額。建議在檔案系統上保留一個“安全”的空閒空間緩衝區,即使在最壞的情況下:所有配額同時超出,這個緩衝區也能保持空閒。這尤其適用於系統用於寫入日誌的分割槽。
Systemd服務的啟動和停止
systemd是執行Linux服務的新的方式。systemd已經取代了sysvinit。systemd為Linux帶來了更快的啟動時間,現在已成為管理Linux服務的標準方式。雖然穩定,但systemd仍在不斷發展。
systemd作為初始化系統,用於管理在Linux核心啟動後需要狀態更改的服務和守護程序。狀態更改包括啟動、停止、重新載入和調整服務狀態。
首先,讓我們檢查當前在伺服器上執行的systemd版本。
[centos@localhost ~]$ systemctl --version systemd 219 +PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN [centos@localhost ~]$
截至本文撰寫時,CentOS 7版本已完全更新,systemd版本219是當前的穩定版本。
我們還可以使用systemd-analyze分析上次伺服器啟動時間。
[centos@localhost ~]$ systemd-analyze Startup finished in 1.580s (kernel) + 908ms (initrd) + 53.225s (userspace) = 55.713s [centos@localhost ~]$
當系統啟動時間較慢時,我們可以使用systemd-analyze blame命令。
[centos@localhost ~]$ systemd-analyze blame 40.882s kdump.service 5.775s NetworkManager-wait-online.service 4.701s plymouth-quit-wait.service 3.586s postfix.service 3.121s systemd-udev-settle.service 2.649s tuned.service 1.848s libvirtd.service 1.437s network.service 875ms packagekit.service 855ms gdm.service 514ms firewalld.service 438ms rsyslog.service 436ms udisks2.service 398ms sshd.service 360ms boot.mount 336ms polkit.service 321ms accounts-daemon.service
在使用systemd時,瞭解單元的概念非常重要。單元是systemd知道如何解釋的資源。單元分為以下12種類型:
- .service
- .socket
- .device
- .mount
- .automount
- .swap
- .target
- .path
- .timer
- .snapshot
- .slice
- .scope
在大多數情況下,我們將使用.service作為單元目標。建議進一步研究其他型別,因為只有.service單元適用於啟動和停止systemd服務。
每個單元都在以下位置的檔案中定義:
/lib/systemd/system − 基本單元檔案
/etc/systemd/system − 執行時啟動的修改後的單元檔案
使用systemctl管理服務
要使用systemd,我們需要非常熟悉systemctl命令。以下是systemctl最常用的命令列開關。
開關 | 操作 |
---|---|
-t | 單元型別的逗號分隔值,例如service或socket |
-a | 顯示所有已載入的單元 |
--state | 顯示處於已定義狀態的所有單元,例如:load、sub、active、inactive等。 |
-H | 遠端執行操作。指定主機名或主機名和使用者名稱,用@分隔。 |
基本的systemctl用法
systemctl [operation] example: systemctl --state [servicename.service]
快速檢視我們系統上執行的所有服務。
[root@localhost rdc]# systemctl -t service UNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-xorg.service loaded active running ABRT Xorg log watcher abrtd.service loaded active running ABRT Automated Bug Reporting Tool accounts-daemon.service loaded active running Accounts Service alsa-state.service loaded active running Manage Sound Card State (restore and store) atd.service loaded active running Job spooling tools auditd.service loaded active running Security Auditing Service avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack blk-availability.service loaded active exited Availability of block devices bluetooth.service loaded active running Bluetooth service chronyd.service loaded active running NTP client/server
停止服務
首先,讓我們停止藍牙服務。
[root@localhost]# systemctl stop bluetooth [root@localhost]# systemctl --all -t service | grep bluetooth bluetooth.service loaded inactive dead Bluetooth service [root@localhost]#
我們可以看到,藍牙服務現在處於非活動狀態。
要再次啟動藍牙服務。
[root@localhost]# systemctl start bluetooth [root@localhost]# systemctl --all -t service | grep bluetooth bluetooth.service loaded active running Bluetooth service [root@localhost]#
注意 − 我們沒有指定bluetooth.service,因為.service是隱含的。最好將單元型別新增到我們正在處理的服務中。因此,從現在開始,我們將使用.service副檔名來明確我們正在執行服務單元操作。
可以對服務執行的主要操作包括:
Start | 啟動服務 |
Stop | 停止服務 |
Reload | 重新載入服務的活動配置,無需停止它(類似於system v init中的kill -HUP) |
Restart | 啟動然後停止服務 |
Enable | 在啟動時啟動服務 |
Disable | 阻止服務在執行時自動啟動 |
上述操作主要用於以下場景:
Start | 啟動已停止的服務。 |
Stop | 臨時關閉服務(例如,當必須停止服務才能訪問服務鎖定的檔案時,例如升級服務時)。 |
Reload | 編輯配置檔案後,我們希望應用新更改而不停止服務。 |
Restart | 與重新載入相同的場景,但服務不支援重新載入。 |
Enable | 當我們希望在啟動時執行停用的服務時。 |
Disable | 主要用於需要停止服務但它在啟動時啟動的情況。 |
檢查服務狀態:
[root@localhost]# systemctl status network.service network.service - LSB: Bring up/down networking Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled) Active: active (exited) since Sat 2017-01-14 04:43:48 EST; 1min 31s ago Docs: man:systemd-sysv-generator(8) Process: 923 ExecStart = /etc/rc.d/init.d/network start (code=exited, status = 0/SUCCESS) localhost.localdomain systemd[1]: Starting LSB: Bring up/down networking... localhost.localdomain network[923]: Bringing up loopback interface: [ OK ] localhost.localdomain systemd[1]: Started LSB: Bring up/down networking. [root@localhost]#
向我們顯示networking服務的當前狀態。如果我們想檢視與網路相關的所有服務,我們可以使用:
[root@localhost]# systemctl --all -t service | grep -i network network.service loaded active exited LSB: Bring up/ NetworkManager-wait-online.service loaded active exited Network Manager NetworkManager.service loaded active running Network Manager ntpd.service loaded inactive dead Network Time rhel-import-state.service loaded active exited Import network [root@localhost]#
對於熟悉sysinit服務管理方法的人來說,過渡到systemd非常重要。systemd是在Linux中啟動和停止守護程序服務的新方法。
Linux管理員 - 使用systemctl進行資源管理
systemctl是用於控制systemd的實用程式。systemctl使CentOS管理員能夠對systemd執行多種操作,包括:
- 配置systemd單元
- 獲取systemd單元的狀態
- 啟動和停止服務
- 啟用/停用systemd服務以進行執行時等操作。
systemctl的命令語法非常簡單,但可能會與開關和選項糾纏在一起。我們將介紹管理CentOS Linux所需的systemctl最基本的功能。
Basic systemctl syntax: systemctl [OPTIONS] COMMAND [NAME]
以下是與systemctl一起使用的常用命令:
- start
- stop
- restart
- reload
- status
- is-active
- list-units
- enable
- disable
- cat
- show
我們已經討論了start、stop、reload、restart、enable和disable以及systemctl。所以讓我們回顧一下其餘常用的命令。
status
在最簡單的形式中,status命令可用於檢視整個系統的狀態:
[root@localhost rdc]# systemctl status ● localhost.localdomain State: running Jobs: 0 queued Failed: 0 units Since: Thu 2017-01-19 19:14:37 EST; 4h 5min ago CGroup: / ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 ├─user.slice │ └─user-1002.slice │ └─session-1.scope │ ├─2869 gdm-session-worker [pam/gdm-password] │ ├─2881 /usr/bin/gnome-keyring-daemon --daemonize --login │ ├─2888 gnome-session --session gnome-classic │ ├─2895 dbus-launch --sh-syntax --exit-with-session
上面的輸出已被壓縮。在實際應用中,systemctl status將輸出大約100行樹狀程序狀態。
假設我們要檢查防火牆服務的狀況:
[root@localhost rdc]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2017-01-19 19:14:55 EST; 4h 12min ago Docs: man:firewalld(1) Main PID: 825 (firewalld) CGroup: /system.slice/firewalld.service └─825 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
正如你所看到的,我們的防火牆服務當前處於活動狀態,並且已經運行了超過4個小時。
list-units
list-units命令允許我們列出特定型別的所有單元。讓我們檢查由systemd管理的套接字:
[root@localhost]# systemctl list-units --type=socket UNIT LOAD ACTIVE SUB DESCRIPTION avahi-daemon.socket loaded active running Avahi mDNS/DNS-SD Stack Activation Socket cups.socket loaded active running CUPS Printing Service Sockets dbus.socket loaded active running D-Bus System Message Bus Socket dm-event.socket loaded active listening Device-mapper event daemon FIFOs iscsid.socket loaded active listening Open-iSCSI iscsid Socket iscsiuio.socket loaded active listening Open-iSCSI iscsiuio Socket lvm2-lvmetad.socket loaded active running LVM2 metadata daemon socket lvm2-lvmpolld.socket loaded active listening LVM2 poll daemon socket rpcbind.socket loaded active listening RPCbind Server Activation Socket systemd-initctl.socket loaded active listening /dev/initctl Compatibility Named Pipe systemd-journald.socket loaded active running Journal Socket systemd-shutdownd.socket loaded active listening Delayed Shutdown Socket systemd-udevd-control.socket loaded active running udev Control Socket systemd-udevd-kernel.socket loaded active running udev Kernel Socket virtlockd.socket loaded active listening Virtual machine lock manager socket virtlogd.socket loaded active listening Virtual machine log manager socket
現在讓我們檢查當前正在執行的服務:
[root@localhost rdc]# systemctl list-units --type=service UNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-xorg.service loaded active running ABRT Xorg log watcher abrtd.service loaded active running ABRT Automated Bug Reporting Tool accounts-daemon.service loaded active running Accounts Service alsa-state.service loaded active running Manage Sound Card State (restore and store) atd.service loaded active running Job spooling tools auditd.service loaded active running Security Auditing Service
is-active
is-active命令是systemctl命令的一個示例,旨在返回單元的狀態資訊。
[root@localhost rdc]# systemctl is-active ksm.service active
cat
cat是一個很少使用的命令。無需在shell中使用cat並鍵入單元檔案的路徑,只需使用systemctl cat。
[root@localhost]# systemctl cat firewalld # /usr/lib/systemd/system/firewalld.service [Unit] Description=firewalld - dynamic firewall daemon Before=network.target Before=libvirtd.service Before = NetworkManager.service After=dbus.service After=polkit.service Conflicts=iptables.service ip6tables.service ebtables.service ipset.service Documentation=man:firewalld(1) [Service] EnvironmentFile = -/etc/sysconfig/firewalld ExecStart = /usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS ExecReload = /bin/kill -HUP $MAINPID # supress to log debug and error output also to /var/log/messages StandardOutput = null StandardError = null Type = dbus BusName = org.fedoraproject.FirewallD1 [Install] WantedBy = basic.target Alias = dbus-org.fedoraproject.FirewallD1.service [root@localhost]#
現在我們已經更詳細地探討了systemd和systemctl,讓我們使用它們來管理cgroups或控制組中的資源。
Linux管理員 - 使用crgoups進行資源管理
cgroups或控制組是Linux核心的一項功能,允許管理員為服務和組分配或限制系統資源。
要列出正在執行的活動控制組,我們可以使用以下ps命令:
[root@localhost]# ps xawf -eo pid,user,cgroup,args 8362 root - \_ [kworker/1:2] 1 root - /usr/lib/systemd/systemd --switched- root --system -- deserialize 21 507 root 7:cpuacct,cpu:/system.slice /usr/lib/systemd/systemd-journald 527 root 7:cpuacct,cpu:/system.slice /usr/sbin/lvmetad -f 540 root 7:cpuacct,cpu:/system.slice /usr/lib/systemd/systemd-udevd 715 root 7:cpuacct,cpu:/system.slice /sbin/auditd -n 731 root 7:cpuacct,cpu:/system.slice \_ /sbin/audispd 734 root 7:cpuacct,cpu:/system.slice \_ /usr/sbin/sedispatch 737 polkitd 7:cpuacct,cpu:/system.slice /usr/lib/polkit-1/polkitd --no-debug 738 rtkit 6:memory:/system.slice/rtki /usr/libexec/rtkit-daemon 740 dbus 7:cpuacct,cpu:/system.slice /bin/dbus-daemon --system -- address=systemd: --nofork --nopidfile --systemd-activation
截至CentOS 6.X,資源管理已透過systemd init實現重新定義。在考慮服務的資源管理時,主要關注的是cgroups。cgroups在功能和簡易性方面都隨著systemd的改進而得到提升。
cgroups在資源管理中的目標是 - 任何服務都不能使整個系統崩潰。或者沒有單個服務程序(可能是編寫不當的PHP指令碼)會透過消耗過多資源來削弱伺服器功能。
cgroups允許對以下資源的單元進行資源控制:
CPU − 限制不重要的CPU密集型任務,與其他不太密集的任務相比
記憶體 − 限制服務可以消耗的記憶體量
磁碟 − 限制磁碟I/O
**CPU時間:**
需要較低CPU優先順序的任務可以具有自定義配置的CPU時間片。
讓我們以以下兩個服務為例。
禮貌的CPU服務1
[root@localhost]# systemctl cat polite.service # /etc/systemd/system/polite.service [Unit] Description = Polite service limits CPU Slice and Memory After=remote-fs.target nss-lookup.target [Service] MemoryLimit = 1M ExecStart = /usr/bin/sha1sum /dev/zero ExecStop = /bin/kill -WINCH ${MAINPID} WantedBy=multi-user.target # /etc/systemd/system/polite.service.d/50-CPUShares.conf [Service] CPUShares = 1024 [root@localhost]#
邪惡的CPU服務2
[root@localhost]# systemctl cat evil.service # /etc/systemd/system/evil.service [Unit] Description = I Eat You CPU After=remote-fs.target nss-lookup.target [Service] ExecStart = /usr/bin/md5sum /dev/zero ExecStop = /bin/kill -WINCH ${MAINPID} WantedBy=multi-user.target # /etc/systemd/system/evil.service.d/50-CPUShares.conf [Service] CPUShares = 1024 [root@localhost]#
讓我們使用較低的CPU優先順序設定禮貌服務:
systemctl set-property polite.service CPUShares = 20 /system.slice/polite.service 1 70.5 124.0K - - /system.slice/evil.service 1 99.5 304.0K - -
我們可以看到,在正常的系統空閒時間內,兩個流氓程序仍在使用CPU週期。但是,設定為具有較少時間片的程序使用的CPU時間較少。考慮到這一點,我們可以看到使用較少的時間片將如何允許基本任務更好地訪問系統資源。
要為每個資源設定服務,set-property方法定義以下引數:
systemctl set-property name parameter=value
CPU時間片 | CPUShares |
記憶體限制 | MemoryLimit |
軟記憶體限制 | MemorySoftLimit |
塊IO權重 | BlockIOWeight |
塊裝置限制(在/volume/path中指定) | BlockIODeviceWeight |
讀取IO | BlockIOReadBandwidth |
磁碟寫入IO | BlockIOReadBandwidth |
服務最常受到CPU使用率、記憶體限制和讀/寫IO的限制。
更改每個引數後,需要重新載入systemd並重新啟動服務:
systemctl set-property foo.service CPUShares = 250 systemctl daemon-reload systemctl restart foo.service
在CentOS Linux中配置CGroups
要在CentOS Linux中建立自定義cgroups,我們需要首先安裝服務並對其進行配置。
步驟1 − 安裝libcgroup(如果尚未安裝)。
[root@localhost]# yum install libcgroup Package libcgroup-0.41-11.el7.x86_64 already installed and latest version Nothing to do [root@localhost]#
我們可以看到,預設情況下,CentOS 7已使用everything安裝程式安裝了libcgroup。使用最小安裝程式將需要我們安裝libcgroup實用程式以及任何依賴項。
步驟2 − 啟動並啟用cgconfig服務。
[root@localhost]# systemctl enable cgconfig Created symlink from /etc/systemd/system/sysinit.target.wants/cgconfig.service to /usr/lib/systemd/system/cgconfig.service. [root@localhost]# systemctl start cgconfig [root@localhost]# systemctl status cgconfig ● cgconfig.service - Control Group configuration service Loaded: loaded (/usr/lib/systemd/system/cgconfig.service; enabled; vendor preset: disabled) Active: active (exited) since Mon 2017-01-23 02:51:42 EST; 1min 21s ago Main PID: 4692 (code=exited, status = 0/SUCCESS) Memory: 0B CGroup: /system.slice/cgconfig.service Jan 23 02:51:42 localhost.localdomain systemd[1]: Starting Control Group configuration service... Jan 23 02:51:42 localhost.localdomain systemd[1]: Started Control Group configuration service. [root@localhost]#
Linux管理員 - 程序管理
以下是與程序管理一起使用的常用命令:bg、fg、nohup、ps、pstree、top、kill、killall、free、uptime、nice。
使用程序
快速說明:Linux中的程序PID
在Linux中,每個執行的程序都會被賦予一個PID或程序ID號。這個PID是CentOS識別特定程序的方式。正如我們所討論的,systemd是CentOS中啟動的第一個程序,其PID為1。
Pgrep用於獲取給定程序名的Linux PID。
[root@CentOS]# pgrep systemd 1 [root@CentOS]#
如上所示,pgrep命令返回systemd的當前PID。
CentOS中基本的CentOS程序和作業管理
在Linux中使用程序時,重要的是要知道如何在命令列執行基本的後臺和前臺程序。
fg − 將程序置於前臺
bg − 將程序移至後臺
jobs − 附加到shell的當前程序列表
ctrl+z − Control + z鍵組合可使當前程序休眠
& − 在後臺啟動程序
讓我們開始使用shell命令sleep。sleep將按其名稱執行操作,休眠一段時間:sleep。
[root@CentOS ~]$ jobs [root@CentOS ~]$ sleep 10 & [1] 12454 [root@CentOS ~]$ sleep 20 & [2] 12479 [root@CentOS ~]$ jobs [1]- Running sleep 10 & [2]+ Running sleep 20 & [cnetos@CentOS ~]$
現在,讓我們將第一個作業置於前臺:
[root@CentOS ~]$ fg 1 sleep 10
如果你正在按照操作步驟進行,你會注意到前臺作業卡在你的shell中。現在,讓我們使程序休眠,然後在後臺重新啟用它。
- 按control+z
- 鍵入:bg 1,將第一個作業傳送到後臺並啟動它。
[root@CentOS ~]$ fg 1 sleep 20 ^Z [1]+ Stopped sleep 20 [root@CentOS ~]$ bg 1 [1]+ sleep 20 & [root@CentOS ~]$
nohup
從shell或終端工作時,值得注意的是,預設情況下,附加到shell的所有程序和作業將在shell關閉或使用者登出時終止。使用nohup時,如果使用者登出或關閉附加程序的shell,則程序將繼續執行。
[root@CentOS]# nohup ping www.google.com & [1] 27299 nohup: ignoring input and appending output to ‘nohup.out’ [root@CentOS]# pgrep ping 27299 [root@CentOS]# kill -KILL `pgrep ping` [1]+ Killed nohup ping www.google.com [root@CentOS rdc]# cat nohup.out PING www.google.com (216.58.193.68) 56(84) bytes of data. 64 bytes from sea15s07-in-f4.1e100.net (216.58.193.68): icmp_seq = 1 ttl = 128 time = 51.6 ms 64 bytes from sea15s07-in-f4.1e100.net (216.58.193.68): icmp_seq = 2 ttl = 128 time = 54.2 ms 64 bytes from sea15s07-in-f4.1e100.net (216.58.193.68): icmp_seq = 3 ttl = 128 time = 52.7 ms
ps命令
ps 命令通常由管理員用來檢視特定程序的快照。ps 命令通常與 grep 命令一起使用,用於篩選和分析特定程序。
[root@CentOS ~]$ ps axw | grep python 762 ? Ssl 0:01 /usr/bin/python -Es /usr/sbin/firewalld --nofork -nopid 1296 ? Ssl 0:00 /usr/bin/python -Es /usr/sbin/tuned -l -P 15550 pts/0 S+ 0:00 grep --color=auto python
在上述命令中,我們看到了所有使用 python 直譯器的程序。結果中還包括我們的 grep 命令,用於查詢字串 python。
以下是 ps 命令最常用的命令列開關。
開關 | 操作 |
---|---|
a | 不限制僅報告當前使用者的程序 |
x | 顯示未附加到 tty 或 shell 的程序 |
w | 以寬格式顯示輸出 |
e | 顯示命令後的環境變數 |
-e | 選擇所有程序 |
-o | 使用者自定義格式的輸出 |
-u | 顯示特定使用者的全部程序 |
-C | 按名稱或程序 ID 顯示所有程序 |
--sort | 按定義對程序進行排序 |
檢視 nobody 使用者正在使用的所有程序:
[root@CentOS ~]$ ps -u nobody PID TTY TIME CMD 1853 ? 00:00:00 dnsmasq [root@CentOS ~]$
檢視 firewalld 程序的所有資訊:
[root@CentOS ~]$ ps -wl -C firewalld F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 0 762 1 0 80 0 - 81786 poll_s ? 00:00:01 firewalld [root@CentOS ~]$
讓我們看看哪些程序消耗的記憶體最多:
[root@CentOS ~]$ ps aux --sort=-pmem | head -10 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND cnetos 6130 0.7 5.7 1344512 108364 ? Sl 02:16 0:29 /usr/bin/gnome-shell cnetos 6449 0.0 3.4 1375872 64440 ? Sl 02:16 0:00 /usr/libexec/evolution-calendar-factory root 5404 0.6 2.1 190256 39920 tty1 Ssl+ 02:15 0:27 /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-iDefCt/database -seat seat0 -nolisten tcp vt1 cnetos 6296 0.0 1.7 1081944 32136 ? Sl 02:16 0:00 /usr/libexec/evolution/3.12/evolution-alarm-notify cnetos 6350 0.0 1.5 560728 29844 ? Sl 02:16 0:01 /usr/bin/prlsga cnetos 6158 0.0 1.4 1026956 28004 ? Sl 02:16 0:00 /usr/libexec/gnome-shell-calendar-server cnetos 6169 0.0 1.4 1120028 27576 ? Sl 02:16 0:00 /usr/libexec/evolution-source-registry root 762 0.0 1.4 327144 26724 ? Ssl 02:09 0:01 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid cnetos 6026 0.0 1.4 1090832 26376 ? Sl 02:16 0:00 /usr/libexec/gnome-settings-daemon [root@CentOS ~]$
檢視 centos 使用者的所有程序,並以自定義格式顯示輸出:
[cnetos@CentOS ~]$ ps -u cnetos -o pid,uname,comm PID USER COMMAND 5802 centos gnome-keyring-d 5812 cnetos gnome-session 5819 cnetos dbus-launch 5820 cnetos dbus-daemon 5888 cnetos gvfsd 5893 cnetos gvfsd-fuse 5980 cnetos ssh-agent 5996 cnetos at-spi-bus-laun
pstree 命令
pstree 命令類似於 ps 命令,但使用頻率較低。它以更清晰的樹狀方式顯示程序。
[centos@CentOS ~]$ pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─2*[abrt-watch-log] ├─abrtd ├─accounts-daemon───2*[{accounts-daemon}] ├─alsactl ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon} │ └─3*[{at-spi-bus-laun}] ├─at-spi2-registr───2*[{at-spi2-registr}] ├─atd ├─auditd─┬─audispd─┬─sedispatch │ │ └─{audispd} │ └─{auditd} ├─avahi-daemon───avahi-daemon ├─caribou───2*[{caribou}] ├─cgrulesengd ├─chronyd ├─colord───2*[{colord}] ├─crond ├─cupsd
pstree 命令的總輸出可能超過 100 行。通常情況下,ps 命令會提供更有用的資訊。
top 命令
top 是在 Linux 系統中排查效能問題時最常用的命令之一。它對於即時統計和 Linux 系統中的程序監控非常有用。以下是 top 命令在命令列中啟動後的預設輸出。
Tasks: 170 total, 1 running, 169 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.3 us, 2.0 sy, 0.0 ni, 95.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1879668 total, 177020 free, 607544 used, 1095104 buff/cache KiB Swap: 3145724 total, 3145428 free, 296 used. 1034648 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5404 root 20 0 197832 48024 6744 S 1.3 2.6 1:13.22 Xorg 8013 centos 20 0 555316 23104 13140 S 1.0 1.2 0:14.89 gnome-terminal- 6339 centos 20 0 332336 6016 3248 S 0.3 0.3 0:23.71 prlcc 6351 centos 20 0 21044 1532 1292 S 0.3 0.1 0:02.66 prlshprof
執行 top 命令時常用的快捷鍵(快捷鍵是在 shell 中執行 top 命令時按下的鍵)。
命令 | 操作 |
---|---|
b | 啟用/停用 top 選單的粗體高亮顯示 |
z | 迴圈切換配色方案 |
l | 迴圈切換負載平均值標題 |
m | 迴圈切換記憶體平均值標題 |
t | 任務資訊標題 |
h | 幫助選單 |
Shift+F | 自定義排序和顯示欄位 |
以下是 top 命令常用的命令列開關。
命令 | 操作 |
---|---|
-o | 按列排序(可以在前面加上 - 或 + 以進行升序或降序排序) |
-u | 僅顯示指定使用者的程序 |
-d | 更新 top 命令的延遲時間 |
-O | 返回 top 命令可以應用排序的列列表 |
top 命令中的排序選項螢幕,使用 Shift+F 顯示。此螢幕允許自定義 top 的顯示和排序選項。
Fields Management for window 1:Def, whose current sort field is %MEM Navigate with Up/Dn, Right selects for move then <Enter> or Left commits, 'd' or <Space> toggles display, 's' sets sort. Use 'q' or <Esc> to end! * PID = Process Id TGID = Thread Group Id * USER = Effective User Name ENVIRON = Environment vars * PR = Priority vMj = Major Faults delta * NI = Nice Value vMn = Minor Faults delta * VIRT = Virtual Image (KiB) USED = Res+Swap Size (KiB) * RES = Resident Size (KiB) nsIPC = IPC namespace Inode * SHR = Shared Memory (KiB) nsMNT = MNT namespace Inode * S = Process Status nsNET = NET namespace Inode * %CPU = CPU Usage nsPID = PID namespace Inode * %MEM = Memory Usage (RES) nsUSER = USER namespace Inode * TIME+ = CPU Time, hundredths nsUTS = UTS namespace Inode * COMMAND = Command Name/Line PPID = Parent Process pid UID = Effective User Id
top 命令,顯示使用者 rdc 的程序,並按記憶體使用情況排序:
PID USER %MEM PR NI VIRT RES SHR S %CPU TIME+ COMMAND 6130 rdc 6.2 20 0 1349592 117160 33232 S 0.0 1:09.34 gnome-shell 6449 rdc 3.4 20 0 1375872 64428 21400 S 0.0 0:00.43 evolution-calen 6296 rdc 1.7 20 0 1081944 32140 22596 S 0.0 0:00.40 evolution-alarm 6350 rdc 1.6 20 0 560728 29844 4256 S 0.0 0:10.16 prlsga 6281 rdc 1.5 20 0 1027176 28808 17680 S 0.0 0:00.78 nautilus 6158 rdc 1.5 20 0 1026956 28004 19072 S 0.0 0:00.20 gnome-shell-cal
顯示有效的 top 欄位(簡略版):
[centos@CentOS ~]$ top -O PID PPID UID USER RUID RUSER SUID SUSER GID GROUP PGRP TTY TPGID
kill 命令
kill 命令用於透過其 PID 從命令 shell 中終止程序。終止程序時,我們需要指定要傳送的訊號。訊號讓核心知道我們希望如何結束程序。最常用的訊號是:
SIGTERM 訊號暗示核心讓程序知道它應該儘快安全停止。SIGTERM 訊號使程序有機會優雅地退出並執行安全的退出操作。
SIGHUP 訊號大多數守護程序在收到 SIGHUP 訊號後會重新啟動。這通常用於在對配置檔案進行更改後對程序進行操作。
SIGKILL 訊號由於 SIGTERM 訊號相當於請求程序關閉。核心需要一個選項來結束不響應請求的程序。當程序掛起時,使用 SIGKILL 選項明確地關閉程序。
要檢視可以使用 kill 命令傳送的所有訊號列表,可以使用 -l 選項:
[root@CentOS]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX [root@CentOS rdc]#
使用 SIGHUP 訊號重啟系統:
[root@CentOS]# pgrep systemd 1 464 500 643 15071 [root@CentOS]# kill -HUP 1 [root@CentOS]# pgrep systemd 1 464 500 643 15196 15197 15198 [root@CentOS]#
pkill 命令允許管理員按程序名稱傳送 kill 訊號。
[root@CentOS]# pgrep ping 19450 [root@CentOS]# pkill -9 ping [root@CentOS]# pgrep ping [root@CentOS]#
killall 命令將終止所有程序。小心使用 root 許可權執行 killall 命令,因為它會終止所有使用者的全部程序。
[root@CentOS]# killall chrome
free 命令
free 命令是一個非常簡單的命令,通常用於快速檢查系統的記憶體。它顯示已使用的物理記憶體和交換記憶體的總量。
[root@CentOS]# free total used free shared buff/cache available Mem: 1879668 526284 699796 10304 653588 1141412 Swap: 3145724 0 3145724 [root@CentOS]#
nice 命令
nice 命令允許管理員根據 CPU 使用情況設定程序的排程優先順序。nice 值基本上是指核心如何為程序或作業排程 CPU 時間片。預設情況下,假設程序獲得對 CPU 資源的平等訪問。
首先,讓我們使用 top 命令檢查當前正在執行的程序的 nice 值。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28 root 39 19 0 0 0 S 0.0 0.0 0:00.17 khugepaged 690 root 39 19 16808 1396 1164 S 0.0 0.1 0:00.01 alsactl] 9598 rdc 39 19 980596 21904 10284 S 0.0 1.2 0:00.27 tracker-extract 9599 rdc 39 19 469876 9608 6980 S 0.0 0.5 0:00.04 tracker-miner-a 9609 rdc 39 19 636528 13172 8044 S 0.0 0.7 0:00.12 tracker-miner-f 9611 rdc 39 19 469620 8984 6496 S 0.0 0.5 0:00.02 tracker-miner-u 27 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd 637 rtkit 21 1 164648 1276 1068 S 0.0 0.1 0:00.11 rtkit-daemon 1 root 20 0 128096 6712 3964 S 0.3 0.4 0:03.57 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.50 ksoftirqd/0 7 root 20 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 0:02.07 rcu_sched
我們要關注 NICE 列(由 NI 表示)。nice 值範圍可以從 -20 到 19。-20 表示最高的優先順序。
nohup nice --20 ping www.google.com &
renice
renice 命令允許我們更改當前正在執行的程序的優先順序。
renice 17 -p 30727
上述命令將降低我們的 ping 程序命令的優先順序。
Linux 管理員 - 防火牆設定
firewalld 是 CentOS 上 iptables 的預設前端控制器。firewalld 前端相比於原始的 iptables 有兩個主要優點:
使用易於配置和實現的區域來抽象鏈和規則。
規則集是動態的,這意味著當設定更改和/或修改時,有狀態連線不會中斷。
請記住,firewalld 是 iptables 的包裝器,而不是替代品。雖然可以使用 firewalld 使用自定義 iptables 命令,但建議使用 firewalld 以避免破壞防火牆功能。
首先,讓我們確保 firewalld 已啟動並啟用。
[root@CentOS rdc]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2017-01-26 21:42:05 MST; 3h 46min ago Docs: man:firewalld(1) Main PID: 712 (firewalld) Memory: 34.7M CGroup: /system.slice/firewalld.service └─712 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
我們可以看到,firewalld 既處於活動狀態(在啟動時啟動),又當前正在執行。如果處於非活動狀態或未啟動,我們可以使用:
systemctl start firewalld && systemctl enable firewalld
現在我們已經配置了 firewalld 服務,讓我們確保它正在執行。
[root@CentOS]# firewall-cmd --state running [root@CentOS]#
我們可以看到,firewalld 服務完全正常執行。
Firewalld 基於區域的概念。區域透過網路管理器應用於網路介面。我們將在配置網路中討論這一點。但就目前而言,預設情況下,更改預設區域將更改保留在“預設區域”預設狀態的任何網路介面卡。
讓我們快速瀏覽一下 firewalld 自帶的每個區域。
序號 | 區域和描述 |
---|---|
1 | drop 低信任級別。所有傳入連線和資料包都將被丟棄,只有透過有狀態性才能進行傳出連線。 |
2 | block 傳入連線將回復一條 icmp 訊息,讓發起者知道請求被禁止。 |
3 | public 所有網路都被限制。但是,可以選擇明確允許選定的傳入連線。 |
4 | external 配置 firewalld 進行 NAT。內部網路保持私有,但可以訪問。 |
5 | dmz 只允許某些傳入連線。用於 DMZ 隔離中的系統。 |
6 | work 預設情況下,更信任網路上的計算機,假設系統位於安全的辦公環境中。 |
7 | hone 預設情況下,更多服務未過濾。假設系統位於家庭網路上,其中將使用 NFS、SAMBA 和 SSDP 等服務。 |
8 | trusted 網路上的所有機器都受信任。大多數傳入連線都被無限制地允許。這並不適用於暴露於網際網路的介面 |
最常用的區域是:public、drop、work 和 home。
以下是一些使用每個常用區域的場景:
public - 這是管理員最常用的區域。它允許您應用自定義設定並遵守 LAN 上操作的 RFC 規範。
drop - 使用 drop 的一個很好的例子是在安全會議、公共 WiFi 或直接連線到網際網路的介面上。drop 假設所有未經請求的請求都是惡意的,包括 ICMP 探測。因此,任何超出狀態的請求都不會收到回覆。drop 的缺點是它可能會在某些情況下破壞應用程式的功能,這些應用程式需要嚴格遵守 RFC 規範。
work - 您位於半安全的公司 LAN 上。可以假設所有流量都相對安全。這意味著它不是 WiFi,我們可能已經部署了 IDS、IPS 和物理安全或 802.1x。我們也應該熟悉使用 LAN 的人員。
home - 您位於家庭 LAN 上。您對 LAN 上的每個系統和使用者都負有個人責任。您瞭解 LAN 上的每一臺機器,並且沒有一臺機器受到入侵。通常,會啟動新的服務以便在受信任的個人之間共享媒體,而您無需為了安全而花費額外的時間。
區域和網路介面的工作方式是一對多的關係。一個網路介面一次只能應用一個區域。而一個區域可以同時應用於多個介面。
讓我們看看有哪些可用的區域以及當前應用的區域。
[root@CentOS]# firewall-cmd --get-zones work drop internal external trusted home dmz public block
[root@CentOS]# firewall-cmd --get-default-zone public [root@CentOS]#
準備好向 firewalld 新增一些自定義規則了嗎?
首先,讓我們看看從外部埠掃描器看來我們的盒子是什麼樣的。
bash-3.2# nmap -sS -p 1-1024 -T 5 10.211.55.1 Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-27 23:36 MST Nmap scan report for centos.shared (10.211.55.1) Host is up (0.00046s latency). Not shown: 1023 filtered ports PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 3.71 seconds bash-3.2#
讓我們允許傳入的 80 埠請求。
首先,檢查應用的預設區域。
[root@CentOs]# firewall-cmd --get-default-zone public [root@CentOS]#
然後,設定允許 80 埠的規則到當前預設區域。
[root@CentOS]# firewall-cmd --zone=public --add-port = 80/tcp success [root@CentOS]#
現在,讓我們在允許 80 埠連線後檢查我們的盒子。
bash-3.2# nmap -sS -p 1-1024 -T 5 10.211.55.1 Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-27 23:42 MST Nmap scan report for centos.shared (10.211.55.1) Host is up (0.00053s latency). Not shown: 1022 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp closed http Nmap done: 1 IP address (1 host up) scanned in 3.67 seconds bash-3.2#
它現在允許對 80 埠的未經請求的流量。
讓我們將預設區域設定為 drop 並看看埠掃描會發生什麼。
[root@CentOS]# firewall-cmd --set-default-zone=drop success [root@CentOS]# firewall-cmd --get-default-zone drop [root@CentOs]#
現在讓我們掃描網路介面處於更安全區域的主機。
bash-3.2# nmap -sS -p 1-1024 -T 5 10.211.55.1 Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-27 23:50 MST Nmap scan report for centos.shared (10.211.55.1) Host is up (0.00094s latency). All 1024 scanned ports on centos.shared (10.211.55.1) are filtered Nmap done: 1 IP address (1 host up) scanned in 12.61 seconds bash-3.2#
現在,所有內容都從外部過濾。
如下所示,當處於 drop 區域時,主機甚至不會響應 ICMP ping 請求。
bash-3.2# ping 10.211.55.1 PING 10.211.55.1 (10.211.55.1): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2
讓我們再次將預設區域設定為 public。
[root@CentOs]# firewall-cmd --set-default-zone=public success [root@CentOS]# firewall-cmd --get-default-zone public [root@CentOS]#
現在讓我們檢查 public 區域中當前的過濾規則集。
[root@CentOS]# firewall-cmd --zone=public --list-all public (active) target: default icmp-block-inversion: no interfaces: enp0s5 sources: services: dhcpv6-client ssh ports: 80/tcp protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules: [root@CentOS rdc]#
根據配置,我們的 80 埠過濾規則僅存在於正在執行的配置中。這意味著一旦系統重新啟動或 firewalld 服務重新啟動,我們的規則將被丟棄。
我們很快就會配置 httpd 守護程序,所以讓我們使我們的更改持久化:
[root@CentOS]# firewall-cmd --zone=public --add-port=80/tcp --permanent success [root@CentOS]# systemctl restart firewalld [root@CentOS]#
現在,public 區域中的 80 埠規則在重新啟動和服務重啟後仍然有效。
以下是使用 firewall-cmd 應用的常用 firewalld 命令。
命令 | 操作 |
---|---|
firewall-cmd --get-zones | 列出可以應用於介面的所有區域 |
firewall-cmd --status | 返回 firewalld 服務的當前狀態 |
firewall-cmd --get-default-zone | 獲取當前預設區域 |
firewall-cmd --set-default-zone=<zone> | 將預設區域設定為當前上下文 |
firewall-cmd --get-active-zone | 獲取當前應用於介面的上下文區域 |
firewall-cmd --zone=<zone> --list-all | 列出指定區域的配置 |
firewall-cmd --zone=<zone> --addport=<port/transport protocol> | 將埠規則應用於區域過濾器 |
--permanent | 使區域更改持久化。此標誌與修改命令一起使用。 |
這些是管理和配置firewalld 的基本概念。
在更復雜的網路場景中,配置 CentOS 中基於主機的防火牆服務可能是一項複雜的任務。CentOS 中firewalld 和 iptables 的高階用法和配置需要一個完整的教程。但是,我們已經介紹了足以完成大部分日常任務的基礎知識。
在CentOS Linux中配置PHP
PHP 是當今使用最廣泛的 Web 語言之一。在 CentOS 上安裝LAMP 棧是每個系統管理員都需要執行的操作,很可能越早越好。
傳統的 LAMP 棧由 (L)inux (A)pache (M)ySQL (P)HP 組成。
CentOS 上的LAMP 棧主要包含三個元件:
- Web 伺服器
- Web 開發平臺/語言
- 資料庫伺服器
注意 − LAMP 棧這一術語還可以包括以下技術:PostgreSQL、MariaDB、Perl、Python、Ruby、NGINX Web 伺服器。
在本教程中,我們將堅持使用 CentOS GNU Linux 的傳統LAMP 棧:Apache Web 伺服器、MySQL 資料庫伺服器和 PHP。
我們實際上將使用 MariaDB。MariaDB 對 MySQL 配置檔案、資料庫和表具有透明性。由於 Oracle 接管了 MySQL 的開發,並且由於許可和開源合規性的限制,MariaDB 現在包含在標準 CentOS 儲存庫中,而不是 MySQL。
我們需要做的第一件事是安裝 Apache。
[root@CentOS]# yum install httpd Loaded plugins: fastestmirror, langpacks base | 3.6 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 extras/7/x86_64/primary_d | 121 kB 00:00:00 Loading mirror speeds from cached hostfile * base: mirror.sigmanet.com * extras: linux.mirrors.es.net * updates: mirror.eboundhost.com Resolving Dependencies --> Running transaction check ---> Package httpd.x86_64 0:2.4.6-45.el7.centos will be installed --> Processing Dependency: httpd-tools = 2.4.6-45.el7.centos for package: httpd-2.4.6-45.el7.centos.x86_64 --> Processing Dependency: /etc/mime.types for package: httpd-2.4.645.el7.centos.x86_64 --> Running transaction check ---> Package httpd-tools.x86_64 0:2.4.6-45.el7.centos will be installed ---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed --> Finished Dependency Resolution Installed: httpd.x86_64 0:2.4.6-45.el7.centos Dependency Installed: httpd-tools.x86_64 0:2.4.6-45.el7.centos mailcap.noarch 0:2.1.41-2.el7 Complete! [root@CentOS]#
讓我們配置httpd 服務。
[root@CentOS]# systemctl start httpd && systemctl enable httpd
現在,讓我們確保 Web 伺服器可以透過 firewalld 訪問。
bash-3.2# nmap -sS -p 1-1024 -T 5 -sV 10.211.55.1 Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-28 02:00 MST Nmap scan report for centos.shared (10.211.55.1) Host is up (0.00054s latency). Not shown: 1022 filtered ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1 (protocol 2.0) 80/tcp open http Apache httpd 2.4.6 ((CentOS)) Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 10.82 seconds bash-3.2#
正如 nmap 服務探測所示,Apache Web 伺服器正在監聽並響應 CentOS 主機上的請求。
安裝 MySQL 資料庫伺服器
[root@CentOS rdc]# yum install mariadb-server.x86_64 && yum install mariadb- devel.x86_64 && mariadb.x86_64 && mariadb-libs.x86_64
我們正在安裝以下 MariaDB 儲存庫軟體包:
mariadb-server.x86_64
主要的 MariaDB 伺服器守護程序程式包。
mariadb-devel.x86_64
需要使用 MySQL/MariaDB 相容性從原始碼編譯的檔案。
mariadb.x86_64
用於從命令列管理 MariaDB 伺服器的 MariaDB 客戶端實用程式。
mariadb-libs.x86_64
MariaDB 的常用庫,其他使用 MySQL/MariaDB 支援編譯的應用程式可能需要這些庫。
現在,讓我們啟動並啟用 MariaDB 服務。
[root@CentOS]# systemctl start mariadb [root@CentOS]# systemctl enable mariadb
注意 − 與 Apache 不同,我們不會透過基於主機的防火牆 (firewalld) 啟用對 MariaDB 的連線。使用資料庫伺服器時,最佳安全實踐是僅允許本地套接字連線,除非特別需要遠端套接字訪問。
讓我們確保 MariaDB 伺服器正在接受連線。
[root@CentOS#] netstat -lnt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN [root@CentOS rdc]#
我們可以看到,MariaDB 正在 3306 tcp 埠監聽。我們將保持基於主機的防火牆 (firewalld) 阻止對 3306 埠的傳入連線。
安裝和配置 PHP
[root@CentOS#] yum install php.x86_64 && php-common.x86_64 && php-mysql.x86_64 && php-mysqlnd.x86_64 && php-pdo.x86_64 && php-soap.x86_64 && php-xml.x86_64
我建議安裝以下 php 包以實現常見的相容性:
- php-common.x86_64
- php-mysql.x86_64
- php-mysqlnd.x86_64
- php-pdo.x86_64
- php-soap.x86_64
- php-xml.x86_64
[root@CentOS]# yum install -y php-common.x86_64 php-mysql.x86_64 php- mysqlnd.x86_64 php-pdo.x86_64 php-soap.x86_64 php-xml.x86_64
這是位於 Apache webroot /var/www/html/ 的簡單 php 檔案。
[root@CentOS]# cat /var/www/html/index.php <html> <head> <title>PHP Test Page</title> </head> <body> PHP Install <?php echo "We are now running PHP on GNU Centos Linux!<br />" ?> </body> </html> [root@CentOS]#
讓我們將頁面的擁有組更改為我們的 http 守護程式在其下執行的系統使用者。
[root@CentOS]# chgrp httpd /var/www/html/index.php && chmod g+rx /var/www/html/index.php ---
透過 ncat 手動請求時。
bash-3.2# ncat 10.211.55.1 80 GET / index.php HTTP/1.1 200 OK Date: Sat, 28 Jan 2017 12:06:02 GMT Server: Apache/2.4.6 (CentOS) PHP/5.4.16 X-Powered-By: PHP/5.4.16 Content-Length: 137 Connection: close Content-Type: text/html; charset=UTF-8 <html> <head> <title>PHP Test Page</title> </head> <body> PHP Install We are now running PHP on GNU Centos Linux!<br /> </body> </html> bash-3.2#
PHP 和 LAMP 非常流行的 Web 程式設計技術。作為 CentOS 管理員,LAMP 的安裝和配置肯定會出現在您的需求列表中。易於使用的 CentOS 軟體包省去了從原始碼編譯 Apache、MySQL 和 PHP 的許多工作。
在CentOS Linux中設定Python
Python 是一種廣泛使用的解釋型語言,它為在 Linux(和其他作業系統)上編寫指令碼應用程式的世界帶來了專業性。曾經 Perl 是行業標準,而 Python 在許多方面已經超越了 Perl。
與 Perl 相比,Python 的一些優勢:
快速改進
作為語言標準的庫
程式碼的可讀性在語言定義中得到了體現
許多專業的框架,從 GUI 支援到 Web 開發,無所不包
Python 可以完成 Perl 可以完成的所有事情,並且在很多情況下做得更好。儘管 Perl 在 Linux 管理員的工具箱中仍然佔有一席之地,但學習 Python 作為一項技能是一個不錯的選擇。
Python 最大的缺點有時與其優勢有關。歷史上,Python 最初是為教學程式設計而設計的。有時,它“易於閱讀”和“以正確的方式做事”的核心基礎會在編寫簡單程式碼時造成不必要的複雜性。此外,它的標準庫在從 2.X 版本過渡到 3.X 版本時也造成了一些問題。
Python 指令碼實際上用於 CentOS 的核心功能,這些功能對作業系統的功能至關重要。因此,將我們的開發 Python 環境與 CentOS 的核心 Python 環境隔離非常重要。
首先,目前有兩個版本的 Python:Python 2.X 和 Python 3.X。
這兩個階段仍在積極生產中,儘管 2.X 版本很快就要被淘汰(並且已經持續了幾年)。出現兩個活動版本的 Python 的原因基本上是修復了 2.X 版本的缺點。這需要 3.X 版本的一些核心功能以無法支援某些 2.X 指令碼的方式重做。
基本上,克服這種過渡的最佳方法是:為 3.X 開發,並跟上最新版本的 2.X 以用於舊版指令碼。目前,CentOS 7.X 依賴於 2.X 的半當前版本。
在撰寫本文時,Python 的最新版本為:3.4.6 和 2.7.13。
不要讓這使你感到困惑或得出任何關於 Python 的結論。設定 Python 環境非常簡單。藉助 Python 框架和庫,這項任務實際上很容易完成。
在設定 Python 環境之前,我們需要一個合理的的環境。首先,讓我們確保我們的 CentOS 安裝已完全更新並安裝了一些構建實用程式。
步驟 1 − 更新 CentOS。
[root@CentOS]# yum -y update
步驟 2 − 安裝構建實用程式。
[root@CentOS]# yum -y groupinstall "development tools"
步驟 3 − 安裝一些需要的軟體包。
[root@CentOS]# yum install -y zlib-dev openssl-devel sqlite-devel bip2-devel
現在我們需要從原始碼安裝最新的 Python 2.X 和 3.X。
- 下載壓縮存檔
- 解壓檔案
- 編譯原始碼
讓我們首先為/usr/src/ 中的每個 Python 安裝建立一個構建目錄。
[root@CentOS]# mkdir -p /usr/src/pythonSource
現在讓我們下載每個版本的原始碼包:
[root@CentOS]# wget https://python.club.tw/ftp/python/2.7.13/Python-2.7.13.tar.xz [root@CentOS]# wget https://python.club.tw/ftp/python/3.6.0/Python-3.6.0.tar.xz
現在我們需要從存檔中解壓每個檔案。
步驟 1 − 安裝 xz-libs 並解壓 tarballs。
[root@CentOS]# yum install xz-libs [root@CentOS python3]# xz -d ./*.xz [root@CentOS python3]# ls Python-2.7.13.tar Python-3.6.0.tar [root@CentOS python3]#
步驟 2 − 從其 tarball 中解壓每個安裝程式。
[root@CentOS]# tar -xvf ./Python-2.7.13.tar [root@CentOS]# tar -xvf ./Python-3.6.0.tar
步驟 3 − 進入每個目錄並執行配置指令碼。
[root@CentOS]# ./configure --prefix=/usr/local root@CentOS]# make altinstall
注意 − 確保使用altinstall 而不是 install。這將使 CentOS 和開發版本的 Python 保持分離。否則,您可能會破壞 CentOS 的功能。
您現在將看到編譯過程開始。喝杯咖啡,休息 15 分鐘,直到完成。由於我們安裝了 Python 的所有必要依賴項,因此編譯過程應該能夠順利完成,不會出錯。
讓我們確保我們安裝了最新的 2.X 版本的 Python。
[root@CentOS Python-2.7.13]# /usr/local/bin/python2.7 -V Python 2.7.13 [root@CentOS Python-2.7.13]#
注意 − 您需要為指向我們開發環境的 Python 2.X 的 Shebang 行新增字首。
[root@CentOS Python-2.7.13]# cat ver.py #!/usr/local/bin/python2.7 import sys print(sys.version)
[root@CentOS Python-2.7.13]# ./ver.py 2.7.13 (default, Jan 29 2017, 02:24:08) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
就這樣,我們為 2.X 和 3.X 版本分別安裝了 Python。從這裡,我們可以使用每個版本以及pip 和 virtualenv 等實用程式來進一步簡化管理 Python 環境和軟體包安裝的負擔。
在CentOS Linux中配置Ruby
Ruby 是一種非常適合 Web 開發和 Linux 管理的語言。Ruby 提供了前面討論的所有語言(PHP、Python 和 Perl)中發現的許多好處。
要安裝 Ruby,最好透過rbenv 引導,這允許管理員輕鬆安裝和管理 Ruby 環境。
安裝 Ruby 的另一種方法是使用 Ruby 的標準 CentOS 軟體包。建議使用rbenv 方法及其所有優點。對於不熟悉 Ruby 的使用者,CentOS 軟體包會更容易。
首先,讓我們獲取 rbenv 安裝程式所需的一些依賴項。
- git-core
- zlib
- zlib-devel
- gcc-c++
- patch
- readline
- readline-devel
- libyaml-devel
- libffi-devel
- openssl-devel
- make
- bzzip2
- autoconf
- automake
- libtool
- bison
- curl
- sqlite-devel
根據安裝 CentOS 時選擇的選項和角色,這些軟體包中的大部分可能已經安裝。最好安裝所有我們不確定的軟體包,因為這可以減少安裝需要依賴項的軟體包時的麻煩。
[root@CentOS]# yum -y install git-core zlib zlib-devel gcc-c++ patch readline readline-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison curl sqlite-devel
方法 1:用於動態 Ruby 開發環境的 rbenv
現在作為將使用Ruby 的使用者:
[rdc@CentOS ~]$ git clone https://github.com/rbenv/rbenv.git [rdc@CentOS ~]$ https://github.com/rbenv/ruby-build.git
ruby-build 將為rbenv 提供安裝功能:
注意 − 在執行install.sh 之前,我們需要切換到 root 或管理員使用者。
[rdc@CentOS ruby-build]$ cd ~/ruby-build [rdc@CentOS ruby-build]# ./install.sh
讓我們設定 rbenv 的 shell 並確保我們安裝了正確的選項。
[rdc@CentOS ~]$ source ~/rbenv/rbenv.d/exec/gem-rehash.bash [rdc@CentOS ruby-build]$ ~/rbenv/bin/rbenv rbenv 1.1.0-2-g4f8925a Usage: rbenv <command> [<args>]
一些有用的 rbenv 命令:
命令 | 操作 |
---|---|
local | 設定或顯示特定於應用程式的本地 Ruby 版本 |
global | 設定或顯示全域性 Ruby 版本 |
shell | 設定或顯示特定於 shell 的 Ruby 版本 |
install | 使用 ruby-build 安裝 Ruby 版本 |
uninstall | 解除安裝特定 Ruby 版本 |
rehash | 重新雜湊 rbenv shims(安裝可執行檔案後執行此命令) |
version | 顯示當前 Ruby 版本及其來源 |
versions | 列出 rbenv 可用的所有 Ruby 版本 |
which | 顯示可執行檔案的完整路徑 |
whence | 列出包含給定可執行檔案的所有 Ruby 版本 |
現在讓我們安裝 Ruby:
[rdc@CentOS bin]$ ~/rbenv/bin/rbenv install -v 2.2.1
編譯完成後:
[rdc@CentOS ~]$ ./ruby -v ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux] [rdc@CentOS ~]$
我們現在擁有一個功能正常的 Ruby 環境,其中包含更新且可用的 Ruby 2.X 分支版本。
方法 2:從 CentOS 軟體包安裝 Ruby
這是最簡單的方法。但是,它可能會受到 CentOS 打包的版本和 gem 的限制。對於重要的開發工作,強烈建議使用rbenv 方法來安裝 Ruby。
安裝 Ruby、所需的開發軟體包和一些常用 gem。
[root@CentOS rdc]# yum install -y ruby.x86_64 ruby-devel.x86_64 ruby- libs.x86_64 ruby-gem-json.x86_64 rubygem-rake.noarch
不幸的是,我們剩下的只是稍微過時的 Ruby 版本。
[root@CentOS rdc]# ruby -v ruby 2.0.0p648 (2015-12-16) [x86_64-linux] [root@CentOS rdc]#
Linux 管理員 - 為 CentOS Linux 設定 Perl
Perl 已經存在很長時間了。它最初被設計為用於解析文字檔案的報告語言。隨著流行度的提高,Perl 添加了模組支援或 CPAN、套接字、執行緒和其他在強大的指令碼語言中需要的功能。
與 PHP、Python 或 Ruby 相比,Perl 最大的優勢在於:它可以輕鬆完成任務。Perl 的這種理念並不總是意味著它以正確的方式完成任務。但是,對於 Linux 上的管理任務,Perl 被認為是指令碼語言的首選。
與 Python 或 Ruby 相比,Perl 的一些優勢:
強大的文字處理能力
Perl 能夠快速編寫指令碼(通常,Perl 指令碼的程式碼行數比等效的 Python 或 Ruby 指令碼少幾十行)
Perl 幾乎無所不能
Perl 的一些缺點包括:
語法可能令人困惑
Perl 的編碼風格可能獨特,從而影響協作
Perl 並不是真正的面嚮物件語言
通常情況下,在使用 Perl 時,並沒有過多考慮標準化和最佳實踐。
在決定使用 Perl、Python 或 PHP 時,應該問以下問題:
- 這個應用程式將來需要版本控制嗎?
- 其他人將來需要修改程式碼嗎?
- 其他人需要使用這個應用程式嗎?
- 這個應用程式將來會在其他機器或 CPU 架構上使用嗎?
如果以上所有問題的答案都是“否”,那麼 Perl 是一個不錯的選擇,並且可以加快最終結果的實現速度。
說完了這些,讓我們配置 CentOS 伺服器以使用最新版本的 Perl。
在安裝 Perl 之前,我們需要了解對 Perl 的支援。正式來說,Perl 只支援最近兩個穩定版本。因此,我們希望確保我們的開發環境與 CentOS 版本隔離。
隔離的原因是:如果有人向 CentOS 社群釋出了一個 Perl 工具,則很可能對其進行修改以使其能夠在 CentOS 附帶的 Perl 版本上執行。但是,我們也希望安裝最新版本以用於開發目的。與 Python 一樣,CentOS 提供的 Perl 重點在於可靠性,而不是前沿技術。
讓我們檢查一下 CentOS 7 上當前的 Perl 版本。
[root@CentOS]# perl -v This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
我們目前執行的是 Perl 5.16.3。截至撰寫本文時,最新版本是:perl-5.24.0
我們肯定希望升級我們的版本,以便能夠在我們的程式碼中使用最新的 Perl 模組。幸運的是,有一個很好的工具可以維護 Perl 環境並保持 CentOS 版本的 Perl 與之隔離。它被稱為perlbrew。
讓我們安裝 Perl Brew。
[root@CentOS]# curl -L https://install.perlbrew.pl | bash % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 170 100 170 0 0 396 0 --:--:-- --:--:-- --:--:-- 397 100 1247 100 1247 0 0 1929 0 --:--:-- --:--:-- --:--:-- 1929
現在我們已經安裝了 Perl Brew,讓我們為最新版本的 Perl 建立一個環境。
首先,我們需要當前安裝的 Perl 版本來引導 perlbrew 安裝。因此,讓我們從 CentOS 儲存庫獲取一些必要的 Perl 模組。
注意 - 當可用時,我們總是希望使用 CentOS Perl 模組而不是使用 CPAN 來安裝 CentOS Perl。
步驟 1 - 安裝 CentOS Perl Make::Maker 模組。
[root@CentOS]# yum -y install perl-ExtUtils-MakeMaker.noarch
步驟 2 - 安裝最新版本的 perl。
[root@CentOS build]# source ~/perl5/perlbrew/etc/bashrc [root@CentOS build]# perlbrew install -n -j4 --threads perl-5.24.1
我們為 Perl 安裝選擇的選項包括:
n - 不進行測試
j4 - 為安裝例程並行執行 4 個執行緒(我們使用的是四核 CPU)
threads - 為 Perl 啟用執行緒支援
安裝成功後,讓我們切換到最新的 Perl 環境。
[root@CentOS]# ~/perl5/perlbrew/bin/perlbrew use perl-5.24.1 A sub-shell is launched with perl-5.24.1 as the activated perl. Run 'exit' to finish it. [root@CentOS]# perl -v This is perl 5, version 24, subversion 1 (v5.24.1) built for x86_64-linuxthread-multi (with 1 registered patch, see perl -V for more detail) Copyright 1987-2017, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page. [root@CentOS]#
簡單的 Perl 指令碼,列印在我們的 perlbrew 環境中執行的 perl 版本:
[root@CentOS]# cat ./ver.pl #!/usr/bin/perl print $^V . "\n";
[root@CentOS]# perl ./ver.pl v5.24.1 [root@CentOS]#
安裝 perl 後,我們可以使用 perl brew 的 cpanm 載入 cpan 模組:
[root@CentOS]# perl-brew install-cpanm
現在讓我們使用 cpanm 安裝程式使用 perl brew 中當前的 5.24.1 Perl 版本來安裝 LWP 模組。
步驟 1 - 切換到當前 Perl 版本的上下文。
[root@CentOS ~]# ~/perl5/perlbrew/bin/perlbrew use perl-5.24.1
啟動一個子 shell,其中 perl-5.24.1 作為啟用的 perl。執行 'exit' 以結束它。
[root@CentOS ~]#
步驟 2 - 安裝 LWP 使用者代理 Perl 模組。
[root@CentOS ~]# ~/perl5/perlbrew/bin/cpanm -i LWP::UserAgent
步驟 3 - 現在讓我們使用新的 CPAN 模組測試我們的 Perl 環境。
[root@CentOS ~]# cat ./get_header.pl #!/usr/bin/perl use LWP; my $browser = LWP::UserAgent->new(); my $response = $browser->get("http://www.slcc.edu/"); unless(!$response->is_success) { print $response->header("Server"); } [root@CentOS ~]# perl ./get_header.pl Microsoft-IIS/8.5 [root@CentOS ~]#
就是這樣!Perl Brew 使隔離 perl 環境變得輕而易舉,並且可以被認為是 Perl 最佳實踐。
安裝和配置Open LDAP
LDAP,即輕量級目錄訪問協議,是一種用於訪問企業中已知的目錄內的 X.500 服務容器的協議。熟悉 Windows 伺服器管理的人可以認為 LDAP 的性質與 Active Directory 非常相似。它甚至是一個將 Windows 工作站與 OpenLDAP CentOS 企業互聯的廣泛使用的概念。另一方面,CentOS Linux 工作站可以共享資源並參與 Windows 域中的基本功能。
在 CentOS 上部署 LDAP 作為目錄伺服器代理、目錄系統代理或 DSA(這些首字母縮寫詞都是同一個意思)類似於使用具有 NDS 的目錄樹結構的舊版 Novell Netware 安裝。
LDAP 的簡史
LDAP 的建立是為了高效地訪問具有企業資源的 X.500 目錄。X.500 和 LDAP 具有相同的特性,並且非常相似,以至於 LDAP 客戶端可以使用一些輔助程式來訪問 X.500 目錄。雖然 LDAP 也有自己的目錄伺服器,稱為slapd。LDAP 和 DAP 之間的區別在於,輕量級版本設計為透過 TCP 執行。
而DAP 使用完整的 OSI 模型。隨著網際網路、TCP/IP 和乙太網在當今網路中的興起,在特定遺留計算模型之外,使用 DAP 和本地 X.500 企業目錄的目錄服務實施很少見。
CentOS Linux 的 openldap 主要元件包括:
openldap | LDAP 支援庫 |
---|---|
openldap-server | LDAP 伺服器 |
openldap-clients | LDAP 客戶端實用程式 |
openldap-devel | OpenLDAP 的開發庫 |
compay-openldap | OpenLDAP 共享庫 |
slapd | OpenLDAP 的目錄伺服器守護程式 |
slurpd | 用於在企業域中進行 LDAP 複製 |
注意 - 命名企業時,最佳實踐是使用.local TLD。使用.net 或.com 可能會在隔離線上和內部域基礎架構時造成困難。想象一下,一家公司在內部同時使用acme.com 進行內部和外部操作所需要做的額外工作。因此,明智的做法是將網際網路資源稱為acme.com 或acme.net。然後,本地網路企業資源顯示為acme.local。這需要配置 DNS 記錄,但會帶來簡單性、流暢性和安全性。
在 CentOS 上安裝 Open LDAP
從YUM 安裝 openldap、openldap-servers、openldap-clients 和 migrationstools。
[root@localhost]# yum -y install openldap openldap-servers openldap-clients migration tools Loaded plugins: fastestmirror, langpacks updates | 3.4 kB 00:00:00 updates/7/x86_64/primary_db | 2.2 MB 00:00:05 Determining fastest mirrors (1/2): extras/7/x86_64/primary_db | 121 kB 00:00:01 (2/2): base/7/x86_64/primary_db | 5.6 MB 00:00:16 Package openldap-2.4.40-13.el7.x86_64 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package openldap-clients.x86_64 0:2.4.40-13.el7 will be installed ---> Package openldap-servers.x86_64 0:2.4.40-13.el7 will be installed --> Finished Dependency Resolution base/7/x86_64/group_gz | 155 kB 00:00:00 Dependencies Resolved =============================================================================== =============================================================================== Package Arch Version Repository Size =============================================================================== =============================================================================== Installing: openldap-clients x86_64 2.4.40-13.el7 base 188 k openldap-servers x86_64 2.4.40-13.el7 base 2.1 M Transaction Summary =============================================================================== =============================================================================== Install 2 Packages Total download size: 2.3 M Installed size: 5.3 M Downloading packages: Installed: openldap-clients.x86_64 0:2.4.40-13.el7 openldap-servers.x86_64 0:2.4.40-13.el7 Complete! [root@localhost]#
現在,讓我們啟動並啟用slapd 服務:
[root@centos]# systemctl start slapd [root@centos]# systemctl enable slapd
此時,讓我們確保我們的openldap 結構位於/etc/openldap 中。
root@localhost]# ls /etc/openldap/ certs check_password.conf ldap.conf schema slapd.d [root@localhost]#
然後確保我們的 slapd 服務正在執行。
root@centos]# netstat -antup | grep slapd tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 1641/slapd tcp6 0 0 :::389 :::* LISTEN 1641/slapd [root@centos]#
接下來,讓我們配置Open LDAP 安裝。
確保已建立我們的系統ldap 使用者。
[root@localhost]# id ldap uid=55(ldap) gid=55(ldap) groups=55(ldap) [root@localhost]#
生成我們的 LDAP 憑據。
[root@localhost]# slappasswd New password: Re-enter new password: {SSHA}20RSyjVv6S6r43DFPeJgASDLlLoSU8g.a10 [root@localhost]#
我們需要儲存 slappasswd 的輸出。
配置 Open LDAP
步驟 1 - 為域配置 LDAP 並新增管理員使用者。
首先,我們希望設定我們的 openLDAP 環境。以下是與ldapmodify 命令一起使用的模板。
dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=vmnet,dc=local dn: olcDatabase = {2}hdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=ldapadm,dc=vmnet,dc=local dn: olcDatabase = {2}hdb,cn=config changetype: modify replace: olcRootPW olcRootPW: <output from slap
使用 ldapmodify 命令更改:/etc/openldap/slapd.d/cn=config/olcDatabase = {1}monitor.ldif。
[root@localhost]# ldapmodify -Y EXTERNAL -H ldapi:/// -f /home/rdc/Documents/db.ldif SASL/EXTERNAL authentication started SASL username: gidNumber = 0+uidNumber = 0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase = {2}hdb,cn=config" modifying entry "olcDatabase = {2}hdb,cn=config" modifying entry "olcDatabase = {2}hdb,cn=config" [root@localhost cn=config]#
讓我們檢查修改後的 LDAP 配置。
root@linux1 ~]# vi /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif [root@centos]# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. # CRC32 a163f14c dn: olcDatabase = {2}hdb objectClass: olcDatabaseConfig objectClass: olcHdbConfig olcDatabase: {2}hdb olcDbDirectory: /var/lib/ldap olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub structuralObjectClass: olcHdbConfig entryUUID: 1bd9aa2a-8516-1036-934b-f7eac1189139 creatorsName: cn=config createTimestamp: 20170212022422Z olcSuffix: dc=vmnet,dc=local olcRootDN: cn=ldapadm,dc=vmnet,dc=local olcRootPW:: e1NTSEF1bUVyb1VzZTRjc2dkYVdGaDY0T0k = entryCSN: 20170215204423.726622Z#000000#000#000000 modifiersName: gidNumber = 0+uidNumber = 0,cn=peercred,cn=external,cn=auth modifyTimestamp: 20170215204423Z [root@centos]#
正如您所看到的,我們的 LDAP 企業修改成功了。
接下來,我們希望為 OpenLDAP 建立一個自簽名 ssl 證書。這將保護企業伺服器和客戶端之間的通訊安全。
步驟 2 - 為 OpenLDAP 建立自簽名證書。
我們將使用openssl 建立自簽名 ssl 證書。請轉到下一章使用 openssl 建立 LDAP SSL 證書,瞭解有關保護與 OpenLDAP 通訊安全的說明。然後,在配置 ssl 證書後,我們將完成 OpenLDAP 企業配置。
步驟 3 - 配置 OpenLDAP 以使用證書進行安全通訊。
使用vim 建立一個包含以下資訊的certs.ldif 檔案:
dn: cn=config changetype: modify replace: olcTLSCertificateFile olcTLSCertificateFile: /etc/openldap/certs/yourGeneratedCertFile.pem dn: cn=config changetype: modify replace: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/openldap/certs/youGeneratedKeyFile.pem
接下來,再次使用ldapmodify 命令將更改合併到 OpenLDAP 配置中。
[root@centos rdc]# ldapmodify -Y EXTERNAL -H ldapi:/// -f certs.ldif SASL/EXTERNAL authentication started SASL username: gidNumber = 0+uidNumber = 0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config" [root@centos]#
最後,讓我們測試我們的 OpenLADP 配置。
[root@centos]# slaptest -u config file testing succeeded [root@centos]#
步驟 4 - 設定 slapd 資料庫。
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG && chown ldap:ldap /var/lib/ldap/*
更新 OpenLDAP 模式。
新增 cosine 和 nis LDAP 模式。
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
最後,建立企業模式並將其新增到當前的 OpenLDAP 配置中。
以下是適用於名為 vmnet.local 的域以及名為ldapadm 的 LDAP 管理員的配置。
dn: dc=vmnet,dc=local dc: vmnet objectClass: top objectClass: domain dn: cn=ldapadm ,dc=vmnet,dc=local objectClass: organizationalRole cn: ldapadm description: LDAP Manager dn: ou = People,dc=vmnet,dc=local objectClass: organizationalUnit ou: People dn: ou = Group,dc=vmnet,dc=local objectClass: organizationalUnit ou: Group
最後,將其匯入到當前的 OpenLDAP 模式中。
[root@centos]# ldapadd -x -W -D "cn=ldapadm,dc=vmnet,dc=local" -f ./base.ldif Enter LDAP Password: adding new entry "dc=vmnet,dc=local" adding new entry "cn=ldapadm ,dc=vmnet,dc=local" adding new entry "ou=People,dc=vmnet,dc=local" adding new entry "ou=Group,dc=vmnet,dc=local" [root@centos]#
步驟 5 - 設定 OpenLDAP 企業使用者。
開啟vim 或您喜歡的文字編輯器並複製以下格式。此設定適用於“vmnet.local”LDAP 域上的名為“entacct”的使用者。
dn: uid=entacct,ou=People,dc=vmnet,dc=local objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: entacct uid: entacct uidNumber: 9999 gidNumber: 100 homeDirectory: /home/enyacct loginShell: /bin/bash gecos: Enterprise User Account 001 userPassword: {crypt}x shadowLastChange: 17058 shadowMin: 0 shadowMax: 99999 shadowWarning: 7
現在,將上面儲存的檔案匯入到 OpenLdap 模式中。
[root@centos]# ldapadd -x -W -D "cn=ldapadm,dc=vmnet,dc=local" -f entuser.ldif Enter LDAP Password: adding new entry "uid=entacct,ou=People,dc=vmnet,dc=local" [root@centos]#
在使用者可以訪問 LDAP 企業之前,我們需要按如下方式分配密碼:
ldappasswd -s password123 -W -D "cn=ldapadm,dc=entacct,dc=local" -x "uid=entacct ,ou=People,dc=vmnet,dc=local"
-s 指定使用者的密碼
-x 是應用密碼更新的使用者名稱
-D 是用於針對 LDAP 模式進行身份驗證的“區分名稱”。
最後,在登入企業帳戶之前,讓我們檢查我們的OpenLDAP 條目。
[root@centos rdc]# ldapsearch -x cn=entacct -b dc=vmnet,dc=local # extended LDIF # # LDAPv3 # base <dc=vmnet,dc=local> with scope subtree # filter: cn=entacct # requesting: ALL # # entacct, People, vmnet.local dn: uid=entacct,ou=People,dc=vmnet,dc=local objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: entacct uid: entacct uidNumber: 9999 gidNumber: 100 homeDirectory: /home/enyacct loginShell: /bin/bash gecos: Enterprise User Account 001 userPassword:: e2NyeXB0fXg= shadowLastChange: 17058 shadowMin: 0 shadowMax: 99999 shadowWarning: 7
將/etc/passwd 和/etc/groups 等內容轉換為 OpenLDAP 身份驗證需要使用遷移工具。這些工具包含在migrationtools 軟體包中。然後安裝到/usr/share/migrationtools。
[root@centos openldap-servers]# ls -l /usr/share/migrationtools/ total 128 -rwxr-xr-x. 1 root root 2652 Jun 9 2014 migrate_aliases.pl -rwxr-xr-x. 1 root root 2950 Jun 9 2014 migrate_all_netinfo_offline.sh -rwxr-xr-x. 1 root root 2946 Jun 9 2014 migrate_all_netinfo_online.sh -rwxr-xr-x. 1 root root 3011 Jun 9 2014 migrate_all_nis_offline.sh -rwxr-xr-x. 1 root root 3006 Jun 9 2014 migrate_all_nis_online.sh -rwxr-xr-x. 1 root root 3164 Jun 9 2014 migrate_all_nisplus_offline.sh -rwxr-xr-x. 1 root root 3146 Jun 9 2014 migrate_all_nisplus_online.sh -rwxr-xr-x. 1 root root 5267 Jun 9 2014 migrate_all_offline.sh -rwxr-xr-x. 1 root root 7468 Jun 9 2014 migrate_all_online.sh -rwxr-xr-x. 1 root root 3278 Jun 9 2014 migrate_automount.pl -rwxr-xr-x. 1 root root 2608 Jun 9 2014 migrate_base.pl
步驟 6 - 最後,我們需要允許訪問 slapd 服務,以便它可以提供服務請求。
firewall-cmd --permanent --add-service=ldap firewall-cmd --reload
配置 LDAP 客戶端訪問
配置 LDAP 客戶端訪問需要客戶端上安裝以下軟體包:openldap、open-ldap clients 和 nss_ldap。
為客戶端系統配置 LDAP 身份驗證相對容易。
步驟 1 - 安裝依賴軟體包:
# yum install -y openldap-clients nss-pam-ldapd
步驟 2 - 使用authconfig 配置 LDAP 身份驗證。
authconfig --enableldap --enableldapauth --ldapserver=10.25.0.1 -- ldapbasedn="dc=vmnet,dc=local" --enablemkhomedir --update
步驟 3 - 重啟 nslcd 服務。
systemctl restart nslcd
Linux管理員 - 建立SSL證書
TLS 和 SSL 背景
TLS 是繼 SSL 之後套接字層安全的新標準。TLS 提供了更好的加密標準以及其他安全和協議包裝器功能,從而提升了 SSL。通常,TLS 和 SSL 術語可以互換使用。但是,作為專業的 CentOS 管理員,務必注意兩者之間的區別和歷史。
SSL 最高版本為 3.0。SSL 是在 Netscape 的推動下成為行業標準的。在 Netscape 被 AOL(90 年代流行的 ISP,又名 America Online)收購後,AOL 從未真正推動 SSL 所需的安全改進。
在 3.1 版中,SSL 技術轉向開放系統標準,並更名為TLS。由於SSL 的版權仍歸 AOL 所有,因此創造了一個新術語 - TLS - 傳輸層安全。因此,重要的是要承認TLS 實際上與SSL 不同。特別是,由於較舊的SSL 技術存在已知安全問題,因此現在有些技術已被認為已過時。
注意 - 本教程在談到 3.1 及更高版本的技術時將使用術語TLS。在評論特定於 3.0 和更低版本的 SSL 技術時,將使用SSL。
SSL 與 TLS 版本
下表顯示了 TLS 和 SSL 版本之間的關係。我聽說過一些人談論SSL 3.2 版本。但是,他們可能是從閱讀部落格中獲得的術語。作為專業的管理員,我們總是希望使用標準術語。因此,談論SSL 應該指的是過去的技術。一些簡單的事情可以讓一個 CentOS 求職者看起來像一個經驗豐富的計算機科學專業畢業生。
TLS | SSL |
---|---|
- | 3.0 |
1.0 | 3.1 |
1.1 | 3.2 |
1.2 | 3.3 |
TLS 執行當今網際網路使用者重要的兩個主要功能:一,驗證一方的身份,稱為身份驗證。二,它為缺乏此原生功能的上層協議(ftp、http、電子郵件協議等)提供傳輸層的端到端加密。
首先,驗證一方的身份,這對於端到端加密的安全至關重要。如果消費者與未授權進行支付的網站建立了加密連線,則財務資料仍然存在風險。這就是每個網路釣魚網站都無法做到的:一個由受信任的CA正確簽署的TLS證書,用於驗證網站運營商的身份是否與其聲稱的身份一致。
只有兩種方法可以繞過沒有正確簽署的證書:誘騙使用者允許瀏覽器信任自簽名證書,或者希望使用者缺乏技術知識,不會知道受信任的證書頒發機構(或CA)的重要性。
在本教程中,我們將使用所謂的自簽名證書。這意味著,如果沒有明確地將此證書設定為訪問該網站的每個Web瀏覽器的受信任狀態,則會顯示錯誤,阻止使用者訪問該站點。然後,它會讓使用者在訪問具有自簽名證書的站點之前執行一些操作。記住,為了安全起見,這是一件好事。
安裝和配置openssl
openssl是TLS開源實現的標準。openssl用於Linux、BSD發行版、OS X等系統,甚至支援Windows。
openssl很重要,因為它提供了傳輸層安全,併為開發人員抽象了身份驗證和端到端加密的詳細程式設計。這就是為什麼openssl幾乎用於每個使用TLS的開源應用程式的原因。它也預設安裝在每個現代版本的Linux上。
預設情況下,從CentOS 5版本開始就應該安裝openssl。為了確保,讓我們嘗試透過YUM安裝openssl。只需執行安裝命令,因為YUM足夠智慧,可以讓我們知道是否已安裝軟體包。如果由於相容性原因我們執行的是舊版本的CentOS,則執行yum -y install將確保openssl針對最新的心臟滴血漏洞進行更新。
執行安裝程式時,發現openssl實際上有更新。
[root@centos]# yum -y install openssl Resolving Dependencies --> Running transaction check ---> Package openssl.x86_64 1:1.0.1e-60.el7 will be updated ---> Package openssl.x86_64 1:1.0.1e-60.el7_3.1 will be an update --> Processing Dependency: openssl-libs(x86-64) = 1:1.0.1e-60.el7_3.1 for package: 1:openssl-1.0.1e-60.el7_3.1.x86_64 --> Running transaction check ---> Package openssl-libs.x86_64 1:1.0.1e-60.el7 will be updated ---> Package openssl-libs.x86_64 1:1.0.1e-60.el7_3.1 will be an update --> Finished Dependency Resolution Dependencies Resolved =============================================================================== =============================================================================== Package Arch Version Repository Size =============================================================================== =============================================================================== Updating: openssl x86_64 1:1.0.1e-60.el7_3.1 updates 713 k Updating for dependencies:
為OpenLDAP建立自簽名證書
這是一種為我們之前的OpenLDAP安裝建立自簽名證書的方法。
建立OpenLDAP自簽名證書。
openssl req -new -x509 -nodes -out /etc/openldap/certs/myldaplocal.pem -keyout /etc/openldap/certs/myldaplocal.pem -days 365 [root@centos]# openssl req -new -x509 -nodes -out /etc/openldap/certs/vmnet.pem -keyout /etc/openldap/certs/vmnet.pem -days 365 Generating a 2048 bit RSA private key .............................................+++ ................................................+++ writing new private key to '/etc/openldap/certs/vmnet.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:US State or Province Name (full name) []:Califonia Locality Name (eg, city) [Default City]:LA Organization Name (eg, company) [Default Company Ltd]:vmnet Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:centos Email Address []:bob@bobber.net [root@centos]#
現在我們的OpenLDAP證書應該放在/etc/openldap/certs/目錄下。
[root@centos]# ls /etc/openldap/certs/*.pem /etc/openldap/certs/vmnetcert.pem /etc/openldap/certs/vmnetkey.pem [root@centos]#
如您所見,我們已將證書和金鑰都安裝在/etc/openldap/certs/目錄中。最後,我們需要更改每個檔案的許可權,因為它們當前歸root使用者所有。
[root@centos]# chown -R ldap:ldap /etc/openldap/certs/*.pem [root@centos]# ls -ld /etc/openldap/certs/*.pem -rw-r--r--. 1 ldap ldap 1395 Feb 20 10:00 /etc/openldap/certs/vmnetcert.pem -rw-r--r--. 1 ldap ldap 1704 Feb 20 10:00 /etc/openldap/certs/vmnetkey.pem [root@centos]#
為Apache Web伺服器建立自簽名證書
在本教程中,我們假設Apache已安裝。我們在另一個教程(配置CentOS防火牆)中安裝了Apache,並將把Apache的高階安裝留到以後的教程中。因此,如果您尚未安裝Apache,請繼續閱讀。
一旦安裝Apache HTTPd,可以使用以下步驟:
步驟1 - 為Apache httpd伺服器安裝mod_ssl。
首先,我們需要使用mod_ssl配置Apache。使用YUM包管理器,這非常簡單:
[root@centos]# yum -y install mod_ssl
然後重新載入Apache守護程序,以確保Apache使用新的配置。
[root@centos]# systemctl reload httpd
此時,Apache已配置為支援本地主機上的TLS連線。
步驟2 - 建立自簽名ssl證書。
首先,讓我們配置我們的私有TLS金鑰目錄。
[root@centos]# mkdir /etc/ssl/private [root@centos]# chmod 700 /etc/ssl/private/
注意 - 請確保只有root使用者具有對此目錄的讀/寫許可權。如果具有世界讀/寫許可權,則可以使用您的私鑰解密嗅探到的流量。
生成證書和金鑰檔案。
[root@centos]# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/self-gen-apache.key -out /etc/ssl/certs/self-sign-apache.crt Generating a 2048 bit RSA private key ..........+++ ....+++ ----- Country Name (2 letter code) [XX]:US State or Province Name (full name) []:xx Locality Name (eg, city) [Default City]:xxxx Organization Name (eg, company) [Default Company Ltd]:VMNET Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:centos.vmnet.local Email Address []: [root@centos]#
注意 - 如果您沒有註冊域名,可以使用伺服器的公網IP地址。
讓我們看看我們的證書:
[root@centos]# openssl x509 -in self-sign-apache.crt -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 17620849408802622302 (0xf489d52d94550b5e) Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, ST=UT, L=xxxx, O=VMNET, CN=centos.vmnet.local Validity Not Before: Feb 24 07:07:55 2017 GMT Not After : Feb 24 07:07:55 2018 GMT Subject: C=US, ST=UT, L=xxxx, O=VMNET, CN=centos.vmnet.local Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:c1:74:3e:fc:03:ca:06:95:8d:3a:0b:7e:1a:56: f3:8d:de:c4:7e:ee:f9:fa:79:82:bf:db:a9:6d:2a: 57:e5:4c:31:83:cf:92:c4:e7:16:57:59:02:9e:38: 47:00:cd:b8:31:b8:34:55:1c:a3:5d:cd:b4:8c:b0: 66:0c:0c:81:8b:7e:65:26:50:9d:b7:ab:78:95:a5: 31:5e:87:81:cd:43:fc:4d:00:47:5e:06:d0:cb:71: 9b:2a:ab:f0:90:ce:81:45:0d:ae:a8:84:80:c5:0e: 79:8a:c1:9b:f4:38:5d:9e:94:4e:3a:3f:bd:cc:89: e5:96:4a:44:f5:3d:13:20:3d:6a:c6:4d:91:be:aa: ef:2e:d5:81:ea:82:c6:09:4f:40:74:c1:b1:37:6c: ff:50:08:dc:c8:f0:67:75:12:ab:cd:8d:3e:7b:59: e0:83:64:5d:0c:ab:93:e2:1c:78:f0:f4:80:9e:42: 7d:49:57:71:a2:96:c6:b8:44:16:93:6c:62:87:0f: 5c:fe:df:29:89:03:6e:e5:6d:db:0a:65:b2:5e:1d: c8:07:3d:8a:f0:6c:7f:f3:b9:32:b4:97:f6:71:81: 6b:97:e3:08:bd:d6:f8:19:40:f1:15:7e:f2:fd:a5: 12:24:08:39:fa:b6:cc:69:4e:53:1d:7e:9a:be:4b:
以下是我們使用openssl命令的每個選項的解釋:
命令 | 操作 |
---|---|
req -X509 | 使用X.509 CSR管理PKI標準進行金鑰管理。 |
-nodes | 不要使用密碼保護我們的證書。Apache必須能夠在不中斷密碼的情況下使用證書。 |
-days 2555 | 將證書的有效期設定為7年或2555天。時間段可以根據需要調整。 |
-newkey rsa:2048 | 指定使用RSA以2048位長度生成金鑰和證書。 |
接下來,我們想為與客戶端協商PFS建立一個Diffie-Hellman組。
[centos#] openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
這將花費5到15分鐘。
完美前向保密 (Perfect Forward Secrecy) - 用於保護會話資料,以防私鑰被洩露。這將生成一個在客戶端和伺服器之間使用的金鑰,該金鑰對於每個會話都是唯一的。
現在,將完美前向保密配置新增到我們的證書中。
[root@centos]# cat /etc/ssl/certs/dhparam.pem | tee -a /etc/ssl/certs/self-sign-apache.crt
配置Apache使用金鑰和證書檔案
我們將對/etc/httpd/conf.d/ssl.conf進行更改:
我們將對ssl.conf進行以下更改。但是,在這樣做之前,我們應該備份原始檔案。在使用像vi或emacs這樣的高階文字編輯器更改生產伺服器時,最好先備份配置檔案然後再進行編輯。
[root@centos]# cp /etc/httpd/conf.d/ssl.conf ~/
現在,在我們已將已知可用的ssl.conf副本複製到主目錄的根目錄之後,讓我們繼續進行編輯。
- 找到
- 按如下方式編輯DocumentRoot和ServerName:
\\# General setup for the virtual host, inherited from global configuration DocumentRoot "/var/www/html" ServerName centos.vmnet.local:443
DocumentRoot 這是您預設Apache目錄的路徑。此資料夾中應該有一個預設頁面,該頁面將顯示一個HTTP請求,請求您的Web伺服器或站點的預設頁面。例如:訪問http://www.yoursite.com/ 將檢索並提供來自您的DocumentRoot的index檔案。
ServerName 是伺服器名稱,可以是IP地址或伺服器的主機名。對於TLS,最好使用主機名建立證書。在我們之前的OpenLDAP教程中,我們在本地企業域中建立了主機名centos:vmnet.local
現在我們要註釋掉以下幾行:
SSLProtocol
# SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: ~~~~> #SSLProtocol all -SSLv2 # SSL Cipher Suite: # List the ciphers that the client is permitted to negotiate. # See the mod_ssl documentation for a complete list. ~~~~> #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
然後讓Apache知道在哪裡可以找到我們的證書和私鑰/公鑰對。
指定我們自簽名證書檔案的路徑
# Server Certificate: # Point SSLCertificateFile at a PEM encoded certificate. If # the certificate is encrypted, then you will be prompted for a # pass phrase. Note that a kill -HUP will prompt again. A new # certificate can be generated using the genkey(1) command. ~~~~> SSLCertificateFile /etc/ssl/certs/self-sign-apache.crt specify path to our private key file # Server Private Key: # If the key is not combined with the certificate, use this # directive to point at the key file. Keep in mind that if # you've both a RSA and a DSA private key you can configure # both in parallel (to also allow the use of DSA ciphers, etc.) ~~~~> SSLCertificateKeyFile /etc/ssl/private/self-gen-apache.key
最後,我們需要允許透過443埠進行入站https連線。
安裝Apache Web伺服器CentOS 7
在本章中,我們將簡要了解Apache HTTP伺服器的背景知識,然後在CentOS Linux 7上安裝最新的穩定版本。
Apache Web伺服器簡史
Apache是一個存在了很長時間的Web伺服器。事實上,幾乎和http本身一樣久遠!
Apache最初是國家超級計算應用中心(也稱為NCSA)的一個小型專案。在90年代中期,“httpd”(當時的名稱)是網際網路上最流行的Web伺服器平臺,市場份額約為90%或更高。
那時,這是一個簡單的專案。被稱為網站管理員的熟練IT人員負責:維護Web伺服器平臺和Web伺服器軟體以及前端和後端站點開發。httpd的核心是它能夠使用稱為外掛或擴充套件的自定義模組。網站管理員也足夠熟練,可以編寫核心伺服器軟體的補丁。
在90年代中後期,httpd的資深開發者和專案經理離開了NCSA去做其他事情。這使得最流行的Web守護程式處於停滯狀態。
由於httpd的使用非常廣泛,一群經驗豐富的httpd網站管理員呼籲舉行關於httpd未來的峰會。決定協調並將最好的擴充套件和補丁應用到當前的穩定版本中。然後,當前的http伺服器鼻祖誕生並被命名為Apache HTTP伺服器。
鮮為人知的歷史事實 - Apache並非以美洲原住民的某個部落命名。事實上,它的命名帶有一個巧妙的轉折:它是由許多才華橫溢的計算機科學家提供的許多修復程式(或補丁)組成的:一個充滿補丁的或Apache。
在CentOS Linux 7上安裝當前穩定版本
步驟1 - 透過yum安裝httpd。
yum -y install httpd
此時,Apache HTTP伺服器將透過yum安裝。
步驟2 - 根據您的httpd需求編輯httpd.conf檔案。
預設的Apache安裝中,Apache的配置檔名為httpd.conf,位於/etc/httpd/目錄下。因此,讓我們在vim中開啟它。
在vim中開啟的httpd.conf的前幾行:
# # This is the main Apache HTTP server configuration file. It contains the # configuration directives that give the server its instructions. # See <URL:http://httpd.apache.org/docs/2.4/> for detailed information. # In particular, see # <URL:http://httpd.apache.org/docs/2.4/mod/directives.html> # for a discussion of each configuration directive.
我們將進行以下更改,以允許我們的CentOS安裝透過http埠80提供http請求。
監聽主機和埠
# Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the <VirtualHost> # directive. # # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # #Listen 12.34.56.78:80 Listen 80
在這裡,我們將Apache更改為監聽某個埠或IP地址。例如,如果我們想在備用埠(例如8080)上執行httpd服務。或者如果我們的Web伺服器配置了多個具有獨立IP地址的介面。
Listen
阻止Apache附加到每個監聽守護程式到每個IP地址上。這對於停止僅指定IPv6或IPv4流量非常有用。或者甚至繫結到多宿主主機上的所有網路介面。
# # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the <VirtualHost> # directive. # # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # Listen 10.0.0.25:80 #Listen 80
DocumentRoot
“文件根目錄”是Apache在訪問您的伺服器時查詢要提供請求的索引檔案的預設目錄:訪問http://www.yoursite.com/ 將檢索並提供來自您的文件根目錄的index檔案。
# # DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # DocumentRoot "/var/www/html"
步驟3 - 啟動並啟用httpd服務。
[root@centos rdc]# systemctl start httpd && systemctl reload httpd [root@centos rdc]#
步驟4 - 配置防火牆以允許訪問埠80請求。
[root@centos]# firewall-cmd --add-service=http --permanent
Linux管理員 - 在CentOS 7上設定MySQL
正如在配置CentOS以與Maria DB一起使用時簡要提到的那樣,CentOS 7 yum儲存庫中沒有原生的MySQL軟體包。為此,我們需要新增一個MySQL託管儲存庫。
CentOS上的MariaDB與MySQL
需要注意的是,MySQL將需要與MariaDB不同的基本依賴項集。此外,使用MySQL會破壞CentOS的概念和理念:旨在最大限度提高可靠性的生產軟體包。
因此,在決定使用Maria還是MySQL時,應該權衡以下兩個選項:我的當前資料庫模式是否適用於Maria?安裝MySQL而不是Maria有什麼優勢?
Maria元件對於MySQL結構來說是100%透明的,並且效率更高,許可證也更好。除非出現令人信服的原因,否則建議將CentOS配置為使用MariaDB。
在CentOS上偏愛Maria的主要原因是:
大多數人將使用MariaDB。遇到問題時,您將獲得更多關於Maria的幫助。
CentOS旨在與Maria一起執行。因此,Maria將提供更好的穩定性。
Maria獲得CentOS的官方支援。
下載並新增MySQL儲存庫
我們將要從以下位置下載並安裝MySQL儲存庫:
http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
步驟 1 − 下載倉庫。
該倉庫方便地打包在一個 rpm 包中,便於安裝。可以使用 wget 下載 −
[root@centos]# wget http://repo.mysql.com/mysql-community-release-el75.noarch.rpm --2017-02-26 03:18:36-- http://repo.mysql.com/mysql-community-release-el75.noarch.rpm Resolving repo.mysql.com (repo.mysql.com)... 104.86.98.130
步驟 2 − 從 YUM 安裝 MySQL。
現在我們可以使用 yum 包管理器來安裝 MySQL −
[root@centos]# yum -y install mysql-server
步驟 3 − 啟動並啟用 MySQL 守護程序服務。
[root@centos]# systemctl start mysql [root@centos]# systemctl enable mysql
步驟 4 − 確保我們的 MySQL 服務正在執行。
[root@centos]# netstat -antup | grep 3306 tcp6 0 0 :::3306 :::* LISTEN 6572/mysqld [root@centos]#
注意 − 我們不會允許任何防火牆規則透過。通常情況下,MySQL 會配置為使用Unix 域套接字。這確保只有 LAMP 架構的 Web 伺服器(本地)可以訪問 MySQL 資料庫,從而消除了資料庫軟體攻擊向量的完整維度。
設定Postfix MTA和IMAP/POP3
為了從我們的 CentOS 7 伺服器傳送電子郵件,我們需要設定來配置一個現代郵件傳輸代理 (MTA)。郵件傳輸代理是負責透過 SMTP 為系統使用者或企業網際網路域名傳送外發郵件的守護程序。
值得注意的是,本教程只講解了設定本地使用的守護程序的過程。我們不會詳細介紹為業務運營設定 MTA 的高階配置。這需要結合許多技能,包括但不限於:DNS、獲取未被列入黑名單的靜態可路由 IP 地址以及配置高階安全和服務設定。簡而言之,本教程旨在讓您熟悉基本配置。請勿將本教程用於面向網際網路主機的 MTA 配置。
由於其兼顧安全性和易於管理的特點,我們選擇Postfix作為本教程的 MTA。較舊版本的 CentOS 中安裝的預設 MTA 是Sendmail。Sendmail是一個很棒的 MTA。但是,就作者個人拙見而言,Postfix 在解決 MTA 的以下注意事項時達到了一個最佳點。在最新版本的 CentOS 中,Postfix 已取代 Sendmail 成為預設 MTA。
Postfix 是一款廣泛使用且文件齊全的 MTA。它得到積極維護和開發。它只需要最少的配置(這只是電子郵件),並且在系統資源方面效率很高(同樣,這只是電子郵件)。
步驟 1 − 從 YUM 包管理器安裝 Postfix。
[root@centos]# yum -y install postfix
步驟 2 − 配置 Postfix 配置檔案。
Postfix 配置檔案位於 − /etc/postfix/main.cf
在簡單的 Postfix 配置中,必須為特定主機配置以下內容:主機名、域名、發件人、inet_interfaces 和目標。
配置主機名 − 主機名是 Postfix 主機的完全限定域名。在 OpenLDAP 章節中,我們將 CentOS 機器命名為:centos,域名是vmnet.local。讓我們在本節中繼續使用它。
# The myhostname parameter specifies the internet hostname of this # mail system. The default is to use the fully-qualified domain name # from gethostname(). $myhostname is used as a default value for many # other configuration parameters. # myhostname = centos.vmnet.local
配置域名 − 如上所述,本教程中將使用的域名是vmnet.local
# The mydomain parameter specifies the local internet domain name. # The default is to use $myhostname minus the first component. # $mydomain is used as a default value for many other configuration # parameters. # mydomain = vmnet.local
配置發件人 − 對於單伺服器和域名設定,我們只需要取消註釋以下部分並保留預設的 Postfix 變數。
# SENDING MAIL # # The myorigin parameter specifies the domain that locally-posted # mail appears to come from. The default is to append $myhostname, # which is fine for small sites. If you run a domain with multiple # machines, you should (1) change this to $mydomain and (2) set up # a domain-wide alias database that aliases each user to # user@that.users.mailhost. # # For the sake of consistency between sender and recipient addresses, # myorigin also specifies the default domain name that is appended # to recipient addresses that have no @domain part. # myorigin = $myhostname myorigin = $mydomain
配置網路介面 − 我們將讓 Postfix 監聽我們的單個網路介面以及與該介面關聯的所有協議和 IP 地址。這隻需保留 Postfix 的預設設定即可。
# The inet_interfaces parameter specifies the network interface # addresses that this mail system receives mail on. By default, # the software claims all active interfaces on the machine. The # parameter also controls delivery of mail to user@[ip.address]. # # See also the proxy_interfaces parameter, for network addresses that # are forwarded to us via a proxy or network address translator. # # Note: you need to stop/start Postfix when this parameter changes. # #inet_interfaces = all #inet_interfaces = $myhostname #inet_interfaces = $myhostname, localhost #inet_interfaces = localhost # Enable IPv4, and IPv6 if supported inet_protocols = all
步驟 3 − 為 Postfix 配置 SASL 支援。
如果沒有 SASL 身份驗證支援,Postfix 將只允許從本地使用者傳送電子郵件。或者,當用戶從本地域名之外發送電子郵件時,它會給出中繼被拒絕錯誤。
注意 − SASL 或簡單應用程式安全層框架是一個旨在支援不同應用程式層協議之間不同技術的身份驗證框架。SASL 開發人員(和使用者)利用當前的身份驗證協議來處理可能沒有內建方便或更安全身份驗證(在談論對安全服務的訪問時)的高階協議,而不是將身份驗證機制留給應用程式層協議。
安裝 "cyrus-sasl*" 包
[root@centos]# yum -y install cyrus-sasl Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: repos.forethought.net * extras: repos.dfw.quadranet.com * updates: mirrors.tummy.com Package cyrus-sasl-2.1.26-20.el7_2.x86_64 already installed and latest version Nothing to do
為 SASL Auth 配置/etc/postfix/main.cf
smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination smtpd_sasl_security_options = noanonymous smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth
我在main.conf中的 SASL 選項
##Configure SASL Options Entries: smtpd_sasl_auth_enable = yes smptd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination smtp_sasl_type = dovecot smtp_sasl_path = private/auth/etc
步驟 4 − 配置 FirewallD 以允許傳入 SMTP 服務。
[root@centos]# firewall-cmd --permanent --add-service=smtp success [root@centos]# firewall-cmd --reload success [root@centos]#
現在讓我們檢查一下以確保我們的 CentOS 主機允許並在埠 25(SMTP)上響應請求。
Nmap scan report for 172.16.223.132 Host is up (0.00035s latency). Not shown: 993 filtered ports PORT STATE SERVICE 20/tcp closed ftp-data 21/tcp open ftp 22/tcp open ssh 25/tcp open smtp 80/tcp open http 389/tcp open ldap 443/tcp open https MAC Address: 00:0C:29:BE:DF:5F (VMware)
如您所見,SMTP 正在監聽,並且守護程序正在響應來自我們內部 LAN 的請求。
安裝 Dovecot IMAP 和 POP3 伺服器
Dovecot 是一個安全的 IMAP 和 POP3 伺服器,旨在處理中小型組織的傳入郵件需求。由於它在 CentOS 中大量使用,我們將使用 Dovecot 作為在 CentOS 和 MTA SASL 提供程式上安裝和配置傳入郵件伺服器的示例。
如前所述,我們不會為 DNS 配置 MX 記錄,也不會建立允許我們的服務處理域郵件的安全規則。因此,僅在面向網際網路的主機上設定這些服務可能會在沒有 SPF 記錄的情況下留下安全漏洞。
步驟 1 − 安裝 Dovecot。
[root@centos]# yum -y install dovecot
步驟 2 − 配置 dovecot。
dovecot 的主要配置檔案位於:/etc/dovecot.conf。我們首先備份主配置檔案。在進行編輯之前始終備份配置檔案是一個好習慣。這樣,如果(例如)換行符被文字編輯器破壞,並且多年來的更改丟失了,則很容易透過將當前備份複製到生產環境來恢復。
啟用dovecot的協議和守護程序服務
# Protocols we want to be serving. protocols = imap imaps pop3 pop3s
現在,我們需要啟用 dovecot 守護程序在啟動時監聽 −
[root@localhost]# systemctl start dovecot [root@localhost]# systemctl enable dovecot
讓我們確保 Dovecot 在為以下內容指定的埠上本地監聽:imap、pop3、安全的 imap 和安全的 pop3。
[root@localhost]# netstat -antup | grep dovecot tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 4368/dovecot tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 4368/dovecot tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 4368/dovecot tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 4368/dovecot tcp6 0 0 :::110 :::* LISTEN 4368/dovecot tcp6 0 0 :::143 :::* LISTEN 4368/dovecot tcp6 0 0 :::993 :::* LISTEN 4368/dovecot tcp6 0 0 :::995 :::* LISTEN 4368/dovecot [root@localhost]#
如您所見,dovecot正在為 IPv4 和 IPv4 指定的埠上監聽。
POP3 | 110 |
POP3s | 995 |
IMAP | 143 |
IMAPs | 993 |
現在,我們需要建立一些防火牆規則。
[root@localhost]# firewall-cmd --permanent --add-port=110/tcp success [root@localhost]# firewall-cmd --permanent --add-port=143/tcp success [root@localhost]# firewall-cmd --permanent --add-port=995/tcp success [root@localhost]# firewall-cmd --permanent --add-port=993/tcp success [root@localhost]# firewall-cmd --reload success [root@localhost]#
我們的傳入郵件伺服器正在接受對 LAN 上主機的POP3、POP3s、IMAP和IMAPs的請求。
Port Scanning host: 192.168.1.143 Open TCP Port: 21 ftp Open TCP Port: 22 ssh Open TCP Port: 25 smtp Open TCP Port: 80 http Open TCP Port: 110 pop3 Open TCP Port: 143 imap Open TCP Port: 443 https Open TCP Port: 993 imaps Open TCP Port: 995 pop3s
Linux 管理員 - 安裝匿名 FTP
在深入研究在 CentOS 上安裝 FTP 之前,我們需要了解一下它的用途和安全性。FTP是一種非常高效且經過完善的協議,用於在計算機系統之間傳輸檔案。FTP 已經使用和完善了幾十年了。對於透過具有延遲的網路高效傳輸檔案或為了純粹的速度,FTP 是一個不錯的選擇。比 SAMBA 或 SMB 都要好。
但是,FTP 確實存在一些安全問題。實際上,是一些嚴重的安全問題。FTP 使用一種非常弱的純文字身份驗證方法。出於這個原因,經過身份驗證的會話應該依賴於 sFTP 或 FTPS,其中 TLS 用於登入和傳輸會話的端到端加密。
考慮到上述警告,普通的 FTP 今天仍在業務環境中使用。主要用途是匿名 FTP 檔案儲存庫。在這種情況下,不需要身份驗證即可下載或上傳檔案。匿名 FTP 使用的一些示例包括 −
大型軟體公司仍然使用匿名 ftp 儲存庫,允許網際網路使用者下載共享軟體和補丁。
允許網際網路使用者上傳和下載公共文件。
某些應用程式會自動透過 FTP 將加密的存檔日誌或配置檔案傳送到儲存庫。
因此,作為 CentOS 管理員,能夠安裝和配置 FTP 仍然是一項重要的技能。
我們將使用名為vsFTP或非常安全的 FTP 守護程式的 FTP 守護程式。vsFTP 已經開發了一段時間了。它以安全、易於安裝和配置以及可靠而聞名。
步驟 1 − 使用 YUM 包管理器安裝 vsFTPd。
[root@centos]# yum -y install vsftpd.x86_64
步驟 2 − 配置 vsFTP 使用 systemctl 在啟動時啟動。
[root@centos]# systemctl start vsftpd [root@centos]# systemctl enable vsftpd Created symlink from /etc/systemd/system/multi- user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
步驟 3 − 配置 FirewallD 以允許 FTP 控制和傳輸會話。
[root@centos]# firewall-cmd --add-service=ftp --permanent success [root@centos]#
確保我們的 FTP 守護程序正在執行。
[root@centos]# netstat -antup | grep vsftp tcp6 0 0 :::21 :::* LISTEN 13906/vsftpd [root@centos]#
步驟 4 − 為 vsFTPD 配置匿名訪問。
建立一個根 FTP 目錄
[root@centos]# mkdir /ftp
將 FTP 根目錄的所有者和組更改為ftp
[root@centos]# chown ftp:ftp /ftp Set minimal permissions for FTP root: [root@centos]# chmod -R 666 /ftp/ [root@centos]# ls -ld /ftp/ drw-rw-rw-. 2 ftp ftp 6 Feb 27 02:01 /ftp/ [root@centos]#
在這種情況下,我們授予使用者對整個根 FTP 樹的讀寫訪問許可權。
配置/etc/vsftpd/vsftpd.conf"
[root@centos]# vim /etc/vsftpd/vsftpd.conf # Example config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings are fairly paranoid. This sample file # loosens things up a bit, to make the ftp daemon more usable. # Please see vsftpd.conf.5 for all compiled in defaults. # # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's # capabilities.
我們希望更改vsftp.conf檔案中的以下指令。
透過取消註釋anon_mkdir_write_enable=YES啟用匿名上傳
將上傳的檔案所有者更改為系統ftp使用者
chown_uploads = YES
chown_username = ftp
將 vsftp 使用的系統使用者更改為 ftp 使用者:nopriv_user = ftp
設定使用者在登入前閱讀的自定義橫幅。
ftpd_banner = 歡迎使用我們的匿名 FTP 儲存庫。所有連線都會被監控和記錄。
讓我們只設置 IPv4 連線 −
listen = YES
listen_ipv6 = NO
現在,我們需要重新啟動或HUP vsftp 服務以應用我們的更改。
[root@centos]# systemctl restart vsftpd
讓我們連線到我們的 FTP 主機,並確保我們的 FTP 守護程序正在響應。
[root@centos rdc]# ftp 10.0.4.34 Connected to localhost (10.0.4.34). 220 Welcome to our Anonymous FTP Repo. All connections are monitored and logged. Name (localhost:root): anonymous 331 Please specify the password. Password: '230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>
Linux 管理員 - 遠端管理
在談論 CentOS 中作為管理員的遠端管理時,我們將探討兩種方法 −
- 控制檯管理
- GUI 管理
遠端控制檯管理
遠端控制檯管理意味著透過 ssh 等服務透過命令列執行管理任務。要有效地使用 CentOS Linux 作為管理員,您需要熟練掌握命令列。Linux 的核心設計就是從控制檯使用。即使在今天,一些系統管理員也更喜歡命令的強大功能,並透過執行沒有物理終端且未安裝 GUI 的精簡版 Linux 機器來節省硬體成本。
遠端 GUI 管理
遠端 GUI 管理通常透過兩種方式完成:遠端 X 會話或 VNC 等 GUI 應用程式層協議。每種方法都有其優點和缺點。但是,在大多數情況下,VNC 是最好的管理選擇。它允許從其他作業系統(例如 Windows 或 OS X)進行圖形控制,這些作業系統本身不支援 X Windows 協議。
使用遠端 X 會話是執行在 X 上的 X-Window 的視窗管理器和桌面管理器的原生功能。但是,整個 X 會話架構主要用於 Linux。並非每個系統管理員都會有 Linux 筆記型電腦來建立遠端 X 會話。因此,最常見的是使用 VNC 伺服器的適配版本。
VNC 最大的缺點是:VNC 本身不支援多使用者環境,例如遠端 X 會話。因此,對於終端使用者的 GUI 訪問,遠端 X 會話是最佳選擇。但是,我們主要關注的是遠端管理 CentOS 伺服器。
我們將討論為多個管理員配置 VNC 與為數百個終端使用者配置遠端 X 會話的方案。
使用 SSH 打下遠端控制檯訪問的安全基礎
ssh 或 Secure Shell 現在是遠端管理任何 Linux 伺服器的標準方法。與 telnet 不同,SSH 使用 TLS 進行身份驗證並對通訊進行端到端加密。如果配置正確,管理員可以確信他們的密碼和伺服器在遠端訪問時都是安全的。
在配置 SSH 之前,讓我們簡單討論一下基本安全性和最小許可權訪問。當 SSH 執行在其預設埠 22 上時;很快你就會遇到針對常用使用者名稱和密碼的暴力破解字典攻擊。這是不可避免的。無論你將多少主機新增到你的拒絕檔案,它們每天都會從不同的 IP 地址發起攻擊。
透過一些常見的規則,你可以採取一些主動措施,讓壞人浪費時間。以下是使用 SSH 進行生產伺服器遠端管理時應遵循的一些安全規則:
切勿使用常用使用者名稱或密碼。系統上的使用者名稱不應是系統預設使用者名稱,也不應與公司電子郵件地址相關聯,例如:systemadmin@yourcompany.com
不允許透過 SSH 進行 root 訪問或管理員訪問。使用唯一的使用者名稱,並在透過 SSH 身份驗證後使用 su 切換到 root 或管理員帳戶。
密碼策略是必須的:使用複雜的 SSH 使用者密碼,例如:“This&IS&a&GUD&P@ssW0rd&24&me”。每隔幾個月更改一次密碼,以消除對增量暴力破解攻擊的易感性。
停用長時間未使用的帳戶。例如,如果招聘經理的語音信箱顯示一個月內不會進行面試,這可能會導致技術精湛且時間充裕的人有機可乘。
每天檢查日誌。作為系統管理員,每天早上至少花 30-40 分鐘檢視系統和安全日誌。如果被問到,告訴每個人你沒有時間不積極主動。這種做法將有助於在問題影響終端使用者和公司利潤之前隔離警告訊號。
關於 Linux 安全性的說明 - 任何對 Linux 管理感興趣的人都應該積極關注當前的網路安全新聞和技術。雖然我們大多聽到的是其他作業系統被入侵,但對於網路罪犯來說,一個不安全的 Linux 系統是一個備受追捧的寶藏。憑藉高速網際網路連線上的 Linux 強大功能,熟練的網路罪犯可以使用 Linux 來利用其他作業系統的漏洞發起攻擊。
安裝和配置 SSH 以進行遠端訪問
步驟 1 - 安裝 SSH 伺服器和所有依賴包。
[root@localhost]# yum -y install openssh-server 'Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: repos.centos.net * extras: repos.dfw.centos.com * updates: centos.centos.com Resolving Dependencies --> Running transaction check ---> Package openssh-server.x86_64 0:6.6.1p1-33.el7_3 will be installed --> Finished Dependency Resolution Dependencies Resolved
步驟 2 - 建立一個安全的常規使用者用於 shell 訪問。
[root@localhost ~]# useradd choozer [root@localhost ~]# usermod -c "Remote Access" -d /home/choozer -g users -G wheel -a choozer
注意 - 我們將新使用者新增到 wheel 組,這樣在 SSH 身份驗證後就可以 su 到 root 使用者。我們還使用了在常用詞表中找不到的使用者名稱。這樣,當 SSH 受到攻擊時,我們的帳戶就不會被鎖定。
儲存 sshd 伺服器配置設定的檔案是 /etc/ssh/sshd_config。
我們最初需要編輯的部分是:
LoginGraceTime 60m PermitRootLogin no
步驟 3 - 重新載入 SSH 守護程序 sshd。
[root@localhost]# systemctl reload sshd
最好將登出寬限期設定為 60 分鐘。一些複雜的管理任務可能超過預設的 2 分鐘。當配置或研究更改時,SSH 會話超時真是令人沮喪的事情。
步驟 4 - 讓我們嘗試使用 root 憑據登入。
bash-3.2# ssh centos.vmnet.local root@centos.vmnet.local's password: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
步驟 5 - 我們現在無法再使用 root 憑據透過 ssh 遠端登入。所以讓我們登入到我們的非特權使用者帳戶,然後 su 到 root 帳戶。
bash-3.2# ssh chooser@centos.vmnet.local choozer@centos.vmnet.local's password: [choozer@localhost ~]$ su root Password: [root@localhost choozer]#
步驟 6 - 最後,讓我們確保 SSHD 服務在啟動時載入,並且 firewalld 允許外部 SSH 連線。
[root@localhost]# systemctl enable sshd [root@localhost]# firewall-cmd --permanent --add-service=ssh success [root@localhost]# firewall-cmd --reload success [root@localhost]#
SSH 現在已設定好並可用於遠端管理。根據您的企業邊界,可能需要配置資料包過濾邊界裝置以允許來自公司區域網外部的 SSH 遠端管理。
配置 VNC 以進行遠端 CentOS 管理
有幾種方法可以在 CentOS 6-7 上透過 VNC 啟用 CentOS 的遠端管理。最簡單但限制最多的一種方法是簡單地使用名為 vino 的軟體包。Vino 是一個為 Linux 設計的虛擬網路桌面連線應用程式,基於 Gnome 桌面平臺。因此,假設安裝已完成 Gnome 桌面。如果尚未安裝 Gnome 桌面,請在繼續之前安裝。Vino 將預設情況下與 Gnome GUI 安裝一起安裝。
要在 Gnome 下使用 Vino 配置螢幕共享,我們需要進入 CentOS 系統首選項進行螢幕共享。
Applications->System Tools->Settings->Sharing
配置 VNC 桌面共享的說明:
停用“新連線必須請求訪問” - 此選項需要物理訪問才能批准每個連線。此選項將阻止遠端管理,除非有人在物理桌面前。
啟用“需要密碼” - 這與使用者密碼是分開的。它將控制對虛擬桌面的訪問,並且仍然需要使用者密碼才能訪問鎖定的桌面(這對安全性很有好處)。
轉發 UP&P 埠:如果可用,請保持停用 - 轉發 UP&P 埠將傳送通用即插即用請求,以便 3 層裝置自動允許 VNC 連線到主機。我們不想要這個。
確保 vino 正在 VNC 埠 5900 上監聽。
[root@localhost]# netstat -antup | grep vino tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 4873/vino-server tcp6 0 0 :::5900 :::* LISTEN 4873/vino-server [root@localhost]#
現在讓我們配置防火牆以允許傳入的 VNC 連線。
[root@localhost]# firewall-cmd --permanent --add-port=5900/tcp success [root@localhost]# firewall-cmd --reload success [root@localhost rdc]#
最後,正如您所看到的,我們能夠連線我們的 CentOS 系統並在 Windows 或 OS X 上使用 VNC 客戶端進行管理。

遵守與我們為 SSH 制定的相同規則對於 VNC 同樣重要。與 SSH 一樣,VNC 不斷地被掃描 IP 範圍並測試弱密碼。還值得注意的是,保留啟用的預設 CentOS 登入名以及控制檯超時有助於提高遠端 VNC 安全性。由於攻擊者需要 VNC 和使用者密碼,請確保螢幕共享密碼不同,並且與使用者密碼一樣難以猜測。
輸入 VNC 螢幕共享密碼後,我們還必須輸入使用者密碼才能訪問鎖定的桌面。

安全說明 - 預設情況下,VNC 不是加密協議。因此,應透過 SSH 建立 VNC 連線隧道以進行加密。
設定透過 VNC 的 SSH 隧道
設定 SSH 隧道將提供 SSH 加密層以透過隧道傳輸 VNC 連線。另一個很棒的功能是它使用 SSH 壓縮為 VNC GUI 螢幕更新新增另一層壓縮。在處理 CentOS 伺服器管理時,更安全和更快總是好的!
因此,從將啟動 VNC 連線的客戶端開始,讓我們設定一個遠端 SSH 隧道。在此演示中,我們使用的是 OS X。首先,我們需要使用 sudo -s 切換到 root 使用者。
bash-3.2# sudo -s password:
輸入使用者密碼,我們現在應該擁有帶 # 提示符的 root shell -
bash-3.2#
現在,讓我們建立我們的 SSH 隧道。
ssh -f rdc@192.168.1.143 -L 2200:192.168.1.143:5900 -N
讓我們分解這個命令:
ssh - 執行本地 ssh 實用程式
-f - 任務完全執行後,ssh 應在後臺執行
rdc@192.168.1.143 - 託管 VNC 服務的 CentOS 伺服器上的遠端 ssh 使用者
-L 2200:192.168.1.143:5900 - 建立我們的隧道 [本地埠]:[遠端主機]:[VNC 服務的遠端埠]
-N 告訴 ssh 我們不希望在遠端系統上執行命令
bash-3.2# ssh -f rdc@192.168.1.143 -L 2200:192.168.1.143:5900 -N rdc@192.168.1.143's password:
成功輸入遠端 ssh 使用者的密碼後,我們的 ssh 隧道 就建立好了。現在是精彩的部分!要連線,我們將 VNC 客戶端指向本地主機上的隧道埠,在本例中為埠 2200。以下是 Mac 筆記型電腦的 VNC 客戶端配置:

最後,我們的遠端 VNC 桌面連線!

SSH 隧道的好處在於它幾乎可以用於任何協議。SSH 隧道通常用於繞過 ISP 的出站和入站埠過濾,以及在規避其他會話層監控的同時欺騙應用程式層 IDS/IPS。
您的 ISP 可能會為非商業帳戶過濾埠 5900,但允許在埠 22 上使用 SSH(如果埠 22 被過濾,則可以在任何埠上執行 SSH)。
應用程式級 IPS 和 IDS 會檢視有效負載。例如,常見的緩衝區溢位或 SQL 注入。端到端 SSH 加密將加密應用程式層資料。
SSH 隧道是 Linux 管理員工具箱中完成任務的好工具。但是,作為管理員,我們希望探索限制特權較低的使用者的 SSH 隧道訪問許可權。
管理安全說明 - 限制 SSH 隧道需要管理員進行思考。評估使用者首先需要 SSH 隧道的理由;哪些使用者需要隧道;以及實際的風險機率和最壞情況的影響。
這是一個高階主題,超出了中級入門指南的範圍。建議那些希望達到 CentOS Linux 管理高階水平的人對這個主題進行研究。
使用 SSH 隧道進行遠端 X-Windows
與 Windows 相比,Linux 中 X-Windows 的設計非常巧妙。如果我們想從另一臺 Linux 機器控制遠端 Linux 機器,我們可以利用 X 中內建的機制。
X-Windows(通常簡稱為“X”)提供了一種機制,可以將來自一臺 Linux 機器上的應用程式視窗顯示到另一臺 Linux 機器上的 X 顯示部分。因此,透過 SSH,我們可以請求將 X-Windows 應用程式轉發到世界各地的另一臺 Linux 機器的顯示器!
要透過 ssh 隧道遠端執行 X 應用程式,我們只需要執行一個命令:
[root@localhost]# ssh -X rdc@192.168.1.105
語法是 - ssh -X [使用者]@[主機],並且主機必須執行具有有效使用者的 ssh。
以下是透過遠端 XWindows ssh 隧道在 Ubuntu 工作站上執行 GIMP 的螢幕截圖。

從另一臺 Linux 伺服器或工作站遠端執行應用程式非常簡單。還可以通過幾種方法啟動整個 X 會話並遠端擁有整個桌面環境。
XDMCP
無頭軟體包,例如 NX
在X和GNOME或KDE等桌面管理器中配置備用顯示器和桌面
此方法最常用於沒有物理顯示器的無頭伺服器,並且確實超出了中級入門指南的範圍。但是,瞭解可用的選項仍然很有益。
Linux管理員 - CentOS中的流量監控
有一些第三方工具可以增強CentOS流量監控的功能。在本教程中,我們將重點介紹CentOS主發行版儲存庫和Fedora EPEL儲存庫中打包的那些工具。
總有一些情況,管理員(由於某種原因)只能使用CentOS主儲存庫中的工具。討論的大多數實用程式都設計供管理員透過shell進行物理訪問使用。當使用可訪問的web-gui進行流量監控時,使用ntop-ng或Nagios等第三方實用程式是最佳選擇(而不是從頭建立此類工具)。
有關可配置web-gui解決方案的更多研究,以下是一些入門研究的連結。
區域網/廣域網流量監控
Nagios
Nagios已經存在很長時間了,因此它經過了驗證。曾經它完全是免費和開源的,但後來發展成為一個企業解決方案,並採用付費許可模式來滿足企業複雜性的需求。因此,在計劃任何使用Nagios的部署之前,請確保開源許可版本能夠滿足您的需求,或者計劃預算用於企業級解決方案。
大多數開源Nagios流量監控軟體都可以在以下網站找到:− https://www.nagios.org
有關Nagios的簡要歷史,請訪問Nagios官方歷史頁面:https://www.nagios.org/about/history/
ntopng
另一個很棒的工具,允許透過web-gui進行頻寬和流量監控,稱為ntopng。ntopng類似於Unix實用程式ntop,可以收集整個區域網或廣域網的資料。提供用於管理、配置和製圖的web-gui,使整個IT部門易於使用。
與Nagios一樣,ntopng也有開源和付費企業版可用。有關ntopng的更多資訊,請訪問以下網站:− http://www.ntop.org/
安裝Fedora EPEL儲存庫 ─ 企業版Linux的額外軟體包
要訪問流量監控所需的一些工具,我們需要將CentOS系統配置為使用EPEL儲存庫。
EPEL儲存庫並非由CentOS官方維護或支援。但是,它由一群Fedora Core志願者維護,以解決企業Linux專業人員常用的軟體包,這些軟體包未包含在CentOS、Fedora Core或Red Hat Enterprise Linux中。
警告
請記住,EPEL儲存庫並非CentOS官方儲存庫,可能會破壞生產伺服器上具有公共依賴項的相容性和功能。考慮到這一點,建議您始終在執行與生產伺服器相同服務的非生產伺服器上進行測試,然後再部署到關鍵系統。
實際上,與CentOS的任何其他第三方儲存庫相比,使用EHEL儲存庫的最大優勢是我們可以確保二進位制檔案未被篡改。不使用來自不受信任來源的儲存庫被認為是最佳實踐。
綜上所述,EPEL官方儲存庫在CentOS中非常常見,可以透過YUM輕鬆安裝。
[root@CentOS rdc]# yum -y install epel-release Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: repo1.dal.innoscale.net * extras: repo1.dal.innoscale.net * updates: mirror.hmc.edu Resolving Dependencies --> Running transaction check ---> Package epel-release.noarch 0:7-9 will be installed --> Finished Dependency Resolution Dependencies Resolved --{ condensed output }--
安裝EPEL儲存庫後,我們需要更新它。
[root@CentOS rdc]# yum repolist Loaded plugins: fastestmirror, langpacks epel/x86_64/metalink | 11 kB 00:00:00 epel | 4.3 kB 00:00:00 (1/3): epel/x86_64/group_gz | 170 kB 00:00:00 (2/3): epel/x86_64/updateinfo | 753 kB 00:00:01 (3/3): epel/x86_64/primary_db --{ condensed output }--
此時,我們的EPEL儲存庫應該已配置並可以使用。讓我們首先安裝nload來監控介面頻寬。
本教程將重點介紹以下工具:
- nload
- ntop
- ifstst
- iftop
- vnstat
- net hogs
- Wireshark
- TCP Dump
- Traceroute
這些都是Linux企業中監控流量的標準工具。每個工具的使用範圍從簡單到高階不等,因此我們只簡要討論Wireshark和TCP Dump等工具。
安裝和使用nload
在CentOS中安裝和配置EPEL儲存庫後,我們現在應該能夠安裝和使用nload。此實用程式旨在即時繪製每個介面的頻寬。
與大多數其他基本安裝一樣,nload是透過YUM包管理器安裝的。
[root@CentOS rdc]# yum -y install nload Resolving Dependencies --> Running transaction check ---> Package nload.x86_64 0:0.7.4-4.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved =============================================================================== =============================================================================== Package Arch Version Repository Size =============================================================================== =============================================================================== Installing: nload x86_64 0.7.4-4.el7 epel 70 k Transaction Summary =============================================================================== =============================================================================== Install 1 Package Total download size: 70 k Installed size: 176 k Downloading packages: --{ condensed output }--
現在我們已經安裝了nload,使用它非常簡單。
[root@CentOS rdc]# nload enp0s5
nload將監控指定的介面。在本例中,enp0s5是一個乙太網介面,它將即時從終端監控網路流量負載和總頻寬使用情況。

如所見,nload將繪製指定介面的傳入和傳出資料,並提供帶井號“#”的資料流的物理表示。
所示截圖顯示了一個簡單的網頁載入,其中包含一些後臺守護程式流量。
nload的常用命令列開關:
命令 | 操作 |
---|---|
-a | 時間段 |
-t | 時間更新間隔(毫秒),預設為500 |
-u | 設定流量測量單位的顯示 h |
-U | 設定總的輸入/輸出流量測量單位,選項與-u相同 |
nload的標準語法:
nload [options] <interface>
如果未指定介面,nload將自動獲取第一個乙太網介面。讓我們嘗試以兆位元組為單位測量總資料輸入/輸出,並以兆位為單位測量當前資料傳輸速度。
[root@CentOS rdc]# nload -U M -u m
當前介面的傳入/傳出資料以兆位元每秒為單位測量,每行“Ttl”表示總的傳入/傳出資料,以兆位元組顯示。
nload可幫助管理員檢視有多少資料已透過介面以及當前有多少資料正在傳入/傳出指定的介面。
要檢視其他介面而不關閉nload,只需使用左右箭頭鍵。這將迴圈遍歷系統上所有可用的介面。
可以使用-m開關同時監控多個介面:
[root@CentOS rdc]# nload -u K -U M -m lo -m enp0s5
nload同時監控兩個介面(lo和enp0s5):

Linux管理員 - 日誌管理
systemd改變了CentOS Linux系統日誌的管理方式。系統上的每個守護程式不再將日誌放置在單獨的位置,然後使用tail或grep等工具作為排序和過濾日誌條目的主要方式,而journald則為分析系統日誌帶來了單點管理。
systemd日誌記錄背後的主要元件是:journal、jounralctl和journald.conf
journald是主要的日誌記錄守護程式,透過編輯journald.conf進行配置,而journalctl用於分析journald記錄的事件。
journald記錄的事件包括:核心事件、使用者程序和守護程式服務。
設定正確的系統時區
在使用journalctl之前,我們需要確保系統時間設定為正確的時間。為此,我們需要使用timedatectl。
讓我們檢查當前的系統時間。
[root@centos rdc]# timedatectl status Local time: Mon 2017-03-20 00:14:49 MDT Universal time: Mon 2017-03-20 06:14:49 UTC RTC time: Mon 2017-03-20 06:14:49 Time zone: America/Denver (MDT, -0600) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: yes Last DST change: DST began at Sun 2017-03-12 01:59:59 MST Sun 2017-03-12 03:00:00 MDT Next DST change: DST ends (the clock jumps one hour backwards) at Sun 2017-11-05 01:59:59 MDT Sun 2017-11-05 01:00:00 MST [root@centos rdc]#
目前,系統時間與本地時區一致。如果您的系統時間不正確,讓我們設定正確的時區。更改設定後,CentOS將自動計算當前時區的時區偏移量,立即調整系統時鐘。
讓我們使用timedatectl列出所有時區:
[root@centos rdc]# timedatectl list-timezones Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers Africa/Asmara Africa/Bamako Africa/Bangui Africa/Banjul Africa/Bissau
這是timedatectl list-timezones的輸出結果。要查詢特定的本地時區,可以使用grep命令:
[root@centos rdc]# timedatectl list-timezones | grep -i "america/New_York" America/New_York [root@centos rdc]#
CentOS使用的標籤通常是國家/地區,使用下劃線而不是空格(New_York而不是“New York”)。
現在讓我們設定我們的時區:
[root@centos rdc]# timedatectl set-timezone "America/New_York" [root@centos rdc]# date Mon Mar 20 02:28:44 EDT 2017 [root@centos rdc]#
您的系統時鐘應該會自動調整時間。
使用journalctl分析日誌
使用journalctl時的常用命令列開關:
開關 | 操作 |
---|---|
-k | 僅列出核心訊息 |
-u | 按特定單元列出(httpd、sshd等…) |
-b | 引導標籤偏移量 |
-o | 日誌輸出格式 |
-p | 按日誌型別過濾(名稱或編號) |
-F | 欄位名或欄位名值 |
--utc | UTC偏移時間 |
--since | 按時間範圍過濾 |
檢查引導日誌
首先,我們將檢查和配置CentOS Linux中的引導日誌。您首先會注意到,CentOS預設情況下不儲存跨重啟的持久引導日誌。
要檢查每次重啟的引導日誌,我們可以發出以下命令:
[root@centos rdc]# journalctl --list-boots -4 bca6380a31a2463aa60ba551698455b5 Sun 2017-03-19 22:01:57 MDT—Sun 2017-03-19 22:11:02 MDT -3 3aaa9b84f9504fa1a68db5b49c0c7208 Sun 2017-03-19 22:11:09 MDT—Sun 2017-03-19 22:15:03 MDT -2 f80b231272bf48ffb1d2ce9f758c5a5f Sun 2017-03-19 22:15:11 MDT—Sun 2017-03-19 22:54:06 MDT -1 a071c1eed09d4582a870c13be5984ed6 Sun 2017-03-19 22:54:26 MDT—Mon 2017-03-20 00:48:29 MDT 0 9b4e6cdb43b14a328b1fa6448bb72a56 Mon 2017-03-20 00:48:38 MDT—Mon 2017-03-20 01:07:36 MDT [root@centos rdc]#
重啟系統後,我們可以看到另一個條目。
[root@centos rdc]# journalctl --list-boots -5 bca6380a31a2463aa60ba551698455b5 Sun 2017-03-19 22:01:57 MDT—Sun 2017-03-19 22:11:02 MDT -4 3aaa9b84f9504fa1a68db5b49c0c7208 Sun 2017-03-19 22:11:09 MDT—Sun 2017-03-19 22:15:03 MDT -3 f80b231272bf48ffb1d2ce9f758c5a5f Sun 2017-03-19 22:15:11 MDT—Sun 2017-03-19 22:54:06 MDT -2 a071c1eed09d4582a870c13be5984ed6 Sun 2017-03-19 22:54:26 MDT—Mon 2017-03-20 00:48:29 MDT -1 9b4e6cdb43b14a328b1fa6448bb72a56 Mon 2017-03-20 00:48:38 MDT—Mon 2017-03-20 01:09:57 MDT 0 aa6aaf0f0f0d4fcf924e17849593d972 Mon 2017-03-20 01:10:07 MDT—Mon 2017-03-20 01:12:44 MDT [root@centos rdc]#
現在,讓我們檢查上次引導日誌:
root@centos rdc]# journalctl -b -5 -- Logs begin at Sun 2017-03-19 22:01:57 MDT, end at Mon 2017-03-20 01:20:27 MDT. -- Mar 19 22:01:57 localhost.localdomain systemd-journal[97]: Runtime journal is using 8.0M (max allowed 108.4M Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpuset Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpu Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpuacct Mar 19 22:01:57 localhost.localdomain kernel: Linux version 3.10.0514.6.2.el7.x86_64 (builder@kbuilder.dev. Mar 19 22:01:57 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-514.6.2.el7.x86_64 ro Mar 19 22:01:57 localhost.localdomain kernel: Disabled fast string operations Mar 19 22:01:57 localhost.localdomain kernel: e820: BIOS-provided physical RAM map:
以上是上次引導的簡化輸出。我們還可以參考數小時、數天、數週、數月甚至數年前的引導日誌。但是,CentOS預設情況下不儲存持久引導日誌。要啟用持久儲存引導日誌,我們需要進行一些配置更改:
- 建立引導日誌的中央儲存點
- 為新的日誌資料夾賦予正確的許可權
- 配置journald.conf以進行持久日誌記錄
配置持久引導日誌的引導位置
journald最初想要儲存持久引導日誌的位置是/var/log/journal。由於預設情況下不存在此位置,讓我們建立它:
[root@centos rdc]# mkdir /var/log/journal
現在,讓我們為目錄賦予journald守護程式訪問許可權:
systemd-tmpfiles --create --prefix /var/log/journal
最後,讓我們告訴journald它應該儲存持久引導日誌。在vim或您喜歡的文字編輯器中,開啟/etc/systemd/jounrald.conf"。
# See journald.conf(5) for details. [Journal]=Storage=peristent
我們關注的行是Storage=。首先刪除註釋#,然後更改為Storage = persistent,如上所示。儲存並重啟CentOS系統,注意執行journalctl list-boots時應該有多個條目。
注意 − 來自VPS提供商的不斷變化的machine-id可能會導致journald無法儲存持久引導日誌。對於這種情況,有很多解決方法。最好仔細閱讀CentOS管理員論壇上釋出的當前修復程式,然後遵循那些找到可行VPS解決方法的人的可靠建議。
要檢查特定的引導日誌,我們只需要使用journald --list-boots獲取每個偏移量,然後使用-b開關加上偏移量。因此,要檢查第二個引導日誌,我們將使用:
journalctl -b -2
如果未指定引導日誌偏移量,-b的預設值始終是上次重啟後的當前引導日誌。
按日誌型別分析日誌
journald的事件編號並分為7種不同的型別:
0 - emerg :: System is unusable 1 - alert :: Action must be taken immediatly 2 - crit :: Action is advised to be taken immediatly 3 - err :: Error effecting functionality of application 4 - warning :: Usually means a common issue that can affect security or usilbity 5 - info :: logged informtation for common operations 6 - debug :: usually disabled by default to troubleshoot functionality
因此,如果我們想檢視所有警告,可以透過journalctl發出以下命令:
[root@centos rdc]# journalctl -p 4 -- Logs begin at Sun 2017-03-19 22:01:57 MDT, end at Wed 2017-03-22 22:33:42 MDT. -- Mar 19 22:01:57 localhost.localdomain kernel: ACPI: RSDP 00000000000f6a10 00024 (v02 PTLTD ) Mar 19 22:01:57 localhost.localdomain kernel: ACPI: XSDT 0000000095eea65b 0005C (v01 INTEL 440BX 06040000 VMW 01 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: FACP 0000000095efee73 000F4 (v04 INTEL 440BX 06040000 PTL 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: DSDT 0000000095eec749 1272A (v01 PTLTD Custom 06040000 MSFT 03 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: FACS 0000000095efffc0 00040 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: BOOT 0000000095eec721 00028 (v01 PTLTD $SBFTBL$ 06040000 LTP 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: APIC 0000000095eeb8bd 00742 (v01 PTLTD ? APIC 06040000 LTP 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: MCFG 0000000095eeb881 0003C (v01 PTLTD $PCITBL$ 06040000 LTP 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: SRAT 0000000095eea757 008A8 (v02 VMWARE MEMPLUG 06040000 VMW 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: HPET 0000000095eea71f 00038 (v01 VMWARE VMW HPET 06040000 VMW 00 Mar 19 22:01:57 localhost.localdomain kernel: ACPI: WAET 0000000095eea6f7 00028 (v01 VMWARE VMW WAET 06040000 VMW 00 Mar 19 22:01:57 localhost.localdomain kernel: Zone ranges: Mar 19 22:01:57 localhost.localdomain kernel: DMA [mem 0x000010000x00ffffff] Mar 19 22:01:57 localhost.localdomain kernel: DMA32 [mem 0x010000000xffffffff] Mar 19 22:01:57 localhost.localdomain kernel: Normal empty Mar 19 22:01:57 localhost.localdomain kernel: Movable zone start for each node Mar 19 22:01:57 localhost.localdomain kernel: Early memory node ranges Mar 19 22:01:57 localhost.localdomain kernel: node 0: [mem 0x000010000x0009dfff] Mar 19 22:01:57 localhost.localdomain kernel: node 0: [mem 0x001000000x95edffff] Mar 19 22:01:57 localhost.localdomain kernel: node 0: [mem 0x95f000000x95ffffff] Mar 19 22:01:57 localhost.localdomain kernel: Built 1 zonelists in Node order, mobility grouping on. Total pages: 60 Mar 19 22:01:57 localhost.localdomain kernel: Policy zone: DMA32 Mar 19 22:01:57 localhost.localdomain kernel: ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
以上顯示了系統過去4天中的所有警告。
使用systemd檢視和瀏覽日誌的新方法確實需要一些練習和研究才能熟悉。但是,憑藉不同的輸出格式,並特別注意使所有打包的守護程式日誌通用化,它值得采用。journald比傳統的日誌分析方法提供了更大的靈活性和效率。
Linux管理員 - 備份與恢復
在探索CentOS中部署標準備份計劃的特定方法之前,讓我們首先討論標準級別備份策略的典型考慮因素。我們首先要習慣的是3-2-1備份規則。
3-2-1備份策略
在整個行業中,您經常會聽到3-2-1備份模型這個術語。在實施備份計劃時,這是一個非常好的方法。3-2-1定義如下:3份資料副本;例如,我們可能有工作副本;使用rsync在CentOS伺服器上設計的冗餘副本;並從備份伺服器上的資料進行輪換的異地USB備份。2種不同的備份介質。在這種情況下,我們實際上將擁有三種不同的備份介質:筆記型電腦或工作站SSD上的工作副本,RADI6陣列上的CentOS伺服器資料以及放在USB驅動器上的異地備份。1份異地資料副本;我們正在每晚輪換異地USB驅動器。另一種現代方法可能是雲備份提供商。
系統恢復
裸機恢復計劃僅僅是CentOS管理員制定的一個計劃,用於使關鍵系統線上並保持所有資料完整。假設100%的系統故障和所有過去系統硬體的丟失,管理員必須有一個計劃來實現正常執行時間,並保持使用者資料完整,同時最大限度地減少停機時間。Linux中使用的單核心實際上使得使用系統映像進行裸機恢復比Windows更容易。而Windows使用的是微核心架構。
完整的 資料恢復和裸機恢復通常是透過多種方法組合完成的,包括關鍵執行伺服器的工作配置生產磁碟映像,遵守3-2-1規則的使用者資料的冗餘備份。甚至一些敏感檔案也可能儲存在安全的防火安全櫃中,只有值得信賴的公司人員才能有限地訪問。
使用原生CentOS工具的多階段裸機恢復和資料恢復計劃可能包括:
使用dd建立和恢復已配置伺服器的生產磁碟映像
使用rsync製作所有使用者資料的增量備份
使用tar & gzip儲存帶有管理員密碼和註釋的加密備份檔案。通常,這可以放在USB驅動器上,加密並鎖在一個高階經理可以訪問的安全櫃中。此外,這還可以確保如果當前管理員中了彩票並消失到某個陽光明媚的島嶼上,其他人也會知道重要的安全憑據。
如果系統由於硬體故障或災難而崩潰,則恢復操作的不同階段如下:
使用已配置的裸機映像構建工作伺服器
從備份中將資料恢復到工作伺服器
可以物理訪問執行前兩個操作所需的憑據
使用rsync進行檔案級備份
rsync是一個用於在本地或其他伺服器之間同步檔案目錄的強大實用程式。系統管理員多年來一直在使用rsync,因此它對於備份資料非常完善。在我看來,sync最好的功能之一是它可以從命令列進行指令碼化。
在本教程中,我們將以各種方式討論rsync:
- 探討和討論一些常見選項
- 建立本地備份
- 透過SSH建立遠端備份
- 恢復本地備份
rsync的名稱來源於其用途:遠端同步,它功能強大且靈活。
以下是透過ssh進行的基本rsync遠端備份:
MiNi:~ rdc$ rsync -aAvz --progress ./Desktop/ImportantStuff/ rdc@192.168.1.143:home/rdc/ Documents/RemoteStuff/ rdc@192.168.1.143's password: sending incremental file list 6,148 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=23/25) 2017-02-14 16_26_47-002 - Veeam_Architecture001.png 33,144 100% 31.61MB/s 0:00:00 (xfr#2, to-chk=22/25) A Guide to the WordPress REST API | Toptal.pdf 892,406 100% 25.03MB/s 0:00:00 (xfr#3, to-chk=21/25) Rick Cardon Technologies, LLC..webloc 77 100% 2.21kB/s 0:00:00 (xfr#4, to-chk=20/25) backbox-4.5.1-i386.iso 43,188,224 1% 4.26MB/s 0:08:29 sent 2,318,683,608 bytes received 446 bytes 7,302,941.90 bytes/sec total size is 2,327,091,863 speedup is 1.00 MiNi:~ rdc$
以下同步透過我們的區域網傳送了近2.3GB的資料。rsync的美妙之處在於它在檔案的基礎上以塊級別增量工作。這意味著,如果我們在1MB的文字檔案中只更改了兩個字元,那麼在下一次同步時,只有1個或2個塊將透過區域網傳輸!
此外,可以停用增量功能,以便使用更多的網路頻寬來減少CPU利用率。如果每10分鐘在1Gb專用備份區域網上不斷複製多個10MB的資料庫檔案,這可能被證明是可取的。原因是:這些檔案將始終發生變化,並將每10分鐘增量傳輸,這可能會增加遠端CPU的負載。由於總傳輸負載不會超過5分鐘,我們可能只想完整地同步資料庫檔案。
以下是rsync最常見的開關:
rsync syntax: rsync [options] [local path] [[remote host:remote path] or [target path
開關 | 操作 |
---|---|
-a | 存檔模式,包含-r、-p、-t、-g、-l |
-d | 僅同步目錄樹,不包含檔案 |
-r | 遞迴進入目錄 |
-l | 將符號連結複製為符號連結 |
-p | 保留許可權 |
-g | 保留組 |
-v | 詳細輸出 |
-z | 透過網路連結壓縮 |
-X | 保留擴充套件屬性 |
-A | 保留ACL |
-t | 保留時間戳 |
-W | 傳輸整個檔案,而不是增量塊 |
-u | 不要覆蓋目標上的檔案 |
--progress | 顯示傳輸進度 |
--delete | 刪除目標上的舊檔案 |
--max-size = XXX | 要同步的最大檔案大小 |
何時使用rsync
我個人更喜歡在將檔案從源主機備份到目標主機時使用rsync。例如,所有用於資料恢復的主目錄,甚至用於災難恢復的異地和雲端。
使用rsync進行本地備份
我們已經看到了如何將檔案從一臺主機傳輸到另一臺主機。相同的方法可用於在本地同步目錄和檔案。
讓我們手動對root使用者目錄中的/etc/進行增量備份。
首先,我們需要在~/root下為同步備份建立一個目錄:
[root@localhost rdc]# mkdir /root/etc_baks
然後,確保有足夠的可用磁碟空間。
[root@localhost rdc]# du -h --summarize /etc/ 49M /etc/ [root@localhost rdc]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/cl-root 43G 15G 28G 35% /
我們可以同步整個/etc/目錄:
rsync -aAvr /etc/ /root/etc_baks/
我們同步的/etc/目錄:
[root@localhost etc_baks]# ls -l ./ total 1436 drwxr-xr-x. 3 root root 101 Feb 1 19:40 abrt -rw-r--r--. 1 root root 16 Feb 1 19:51 adjtime -rw-r--r--. 1 root root 1518 Jun 7 2013 aliases -rw-r--r--. 1 root root 12288 Feb 27 19:06 aliases.db drwxr-xr-x. 2 root root 51 Feb 1 19:41 alsa drwxr-xr-x. 2 root root 4096 Feb 27 17:11 alternatives -rw-------. 1 root root 541 Mar 31 2016 anacrontab -rw-r--r--. 1 root root 55 Nov 4 12:29 asound.conf -rw-r--r--. 1 root root 1 Nov 5 14:16 at.deny drwxr-xr-x. 2 root root 32 Feb 1 19:40 at-spi2 --{ condensed output }--
現在讓我們進行增量rsync:
[root@localhost etc_baks]# rsync -aAvr --progress /etc/ /root/etc_baks/ sending incremental file list test_incremental.txt 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=1145/1282) sent 204620 bytes received 2321 bytes 413882.00 bytes/sec total size is 80245040 speedup is 387.77 [root@localhost etc_baks]#
只有我們的test_incremental.txt檔案被複制。
使用rsync進行遠端差分備份
讓我們將初始rsync完整備份到已部署備份計劃的伺服器上。此示例實際上是將Mac OS X工作站上的資料夾備份到CentOS伺服器。rsync的另一個優點是它可以用於任何已移植rsync的平臺。
MiNi:~ rdc$ rsync -aAvz Desktop/ImportanStuff/ rdc@192.168.1.143:Documents/RemoteStuff rdc@192.168.1.143's password: sending incremental file list ./ A Guide to the WordPress REST API | Toptal.pdf Rick Cardon Tech LLC.webloc VeeamDiagram.png backbox-4.5.1-i386.iso dhcp_admin_script_update.py DDWRT/ DDWRT/.DS_Store DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin DDWRT/ddwrt_mod_notes.docx DDWRT/factory-to-ddwrt.bin open_ldap_config_notes/ open_ldap_config_notes/ldap_directory_a.png open_ldap_config_notes/open_ldap_notes.txt perl_scripts/ perl_scripts/mysnmp.pl php_scripts/ php_scripts/chunked.php php_scripts/gettingURL.php sent 2,318,281,023 bytes received 336 bytes 9,720,257.27 bytes/sec total size is 2,326,636,892 speedup is 1.00 MiNi:~ rdc$
我們現在已將工作站上的資料夾備份到執行RAID6卷的伺服器上,並對異地儲存的輪換災難恢復介質進行了備份。使用rsync使我們僅使用一臺具有昂貴冗餘磁碟陣列和輪換差分備份的伺服器就實現了標準的3-2-1備份。
現在,讓我們在新增名為test_file.txt的單個新檔案後,使用rsync再次備份同一資料夾。
MiNi:~ rdc$ rsync -aAvz Desktop/ImportanStuff/ rdc@192.168.1.143:Documents/RemoteStuff rdc@192.168.1.143's password: sending incremental file list ./ test_file.txt sent 814 bytes received 61 bytes 134.62 bytes/sec total size is 2,326,636,910 speedup is 2,659,013.61 MiNi:~ rdc$
正如您所看到的,只有新檔案透過rsync傳遞到伺服器。檔案比較是在逐檔案的基礎上進行的。
需要注意的是:這隻會複製新檔案:test_file.txt,因為它只是唯一更改的檔案。rsync使用ssh。我們不需要在任何一臺機器上使用root帳戶。
rsync簡單、強大且有效,非常適合備份整個資料夾和目錄結構。但是,rsync本身並不自動化此過程。我們需要深入研究我們的工具箱,找到最適合這項工作的簡單工具。
要使用cronjobs自動執行rsync備份,必須使用SSH金鑰進行身份驗證來設定SSH使用者。這與cronjobs相結合,使rsync能夠按定時間隔自動執行。
使用DD進行逐塊裸機恢復映像
DD是一個Linux實用程式,自從Linux核心滿足GNU實用程式以來就存在了。
dd最簡單的說法是複製選定磁碟區域的映像。然後提供複製物理磁碟選定塊的能力。因此,除非您有備份,否則一旦dd覆蓋磁碟,所有塊都將被替換。即使是價格昂貴的高階資料恢復也無法恢復以前的資料丟失。
使用dd建立可啟動系統映像的整個過程如下:
- 從具有可啟動Linux發行版的CentOS伺服器啟動
- 查詢要成像的可啟動磁碟的名稱
- 確定儲存恢復映像的位置
- 查詢磁碟上使用的塊大小
- 啟動dd映像操作
在本教程中,為了節省時間和簡便起見,我們將從CentOS虛擬機器建立主引導記錄的ISO映像。然後,我們將此映像儲存在異地。如果我們的MBR損壞且需要恢復,則可以將相同的過程應用於整個可啟動磁碟或分割槽。但是,對於本教程來說,所需的時間和磁碟空間確實有點過分了。
鼓勵CentOS管理員在測試環境中熟練掌握恢復完全可啟動的磁碟/分割槽並執行裸機恢復。當最終需要在現實生活中與管理人員和幾十個終端使用者一起進行練習時,這將減輕很多壓力。在這種情況下,10分鐘的摸索時間似乎像一個永恆,讓人汗流浹背。
注意:使用dd時,請確保不要混淆源卷和目標卷。您可以透過將備份位置複製到啟動驅動器來破壞資料和可啟動伺服器。或者,可能更糟糕的是,使用DD在非常低的級別覆蓋資料,從而永遠破壞資料。
以下是dd常見的命令列開關和引數:
開關 | 操作 |
---|---|
if= | 要複製的輸入檔案或源 |
of= | 輸出檔案或輸入檔案的副本 |
bs | 設定輸入和輸出塊大小 |
obs | 設定輸出檔案塊大小 |
ibs | 設定輸入檔案塊大小 |
count | 設定要複製的塊數 |
conv | 要新增的額外成像選項 |
Noerror | 不要停止處理錯誤 |
同步 | 如果發生錯誤或未對齊,則填充不合適的輸入塊 |
關於塊大小的說明 − dd 的預設塊大小為 512 位元組。這是較低密度硬碟的標準塊大小。如今,更高密度硬碟的塊大小已增加到 4096 位元組 (4kB),以支援 1TB 及更大的磁碟。因此,在使用 dd 處理較新、較高容量的硬碟之前,我們需要檢查磁碟塊大小。
在本教程中,我們將使用在 VMware 中執行的 CentOS 安裝程式,而不是在生產伺服器上使用 *dd*。我們還將配置 VMware 以引導可啟動的 Linux ISO 映象,而不是使用可啟動的 USB 快閃記憶體盤。
首先,我們需要下載名為 *CentOS Gnome ISO* 的 CentOS 映象。該映象大小接近 3GB,建議始終保留一份副本,用於建立可啟動的 USB 快閃記憶體盤以及引導虛擬伺服器安裝程式以進行故障排除和裸機映象。
其他可啟動的 Linux 發行版也能正常工作。Linux Mint 可用於可啟動的 ISO 映象,因為它具有強大的硬體支援和完善的 GUI 磁碟維護工具。
CentOS GNOME Live 可啟動映象可從以下地址下載:http://buildlogs.centos.org/rolling/7/isos/x86_64/CentOS-7-x86_64-LiveGNOME.iso
讓我們配置 VMware Workstation 安裝程式以從我們的 Linux 可啟動映象引導。這些步驟適用於 OS X 上的 VMware。但是,它們在 Linux、Windows 上的 VMware Workstation 甚至 Virtual Box 上也類似。
注意 − 使用 Virtual Box 或 VMware Workstation 等虛擬桌面解決方案是設定實驗室場景以學習 CentOS 管理任務的好方法。它提供了安裝多個 CentOS 安裝程式的能力,幾乎無需硬體配置,從而使人們能夠專注於管理,甚至可以在進行更改之前儲存伺服器狀態。
首先,讓我們配置一個虛擬 CD-ROM 並連線我們的 ISO 映象以進行引導,而不是虛擬 CentOS 伺服器安裝程式 −

現在,設定啟動磁碟 −

現在引導時,我們的虛擬機器將從 CentOS 可啟動 ISO 映象引導,並允許訪問先前配置的虛擬 CentOS 伺服器上的檔案。
讓我們檢查我們的磁碟,看看我們想從哪裡複製 MBR(精簡輸出如下所示)。
MiNt ~ # fdisk -l Disk /dev/sda: 60 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
我們已經找到我們的物理磁碟:*sda* 和 *sdb*。每個磁碟的塊大小為 512 位元組。因此,我們現在將執行 *dd* 命令來複制 SDA1 上 MBR 的前 512 位元組。
最好的方法是 −
[root@mint rdc]# dd if=/dev/sda bs=512 count=1 | gzip -c > /mnt/sdb/images/mbr.iso.gz 1+0 records in 1+0 records out 512 bytes copied, 0.000171388 s, 3.0 MB/s [root@mint rdc]# ls /mnt/sdb/ mbr-iso.gz [root@mint rdc]#
就這樣,我們得到了主引導記錄的完整映象。如果我們有足夠的儲存空間來映象引導驅動器,我們可以輕鬆地製作完整的系統引導映象 −
dd if=/dev/INPUT/DEVICE-NAME-HERE conv=sync,noerror bs=4K | gzip -c > /mnt/sdb/boot-server-centos-image.iso.gz
*conv=sync* 用於必須對物理介質進行位元組對齊的情況。在這種情況下,如果未讀取精確的 4K 對齊(例如…只有 3K 但需要在磁碟上佔用至少一個 4K 塊的檔案。或者,讀取時 simply 出現錯誤且 dd 無法讀取檔案。),則 dd 可能會出錯。因此,帶有 *conv=sync,noerror* 的 *dd* 將使用無關緊要但有用的資料將 3K 填充到 4K 塊對齊的物理介質中。同時不會出現可能結束大型操作的錯誤。
處理來自磁碟的資料時,我們始終希望包含:*conv=sync,noerror* 引數。
這僅僅是因為磁碟不像 TCP 資料那樣是流。它們是由對齊到特定大小的塊組成的。例如,如果我們有 512 位元組的塊,則只有 300 位元組的檔案仍然需要 512 位元組的磁碟空間(可能需要 2 個塊用於 inode 資訊,例如許可權和其他檔案系統資訊)。
使用 gzip 和 tar 進行安全儲存
gzip 和 tar 是 CentOS 管理員必須習慣使用的兩個實用程式。它們的用途遠不止於解壓縮存檔。
在 CentOS Linux 中使用 Gnu Tar
Tar 是一種存檔實用程式,類似於 Windows 上的 *winrar*。其名稱 *Tape Archive*(縮寫為 *tar*)幾乎概括了該實用程式的功能。*tar* 將獲取檔案並將它們放入存檔中,以方便邏輯處理。因此,我們可以將儲存在 /etc 中的數十個檔案“tar”成一個存檔,以便備份和儲存。
*tar* 多年來一直是 Unix 和 Linux 上儲存存檔檔案的標準。因此,將 *tar* 與 *gzip* 或 *bzip* 結合使用被認為是每個系統上存檔的最佳實踐。
以下是 *tar* 常用的常用命令列開關和選項列表 −
開關 | 操作 |
---|---|
-c | 建立一個新的 .tar 存檔 |
-C | 解壓到不同的目錄 |
-j | 使用 bzip2 壓縮 |
-z | 使用 gzip 壓縮 |
-v | 詳細顯示存檔進度 |
-t | 列出存檔內容 |
-f | 存檔的檔名 |
-x | 解壓 tar 存檔 |
以下是建立 *tar* 存檔的基本語法。
tar -cvf [tar archive name]
關於 tar 的壓縮機制的說明 − 建議在使用 tar 時堅持使用兩種常見的壓縮方案之一:gzip 和 bzip2。gzip 檔案消耗的 CPU 資源較少,但通常大小較大。雖然 bzip2 的壓縮時間較長,它們會使用更多的 CPU 資源;但最終檔案大小會更小。
使用檔案壓縮時,我們始終希望使用標準副檔名,讓包括我們在內的每個人都知道(而不是透過反覆試驗來猜測)需要什麼壓縮方案來解壓存檔。
bzip2 | .tbz |
bzip2 | .tar.tbz |
bzip2 | .tb2 |
gzip | .tar.gz |
gzip | .tgz |
如果需要可能在 Windows 機器上解壓存檔或在 Windows 上使用,建議使用 * .tar.tbz* 或 * .tar.gz*,因為大多數三個字元的單個副檔名會混淆 Windows 和僅限 Windows 的管理員(但是,這有時是預期的結果)
讓我們從 Mac 工作站複製的遠端備份建立一個 *gzipped* tar 存檔 −
[rdc@mint Documents]$ tar -cvz -f RemoteStuff.tgz ./RemoteStuff/ ./RemoteStuff/ ./RemoteStuff/.DS_Store ./RemoteStuff/DDWRT/ ./RemoteStuff/DDWRT/.DS_Store ./RemoteStuff/DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin ./RemoteStuff/DDWRT/ddwrt_mod_notes.docx ./RemoteStuff/DDWRT/factory-to-ddwrt.bin ./RemoteStuff/open_ldap_config_notes/ ./RemoteStuff/open_ldap_config_notes/ldap_directory_a.png ./RemoteStuff/open_ldap_config_notes/open_ldap_notes.txt ./RemoteStuff/perl_scripts/ ./RemoteStuff/perl_scripts/mysnmp.pl ./RemoteStuff/php_scripts/ ./RemoteStuff/php_scripts/chunked.php ./RemoteStuff/php_scripts/gettingURL.php ./RemoteStuff/A Guide to the WordPress REST API | Toptal.pdf ./RemoteStuff/Rick Cardon Tech LLC.webloc ./RemoteStuff/VeeamDiagram.png ./RemoteStuff/backbox-4.5.1-i386.iso ./RemoteStuff/dhcp_admin_script_update.py ./RemoteStuff/test_file.txt [rdc@mint Documents]$ ls -ld RemoteStuff.tgz -rw-rw-r--. 1 rdc rdc 2317140451 Mar 12 06:10 RemoteStuff.tgz
注意 − 我們沒有直接將所有檔案新增到存檔中,而是存檔了整個資料夾 *RemoteStuff*。這是最簡單的方法。因為解壓後,整個目錄 *RemoteStuff* 將與當前工作目錄中的所有檔案一起解壓為 *./currentWorkingDirectory/RemoteStuff/*
現在讓我們在 */root/* 主目錄中解壓存檔。
[root@centos ~]# tar -zxvf RemoteStuff.tgz ./RemoteStuff/ ./RemoteStuff/.DS_Store ./RemoteStuff/DDWRT/ ./RemoteStuff/DDWRT/.DS_Store ./RemoteStuff/DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin ./RemoteStuff/DDWRT/ddwrt_mod_notes.docx ./RemoteStuff/DDWRT/factory-to-ddwrt.bin ./RemoteStuff/open_ldap_config_notes/ ./RemoteStuff/open_ldap_config_notes/ldap_directory_a.png ./RemoteStuff/open_ldap_config_notes/open_ldap_notes.txt ./RemoteStuff/perl_scripts/ ./RemoteStuff/perl_scripts/mysnmp.pl ./RemoteStuff/php_scripts/ ./RemoteStuff/php_scripts/chunked.php ./RemoteStuff/php_scripts/gettingURL.php ./RemoteStuff/A Guide to the WordPress REST API | Toptal.pdf ./RemoteStuff/Rick Cardon Tech LLC.webloc ./RemoteStuff/VeeamDiagram.png ./RemoteStuff/backbox-4.5.1-i386.iso ./RemoteStuff/dhcp_admin_script_update.py ./RemoteStuff/test_file.txt [root@mint ~]# ping www.google.com
如上所示,所有檔案都只是解壓到當前工作目錄中的包含目錄中。
[root@centos ~]# ls -l total 2262872 -rw-------. 1 root root 1752 Feb 1 19:52 anaconda-ks.cfg drwxr-xr-x. 137 root root 8192 Mar 9 04:42 etc_baks -rw-r--r--. 1 root root 1800 Feb 2 03:14 initial-setup-ks.cfg drwxr-xr-x. 6 rdc rdc 4096 Mar 10 22:20 RemoteStuff -rw-r--r--. 1 root root 2317140451 Mar 12 07:12 RemoteStuff.tgz -rw-r--r--. 1 root root 9446 Feb 25 05:09 ssl.conf [root@centos ~]#
使用 gzip 壓縮檔案備份
如前所述,我們可以使用命令列開關 * -j* 或 * -z* 從 tar 中使用 bzip2 或 gzip。我們還可以使用 gzip 壓縮單個檔案。但是,單獨使用 bzip 或 gzip 並沒有提供與與 *tar* 結合使用時一樣多的功能。
使用 *gzip* 時,預設操作是刪除原始檔案,並用添加了 .gz 副檔名的壓縮版本替換每個原始檔案。
gzip 的一些常用命令列開關是 −
開關 | 操作 |
---|---|
-c | 放入存檔後保留檔案 |
-l | 獲取壓縮存檔的統計資訊 |
-r | 遞迴壓縮目錄中的檔案 |
-1 到 9 | 指定 1 到 9 級別的壓縮級別 |
*gzip* 或多或少基於逐個檔案進行工作,而不是像某些 Windows 作業系統 zip 實用程式那樣基於存檔進行工作。其主要原因是 *tar* 已經提供了高階存檔功能。*gzip* 的設計僅提供壓縮機制。
因此,想到 *gzip* 時,請考慮單個檔案。想到多個檔案時,請考慮 *tar* 存檔。現在讓我們透過之前的 *tar* 存檔來探索這一點。
注意 − 經驗豐富的 Linux 專業人員通常將 tar 存檔稱為 tarball(tar 包)。
讓我們從我們的 *rsync* 備份中建立另一個 *tar* 存檔。
[root@centos Documents]# tar -cvf RemoteStuff.tar ./RemoteStuff/ [root@centos Documents]# ls RemoteStuff.tar RemoteStuff/
為了演示,讓我們 *gzip* 新建立的 tarball,並告訴 *gzip* 保留舊檔案。預設情況下,如果沒有 * -c* 選項,gzip 將用 *.gz* 檔案替換整個 tar 存檔。
[root@centos Documents]# gzip -c RemoteStuff.tar > RemoteStuff.tar.gz [root@centos Documents]# ls RemoteStuff RemoteStuff.tar RemoteStuff.tar.gz We now have our original directory, our tarred directory and finally our gziped tarball.
讓我們嘗試使用 *gzip* 測試 * -l* 開關。
[root@centos Documents]# gzip -l RemoteStuff.tar.gz compressed uncompressed ratio uncompressed_name 2317140467 2326661120 0.4% RemoteStuff.tar [root@centos Documents]#
為了演示 *gzip* 與 Windows Zip 實用程式的不同之處,讓我們在文字檔案資料夾上執行 gzip。
[root@centos Documents]# ls text_files/ file1.txt file2.txt file3.txt file4.txt file5.txt [root@centos Documents]#
現在讓我們使用 -r 選項遞迴壓縮目錄中的所有文字檔案。
[root@centos Documents]# gzip -9 -r text_files/ [root@centos Documents]# ls ./text_files/ file1.txt.gz file2.txt.gz file3.txt.gz file4.txt.gz file5.txt.gz [root@centos Documents]#
看到?並非有些人預期的那樣。所有原始文字檔案都被刪除,每個檔案都被單獨壓縮。由於這種行為,最好只在需要處理單個檔案時考慮使用 *gzip*。
使用 *tarball*,讓我們將 *rsynced* tarball 解壓到新目錄。
[root@centos Documents]# tar -C /tmp -zxvf RemoteStuff.tar.gz ./RemoteStuff/ ./RemoteStuff/.DS_Store ./RemoteStuff/DDWRT/ ./RemoteStuff/DDWRT/.DS_Store ./RemoteStuff/DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin ./RemoteStuff/DDWRT/ddwrt_mod_notes.docx ./RemoteStuff/DDWRT/factory-to-ddwrt.bin ./RemoteStuff/open_ldap_config_notes/ ./RemoteStuff/open_ldap_config_notes/ldap_directory_a.png ./RemoteStuff/open_ldap_config_notes/open_ldap_notes.txt ./RemoteStuff/perl_scripts/ ./RemoteStuff/perl_scripts/mysnmp.pl ./RemoteStuff/php_scripts/ ./RemoteStuff/php_scripts/chunked.php
如上所示,我們將 tarball 解壓到 /tmp 目錄。
[root@centos Documents]# ls /tmp hsperfdata_root RemoteStuff
加密 Tarball 存檔
加密 tarball 存檔以儲存可能需要其他組織員工訪問的安全文件(例如災難恢復)可能是一個棘手的概念。基本上有三種方法可以做到這一點:使用 GnuPG,或使用 openssl,或使用第三方實用程式。
GnuPG 主要設計用於非對稱加密,並且考慮到身份關聯,而不是密碼短語。誠然,它可以與對稱加密一起使用,但這並不是 GnuPG 的主要優勢。因此,當需要多於原始人員訪問的人員(例如,可能需要保護公司經理免受管理員利用所有“王國鑰匙”作為槓桿的情況)時,我會不考慮使用 GnuPG 來儲存具有物理安全性的存檔。
像 GnuPG 一樣,openssl 可以做我們想做的事情,並且隨 CentOS 一起提供。但是,它並非專門設計用於實現我們想要的功能,並且加密在安全社群中受到質疑。
我們的選擇是一個名為 **7zip** 的實用程式。7zip 是一種類似於 *gzip* 的壓縮實用程式,但具有更多功能。與 Gnu Gzip 一樣,7zip 及其標準也在開源社群中。我們只需要從我們的 EHEL 儲存庫安裝 7zip(下一章將詳細介紹安裝擴充套件企業儲存庫)。
在 Centos 上安裝 7zip
一旦我們的 EHEL 儲存庫在 CentOS 中載入並配置,7zip 的安裝就非常簡單。
[root@centos Documents]# yum -y install p7zip.x86_64 p7zip-plugins.x86_64 Loaded plugins: fastestmirror, langpacks base | 3.6 kB 00:00:00 epel/x86_64/metalink | 13 kB 00:00:00 epel | 4.3 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 (1/2): epel/x86_64/updateinfo | 756 kB 00:00:04 (2/2): epel/x86_64/primary_db | 4.6 MB 00:00:18 Loading mirror speeds from cached hostfile --> Running transaction check ---> Package p7zip.x86_64 0:16.02-2.el7 will be installed ---> Package p7zip-plugins.x86_64 0:16.02-2.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved
就這麼簡單,7zip 已安裝並可以使用 256 位 AES 加密來加密我們的 tarball 存檔。
現在讓我們使用 7z 使用密碼加密我們的 gzip 存檔。執行此操作的語法非常簡單 −
7z a -p <output filename><input filename>
其中,**a:** 新增到存檔,**-p:** 加密並提示輸入密碼
[root@centos Documents]# 7z a -p RemoteStuff.tgz.7z RemoteStuff.tar.gz 7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R) Core(TM) i5-4278U CPU @ 2.60GHz (40651),ASM,AES-NI) Scanning the drive: 1 file, 2317140467 bytes (2210 MiB) Creating archive: RemoteStuff.tgz.7z Items to compress: 1 Enter password (will not be echoed): Verify password (will not be echoed) : Files read from disk: 1 Archive size: 2280453410 bytes (2175 MiB) Everything is Ok [root@centos Documents]# ls RemoteStuff RemoteStuff.tar RemoteStuff.tar.gz RemoteStuff.tgz.7z slapD text_files [root@centos Documents]#
現在,我們有一個 .7z 壓縮包,它使用 256 位 AES 加密 gzip 壓縮的 tar 包。
注意 − 7zip 使用 256 位 AES 加密,並使用密碼的 SHA-256 雜湊值和計數器,重複最多 512K 次進行金鑰派生。如果使用複雜的金鑰,這應該足夠安全。
對於較大的壓縮包,加密和重新壓縮歸檔檔案的過程可能需要一些時間。
7zip 是一款高階工具,功能比 gzip 或 bzip2 更強大。但是,它在 CentOS 或 Linux 世界中並不像其他工具那樣標準。因此,應儘可能多地使用其他實用程式。
Linux 管理員 - 系統更新
CentOS 7 系統可以透過三種方式更新:
- 手動
- 自動
- 手動更新主要安全問題並配置自動更新
在生產環境中,建議手動更新生產伺服器。或者至少制定一個更新計劃,以便管理員可以確保對業務運營至關重要的服務。
簡單的安全更新可能會導致常用應用程式出現遞迴問題,這需要管理員進行升級和重新配置。因此,在生產環境中安排自動更新之前,請務必先在開發伺服器和桌面進行測試。
手動更新 CentOS 7
要更新 CentOS 7,我們需要熟悉 `yum` 命令。`yum` 用於處理 CentOS 7 中的軟體包儲存庫。`yum` 是通常用於執行以下操作的工具:
- 更新 CentOS 7 Linux 系統
- 搜尋軟體包
- 安裝軟體包
- 檢測並安裝軟體包所需的依賴項
為了使用 `yum` 進行更新,您的 CentOS 伺服器需要連線到網際網路。大多數配置將安裝基本系統,然後使用 `yum` 查詢主要的 CentOS 儲存庫以獲取軟體包中的其他功能並應用系統更新。
我們已經使用 `yum` 安裝了一些軟體包。使用 `yum` 時,始終需要以 root 使用者身份執行操作。或者具有 root 許可權的使用者。
[root@centos rdc]# yum search nano Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.rackspace.com * epel: mirror.chpc.utah.edu * extras: repos.forethought.net * updates: repos.forethought.net ====================================================================== N/S matched: nano ====================================================================== nano.x86_64 : A small text editor nodejs-nano.noarch : Minimalistic couchdb driver for Node.js perl-Time-Clock.noarch : Twenty-four hour clock object with nanosecond precision Name and summary matches only, use "search all" for everything. [root@centos rdc]#
現在,讓我們安裝 `nano` 文字編輯器。
[root@centos rdc]# yum install nano Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.keystealth.org * epel: pubmirror1.math.uh.edu * extras: centos.den.host-engine.com * updates: repos.forethought.net Resolving Dependencies --> Running transaction check ---> Package nano.x86_64 0:2.3.1-10.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: nano x86_64 2.3.1-10.el7 base 440 k Transaction Summary Install 1 Package Total download size: 440 k Installed size: 1.6 M Is this ok [y/d/N]: y Downloading packages: nano-2.3.1-10.el7.x86_64.rpm | 440 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : nano-2.3.1-10.el7.x86_64 1/1 Verifying : nano-2.3.1-10.el7.x86_64 1/1 Installed: nano.x86_64 0:2.3.1-10.el7 Complete! [root@centos rdc]#
我們已經安裝了 nano 文字編輯器。我認為,這種方法比在網站上搜索實用程式並手動執行安裝程式要容易得多。此外,儲存庫使用數字簽名來驗證軟體包,確保它們來自受信任的來源。當信任新的儲存庫時,管理員有責任驗證其真實性。這就是為什麼建議謹慎對待第三方儲存庫的原因。
Yum 也可以用來刪除軟體包。
[root@centos rdc]# yum remove nano Loaded plugins: fastestmirror, langpacks Resolving Dependencies --> Running transaction check ---> Package nano.x86_64 0:2.3.1-10.el7 will be erased --> Finished Dependency Resolution Dependencies Resolved
現在讓我們檢查更新。
[root@centos rdc]# yum list updates Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.keystealth.org * epel: pubmirror1.math.uh.edu * extras: centos.den.host-engine.com * updates: repos.forethought.net Updated Packages NetworkManager.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-adsl.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-glib.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-libnm.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-team.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-tui.x86_64 1:1.4.0-17.el7_3 updates NetworkManager-wifi.x86_64 1:1.4.0-17.el7_3 updates audit.x86_64 2.6.5-3.el7_3.1 updates audit-libs.x86_64 2.6.5-3.el7_3.1 updates audit-libs-python.x86_64
如所示,我們有幾十個更新等待安裝。實際上,由於我們尚未配置自動更新,因此大約有 100 個更新。因此,讓我們安裝所有掛起的更新。
[root@centos rdc]# yum update Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.usc.edu * epel: pubmirror1.math.uh.edu * extras: repos.forethought.net * updates: repos.forethought.net Resolving Dependencies --> Running transaction check ---> Package NetworkManager.x86_64 1:1.4.0-14.el7_3 will be updated ---> Package NetworkManager.x86_64 1:1.4.0-17.el7_3 will be an update selinux-policy noarch 3.13.1102.el7_3.15 updates 414 k selinux-policy-targeted noarch 3.13.1102.el7_3.15 updates 6.4 M systemd x86_64 21930.el7_3.7 updates 5.2 M systemd-libs x86_64 21930.el7_3.7 updates 369 k systemd-python x86_64 21930.el7_3.7 updates 109 k systemd-sysv x86_64 21930.el7_3.7 updates 63 k tcsh x86_64 6.18.01-13.el7_3.1 updates 338 k tzdata noarch 2017a1.el7 updates 443 k tzdata-java noarch 2017a1.el7 updates 182 k wpa_supplicant x86_64 1:2.021.el7_3 updates 788 k Transaction Summary =============================================================================== Install 2 Packages Upgrade 68 Packages Total size: 196 M Total download size: 83 M Is this ok [y/d/N]:
按下“y”鍵後,CentOS 7 的更新將開始。`yum` 更新時通常會經歷以下過程:
- 檢查當前軟體包
- 在儲存庫中查詢更新的軟體包
- 計算更新的軟體包所需的依賴項
- 下載更新
- 安裝更新
現在,讓我們確保我們的系統是最新的:
[root@centos rdc]# yum list updates Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * updates: mirror.compevo.com [root@centos rdc]#
如您所見,沒有列出任何更新。
配置 YUM 的自動更新
如前所述,在企業環境中,自動更新可能不是首選的安裝方法。讓我們來看一下使用 yum 配置自動更新的步驟。
首先,我們安裝一個名為 `yum-cron` 的軟體包。
[root@centos rdc]# yum -y install yum-cron Install 1 Package Total download size: 61 k Installed size: 51 k Downloading packages: yum-cron-3.4.3-150.el7.centos.noarch.rpm | 61 kB 00:00:01 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : yum-cron-3.4.3-150.el7.centos.noarch 1/1 Verifying : yum-cron-3.4.3-150.el7.centos.noarch 1/1 Installed: yum-cron.noarch 0:3.4.3-150.el7.centos Complete! [root@centos rdc]#
預設情況下,`yum-cron` 只下載更新,而不安裝它們。是否自動安裝更新取決於管理員。最大的問題是:有些更新需要重新啟動系統。此外,有些更新可能需要在服務再次執行之前進行配置更改。
更新依賴項可能會在以下情況下導致遞迴問題:
yum 建議更新某個庫
該庫只支援 Apache 伺服器 2.4,但我們有 2.3 伺服器
我們的電子商務網站依賴於特定版本的 PHP
為該庫安裝的新版 Apache 需要升級 PHP
我們的生產 Web 應用程式尚未在新版 PHP 版本上進行測試
除非配置為不這樣做,否則 yum 可能會在未經通知的情況下自動升級 Apache 和 PHP。
如果所有 5 種情況都發生,可能會導致從早上的一場大麻煩到可能危及使用者資料的安全漏洞。雖然上述示例是一種完美的風暴,但我們永遠不想發生這種情況。
管理員需要評估由於更新重新引導和重新配置導致的可能服務停機時間而造成的潛在收入損失的情況。對於每天數百萬美元的電子商務網站來說,這種做法可能不夠保守。
現在讓我們配置 `yum-cron` 以自動安裝系統更新。
[root@centos rdc]# vim /etc/yum/yum-cron.conf # Whether updates should be applied when they are available. Note # that download_updates must also be yes for the update to be applied. apply_updates = yes
我們要將 `apply_updates = no` 更改為 `apply_updates = yes`。現在讓我們配置 `yum-cron` 的更新間隔。
同樣,是否使用自動更新並根據需要安裝更新可能是一把雙刃劍,管理員需要針對每種獨特情況進行考慮。
Linux 管理員 - Shell 指令碼
Bash Shell 簡介
與 GNU Linux 的各種發行版一樣,shell 也有多種型別,並且相容性各不相同。CentOS 中的預設 shell 稱為 Bash 或 Bourne Again Shell。Bash shell 是 Stephen Bourne 開發的現代修改版 Bourne Shell。Bash 直接取代了 Ken Thompson 和 Dennis Ritchie 在貝爾實驗室開發的 Unix 作業系統上的原始 Thompson Shell(Stephen Bourne 也是貝爾實驗室的僱員)。
每個人都有自己喜歡的 shell,每個 shell 都有其優點和缺點。但在大多數情況下,Bash 將成為所有 Linux 發行版中的預設 shell,並且是最常用的。隨著經驗的積累,每個人都希望探索和使用最適合自己的 shell。但與此同時,每個人也都希望掌握 Bash shell。
其他 Linux shell 包括:Tcsh、Csh、Ksh、Zsh 和 Fish。
掌握任何 Linux shell 的專業技能對於 CentOS 管理員來說極其重要。正如我們前面提到的,與 Windows 不同,Linux 本質上是一個命令列作業系統。shell 只是一種使用者介面,允許管理員(或使用者)向作業系統發出命令。如果 Linux 系統管理員是一位航空公司飛行員,那麼使用 shell 就類似於將飛機從自動駕駛儀上移開並抓住手動控制裝置以進行更靈活的飛行。
Linux shell(如 Bash)在計算機科學術語中被稱為命令列直譯器。Microsoft Windows 也有兩個命令列直譯器,稱為 DOS(不要與原始 DOS 作業系統混淆)和 PowerShell。
大多數現代 shell(如 Bash)都提供結構,允許更復雜的shell 指令碼來自動執行常見和複雜的任務。
結構包括:
- 指令碼流程控制(ifthen 和 else)
- 邏輯比較運算(大於、小於、等於)
- 迴圈
- 變數
- 定義操作的引數(類似於命令的開關)
使用 Shell 指令碼與指令碼語言
在考慮執行任務時,管理員經常會問自己:我應該使用 shell 指令碼還是使用 Perl、Ruby 或 Python 等指令碼語言?
這裡沒有固定的規則。shell 與指令碼語言之間只有典型的區別。
Shell
Shell 允許使用 Linux 命令,例如 `sed`、`grep`、`tee`、`cat` 和 Linux 作業系統上的所有其他基於命令列的實用程式。事實上,幾乎任何基於命令列的 Linux 實用程式都可以在您的 shell 中編寫指令碼。
使用 shell 的一個很好的例子是快速指令碼,用於檢查主機列表的 DNS 解析。
我們簡單的 Bash 指令碼用於檢查 DNS 名稱:
#!/bin/bash for name in $(cat $1); do host $name.$2 | grep "has address" done exit
用於測試 DNS 解析的小型詞表:
dns www test dev mail rdp remote
針對 google.com 域的輸出:
[rdc@centos ~]$ ./dns-check.sh dns-names.txt google.com -doing dns dns.google.com has address 172.217.6.46 -doing www www.google.com has address 172.217.6.36 -doing test -doing dev -doing mail googlemail.l.google.com has address 172.217.6.37 -doing rdp -doing remote [rdc@centos ~]$
利用 shell 中簡單的 Linux 命令,我們能夠建立一個簡單的 5 行指令碼,用於稽核來自詞表的 DNS 名稱。即使使用良好實現的 DNS 庫,這在 Perl、Python 或 Ruby 中也需要相當長的時間。
指令碼語言
指令碼語言將提供 shell 之外的更多控制。上述 Bash 指令碼使用了 Linux `host` 命令的包裝器。如果我們想做更多的事情並建立我們自己的類似於 `host` 的應用程式來與 shell 之外進行互動呢?這就是我們將使用指令碼語言的地方。
此外,使用維護良好的指令碼語言,我們知道我們的操作在大多數情況下可以在不同的系統上執行。例如,Python 3.5 將在執行 Python 3.5 並安裝相同庫的任何其他系統上執行。但是,如果我們想在 Linux 和 HP-UX 上執行我們的 BASH 指令碼,情況就不是這樣了。
有時,指令碼語言和強大的 shell 之間的界限可能會模糊。可以使用 Python、Perl 或 Ruby 自動執行 CentOS Linux 管理任務。這樣做實際上非常普遍。此外,熟練的 shell 指令碼開發人員已經在 Bash 中建立了一個簡單但功能完善的 Web 伺服器守護程式。
在掌握了指令碼語言和在 shell 中自動執行任務的經驗後,CentOS 管理員將能夠快速確定在需要解決問題時從哪裡開始。通常情況下,專案是從 shell 指令碼開始的。然後隨著專案的複雜性增加,再轉向指令碼(或編譯)語言。
此外,可以使用指令碼語言和 shell 指令碼完成專案的不同部分。一個例子可能是使用 Perl 指令碼抓取網站。然後,使用 shell 指令碼使用 `sed`、`awk` 和 `egrep` 進行解析和格式化。最後,使用 PHP 指令碼透過 Web GUI 將格式化後的資料插入 MySQL 資料庫。
在瞭解了 shell 的一些理論之後,讓我們開始學習從 CentOS 的 Bash shell 自動執行任務的基本構建塊。
輸入輸出和重定向
將標準輸出處理到另一個命令:
[rdc@centos ~]$ cat ~/output.txt | wc -l 6039 [rdc@centos ~]$
上面,我們將 `cat` 的標準輸出傳遞給 `wc` 進行處理,使用管道字元。`wc` 然後處理 `cat` 的輸出,將 output.txt 的行數列印到終端。將管道字元視為將一個命令的輸出傳遞給下一個命令的“管道”。
以下是處理命令重定向時需要記住的關鍵概念:
編號 | 檔案描述符 | 字元 |
---|---|---|
0 | 標準輸入 | < |
1 | 標準輸出 | > |
2 | 標準錯誤 | |
追加標準輸出 | >> | |
分配重定向 | & | |
將標準輸出透過管道傳輸到標準輸入 | | |
我們在第一章中介紹了這個概念,但並沒有過多討論重定向或重定向的分配。在 Linux 中開啟終端時,你的 shell 被視為預設目標 -
- 標準輸入 < 0
- 標準輸出 > 1
- 標準錯誤 2
讓我們看看它是如何工作的 -
[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2 COMMAND PID USER **FD** TYPE DEVICE SIZE/OFF NODE NAME bash 13684 rdc **0u** CHR 136,0 0t0 3 /dev/pts/0 bash 13684 rdc **1u** CHR 136,0 0t0 3 /dev/pts/0 bash 13684 rdc **2u** CHR 136,0 0t0 3 /dev/pts/0 [rdc@centos ~]$
/dev/pts/0 是我們的偽終端。CentOS Linux 會檢視它,並將我們開啟的終端應用程式視為一個真正的終端,其鍵盤和顯示器透過序列介面連線。但是,就像 hypervisor 將硬體抽象到作業系統一樣,/dev/pts 將我們的終端抽象到應用程式。
從上面的 lsof 命令中,我們可以看到在 **FD** 列中,所有三個檔案描述符都設定為我們的虛擬終端 (0,1,2)。現在我們可以傳送命令、檢視命令輸出以及與命令相關的任何錯誤。
以下是 STDIN 和 STDOUT 的示例 -
STDOUT
[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." > output.txt && cat output.txt I am coming from Standard output or STDOUT. [root@centosLocal centos]#
也可以將 stdout 和 stderr 傳送到不同的檔案 -
bash-3.2# find / -name passwd 1> good.txt 2> err.txt bash-3.2# cat good.txt /etc/pam.d/passwd /etc/passwd bash-3.2# cat err.txt find: /dev/fd/3: Not a directory find: /dev/fd/4: Not a directory bash-3.2#
在搜尋整個檔案系統時,遇到兩個錯誤。每個錯誤都被髮送到單獨的檔案以供以後檢視,而返回的結果則被放置到一個單獨的文字檔案中。
在執行向終端輸出大量資料的操作(例如編譯應用程式)時,將 stderr 傳送到文字檔案非常有用。這允許檢視可能因終端滾動歷史記錄而丟失的錯誤。
將 STDOUT 傳遞到文字檔案時需要注意一點,那就是 **>>** 和 **>** 之間的區別。雙“>>”將追加到檔案,而單數形式將覆蓋檔案並寫入新內容(因此所有先前的資料都將丟失)。
STDIN
[root@centosLocal centos]# cat < stdin.txt Hello, I am being read form Standard input, STDIN. [root@centosLocal centos]#
在上面的命令中,文字檔案 stdin.txt 被重定向到 cat 命令,該命令將其內容回顯到 STDOUT。
管道字元 "|"
管道字元將獲取第一個命令的輸出,將其作為輸入傳遞到下一個命令,允許第二個命令對輸出執行操作。
現在,讓我們將 cat 的 stdout “管道”到另一個命令 -
[root@centosLocal centos]# cat output.txt | wc -l 2 [root@centosLocal centos]#
上面,wc 對從管道傳遞的 cat 的輸出執行計算。管道命令在過濾 grep 或 egrep 的輸出時特別有用 -
[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l 9000 [root@centosLocal centos]#
在上面的命令中,我們將每個 4 位數字從包含 65535 到所有數字的文字檔案(透過 egrep 過濾器傳遞)傳遞到 wc。
使用 & 重定向輸出
可以使用 **&** 字元重定向輸出。如果我們想將 STDOUT 和 STDERR 的輸出都重定向到同一個檔案,則可以按如下方式完成 -
[root@centosLocal centos]# find / -name passwd > out.txt 2>&1 [root@centosLocal centos]# cat out.txt find: /dev/fd/3: Not a directory find: /dev/fd/4: Not a directory /etc/passwd [root@centosLocal centos]#
使用 **&** 字元進行重定向的工作原理如下:首先,輸出被重定向到 out.txt。其次,STDERR 或檔案描述符 2 被重新分配到與 STDOUT 相同的位置,在本例中為 out.txt。
重定向非常有用,在解決處理大型文字檔案、編譯原始碼、重定向 shell 指令碼中的輸出以及發出複雜的 Linux 命令時遇到的問題時非常方便。
雖然功能強大,但對於較新的 CentOS 管理員來說,重定向可能會變得很複雜。練習、研究和偶爾向 Linux 論壇(例如 Stack Overflow Linux)提問將有助於解決高階問題。
Bash Shell 結構
現在我們已經很好地瞭解了 Bash shell 的工作原理,讓我們學習一些常用的基本結構來編寫指令碼。在本節中,我們將探討 -
BASH 故障排除提示
與專用指令碼語言相比,BASH 可能有點棘手。BASH 指令碼中最大的障礙之一是錯誤轉義或未轉義傳遞到 shell 的指令碼操作。如果你已經檢查過指令碼幾次,但它沒有按預期工作,請不要擔心。即使對於那些每天使用 BASH 建立複雜指令碼的人來說,這也是很常見的。
快速搜尋 Google 或註冊專家 Linux 論壇提問將很快得到解決。很有可能有人遇到過完全相同的問題,並且它已經被解決了。
BASH 指令碼是一種快速建立強大指令碼的絕佳方法,這些指令碼可用於從自動化管理任務到建立有用工具的一切用途。成為一名專家級的 BASH 指令碼開發者需要時間和實踐。因此,儘可能使用 BASH 指令碼,它是 CentOS 管理工具箱中的一款強大工具。
Linux 管理員 - 包管理
CentOS 中的包管理可以透過兩種方式執行:從終端和從圖形使用者介面。
CentOS 管理員的大部分時間往往都用於使用終端。更新和安裝 CentOS 包也不例外。考慮到這一點,我們將首先探討終端中的包管理,然後觸及使用 CentOS 提供的圖形包管理工具。
YUM 包管理器
YUM 是 CentOS 中提供的包管理工具。我們在前幾章中簡要介紹了這個主題。在本章中,我們將從乾淨的 CentOS 安裝開始。我們將首先完全更新我們的安裝,然後安裝一個應用程式。
YUM 極大地促進了 Linux 中的軟體安裝和管理。YUM 會“自動”檢查過時的依賴項以及過時的包。與從原始碼編譯每個應用程式的舊時代相比,這確實減輕了 CentOS 管理員的負擔。
yum check-update
檢查可以更新的包。在本教程中,我們將假設這是一個將面向網際網路的生產系統,沒有任何需要在升級包之前由 DevOps 測試的生產應用程式。現在讓我們將更新的候選包安裝到系統中。
[root@localhost rdc]# yum check-update Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu NetworkManager.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-adsl.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-glib.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-libnm.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-team.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-tui.x86_64 1:1.4.0-19.el7_3 updates NetworkManager-wifi.x86_64 1:1.4.0-19.el7_3 updates audit.x86_64 2.6.5-3.el7_3.1 updates vim-common.x86_64 2:7.4.160-1.el7_3.1 updates vim-enhanced.x86_64 2:7.4.160-1.el7_3.1 updates vim-filesystem.x86_64 2:7.4.160-1.el7_3.1 updates vim-minimal.x86_64 2:7.4.160-1.el7_3.1 updates wpa_supplicant.x86_64 1:2.0-21.el7_3 updates xfsprogs.x86_64 4.5.0-9.el7_3 updates [root@localhost rdc]#
yum update
這將安裝所有更新的候選包,使您的 CentOS 安裝保持最新。對於新安裝,這可能需要一些時間,具體取決於您的安裝和網際網路連線速度。
[root@localhost rdc]# yum update vim-minimal x86_64 2:7.4.160-1.el7_3.1 updates 436 k wpa_supplicant x86_64 1:2.0-21.el7_3 updates 788 k xfsprogs x86_64 4.5.0-9.el7_3 updates 895 k Transaction Summary ====================================================================================== Install 2 Packages Upgrade 156 Packages Total download size: 371 M Is this ok [y/d/N]:
透過 YUM 安裝軟體
除了更新 CentOS 系統外,YUM 包管理器是我們安裝軟體的首選工具。從網路監控工具、影片播放器到文字編輯器,都可以透過 YUM 從中央儲存庫安裝。
在安裝一些軟體實用程式之前,讓我們看看一些 YUM 命令。對於日常工作,CentOS 管理員 90% 的 YUM 使用量大約是 7 個命令。我們將介紹每一個命令,希望能夠熟悉在日常使用中熟練操作 YUM。但是,像大多數 Linux 實用程式一樣,YUM 提供了豐富的先進功能,始終可以透過手冊頁進行探索。使用 man yum 將始終是使用任何 Linux 實用程式執行不熟悉操作的第一步。
最常用的 YUM 命令
以下是常用的 YUM 命令。
命令 | 操作 |
---|---|
list installed | 列出透過 YUM 安裝的包 |
list all | 列出所有當前可用的包 |
group list | 列出分組的包 |
info | 提供有關包的詳細資訊 |
search | 搜尋包描述和名稱 |
install | 安裝包 |
localinstall | 安裝本地 rpm 包 |
remove | 刪除和安裝包 |
clean all | 清除 /var/cache/yum 以釋放磁碟空間 |
man yum | 像所有 linux 命令一樣,幫助檔案 |
使用 YUM 安裝軟體
我們現在將安裝一個名為 Lynx 的基於文字的 Web 瀏覽器。在安裝之前,我們必須首先獲取包含 Lynx Web 瀏覽器的包名稱。我們甚至不能 100% 確定我們的預設 CentOS 儲存庫是否提供 Lynx Web 瀏覽器的包,所以讓我們搜尋一下 -
[root@localhost rdc]# yum search web browser Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu ================================================================= N/S matched: web, browser ================================================================== icedtea-web.x86_64 : Additional Java components for OpenJDK - Java browser plug-in and Web Start implementation elinks.x86_64 : A text-mode Web browser firefox.i686 : Mozilla Firefox Web browser firefox.x86_64 : Mozilla Firefox Web browser lynx.x86_64 : A text-based Web browser Full name and summary matches only, use "search all" for everything. [root@localhost rdc]#
我們看到,CentOS 確實在儲存庫中提供了 Lynx Web 瀏覽器。讓我們看看有關該包的更多資訊。
[root@localhost rdc]# lynx.x86_64 bash: lynx.x86_64: command not found... [root@localhost rdc]# yum info lynx.x86_64 Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu Available Packages Name : lynx Arch : x86_64 Version : 2.8.8 Release : 0.3.dev15.el7 Size : 1.4 M Repo : base/7/x86_64 Summary : A text-based Web browser URL : http://lynx.isc.org/ License : GPLv2 Description : Lynx is a text-based Web browser. Lynx does not display any images, : but it does support frames, tables, and most other HTML tags. One : advantage Lynx has over graphical browsers is speed; Lynx starts and : exits quickly and swiftly displays web pages. [root@localhost rdc]#
很好!2.8 版本足夠新,所以讓我們安裝 Lynx。
[root@localhost rdc]# yum install lynx Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu Resolving Dependencies --> Running transaction check ---> Package lynx.x86_64 0:2.8.8-0.3.dev15.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved =============================================================================== =============================================================================== Package Arch Version Repository Size =============================================================================== =============================================================================== Installing: lynx x86_64 2.8.80.3.dev15.el7 base 1.4 M Transaction Summary =============================================================================== =============================================================================== Install 1 Package Total download size: 1.4 M Installed size: 5.4 M Is this ok [y/d/N]: y Downloading packages: No Presto metadata available for base lynx-2.8.8-0.3.dev15.el7.x86_64.rpm | 1.4 MB 00:00:10 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : lynx-2.8.8-0.3.dev15.el7.x86_64 1/1 Verifying : lynx-2.8.8-0.3.dev15.el7.x86_64 1/1 Installed: lynx.x86_64 0:2.8.8-0.3.dev15.el7 Complete! [root@localhost rdc]#
接下來,讓我們確保 Lynx 確實正確安裝了。
[root@localhost rdc]# yum list installed | grep -i lynx lynx.x86_64 2.8.8-0.3.dev15.el7 @base [root@localhost rdc]#
太棒了!讓我們使用 Lynx 並看看沒有“點贊”和漂亮圖片的網路是什麼樣的。
[root@localhost rdc]# lynx www.tutorialpoint.in
太好了,現在我們有一個用於生產伺服器的 Web 瀏覽器,可以在無需過多擔心透過網路啟動的遠端攻擊的情況下使用。這對生產伺服器來說是一件好事。
我們快完成了,但是首先我們需要為開發人員設定此伺服器以測試應用程式。因此,讓我們確保他們擁有完成工作所需的所有工具。我們可以單獨安裝所有內容,但 CentOS 和 YUM 使此過程快得多。讓我們安裝 開發人員組包。
[root@localhost rdc]# yum groups list Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu Available Groups: Compatibility Libraries Console Internet Tools Development Tools Graphical Administration Tools Legacy UNIX Compatibility Scientific Support Security Tools Smart Card Support System Administration Tools System Management Done [root@localhost rdc]#
這是 CentOS 提供的較小的包組列表。讓我們看看“開發組”中包含什麼。
[root@localhost rdc]# yum group info "Development Tools" Loaded plugins: fastestmirror, langpacks There is no installed groups file. Maybe run: yum groups mark convert (see man yum) Loading mirror speeds from cached hostfile * base: mirror.scalabledns.com * extras: mirror.scalabledns.com * updates: mirror.clarkson.edu Group: Development Tools Group-Id: development Description: A basic development environment. Mandatory Packages: autoconf automake binutils bison
輸出的第一屏如上所示。整個列表相當全面。但是,隨著時間的推移,通常需要完整安裝此組。讓我們安裝整個開發組。
[root@localhost rdc]# yum groupinstall "Development Tools"
這將是一個較大的安裝。完成後,您的伺服器將擁有大多數 Perl、Python、C 和 C++ 的開發庫和編譯器。
CentOS 中的圖形化包管理
Gnome 桌面提供了一個名為 Software 的圖形化包管理工具。它非常易於使用且簡單明瞭。CentOS 的 Gnome 包管理工具 Software 可以透過導航到:應用程式 → 系統工具 → Software 來找到。
軟體包管理工具分為幾組,允許管理員選擇要安裝的包。雖然此工具非常易於使用,並且對於終端使用者來說非常簡單,但 YUM 功能更強大,管理員可能會更多地使用它。
以下是軟體包管理工具的螢幕截圖,並非真正為系統管理員設計。

Linux 管理員 - 卷管理
邏輯卷管理 (LVM) 是 Linux 用於跨不同物理硬碟管理儲存卷的一種方法。這與 RAID 不同,但其概念類似於 RAID 0 或 J-Bod。使用 LVM,可以(例如)擁有三個各為 1TB 的物理磁碟,然後建立一個大約 3TB 的邏輯卷,例如 /dev/sdb。甚至可以建立兩個 1.5TB 的邏輯卷,五個 500GB 的邏輯卷,或者任何組合。單個磁碟甚至可以用於邏輯卷的快照。
注意 − 正確配置後,使用邏輯卷實際上會提高磁碟 I/O 效能。這與 RAID 0 將資料跨多個磁碟條帶化的方式類似。
學習使用 LVM 進行卷管理時,如果我們知道 LVM 中每個元件是什麼,就會更容易。請學習下表以全面掌握每個元件。如有需要,請使用 Google 搜尋學習。瞭解邏輯卷的每個部分對於管理它們非常重要。
PV | 物理卷 | sda |
PP | 物理分割槽 | sda1 , sda2 |
VG | 卷組 | 合併的物理資源 |
LV | 邏輯卷 | 對作業系統來說是一個儲存裝置 |
物理卷 將顯示為 /dev/sda、/dev/sdb;Linux 檢測到的物理磁碟。
物理分割槽 將是磁碟實用程式(如 fdisk)分割槽的一段磁碟。請記住,在大多數常見的 LVM 設定中不推薦使用物理分割槽。示例:磁碟 /dev/sda 分割槽為包含兩個物理分割槽:/dev/sda1 和 /dev/sda1
如果我們有兩個各為 1TB 的物理磁碟,我們可以在這兩個磁碟之間建立一個近 2TB 的卷組。
從卷組中,我們可以建立三個邏輯卷,每個邏輯卷的大小不超過卷組的總大小。
傳統的 Linux 磁碟管理工具
在瞭解 CentOS 7 中用於 LVM 管理的最新最佳功能工具之前,我們應該首先探索用於 Linux 磁碟管理的更傳統工具。這些工具將會派上用場,並且仍然可以與當今的先進 LVM 工具(如系統儲存管理器 - lsblk、parted 和 mkfs.xfs)一起使用。
現在,假設我們向系統添加了另一個或兩個磁碟,我們需要列舉 Linux 檢測到的磁碟。我始終建議在執行被認為是破壞性操作之前每次都列舉磁碟。lsblk 是獲取磁碟資訊的絕佳工具。讓我們看看 CentOS 檢測到哪些磁碟。
[root@localhost rdc]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─cl-root 253:0 0 17G 0 lvm / └─cl-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 6G 0 disk sdc 8:32 0 4G 0 disk sr0 11:0 1 1024M 0 rom
如您所見,此係統上有三個磁碟:sda、sdb 和 sdc。
磁碟 sda 包含我們正在使用的 CentOS 安裝,因此我們不想隨意操作 sda。sdb 和 sdc 都是為此教程新增到系統的。讓我們使這些磁碟對 CentOS 可用。
建立磁碟標籤
[root@localhost rdc]# parted /dev/sdb mklabel GPT Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue? Yes/No? Yes [root@localhost rdc]#
我們現在已經標記了一個磁碟。只需以相同的方式在 sdc 上執行 parted 命令。
建立磁碟分割槽
我們每個磁碟只建立一個分割槽。要建立分割槽,再次使用 parted 命令。
[root@localhost rdc]# parted -a opt /dev/sdb mkpart primary ext4 0% 100%
警告 − 您請求從 0.00B 到 6442MB(扇區 0..12582911)的分割槽。
我們可以管理的最接近的位置是 17.4kB 到 1048kB(扇區 34..2047)。
您仍然接受嗎?
是/否?否
[root@localhost rdc]# parted -a opt /dev/sdc mkpart primary ext4 0% 100%
資訊 − 您可能需要更新 /etc/fstab。
[root@localhost rdc]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part / boot └─sda2 8:2 0 19G 0 part ├─cl-root 253:0 0 17G 0 lvm / └─cl-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 6G 0 disk └─sdb1 8:17 0 6G 0 part sdc 8:32 0 4G 0 disk └─sdc1 8:33 0 4G 0 part sr0 11:0 1 1024M 0 rom [root@localhost rdc]#
從 lsblk 輸出可以看出,我們現在有兩個分割槽,每個分割槽都在 sdb 和 sdc 上。
建立檔案系統
最後,在掛載和使用任何卷之前,我們需要新增一個檔案系統。我們將使用 XFS 檔案系統。
root@localhost rdc]# mkfs.xfs -f /dev/sdb1 meta-data = /dev/sdb1 isize = 512 agcount = 4, agsize = 393088 blks = sectsz = 512 attr = 2, projid32bit = 1 = crc = 1 finobt = 0, sparse = 0 data = bsize = 4096 blocks = 1572352, imaxpct = 25 = sunit = 0 swidth = 0 blks naming = version 2 bsize = 4096 ascii-ci = 0 ftype = 1 log = internal log bsize = 4096 blocks = 2560, version = 2 = sectsz = 512 sunit = 0 blks, lazy-count = 1 realtime = none extsz = 4096 blocks = 0, rtextents = 0 [root@localhost rdc]# mkfs.xfs -f /dev/sdc1 meta-data = /dev/sdc1 isize = 512 agcount = 4, agsize = 262016 blks = sectsz = 512 attr = 2, projid32bit = 1 = crc = 1 finobt = 0, sparse = 0 data = bsize = 4096 blocks = 1048064, imaxpct = 25 = sunit = 0 swidth = 0 blks naming = version 2 bsize = 4096 ascii-ci = 0 ftype = 1 log = internal log bsize = 4096 blocks = 2560, version = 2 = sectsz = 512 sunit = 0 blks, lazy-count = 1 realtime = none extsz = 4096 blocks = 0, rtextents = 0 [root@localhost rdc]#
讓我們檢查一下每個檔案系統是否可用。
[root@localhost rdc]# lsblk -o NAME,FSTYPE NAME FSTYPE sda ├─sda1 xfs └─sda2 LVM2_member ├─cl-root xfs └─cl-swap swap sdb └─sdb1 xfs sdc └─sdc1 xfs sr0 [root@localhost rdc]#
每個現在都使用 XFS 檔案系統。讓我們掛載它們,檢查掛載點,並將檔案複製到每個掛載點。
[root@localhost rdc]# mount -o defaults /dev/sdb1 /mnt/sdb [root@localhost rdc]# mount -o defaults /dev/sdc1 /mnt/sdc [root@localhost ~]# touch /mnt/sdb/myFile /mnt/sdc/myFile [root@localhost ~]# ls /mnt/sdb /mnt/sdc /mnt/sdb: myFile /mnt/sdc: myFile
此時我們有兩個可用的磁碟。但是,只有手動掛載它們後才能使用它們。要啟動時掛載每個磁碟,我們必須編輯 fstab 檔案。此外,必須為需要訪問新磁碟的組設定許可權。
建立卷組和邏輯卷
CentOS 7 最大的改進之一是包含了一個名為系統儲存管理器或ssm 的實用程式。系統儲存管理器極大地簡化了在 Linux 上管理 LVM 池和儲存卷的過程。
我們將介紹在 CentOS 中建立簡單的卷池和邏輯卷的過程。第一步是安裝系統儲存管理器。
[root@localhost rdc]# yum install system-storage-manager
讓我們使用 ssm list 命令檢視我們的磁碟。

如上所示,系統上總共安裝了三個磁碟。
/sdba1 − 託管我們的 CentOS 安裝
/sdb1 − 掛載在 /mnt/sdb
/sdc1 − 掛載在 /mnt/sdc
我們要做的是使用兩個磁碟(sdb 和 sdc)建立一個卷組。然後使系統可以使用三個 3GB 的邏輯卷。
讓我們建立卷組。
[root@localhost rdc]# ssm create -p NEW_POOL /dev/sdb1 /dev/sdc1
預設情況下,ssm 將建立一個擴充套件整個 10GB 池的單個邏輯卷。我們不想要這個,所以讓我們刪除它。
[root@localhost rdc]# ssm remove /dev/NEW_POOL/lvol001 Do you really want to remove active logical volume NEW_POOL/lvol001? [y/n]: y Logical volume "lvol001" successfully removed [root@localhost rdc]#
最後,讓我們建立三個邏輯卷。
[root@localhost rdc]# ssm create -n disk001 --fs xfs -s 3GB -p NEW_POOL [root@localhost rdc]# ssm create -n disk002 --fs xfs -s 3GB -p NEW_POOL [root@localhost rdc]# ssm create -n disk003 --fs xfs -s 3GB -p NEW_POOL
現在,讓我們檢查我們的新卷。

我們現在擁有三個跨越兩個物理磁碟分割槽的獨立邏輯卷。
邏輯卷是現在內置於 CentOS Linux 的一項強大功能。我們已經接觸了管理這些邏輯卷的表面內容。掌握池和邏輯卷需要實踐和從 Tutorials Point 等資源中進行擴充套件學習。目前,您已經學習了 CentOS 中 LVM 管理的基礎知識,並且能夠在單個主機上建立基本的條帶化邏輯卷。