Try   HackMD

RHCSA(ex200含試題與解答)

基礎Bash指令

$ whoami
user

$ command1 ; command2
output1
output2

$ !!            #執行上一個command

硬連結 & 軟連結

  • 硬連結(Hard link)
    Linux中每個檔案都有inode(index node),指向磁碟上的實體位置,建立硬連結即是使用相同的inode。意思表示所有建立硬連結的檔案雖然不同檔名,但是都是同一個實體位置,因此修改內容後所有檔案內容皆會修改。

    特點

    1. 目錄無法建立硬連結
    2. 需要刪除所有硬連結的檔案,檔案才會真正被刪除
    3. 硬連結需建立在同一個檔案系統
    ​​​​$ ln test2.txt test3.txt       #建立硬連結
    ​​​​$ ls -al 
    ​​​​-rw-r-----.  2 root root         16 Dec 21 00:45 test2.txt
    ​​​​-rw-r-----.  2 root root         16 Dec 21 00:45 test3.txt
    ​​​​
    ​​​​$ ls -i test2.txt test3.txt    #顯示檔案的inode
    ​​​​54390640 test2.txt  
    ​​​​54390640 test3.txt
    
  • 軟連結(symbolic link)
    如同windows系統中建立捷徑,建立新的inode指向原始檔案

    1. 目錄可以使用軟連結
    2. 被指向的原始檔案刪除,軟連結的檔案即無法使用
    3. 可以跨檔案系統
    ​​​​$ ln -s test2.txt test4.txt     #建立軟連結
    ​​​​$ ls -l
    ​​​​-rw-r-----.  2 root root         16 Dec 21 00:45 test2.txt
    ​​​​-rw-r-----.  2 root root         16 Dec 21 00:45 test3.txt
    ​​​​lrwxrwxrwx.  1 root root          9 Dec 21 01:18 test4.txt -> test2.txt
    ​​​​
    ​​​​$ ls -i test2.txt test4.txt
    ​​​​54390640 test2.txt  
    ​​​​33705998 test4.txt
    

Linux目錄結構

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

/boot:啟動Linux所需的核心文件
/dev:從此目錄可以訪問各種系統設備
/etc:系統與應用軟體的設定檔
/home:使用者的主目錄
/root:系統管理員的主目錄
/run:紀錄系統開啟以來的訊息,系統重啟後/run底下的文件就會被清除
/bin、/sbin:系統指令所存放的目錄,為/usr/bin、/usr/sbin的連結檔。bin提供給一般使用者、sbin提供給super user
/tmp:臨時存放文件使用,所有用戶都可以在此目錄存取
/usr:Unix System Resources,儲存系統核心所使用的文件
/var:存放具有變動性資料
/mnt:用於臨時掛載的目錄
/opt:大多數第三方軟體安裝位置
/proc:存在記憶體中的虛擬文件系統

root密碼重置

1. 開機時在grub選單按e進入命令模式
2. 在Linux這行最後加上rd.break
3. 按Ctrl+x重新開機
4. $ mount -o remount,rw /sysroot
5. chroot /sysroot
6. passwd root
7.  ./touch autolrelabel
8. 2次exit

SELinux

參考資料

每個程序或檔案selinux都會設有類似標籤的type,僅有擁有那個type才能進行存取服務或檔案(下圖紅框處即為type)

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

  • 工作模式
$ getenforce            #顯示目前使用的模式
$ setenforce [0|1]      #設定模式 [Permissive|Enforce]

Enforcing:啟用模式
Permissive:不會限制存取,只會輸出 log 警告
disabled:禁用
  • 範例
$ dnf install httpd
$ systemctl start httpd
$ firewall-cmd --add-service=http
$ firewall-cmd --reload
$ curl 127.0.0.1                    #測試網頁是否可以存取

