---
# System prepended metadata

title: 113下 Linux 期末考試練習VM2

---

# 1. 系統救援

## 系統救援 - 1 ：核心相關資料錯誤造成的問題

* 問題描述：
為了測試核心開機功能，不小心將 initramfs 檔案刪除，導致系統無法順利開機。
* 建議救援方式：
使用原版光碟處理，請進入系統救援的模式，並依據系統既有的核心版本，將 initramfs 重建
* 注意事項：
(1)重建時 initramfs 時，應考慮 grub2 的原本設定檔 (可能會在哪裡？)，以找到正確的檔名，方可順利成功開機喔。 
(2)你可以使用任何一個 RockyLinux 9.x 的光碟做救援，但是需要注意不同的核心版本的問題！


開機後你會發現
![image](https://hackmd.io/_uploads/Syz35CIGgl.png)
強制關機
![image](https://hackmd.io/_uploads/r1URc0LMlx.png)

準備 Rocky Linux 9.x 安裝光碟或 USB 開機碟

![image](https://hackmd.io/_uploads/r1m8iCIfxe.png)
開機時選擇「Troubleshooting」 > 「Rescue a Rocky Linux system」
![image](https://hackmd.io/_uploads/BJc6jCLMxx.png)

![image](https://hackmd.io/_uploads/HJkb30LGxg.png)
選擇 1，讓系統嘗試掛載原來的根檔案系統。
![image](https://hackmd.io/_uploads/rJADnRUflx.png)
光碟環境會提供`chroot /sysroot` 指令， 讓你進入原本系統的根目錄環境。
![image](https://hackmd.io/_uploads/S1HF2RUGxl.png)
輸入『 df 』應該會看到原本系統資料通通掛載在 /mnt/sysroot 底下， 因此請使用『 chroot /mnt/sysroot 』指令來進入原本的系統。
![image](https://hackmd.io/_uploads/S1Jo3CUGlg.png)

![image](https://hackmd.io/_uploads/S140nR8Mlg.png)
先確認你系統使用的是哪一個核心版本
請記住你想要重建的版本（通常是最新的或你使用的那個）。
![image](https://hackmd.io/_uploads/Bkef6ALzxg.png)

>[!Note] lib/modules
>主要用於存放與當前或安裝內核版本相對應的核心模組

前往 /boot 目錄，你會發現沒有initramfs的檔案
![image](https://hackmd.io/_uploads/HydUTCLMxg.png)
### 使用 `dracut` 工具來重建 `initramfs`
單純執行：`dracut -v`
`-v`：列出詳細過程
會嘗試建立一個預設的 initramfs 檔案（通常是目前正在執行的核心的版本）
![image](https://hackmd.io/_uploads/rkoygkPMex.png)


參考: [Unit13-13.2.5節](https://linux.vbird.org/linux_basic_train/rockylinux9/unit13.php#ex) 開機檔案的救援問題


## 系統救援 - 2 ：管理員手滑造成的 root 屬性問題

* 問題描述：
因為幫用戶設定屬性，結果不小心『可能』修改到 root 這個帳號的相關屬性資料。

* 救援目標：
(1)root 密碼恢復到 myRockyL9
(2)root 登入時可順利取得 bash shell 。

```bash=
echo 'myRockyL9' | passwd --stdin root
usermod -s /bin/bash root
```

```bash=
# 檢查 /etc/passwd 中 root 欄位是否正確設定為：
root:x:0:0:root:/root:/bin/bash
```

![image](https://hackmd.io/_uploads/HJZVzywGgl.png)

![image](https://hackmd.io/_uploads/H1Y8XyPGgx.png)
關機後重新調整設定
![image](https://hackmd.io/_uploads/BJKoXkwMgl.png)
開機後按下方向鍵調整選單，使用舊的核心開機
![image](https://hackmd.io/_uploads/HkPCNkPMgg.png)
之後你就可以拿回圖形化介面了

參考: [Unit07](https://linux.vbird.org/linux_basic_train/rockylinux9/unit07.php#7.2) 系統救援

# 2. 開機選單的處理

**修改目標 :**
1. Timeout 時間 設定為 `15 秒`。
1. 所有核心參數都需加入 `noapic` 參數。
1. 新增一個開機選單項目：回到 MBR（名稱內含 "MBR"）。
1. 新增一個開機選單項目：進入圖形界面模式，需使用原有的核心版本，且選單名稱需包含 `mygraphical`。這個設定檔名請設定為 `custom.conf`


```bash=
vim /etc/default/grub
GRUB_TIMEOUT=15
```

使用以下指令更新 grub2 設定（若更改其他核心設定時）：
```bash=
grub2-mkconfig -o /boot/grub2/grub.cfg
```

:::info
執行 grub2-mkconfig -o /boot/grub2/grub.cfg 是重新生成 GRUB 2 的引導配置文件的標準方法，確保系統啟動選單和內核列表是最新的，反映當前系統狀態和設定

grub2-mkconfig 命令會根據系統中已安裝的內核和配置文件（如 /etc/default/grub 和 /etc/grub.d/ 目錄下的腳本）自動生成一個完整的引導配置文件。
而這個配置文件通常是 /boot/grub2/grub.cfg，它包含了啟動選單的所有條目和啟動參數。
使用這個命令可以在安裝新內核或修改啟動參數後，重新生成引導配置文件，使改動生效。
不建議直接手動編輯 /boot/grub2/grub.cfg，因為它是自動生成的，手動修改會在下次生成時被覆蓋
:::

```bash=
cd /boot/loader/entries/

cp d...-5.14.0-162.6.1.e19_1.x86_64.conf custom.conf
vim custom. conf
```

:::info
/boot/loader/entries/ 目錄是用於存放啟動項配置文件的位置。啟動項是引導加載器（例如systemd-boot）用來啟動不同作業系統或內核的選項
:::

![image](https://hackmd.io/_uploads/Hk_2P-Dflx.png)

參考: [Unit13-13.2.4節](https://linux.vbird.org/linux_basic_train/rockylinux9/unit13.php#13.2) **grub2 設定檔維護**


# 3. 檔案系統方面的處理，包含分割(注意primary, extended, logical的限制)、格式化、掛載等

## A. 軟體磁碟陣列管理：

目前的系統有個出現磁碟出問題而快要損毀 (degrade) 的軟體磁碟陣列，找出並修復好該系統。

* 該磁碟似乎==已經被拔除一個 partition==
* 找出系統中具==有的跟 RAID 內的 partition 容量相同==，且==沒有被使用的 partition==，那就是這個 RAID 缺乏的磁碟槽 (假設已經被修理好了)
* 請==將該磁碟槽加入原本的系統中==，以救援這個磁碟陣列 (讓他變成 clean 的狀態，改變 degraded 的困擾)

```bash=
# 查看所有區塊裝置（block devices）
lsblk

cat /proc/mdstat
# /proc/mdstat 是 Linux 核心提供的一個虛擬檔案，用來顯示軟體 RAID 陣列的即時狀態
```

![image](https://hackmd.io/_uploads/HJTI9WDMle.png)


| 欄位        | 說明                               |
| --------- | -------------------------------- |
| `md5`     | RAID 裝置名稱（`/dev/md5`）            |
| `raid1`   | RAID 類型：鏡像（兩份相同資料）               |
| `vda5[1]` | RAID 成員之一，目前只有這一顆在線              |
| `[2/1]`   | 表示：這個 RAID 原本應有 2 個裝置，目前只有 1 個在線 |
| `[_U]`    | 表示：第一顆磁碟壞了或離線（`_` 是壞的，`U` 是正常的）  |

:::warning
這代表 RAID1 有一顆磁碟已經離線，現在系統只靠單一一顆磁碟在撐（資料還在，但沒有備援）。如果這顆也壞掉，資料會丟失。
:::

```bash=
# 確認是哪一顆磁碟離線，查看詳細資訊
mdadm --detail /dev/md5
```

![image](https://hackmd.io/_uploads/ryY9oWwzgg.png)


| 欄位                | 值               | 說明                       |
| ----------------- | --------------- | ------------------------ |
| `Raid Level`      | raid1           | 鏡像 RAID                  |
| `Raid Devices`    | 2               | 陣列應有 2 顆裝置               |
| `Active Devices`  | 1               | 實際在線的只有 1 顆              |
| `State`           | clean, degraded | 資料完整，但 RAID 結構不完整（缺少備份）  |
| `Working Devices` | 1               | 只有一顆硬碟有在用                |
| `Failed Devices`  | 0               | 沒有「標記為壞掉」的裝置（只是有一顆不在陣列中） |
| `vda5`            | 唯一活著的 RAID 成員   |                          |

:::warning
 RAID 狀態是 「degraded（降級）」，也就是「目前只剩下一顆硬碟在運作」
:::

```bash=
mdadm --add /dev/md5 /dev/vda4

mdadm --detail /dev/md5
```
再次檢查你就會發現 `degraded` 不見了

參考: [Unit14-14.1.2節](https://linux.vbird.org/linux_basic_train/rockylinux9/unit14.php#14.1) **Software RAID 的使用**


## B. LVM 的建立與 VDO 的應用

* 將目前這個系統當中的所有剩餘容量建立成為單一分割槽，並且將 ==system ID 設定為 LVM==
* 利用上面這個分割槽，建立一個名為 `thevg 的 VG` ，且`PE 容量`為 ==8M==
* ==將 /dev/thevg/thelv 加入到 VDO 的支援==，建立名為如下的 VDO 裝置
* 將 thevg 的==所有容量通通給予名為 thelv== 的 lv
* `VDO 虛擬容量`為 ==20G==
* 裝置使用 ==/dev/thevg/thelv==
* 將 VDO 裝置`格式化`成為 ==XFS== 檔案系統
* 此裝置`開機後會立刻掛載`到 ==/data/vmdata== 目錄下

:::info
VDO 的使用需要透過 vdo 以及 kmod-kvdo 模組的支援，因此得要安裝這兩個軟體才行。
```bash=
yum install vdo kmod-kvdo lvm2
```
:::

```bash=
df -Th

fdisk /dev/vda

pvcreate /dev/vda6

vgcreate -s 8M thevg /dev/vda6

# 在 thevg 卷組建立一個名為 thelv 的 VDO 邏輯卷，
# 實際空間約6GB，虛擬容量20GB，啟用壓縮和重複資料刪除
lvcreate -L 6G --vdo --name thelv --compression y --deduplication y --virtualsize 20G thevg

```

![image](https://hackmd.io/_uploads/BJBb4mwzlx.png)


:::warning
目前核心是 EL9.1 版本系列（el9_1）
安裝的 kmod-kvdo 是 EL9.5 版本系列（el9_5）
這兩個版本的核心模組目錄不同，導致模組無法被載入。
:::


```bash=
ll /lib/modules

ll /boot

dracut -f /boot/initramfs-5.14.0-503.23.2.el9_5.x86_64.img 5.14.0-503.23.2.el9_5.x86_64

# 建立好之後要reboot
```
這行指令會強制（`-f`）為這個 kernel 建立 `initramfs` 檔案，路徑跟檔名自己指定。

>[!Note] 提醒
>在執行 dracut 建立某個 kernel 的 initramfs 之前，`/lib/modules/<kernel-version>` 必須存在，而且要包含該 kernel 所需的驅動模組、設定等資料。否則 dracut 無法正確生成 initramfs。

```bash=
lvscan

vdostats --human-readable
```

![image](https://hackmd.io/_uploads/H15M2GwMeg.png)
![image](https://hackmd.io/_uploads/rJRgJQwfle.png)

>`vdostats --human-readable` 是用來查詢 VDO 裝置統計資訊的工具，讓你用容易理解的容量單位來看設備狀況。

* 將 /dev/thevg/thelv 格式化為 xfs 檔案系統，掛載到 /data/vmdata 目錄下，並且開機自動掛載

```bash=
mkfs.xfs /dev/thevg/thelv

vim /etc/fstab
/dev/thevg/thelv /data/vmdata xfs defaults 0 0
```

```bash=
mkdir -p /data/vmdata

mount -a

# 檢查
df -Th
```

---

### ==建立 VDO 需要至少 ~5 GiB 實體空間==，因為我失敗過，以下是解救的方法

可以將 /dev/vda6 加大容量，然後把多的空間給 thevg，前提是磁碟還有可用空間可以擴展分割區。

>[!Caution] 警告
>調整現有分割區大小有風險，如果不是 LVM 裸裝到分割區，或有掛載點要非常小心。

```bash=
parted /dev/vda
print
resizepart 6 100%  # 把 vda6 擴展到磁碟尾端
quit
```

```bash=
# 讓 OS 重新識別磁區大小變化
partprobe /dev/vda

# 擴展 PV 的可用容量
pvresize /dev/vda6

# 確認 VG 容量已變大
vgdisplay thevg
```
`partprobe`：這個指令來自 parted 套件，用來讓 Linux 核心重新掃描磁碟的分割區表，更新系統內核對磁碟分割區的認知。

參考: [Unit14-14.4.2節](https://linux.vbird.org/linux_basic_train/rockylinux9/unit14.php#14.4) **使用於虛擬機器磁碟應用的 VDO 機制**

# 4. 系統效能處理

## A. 請改用『 throughput-performance 』來動態調整系統效能

```bash=
# 先啟動這個服務

systemctl start  tuned
systemctl enable tuned
systemctl status tuned
```

```bash=
tuned-adm list

# 使用 throughput-performance
tuned-adm profile throughput-performance

# 顯示目前使用中的效能設定檔
tuned-adm active

# 使用 tuned 的檢查功能
tuned-adm verify
```

參考: [Unit13-13.1.7節](https://linux.vbird.org/linux_basic_train/rockylinux9/unit13.php#13.1) **系統效能優化 - tuned, tuned-adm**  
**搜尋關鍵字 `throughput-performance`**

## B. 調整核心參數，讓每次開機都會修改成為底下這樣：

* /proc/sys/vm/dirty_ratio 改成 40
* /proc/sys/vm/dirty_background_ratio 改成 5
* /proc/sys/vm/swappiness 改成 10

```bash=
vim /etc/sysctl.conf

vm.dirty_ratio = 40
vm.dirty_background_ratio = 5
vm.swappiness = 10
```

| 參數名稱                            | 說明                                           |
| ------------------------------- | -------------------------------------------- |
| `vm.dirty_ratio = 40`           | 當記憶體中髒資料（未寫入磁碟的資料）達到 40% 時，強制觸發寫入            |
| `vm.dirty_background_ratio = 5` | 髒資料達 5% 時，背景開始寫入磁碟                           |
| `vm.swappiness = 10`            | 控制系統多傾向使用 RAM 而非 swap，數字越低越偏向使用記憶體（預設通常是 60） |

這些調整主要針對 I/O 效能和記憶體使用效率做優化，特別適用於高效能伺服器環境。

```bash=
# 立即套用參數
sysctl -p /etc/sysctl.conf


# 檢查(選用)
cd /proc/sys/vm

cat dirty_ratio
cat dirty_background_ratio
cat swappiness
```

參考: [Unit13-13.1.5節](https://linux.vbird.org/linux_basic_train/rockylinux9/unit13.php) **搜尋關鍵字 `使用 /etc/sysctl.conf 處理核心參數`**
