# 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目錄結構
![](https://i.imgur.com/IKwuTnw.png)
```
/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
[參考資料](https://jeffwen0105.com/linux-selinux/#:~:text=SELinux%20%E6%98%AF%E4%B8%80%E5%80%8BLinux%E6%A0%B8%E5%BF%83,%E5%9D%87%E5%85%A7%E5%BB%BA%E6%AD%A4%E5%8A%9F%E8%83%BD%E3%80%82)
每個程序或檔案selinux都會設有類似標籤的type,僅有擁有那個type才能進行存取服務或檔案(下圖紅框處即為type)
![](https://i.imgur.com/g7VHfKH.png)
* 工作模式
```
$ 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試題
1.
![](https://i.imgur.com/Ci2beE0.png)
:::spoiler 解答
```
$ 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
```
:::
2.
![](https://i.imgur.com/cJEfRVu.png)
:::spoiler 解答
```
$ 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
```
:::
3.
![](https://i.imgur.com/RDboFjT.png)
:::spoiler 解答
```
$ 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
```
:::
4.
![](https://i.imgur.com/amhbsW3.png)
:::spoiler 解答
```
$ 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
```
:::
5.
![](https://i.imgur.com/6aMXKPQ.png)
:::spoiler 解答
```
$ 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
```
:::
6.
![](https://i.imgur.com/hfLzRT6.png)
:::spoiler 解答
```
$ 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
```
:::
7.
![](https://i.imgur.com/s7XJQWq.png)
:::spoiler 解答
```
$ vi /etc/chrony.conf
server utility.net1.example.com
$ systemctl restart chronyd
$ chronyc sources #查看是否有連上server端
```
:::
8.
![](https://i.imgur.com/FsFCgcu.png)
:::spoiler 解答
```
# 題目為將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
```
:::
9.
![](https://i.imgur.com/Yr80JlI.png)
:::spoiler 解答
```
$ 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設定
```
:::
10.
![](https://i.imgur.com/ZTgbrkx.png)
:::spoiler 解答
```
$ useradd -u 4332 jean
$ echo flectrag | passwd --stdin jean
```
:::
11.
![](https://i.imgur.com/UFlcXse.png)
:::spoiler 解答
```
$ 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/
```
:::
12.
![](https://i.imgur.com/Nh9VCOz.png)
:::spoiler 解答
```
$ grep strato /usr/share/dict/words >> /root/lines.txt
```
:::
13.
![](https://i.imgur.com/mHslVAf.png)
:::spoiler 解答
```
$ tar jcf /root/data.tar.bz2 /usr/local
$ file /root/data.tar.bz2
data.tar.bz2: bzip2 compressed data, block size = 900k
```
:::
14.
![](https://i.imgur.com/hscSCjc.png)
:::spoiler 解答
```
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
```
:::
15.
![](https://i.imgur.com/3kJGCYA.png)
:::spoiler 解答
```
$ 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
```
:::
16.
![](https://i.imgur.com/7fUAHfi.png)
:::spoiler 解答
```
#建立一個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
```
:::
17.
![](https://i.imgur.com/6UVWZbv.png)
:::spoiler 解答
```
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
```
:::
18.
![](https://i.imgur.com/6mZMkjz.png)
:::spoiler 解答
```
$ 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
```
:::
19.
![](https://i.imgur.com/6mA8QFm.png)
![](https://i.imgur.com/M2MCPjz.png)
:::spoiler 解答
架構圖
![](https://i.imgur.com/0Kztkrp.png)
```
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
```
:::
20.
建立VDO volume,符合以下條件:
>* 使用unpartition disk (/dev/sdb)
>* 名稱為myvdo
>* 大小為5G
>* filesystem為xfs
>* 開機時會自動掛載至/vblock
:::spoiler 解答
```
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
```
:::
21.
![](https://i.imgur.com/KxmUk81.png)
:::spoiler 解答
```
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`