#http type測試
$ cp -a /etc/shadow /var/www/html/
$ chmod 777 /var/www/html/shadow    #模擬當使用者不小心把全限開到最大,selinux的防護作用
$ curl 127.0.0.1/shadow
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>
$ chcon  -t httpd_sys_content_t /var/www/html/shadow               
                                     #透過指令chcon加入httpd_sys_content_t的type
$ curl 127.0.0.1/shadow              #可以正常顯示內容                                     
                            


#變更連接port號 80->82
$ vi /etc/httpd/conf/httpd.conf
...
Listen 80                             #改為82    
$ systemctl restart httpd             #此時會出現錯誤,無法啟動httpd服務
$ semanage port -a -t http_port_t -p tcp 82
$ systemctl restart httpd
$ curl 127.0.0.1
curl: (7) Failed to connect to 127.0.0.1 port 80: 連線被拒絕
$ curl 127.0.0.1:82                   #82 port可以正常連線

管理群組

$ groupadd -g <gid> group名稱

$ groupmod -g <新gid> -n <新名稱> 舊名稱

$ groupdel group名稱
$ usermod -g <主要group> -aG <次要group> -L user名稱
-G:usermod會將帳號從原來的群組退出,前面加-a會保留原來的群組設定
-L:鎖定使用者
-U:解鎖使用者

管理使用者密碼

/etc/shadow 儲存使用者帳號資訊
/etc/login.defs 密碼設定資訊

範例:
user03:$6$CSsXsd3rwghsdfarf:17933:0:99999:7:2:18113:
帳號名稱:(加密後)密碼:密碼最後一次更動時間:密碼不可修改天數:密碼有效天數:密碼失效前提醒:過期容許時間
$ chage -m 0 -M 90 -W 7 -I 14 <使用者名稱>
修改密碼規則
-m:密碼最少要幾天後才能改
-M:密碼最多幾天後過期
-W:密碼過期前幾天會提醒
-I:密碼過期後幾天無法使用

$ chage -l <使用者名稱>        查看使用者密碼資訊

更改檔案權限

$ chmod who/what/which 檔案名稱

who
u:user
g:group
o:other
a:all

what
+:add
-:remove
=:set exactly

which
r:read
w:write
x:execute

*特殊權限
u+s(suid):讓文件在執行時具有所有者權限    例:/etc/shadow 平時檔案權限為『-r--------』,但一般使用者要修改密碼,可透過/usr/bin/passwd 修改/etc/shadow
g+s(sgid):只對目錄有效,任何使用者在此目錄底下建立的檔案,所屬群組與該目錄相同
o+t(sticky):防止刪除,用於目錄    例:ls -ld /tmp
rwsrw-r--		 表示設置 SUID 屬性
rwxrwsrw-		 表示設置 SGID 屬性
rwxrw-rwt		 表示設置 SBIT 屬性

*預設檔案權限umask
目錄權限0777,檔案權限0666
umask預設是0022
(最大權限-umask=現在權限)
在/etc/bashrc中添加umask可永久生效
在~/.bashrc中添加umask可對個別使用者生效
$ chown 參數 使用者:群組 folder

參數
-v    輸出執行結果
-f    不輸出任何錯誤訊息
-R    遞迴更改

Process

Process states
R - runnung
K、I、D、S - sleeping
T - stoped
Z、X - zombie

[ctrl]+z        將目前工作丟到背景中暫停
# jobs          列出在背景工作的狀態,包括running、stoped的程序
# fg %1         將背景[1]的工作拿到前景處理
# ps aux        查看執行中的程序
# pstree        查看程序之間的關係

Services & Daemons

​​​​systemd:管理Linux啟動程序、服務的啟動以及服務的管理
service units
.service:系統服務
.socket:當client連線到sockect時,systemd會啟動一個daemon,並將連線轉移過去
.path
# systemctl list-units --type=service  列出所有type為service的units(預設為只列出active的服務,加入--all參數可顯示所有服務)
# systemctl is-active <服務名稱>        檢查服務是否啟動
# systemctl is-enable <服務名稱>        檢查服務是否在開機時會自動啟動

