這一章的內容也會比較多,因為預期三篇文章更完RH134系列,所以每章安排的內容都比較多,并且RH134上面的都是重點,一點也不好寫。昨天一天將RH124系列寫完了,今天爭取將RH134系列寫完。至于我為什么要著急將這些寫完,那是因為還有很多內容沒寫。
包括之前說的docker、mysql、shell系列,這些課程我已經學完了,只是還沒有做歸納總結。而且之前的k8s系列只寫了一半,還有一半內容沒寫。后面還會增加ansible的系列,和k8s一樣內容很多。但是樂觀一點,九月份之前一定能夠全寫完的。
九月份之后,我的云原生俱樂部生涯也要結束了,整個云原生俱樂部系列也就要完結了。計劃后面寫go語言相關的內容,并爭取在b站上更新視頻,但是學習是沒有止境的,希望我的博客也是沒有盡頭的。
這一篇主要講RH134中調優系統性能,管理SELinux安全性,管理基本存儲,管理存儲堆棧這四部分內容。第一部分主要是和tuned守護進程相關,SELinux上下文會比較難理解一點,至于后兩部分則是緊密相關的,會用到fdisk或者parted分區工具以及邏輯卷的概念。
調優系統性能
這節的內容是將如何通過選擇由tuned守護進程管理的調優配置集來優化系統性能,tuned守護進程會利用反映特定工作負載要求的調優配置集,以動態和靜態兩種方式應用調優調整。
[1]動態調優
其中,tuned守護進程附帶了三個監控器插件,分別用于監控磁盤負載,監控網絡負載,監控cpu負載,并且附帶相應的調優插件。這些插件都用于動態調優,默認情況下是處于禁用狀態。不過需要注意的是,動態調優會從選定調優配置集的初始值開始,不斷調整適應當前工作負載。
[2]調優配置集
可以通過tuned-adm客戶端工具和tuned守護進程進行交互,使用tuned-adm active可以查看當前使用的調優配置集,使用tuned-adm list則是列出系統中所有的調優配置集。
使用tuned-adm profile_info name可以查看指定調優配置集的信息,如果不指定調優配置集,默認是當前活躍的配置集。使用tuned-adm recommend可以為系統推薦調優配置集,然后可以使用tuned-adm profile name來切換調優配置集。
[3]進程調度--優先級
用戶可以給進程設置nice值,范圍是-20~19,值越低優先級越高。只有root可以降低進程的nice值,其他用戶只能提高。可以使用nice -n設置值,如nice -15 sleep 15 &,當然也可以重新設置進程nice值,如使用renice -n <PID>。
但是這些進程都是普通進程,而進程分實時進程和普通進程,只有普通進程能夠設置nice值。實時進程使用pr值,實際上cpu調度的時候參考的是pr值,pr=nice+20,內核調度器實際使用的是pr值來確定CPU的時間分配順序。
管理SELinux安全性
SELinux強制執行一組訪問規則,明確定義進程和資源之間允許的操作,未經允許的操作都會視為非法。由于僅允許定義的操作,所以使得安全性較差的應用依舊能夠得到受到保護。
[1]更改SELinux模式
SELinux具有Enforing、Permissive、Disabled三種模式,在Permissive模式下,非法的訪問不會被阻止但會記錄,至于Disabled模式下,則既不阻止也不記錄。紅帽9開始,只能在系統啟動時設置內核參數selinux=0來完全禁用。
SELinux的配置文件是/etc/selinux/config,有一個字段是SELINUX,可以設置為enforcing或者permissive,系統會在啟動時讀取該配置文件(所以修改后需重啟才能生效)。
如果在紅帽9中將配置文件設置SELINUX=disabled,則會讓所有的操作都被拒絕,因此在文件中禁用selinux會導致SELinux拒絕加載任何任何策略,而策略定義了允許的操作。
除了修改配置文件外,還可以使用setenforce 0或者1來設置模式(臨時切換,無需重啟系統),0代表Permissive,1代表Enforcing,后面可以使用getenforce來查看selinux模式
[2]設置SELinux上下文
SELinux安全上下文的格式有user、role、type、secure level,使用chcon可以臨時修改文件上下文,使用restorecon(-R選項用于遞歸還原)將文件上下文還原成數據庫中定義的上下文。
其中我們最需要關注的就是type,如果類型不對就會拒絕進程訪問該類型資源。比如設置網站文件,如果文件的類型不對,訪問網站時會報403的錯誤。文件的selinux上下文默認會繼承父目錄的,比如在目錄下touch文件,便會繼承目錄的selinux。
保留selinux上下文
如果使用mv移動文件,會保留原來的selinux上下文(mv的兩個文件目錄必須處于同一個文件系統,否則相當于cp+rm),但是通過cp默認就不會保留selinux上下文,除非是用-a選項來保留文件的權限、時間戳以及selinux上下文。
還有創建tar歸檔的時候默認保留原始上下文(通過?--xattrs?隱式啟用),除非是用--no-xattrs來不保留selinux上下文,解壓文件時默認恢復原來的seinux上下文。-p選項(歸檔和解壓的時候都要用)則是保留文件的權限、所有者和時間戳。
rsync同步文件的時候也需要注意selinux上下文是否需要保留,通過-a來保留文件權限,-X來保留selinux上下文,兩者需要起來使用。
selinux策略規則
可以通過semanage fcontext -a -t type file來給file文件添加上下文策略(修改數據庫中的定義),并通過restorecon來應用該selinux上下文策略。
在selinux中由一種動態調整規則,就是?在保持上下文不變的前提下,通過布爾值控制是否允許某些上下文之間的交互,每個布爾值背后關聯一組 SELinux 策略規則。
例如當?`httpd_enable_homedirs`為 `on`時,策略允許 `httpd_t`進程訪問 `user_home_t`類型的文件,使用getsebool -a 可以顯示所有布爾值及其狀態。
管理基本存儲
這里會講到分區方案GPT和MBR兩種方案,以及介紹分區工具fdisk以及parted等,我對parted比較熟悉一點,并且喜歡用命令式而不是交互式的進行分區。
[1]GPT分區和MBR分區
MBR分區方案是運行在BIOS固件的系統的標準分區方案,對于運行UEFI固件的系統,GPT分區方案則是標準。前者可以劃分四個主分區,最后一個分區可以作為邏輯分區擴展,在第一個扇區存儲分區表,占512kb大小;而后者在磁盤首尾各存儲一份分區表,分區表支持CRC檢驗,支持128個主分區。
[2]parted分區工具
可以使用parted /dev/vdb print來查看該磁盤的分區表情況,如果不接子命令而是parted /dev/vdb則是進入交互式分區會話。默認是使用十進制單位查看分區表情況,可以使用unit s(B、MiB、MB來指定單位),如parted /dev/vdb unit MiB print。
使用parted /dev/vdb mklabel msdos(gpt)寫入磁盤標簽(會擦除現有分區表),然后可以使用parted /dev/vdb mkpart primary ext4 1MiB 100MiB來創建分區,在MBR方案中,primary后面表示使用主分區還是擴展分區(extended),對于GPT方案來說,則是指的主分區名稱。
如果要創建的分區是要作為交換分區的,可以使用parted /dev/vdb mkpart primary linux-swap 1MiB 100MiB來創建分區,同樣如果是MBR分區方案,primary表示主分區,GPT分區方案,primary表示分區名稱。
創建分區之后,運行udevadm settle等待系統檢測新分區并在/dev目錄下創建關聯的設備文件,之后就可以使用parted /dev/vdb print來查看分區情況了,每個分區會有對應編號,可以通過parted /dev/vdb rm n 刪除對應編號的分區。
[3]創建文件系統
此時創建的分區還不能進行掛載,因為parted只是給分區打上文件系統的標簽,并沒有在該分區創建文件系統。可以通過mkfs.ext4 /dev/vdb1來創建文件系統,如果是交換分區的話,使用mkswap /dev/vdb1來格式化分區。
創建文件系統或者格式化之后,就可以通過/etc/fstab永久掛載或激活了,通過lsblk -fp可以查看設備文件的UUID,推薦使用UUID來持久掛載或激活。編寫/etc/fstab文件之后使用mount -a或者swapon -a來驗證是否正確掛載或激活(如果不對會報錯)。
當然,單獨使用mount /dev/vdb1 /mnt/data也可以臨時掛載,或者使用swapon /dev/vdb1來臨時激活,如果要取消掛載用unmount,取消激活交換空間用swapoff。
管理存儲堆棧
這一部分就要講到LVM邏輯卷管理器的概念了,但還是有相當一部分和上一章的內容相關。首先要講講物理卷(PV)、卷組(VG)、邏輯卷(LV)、物理區塊(PE)、邏輯區塊(LV)等概念,接著講如何創建邏輯卷。
[1]基本概念
?物理卷?是實際的磁盤或分區,LVM 允許直接將未分區的磁盤初始化為物理卷,無需預先創建分區表。LVM 會在磁盤的開頭寫入 ??LVM 元數據??(而非傳統分區表),標記該磁盤為物理卷。
LVM工具會將物理卷劃分為物理區塊PE,默認是4MB大小(不過也可以指定大小),VG 和 LV 的空間分配基于 PE。卷組則由一個或多個PV組成,邏輯卷則從VG中的空閑物理區塊創建,LV是邏輯區塊的的集合,而LE映射到物理區塊PE,兩者大小相等。
[2]創建邏輯卷
步驟的話也很簡單,就是三步走,主要創建邏輯卷時使用-L選項是絕對大小(默認單位是MB),而使用-l選項是相對大小(PE為單位),如-l 40就是用40個物理區塊PE。
先創建物理卷,使用pvcreate /dev/vdb1,可以使用pvs或者pvdisplay來查看;然后創建卷組,使用vgcreate vgname /dev/vdb1,可以使用vgs或者vgdisplay來查看;最后創建邏輯卷,使用lvcreate -L 100MiB -n lvname vgname,通過lvs或者lvdisplay可以查看。
注意這里使用/dev/vdb1分區,雖然創建分區的步驟區別不大(可以不指定文件系統類型,如parted /dev/vdb mkpart primary 1MiB 100MiB),但是多了一步,最后使用parted /dev/vdb?set n lvm on來給分區貼lvm標簽(其實也可以不寫)。
同樣需要給邏輯卷創建文件系統,使用mkfs -t xfs /dev/vgname/lvname來創建文件系統,如果要格式化交換分區,則可用mkswap /dev/vgname/lvname,然后就是正常掛載或者激活步驟了。
[3]擴縮邏輯卷
使用lvextend -L +20MiB /dev/vgname/lvname 來擴展20MiB(不使用+就是重新設置大小),如果要同時應用上文件系統,需要加-r選項,否則就需要額外配置,使用unmount在mount是脫機處理的辦法,當然也提供不脫機命令,不過還是推薦使用-r選項。
如果要擴展卷組的話,使用vgextend vgname /dev/vdb2命令,縮減邏輯卷的話步驟不一樣,先縮減文件系統大小,然后再使用lvreduce來縮減邏輯卷大小。lvremove /dev/vgname/lvname則是用于刪除邏輯卷,vgemove 則是用于刪除卷組。