SSH

/etc/ssh/sshd_config ssh設定檔
修改PermitRootLogin no

$ w                                    顯示登入中的使用者
$ ssh <主機名稱>                        使用當前使用者名稱登入<某主機>

$ ssh-keygen                           產生公鑰、私鑰,存於~/.ssh/id_rsa、~/.ssh/id_rsa.pub
                                        -t:選擇key的加密演算法
                                        -P:後面接舊的密碼
$ ssh-copy-id <使用者>@<主機名稱>        複製一份公鑰至連線端

log

logrotate
所有log file都儲存在/var/log資料夾中,為避免佔用太多空間,一段時間後會將log檔壓縮並以當天日期重新命名。

$ journalctl                            顯示所有journal的messages
$ journalctl -u sshd                    顯示xx服務相關的訊息
$ journalctl _PID=xx                    顯示PID=xx程序的相關訊息
$ journalctl _UID=xx                    顯示UID=xx使用者的相關訊息
$ journalctl --since "2022-03-11 20:30" --until "2022-03-14 10:00"
                                        顯示"YYYY-MM-DD hh:mm:ss" 特定時間的訊息
$ vi /etc/systemd/journald.conf         
    Storage=auto                        persistent:將journal儲存在/var/log/journal,即使reboot也會存在
                                        volatile:將journal儲存在/run/log/journal,reboot後資料就不存在
                                        auto:如果/var/log/journal資料夾存在,journal就用persistent儲存,反之用volatile儲存
                                        none:將log drop掉
$ systemctl restart systemd-journld     重啟journald
$ timedatectl                      控制系統的時間與日期
$ timedatectl list-timezone        列出可用時區
$ timedatectl set-timezone  xx     將xx地區設為時區
$ timedatectl set-ntp yes          開啟ntp校時功能

網路設定

$ ip addr show dev <網卡名稱>        顯示xx網卡的ip
$ ip link                           顯示所有連線
$ ip route                          顯示routing資訊
$ tracepath <主機名稱>               顯示到達網域的主機路由訊息
NetworkManager Service
$ nmcli d                            顯示網卡的狀態
$ nmcli c --active                   顯示網路連線狀態
$ nmcli c show <連線名稱>             顯示連線詳細資料
$ nmcli c add con-name <連線名稱> type ethernet ifname <網卡名稱> \
ipv4.method manual ipv4.addresses x.x.x.x ipv4.dns x.x.x.x ipv4.gateway x.x.x.x ipv6.method disabled
$ nmcli c modify <連線名稱> <資訊>     修改連線資料
$ nmcli c reload <連線名稱>            
$ nmcli c delete <連線名稱>           刪除連線

使用hostnamectl指令控制/etc/hostname裡的名稱

$ hostnamectl                           顯示主機資訊
$ hostnamectl set-hostname <hostname>   修改主機名稱
$ dig <hostname>                    測試DNS的連線狀況
$ getent hosts <hostname>           查看Name Server Switch上的條目

壓縮與檔案傳輸

tar
語法:tar <參數> <產生新檔名> <目標目錄位址>

參數
-c 建立新的archive(檔案)
-v 顯示詳細過程
-z 呼叫gzip壓縮tar檔
-f 指定檔名
-t 檢視壓縮檔內容
-x 從檔案中提取(解檔時用到)


SFTP(Secure File Transfer Program)

$ sftp <使用者>@<遠端IP>             登入遠端主機

///本地主機操作
lcd
lls
lpwd

///遠端主機操作
cd
ls
pwd

get <檔案名稱>                       下載遠端主機上的檔案
get <檔案名稱> <新檔案名稱>           下載遠端檔案,並改為新名稱
get -r <目錄名稱>                    下載遠端主機上的目錄
put <檔案名稱>                       上傳檔案到遠端主機
put -r <目錄名稱>                    上傳目錄到遠端主機    


rsync
Linux上複製與備份的工具

參數
-v:輸出詳細資訊
-a:封裝備份模式,遞迴備份目錄下所有檔案、檔案擁有者、群組、權限
-z:啟用壓縮
-h:將數字以比較容易閱讀的格式輸出

$ rsync <參數> <來源位置> <目的位置>
範例:rsync -avh myfile.gz /tmp/

安裝、更新軟體包

subscription-manager

subscription-manager register --username <yourusername> #使用root帳號註冊RedHat訂閱
subscription-manager list --available                   #列出可使用的訂閱帳戶
subscription-manager facts --list | grep version        #查詢訂閱版本

/etc/pki/product       #此位置的證書代表已安裝的RedHat產品
/etc/pki/consumer      #此位置的證書標示已註冊的RedHat帳號
/etc/pki/entitlement   #此位置的證書代表使用哪個訂閱
rpm

#rpm安裝包資訊
rpm -q <packages>      #列出安裝包的版本
rpm -qa                #列出所有安裝包
rpm -qi                #列出安裝包的detail information
rpm -ql                #列出安裝package時建立的目錄

rpm -ivh <packages>    #安裝rpm package
dnf

dnf list <packages*>                          #列出相似名稱安裝包
dnf search <關鍵字>                            #列出含有關鍵字的安裝包(包括安裝包介紹部分)
dnf info <packages>                           #顯示安裝包的訊息
dnf provides <路徑、packages>                  #通過路徑找到packages
dnf install <packages>                        #安裝packages
dnf update                                    #更新dnf
dnf remove                                    #移除packages

dnf repolist all                              #列出所有儲存庫
dnf config-manager --enable <Repositories>    #啟用/停止 /etc/yum.repos.d/ 底下repo config
###Repositories 2種加入方式
1. 手動加入
    在/etc/yum.repos.d/目錄底下加入xxx.repo的config檔,baseurl的value加入來源
2. 使用命令自動建立
    $ dnf config-manager --add-repo "http://XXXX"
    使用上述指令後會自動在/etc/yum.repos.d/目錄底下加入xxx.repo的config檔

Linux 檔案系統

Linux 檔案系統預設為XFS,支援ext4,RHEL9之後開始也支援exFAT。
將檔案系統掛載在一個目錄底下,那個目錄稱為「mount point」

使用Linux Web console

從RHEL7開始,預設安裝cockpit web console

$ dnf install cockpit
$ systemctl enable --now cockpit
$ firewall-cmd --add-service=cockpit --permanent
$ firewall-cmd --reload

RHCSA試題

解答
$ hostnamectl set-hostname primary.net1.example.com
$ su -
$ nmcli c add con-name enp1s0 type ethernet ifname enp1s0 \
ipv4.addresses 172.24.1.15/24 ipv4.gateway 172.24.1.254 \
ipv4.dns 172.24.1.254 ipv4.method manual
$ nmcli c up enp1s0

解答
$ vi /etc/yum.repo.d/rhel.repo
[BaseOS]
name=RHEL-BaseOS
baseurl=http://server1.net1.example.com/BaseOS
enabled=1
gpgcheck=0

[AppStream]
name=RHEL-AppStream
baseurl=http://server1.net1.example.com/AppStream
enabled=1
gpgcheck=0
$ yum clean all
$ yum repolist

解答
$ yum install httpd
$ systemctl start httpd
$ systemctl enable httpd
$ firewall-cmd --add-service=http
$ firewall-cmd --reload
$ vi /etc/httpd/conf/httpd.conf
...
Listen 82
...
$ semanage port -a -t http_port_t -p tcp 82
$ systemctl restart httpd
$ curl 127.0.0.1:82

解答
$ groupadd manager
$ useradd -G manager natasha 
$ id natasha (查詢帳號資訊)
uid=1001(natasha) gid=1002(natasha) groups=1002(natasha),1001(manager)
$ useradd -G manager harry
$ id harry
uid=1002(harry) gid=1003(harry) groups=1003(harry),1001(manager)
$ useradd -s /sbin/nologin sarah
$ passwd natash 
$ echo flectrag | passwd --stdin natasha

解答
$ crontab -e -u natasha
* * * * * logger "EX200 in progress"
$ systemctl restart crond             #重啟cron服務,載入crontab設定
$ cat /var/log/messages | grep EX200
Dec 26 15:40:01 RHEL8-100G natasha[114478]: EX200 in progress
logger
使用這個指令可以直接將訊息寫入rsyslog中

例1:
$ logger "insert test"
$ cat /var/log/messages | grep insert
Dec 26 16:15:17 RHEL8-100G root[114630]: insert test

例2(寫入指定的log紀錄檔):
$ vi /etc/rsyslog
...
local3.*            /var/log/loggertest.log
$ systemctl restart rsyslog
$ logger -p local3.notice "logger test"
$ cat /var/log/loggertest.log
Dec 26 16:12:52 RHEL8-100G root[114627]: logger test

解答
$ mkdir /home/contrib
$ chgrp manager /home/contrib
$ chmod g+ws /home/contrib
drwxrws---. 2 root     manager   6 12月 26 17:08 contrib

#檢查/home/contrib目錄底下建立的檔案,group皆預設為manager
$ cd /home/contrib
$ touch test
$ ls -l
-rw-r-----.  1 root    manager   0 12月 26 17:32 test

解答
$ vi /etc/chrony.conf
server utility.net1.example.com
$ systemctl restart chronyd
$ chronyc sources            #查看是否有連上server端

解答
# 題目為將utility.net1.example.com的目錄透過NFS-exports掛到本機,前置作業皆在utility機器上已設好,無須再設定,僅供參考
$ yum install rpcbind                #安裝套件rpcbind、nfs-utils
$ systemctl start rpcbind            #此套件負責執行rpc服務的port mapping,所以要先啟動
$ systemctl enable rpcbind
$ yum install nfs-utils
$ systemctl start nfs-server
$ systemctl enable nfs-server
$ firewall-cmd --add-service=rpc-bind --permanent        #開啟防火牆,允許服務通過
$ firewall-cmd --add-service=nfs --permanent
$ firewall-cmd --add-service=mountd --permanent
$ firewall-cmd --reload
$ vi /etc/exports
/rusers/remoteuser1    primary.net1.example.com(ro)
$ exportfs -arv                      #此指令能不須重啟nfs服務,即可套用新的設定檔

#以下操作在本地虛擬機(NFS client)上執行
$ showmount -e utility.net1.example.com                  #查看NFS server上分享的目錄
Export list for 172.24.1.100
/rusers/remoteuser1    primary.net1.example.com(ro)
$ yum install autofs
$ systemctl start autofs
$ systemctl enable autofs
$ vi /etc/auto.master
/rusers /etc/auto.nfs
$ vi /etc/auto.nfs
remoteuser1 -r utility.net1.example.com:/rusers/remoteuser1
$ systemctl restart autofs            #重啟autofs,吃到新的設定檔
$ cd /rusers/remoteuser1

解答
$ cp /etc/fstab /var/tmp/fstab
$ setfacl -m u:natasha:rw /var/tmp/fstab
$ setfacl -m u:harry:- /var/tmp/fstab
$ setfacl -m o:r /var/tmp/fstab
$ getfacl /var/tmp/fstab
# file: var/tmp/fstab
# owner: root
# group: root
user::rw-
user:natasha:rw-
user:harry:---
group::r--
mask::rw-
other::r--
setfacl、getfacl(file access control list)

getfacl查看檔案、目錄權限
$ getfacl file.txt
# file: file.txt
# owner: root
# group: root
user::rw-
group::rw-
other::r--

setfacl設定檔案、目錄權限
$ setfacl -m u:user:rx file.txt    #-m表示修改權限
$ setfacl -x u:user file.txt       #-x表示移除權限
$ setfacl -b file.txt              #-b表示清除"檔案中"所有acl設定
$ setfacl -Rb file.txt             #-R表示遞迴清除"目錄中"所有acl設定
$ setfacl -m m:r file.txt          #m表示mask,設定遮罩,超出範圍的權限就會失效
$ setfacl -m d:u:user1:rw folder   #d表示此目錄底下建立的新檔案,都會自動繼承acl設定

解答
$ useradd -u 4332 jean
$ echo flectrag | passwd --stdin jean

解答
$ find / -user simone -exec cp -a {} /root/found/ \;
#利用find指令找到-user是simone的檔案,後面皆-exec將找到的結果進行複製。
#cp中 -a參數通常於複製目錄時使用,保留連結、文件屬性、並複製目錄下所有內容,{}表示find找到的結果

***以下做法與上面同義***
$ mkdir /root/found
$ cp -a $(find / -user simone) /root/found/

解答
$ grep strato /usr/share/dict/words >> /root/lines.txt

解答
$ tar jcf /root/data.tar.bz2 /usr/local 
$ file /root/data.tar.bz2 
data.tar.bz2: bzip2 compressed data, block size = 900k

解答
1. 開機時在grub選單按e進入命令模式
2. 在Linux這行最後加上rd.break
3. 按Ctrl+x重新開機
4. $ mount -o remount,rw /sysroot
5. chroot /sysroot
6. passwd root
7.  ./touch autolrelabel
8. 2次exit

解答
$ vi /etc/yum.repo.d/rhel.repo
[BaseOS]
name=RHEL-BaseOS
baseurl=http://server1.net1.example.com/BaseOS
enabled=1
gpgcheck=0

[AppStream]
name=RHEL-AppStream
baseurl=http://server1.net1.example.com/AppStream
enabled=1
gpgcheck=0
$ yum clean all            #清理快取
$ yum repolist
軟體庫 ID                  軟體庫名稱
BaseOS                    RHEL-BaseOS
AppStream                 RHEL-AppStream

解答
#建立一個2GB的partition: /dev/sdb1,並建立volune group: testvg,logic volume: vo
$ lsblk
sdb         8:16   0    2G  0 disk      #要畫partition的disk
$ fdisk /dev/sdb
> 命令:F                                 #顯示未分割的區域
Unpartitioned space /dev/sdb: 2 GiB, 2146435072 bytes, 4192256 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes

Start    結束    磁區 Size
2048 4194303 4192256   2G
> 命令:n                                 #建立新分割
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p):

Using default response p.
分割區編號 (1-4, default 1):
First sector (2048-4194303, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-4194303, default 4194303):

Created a new partition 1 of type 'Linux' and of size 2 GiB.
#全部選項接直接按enter,以預設進行
> 命令:w                                 #儲存設定並離開

$ pvcreate /dev/sdb1                     #將sdb1建立為pv,格式:pvcreate <要建立成pv的partition>
$ pvs                                   
PV         VG   Fmt  Attr PSize  PFree
/dev/sdb1       lvm2 --- <2.00g <2.00g
$ vgcreate testvg /dev/sdb1              #建立testvg,格式:vgcreate <vg名稱> <要加入的pv>
$ vgs
VG     #PV #LV #SN Attr   VSize  VFree
testvg   1   0   0 wz--n- <2.00g <2.00g
$ lvcreate -n vo -L +200M /dev/testvg    #從vg中建立200M的lv
$ lvs
LV            VG     Attr       LSize  
vo            testvg -wi-a----- 200.00m

#將200M的lv格式化,檔案系統為xfs,並掛載至/mnt/vo底下
$ mkfs.xfs /dev/testvg/vo                #將/dev/testvg/vo以xfs檔案系統格式化
$ mkdir /mnt/vo                          #建立mount point
$ mount /dev/testvg/vo /mnt/vo
$ df -Th
檔案系統                       類型      容量  已用  可用 已用% 掛載點
...
/dev/mapper/testvg-vo         xfs      195M  12M   184M   6% /mnt/vo

#將200M的lv擴展至250M
$ lvextend -L +50M /dev/testvg/vo        #先擴增lv          
$ df -Th  
#測試若僅擴增lv,不擴檔案系統會如何
#結果顯示掛載起來後,也僅沒有檔案系統的lv無法使用
檔案系統                       類型      容量  已用  可用 已用% 掛載點
...
/dev/mapper/testvg-vo         xfs      195M  12M   184M   6% /mnt/vo
$ xfs_growfs /dev/testvg/vo               #擴展xfs檔案系統
$ df -Th                                  #確認檔案系統是否有擴增成功
檔案系統                       類型      容量  已用  可用 已用% 掛載點
...
/dev/mapper/testvg-vo          xfs      247M  13M  235M   5% /mnt/vo
$ vi /etc/fstab                            #設定開機自動掛載
...
/dev/testvg/vo    /mnt/vo    xfs    defaults    0 0

解答
swap 空間
swap空間可以為分割區或檔案
當實體記憶體(RAM)用完時,假如系統還需要更多記憶體資源,會將不常用資源移至swap分割區中。
$ mkswap <partition>                   #初始化swap空間
$ swapon <partition>                   #啟用swap空間
$ swapon -a                            #編輯/etc/fstab以後,此指令會啟用標記為swap的
$ swapon -s                            #查看系統中的swap空間
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       5242876 0       -2

###題目解答
$ fdisk /dev/sdb
> 命令:n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
分割區編號 (1-4, default 1):
First sector (2048-2097151, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151): +512M

Created a new partition 1 of type 'Linux' and of size 512 MiB.

> 命令:w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

$ mkswap /dev/sdb1
Setting up swapspace version 1, size = 512 MiB (536866816 bytes)
無標籤,UUID=eb3e80cd-446b-4b37-9ebf-97b2b7b1e6bf
$ vi /etc/fstab
...
/dev/sdb1    none    swap    defaults 0 0
$ swapon -a
$ swapon -s
Filename                                Type            Size    Used    Priority
/dev/sdb1                               partition       524284  0       -2
/dev/dm-1                               partition       5242876 0       -3

解答
$ fdisk /dev/sdb
> 命令:n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
分割區編號 (2-4, default 2):
First sector (1050624-4194303, default 1050624):
Last sector, +sectors or +size{K,M,G,T,P} (1050624-4194303, default 4194303): +1G

Created a new partition 2 of type 'Linux' and of size 1 GiB.

> 命令:w
The partition table has been altered.
Syncing disks.
$ pvcreate /dev/sdb2
$ vgcreate -s 8M wgroup /dev/sdb2        #vg wgroup中一個PE 8M
$ vgdisplay wgroup
...
PE Size               8.00 MiB
Total PE              127
$ lvcreate -n wshare -l 100 wgroup       #建立lv wshare 大小為100個PE
$ lvs
 LV            VG     Attr       LSize   
 wshare        wgroup -wi-a----- 800.00m
$ mkfs.vfat /dev/wgroup/wshare
$ mkdir /mnt/wshare
$ vi /etc/fstab
...
/dev/wgroup/wshare      /mnt/wshare             vfat    defaults        0 0
$ mount -a 
$ df -Th
檔案系統                       類型      容量  已用  可用 已用% 掛載點
/dev/mapper/wgroup-wshare     vfat     799M  4.0K  799M  1%  /mnt/wshare


解答

架構圖

stratis透過(volume managing filesystem ,VMF),建立一個pool後可以在上面對多個filesystem進行管理。

Block device:可以是磁區、LVM,每個Block device最少1G
pool:所有儲存區的集合
Filesystem:系統用於檔案管理

###題目解答
$ yum install stratisd stratis-cli
$ systemctl start stratisd
$ systemctl enable stratisd
    #已有先建立的LVM空間拿來當作bolck device
$ wipefs -a /dev/stratisvg/stratislv    #若已經有filesystem需要先清除
$ stratis pool create stratispool /dev/stratisvg/stratislv         #透過建立pool將之前劃好的LVM空間加入,此空間大小為3GB
$ stratis pool list
Name                        Total Physical   Properties
stratispool   3 GiB / 37.63 MiB / 2.96 GiB      ~Ca,~Cr
$ stratis blockdev list
Pool Name   Device Node          Physical Size   Tier
stratispool   /dev/stratisvg/stratislv           3 GiB   Data

$ mkdir /stratisvolume                   #建立mount point
$ blkid /dev/stratis/stratispool/stratisfs
/dev/stratis/stratispool/stratisfs: UUID="afd3d918-3ffa-4ec4-8622-b837081879c7" BLOCK_SIZE="512" TYPE="xfs"
#查詢stratisfs的UUID,以便寫入/etc/fstab
$ vi /etc/fstab
UUID=afd3d918-3ffa-4ec4-8622-b837081879c7    /stratisvolume    xfs    defaults,x-systemd.requires=stratisd.service    0 0   
#x-systemd.requires=stratisd.service表示系統啟動要掛載時要先啟動stratisd,才能避免無法掛載stratis的檔案系統導致無法開機
$ stratis filesystem snapshot stratisfs stratis       #建立stratisfs的snapshot:stratisnap
$ stratis filesystem list
Pool Name     Name         Used      Created             Device                                UUID                           
stratispool   stratisfs    546 MiB   Jan 05 2023 13:37   /dev/stratis/stratispool/stratisfs    afd3d9183ffa4ec48622b837081879c7
stratispool   stratisnap   546 MiB   Jan 05 2023 14:49   /dev/stratis/stratispool/stratisnap   cc84e03850394cd9a66e10a4001701d3

###stratis相關指令
$ stratis pool add-data stratispool /dev/sdc          #在現有的pool新增block device
$ stratis filesystem destroy stratispool stratisfs    #刪除已建立的filesystem
$ stratis pool destroy stratispool                    #刪除已建立的pool
  1. 建立VDO volume,符合以下條件:
    • 使用unpartition disk (/dev/sdb)
    • 名稱為myvdo
    • 大小為5G
    • filesystem為xfs
    • 開機時會自動掛載至/vblock
解答
vdo(Virtual Data Optimizer)
透過vdo處理虛擬機的磁碟,存在vdo掛載點的資料可以使用vdo系統管理,資料同步、壓縮。因此假設實際上有1T的空間,經過vdo處理可以產生5T的虛擬空間。

###題目解答
$ yum install vdo kmod-kvdo
$ systemctl start vdo
$ systemctl enable vdo
$ vdo create --name=myvdo --vdoLogicalSize=5G --device=/dev/sdb   #建立vdo最小邏輯大小至少5G
$ vdo status --name=myvdo        #可以查看vdo的狀態
$ mkfs.xfs /dev/mapper/myvdo     #用xfs格式化
$ vi /etc/fstab
/dev/mapper/vdo    /vblock    xfs    defaults,x-systemd.requires=vdo.service 0 0
$ mkdir /vblock
$ mount -a
$ df -h
檔案系統                        容量  已用  可用 已用% 掛載點
/dev/mapper/myvdo              5.0G  68M  5.0G   2% /vblock


###刪除vdo
$ umount /vblock
$ vdo remove myvdo

解答
Tuned 動態系統優化
依據監控到的系統狀態自動調整系統設置,以達到服務器最佳性能。
RHEL預設已安裝且啟動
tuned為監控並調整系統設置服務
tuned-adm以命令管理tuned

###題目解答
$ tuned-adm list                 #列出所有可使用的profile
$ tuned-adm active               #查看現在正在使用的profile
$ tuned-adm recommend            #查看系統推薦的優畫策略
virtual-guest
$ tuned-adm profile virtual-guest    #將profile設為系統推薦的virtual-guest
tags RHCSA