---
# System prepended metadata

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

---

# 1. 系統初始化設定

## A. 預設開機進入純文字界面

參考: [Unit13-13.1.5節](https://linux.vbird.org/linux_basic_train/rockylinux9/unit13.php#13.1) 搜尋關鍵字 `multi-user`

```bash=
systemctl set-default multi-user.target
```

重新reboot之後就會直接進入純文字介面了

可暫時切換到圖形界面：`systemctl isolate graphical.target`

## B. 網路設定

參考: [Unit11-11.1.1](https://linux.vbird.org/linux_basic_train/rockylinux9/unit11.php#11.1) 網路設定

刪除原有網路連線

```bash=
nmcli connection delete <原有連線名稱>
```

建立新連線名為 mynetwork，使用乙太網路介面（假設介面名稱為 eth0，請依實際介面調整）

```bash=
nmcli connection add type ethernet con-name mynetwork ifname ens3  /
connection.autoconnect yes /
ipv4.method manual /
ipv4.address 192.168.251.XXX/24 /
ipv4.gateway 192.168.251.254 /
ipv4.dns "172.16.200.254 120.114.100.1" 

nmcli connection up mynetwork
```

主機名稱設定

```bash!
hostnamectl hostname wwwXXX.book.vbird
```

## C. YUM 軟體倉儲設定

參考: [Unit12-12.2.2](https://linux.vbird.org/linux_basic_train/rockylinux9/unit12.php#12.2) yum 的設定檔

建立兩個倉儲檔案 /etc/yum.repos.d/myapp.repo 和 /etc/yum.repos.d/mybase.repo，內容分別為：

```ini=
[myapp]
name=My App Repository
baseurl=http://download.rockylinux.org/pub/rocky/9/AppStream/x86_64/os
enabled=1
gpgcheck=0
```

```ini=
[mybase]
name=My App Repository
baseurl=http://download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os
enabled=1
gpgcheck=0
```

## D. 時區與網路校時設定

參考: [Uuit11-11.1.2](https://linux.vbird.org/linux_basic_train/rockylinux9/unit11.php#11.1) 日期與時間設定

設定時區為台北

```bash=
timedatectl set-timezone Asia/Taipei
```

安裝並設定 chronyd 使用 NTP 伺服器

```bash=
yum install chrony -y
```

編輯 /etc/chrony.conf，加入：

```ini=
server ntp.ksu.edu.tw iburst
server time.stdtime.gov.tw iburst
```

啟動並設定開機自動啟動：

```bash=
systemctl enable --now chronyd
```

```bash=
# 檢查 Chrony 的同步狀態
chronyc sources
```

## E. 系統自動更新機制（核心升級）

只升級 kernel 

```bash=
yum update kernel -y
```

參考: [Unit12-12.2.3](https://linux.vbird.org/linux_basic_train/rockylinux9/unit12.php#12.2) yum 的軟體群組功能

`yum grouplist` 可以列出 YUM 軟體管理器 支援的「套件群組（package groups）」

安裝 RPM 開發工具群組

```bash=
yum groupinstall "RPM Development Tools" -y
```

參考: [Unit11-11.3.2](https://linux.vbird.org/linux_basic_train/rockylinux9/unit11.php#11.3) 循環工作排程： crontab

建立排程於每天凌晨 1:30 執行核心升級並重啟（可寫入 root crontab）

```bash=
30 1 * * * root yum -y update kernel 
```



# 2. 帳號與權限控管

## A. 管理員的一般帳號設定：

參考: [Unit10-10.2](https://linux.vbird.org/linux_basic_train/rockylinux9/unit10.php#10.2) 多人共管系統的環境：用 sudo

使用 visudo 或新增檔案 /etc/sudoers.d/student，加入：

```bash=
student ALL=(ALL) ALL
```

## B. 鎖定 alex 帳號（密碼鎖定）

使用 passwd 這個指令

```bash=
passwd -l alex
```

## C. 建立系統帳號 mysys1

使用 useradd 這個指令

* 不需要家目錄
* 不具備可互動的 shell
* 不需要密碼

```bash=
useradd -r -M -s /sbin/nologin mysys1
```

## D. 新用戶家目錄預設包含 newhtml 子目錄

參考: [Unit10-10.1.5](https://linux.vbird.org/linux_basic_train/rockylinux9/unit10.php#10.1) 帳號管理實務

`/etc/default/useradd` 是 Linux 系統中用來設定「useradd」指令的預設值的設定檔。

`/etc/skel`	是建立家目錄時，複製這個目錄裡的檔案作為預設配置（例如 .bashrc）

修改 /etc/skel 目錄，新增 newhtml 目錄
```bash=
mkdir /etc/skel/newhtml
```
新用戶登入時設定命令別名（在 /etc/skel/.bashrc）

```bash=
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
```

## E. 啟用 /home 磁碟配額功能

參考: [Unit14-14.5.2](https://linux.vbird.org/linux_basic_train/rockylinux9/unit14.php#14.5) xfs 檔案系統的 quota 實做

:::info
由於 Quota 需要檔案系統的支援，因此請務必在 fstab 檔案中增加底下的設定值：

uquota/usrquota/quota：啟動使用者帳號 quota 管理
gquota/grpquota：啟動群組 quota 管理
:::



編輯 /etc/fstab，在 /home 掛載點加入 usrquota,grpquota 選項

```bash=
# [裝置/UUID等]  [掛載點]  [檔案系統]  [檔案系統參數]  [dump]  [fsck]
/dev/mapper/rocky-home /home  xfs  defaults,uquota,gquota  0 0
```

重新掛載 /home
```bash=
umount /home
# 因為student 在系統內，所以 /home 無法卸載。請登出所有的一般用戶帳號 (避免使用到 /home)
mount /home
```


建立 examgroup 群組

```bash=
groupadd examgroup
```

## F. 建立 /root/users/addusers.sh 腳本（建立 examuser11~30 帳號）

參考：[Unit10-10.1.3、10.1.5](https://linux.vbird.org/linux_basic_train/rockylinux9/unit10.php#10.1) bash shell script 的迴圈控制、帳號管理實務

* 帳號名稱為： examuser11 ~ examuser30 共 20 個帳號
* 建立帳號時，每個帳號都要加入一個名為 examgroup 的次要群組支援
* 每個帳號的密碼均為 myPassWord
* 並且每個帳號首次登入系統時，都會被強迫要求更改密碼 (chage ??)
`使用『 chage -d 0 username 』讓這個帳號的密碼建置日期強迫歸零`
* 修改每位帳號家目錄 (例如 examuser11 家目錄在 /home/examuser11/ ) 的權限成為 drwx--x--x 的模樣
* 每個帳號在 /home 的 Quota 為 soft --> 120MB, hard --> 150MB

```bash=
#!/bin/bash
for  user in examuser{11..30}
do
  # 建立使用者並加入 examgroup
  useradd  -G examgroup $user
  # 設定密碼
  echo "myPassWord" | passwd --stdin $user
  # 強制第一次登入改密碼
  chage -d 0 "$user"
  # 修改家目錄權限
  chmod 711 "/home/${user}"
  # 設定 quota
  xfs_quota -x -c "limit -u bsoft=120m bhard=150m $user" /home
done
```
執行腳本：
```bash=
sh /root/users/addusers.sh
```

## G. 建立群組共用目錄 /data/myexam 權限設定

參考：[Unit10-10.3.2](https://linux.vbird.org/linux_basic_train/rockylinux9/unit10.php#10.3) ACL 的設定技巧

```bash=
# 建立目錄
mkdir -p /data/myexam
# 設定該目錄的擁有者與群組
chown :examgroup /data/myexam

# 設定權限：群組可讀寫執行，其他人沒權限
# 設定 SGID 強制新建資料使用 examgroup 群組
chmod 2770 /data/myexam
```

examuser30 - 完全拒絕存取

```bash=
# 建立 ACL，撤銷 examuser30 的所有權限
setfacl -m u:examuser30:--- /data/myexam
```

student - 只讀與可進入，無寫入權限（包括未來新資料）

```bash=
# 設定 student 可讀與進入（rx），不能寫
setfacl -m u:student:rx /data/myexam

# 預設 ACL 設定：讓 student 對未來新增的檔案與目錄都有 rx 權限
setfacl -d -m u:student:rx /data/myexam
```

驗證權限(選用)

```bash=
# 查看目錄權限
ls -ld /data/myexam

# drwxrws---+ 2 root examgroup 6 May 21 09:57 /data/myexam

# 查看 ACL 設定
getfacl /data/myexam

# file: /data/myexam
# owner: root
# group: examgroup
# flags: -s-
user::rwx
user:student:r-x
user:examuser30:---
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:student:r-x
default:group::rwx
default:mask::rwx
default:other::---
```

# 3.系統基本操作，包括系統備份、自動化腳本、時間自動更新等機制

## A. 找出 `/usr/bin, /usr/sbin` 目錄下具有特殊權限的檔案（SUID / SGID / SBIT），並複製到 /data/findperm

參考:[Unit05-5.3.2](https://linux.vbird.org/linux_basic_train/rockylinux9/unit05.php#5.3) SUID/SGID/SBIT 權限的設定

參考:[Unit07-7.1.2](https://linux.vbird.org/linux_basic_train/rockylinux9/unit07.php#7.1)  變數設定規則


```bash=
# 先建好目標目錄
mkdir /data/findperm

# 找出題目需要的檔名
find /usr/sbin /usr/bin -perm /7000 2> /dev/null

# 最後動作(複製到 /data/findperm)
cp -a $(find /usr/sbin /usr/bin -perm /7000 2> /dev/null) /data/findperm
```

## B. 使用 ip addr show 過濾 inet（IPv4）資訊，並輸出至 /data/mynetwork.txt

參考:[Unit08-8.2.2](https://linux.vbird.org/linux_basic_train/rockylinux9/unit08.php#8.2)  管線 (pipe) | 的意義

```bash=
# 方法一
ip addr show | grep -w inet | grep -v inet6 > /data/mynetwork.txt

#方法二

ip addr show | grep 'inet ' > /data/mynetwork.txt
```

## C. 系統備份腳本 /root/backup_system.sh


參考:[Unit11-11.2.2](https://linux.vbird.org/linux_basic_train/rockylinux9/unit11.php#11.2)  檔案的打包指令, tar


* 需要備份的目錄有：/etc, /home, /var/spool/mail/, /var/spool/cron/, /var/spool/at/, /var/lib/
* 第一行一定要宣告 shell 喔！
* 自動判斷 /backups 目錄是否存在，若不存在則 mkdir 建立她，若存在則不進行任何動作
* 設計一個名為 mysource 的變數，變數內容以空格隔開所需要備份的目錄
* 設計一個名為 mytarget 的變數，該變數為 tar 所建立的檔名，檔名命名規則 /backups/mysys_20xx_xx_xx.tar.bz2 ， 其中 20xx_xx_xx 為西元年、月、日的數字， 該數字依據你備份當天的日期由 date 自行取得。
* 開始利用 tar 來備份

```bash=
#!/bin/bash

# 建立備份目錄
[ ! -d /backups ] && mkdir -p /backups

# 備份來源
mysource="/etc /home /var/spool/mail /var/spool/cron /var/spool/at /var/lib"

# 備份目標檔案名稱
mydate=$(date +%Y_%m_%d)
mytarget="/backups/mysys_${mydate}.tar.bz2"

# 開始備份
tar -jcvf "$mytarget" $mysource

```
儲存後立刻執行一次測試

```bash=
sh backup_system.sh
```
## D. 定期備份（每週六凌晨2點），包含log與 nice 值設定

參考:[Unit05-5.2.3](https://linux.vbird.org/linux_basic_train/rockylinux9/unit05.php#5.2)  程序的優先序 PRI 與 NI

參考:[Unit08-8.2.1](https://linux.vbird.org/linux_basic_train/rockylinux9/unit08.php#8.2)  指令執行資料的流動

```bash=
vim /etc/crontab

0 2 * * 6 root nice -n 10 /root/backup_system.sh > /backups/backup.log 2>&1
```

## E. 恢復 /usr/sbin/setquota 檔案操作指南

參考:[Unit08-8.2.1](https://linux.vbird.org/linux_basic_train/rockylinux9/unit08.php#8.2)  指令執行資料的流動

```bash=
# 確認該檔案是由哪個套件提供
rpm -qf /usr/sbin/setquota

# 驗證 quota 套件的完整性
rpm -V quota
# 如果檔案缺失，輸出會顯示
# missing   /usr/sbin/setquota

# 使用 yum 移除並重新安裝 quota 套件
yum remove quota
yum install quota

yum reinstall quota
```

## F. HTTP/HTTPS 網頁伺服器練習流程


參考:[Unit13-13.1.6-1](https://linux.vbird.org/linux_basic_train/rockylinux9/unit13.php) 


* 讓你的 Linux 成為 http 以及 https 支援兩者的網頁伺服器
* 每次開機都會主動的喚醒這個伺服器功能
* Internet 應該要能夠連線到你的 http 以及 https 埠口服務
* 當輸入 http://localhost 時，可以看到的是『This is DIS in KSU.』


> [!Note]**服務建置五個步驟**
安裝
啟動
開機啟動
防火牆
測試與上傳資料

```bash=
# 安裝 Apache 網頁伺服器與 SSL 模組（支援 HTTPS）
yum install httpd mod_ssl

# 啟動 httpd 並設定開機自動啟動
systemctl enable --now httpd

# 永久開啟防火牆中的 HTTP/HTTPS 服務（port 80/443）
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent

# 重新載入防火牆設定，使變更立即生效
firewall-cmd --reload


# 寫入首頁內容，當訪問 http://localhost 時顯示這行文字
echo "This is DIS in KSU." > /var/www/html/index.html
```

測試(選用)

```bash=
# 查看目前防火牆的完整狀態，確認已開啟 http 和 https
firewall-cmd --list-all

# 顯示目前系統中所有監聽中的 TCP/UDP 埠口
netstat -tuln

# 使用 curl 測試本機 HTTP 服務是否正常運作（模擬瀏覽器)
curl http://localhost
# 預期輸出：This is DIS in KSU.
```

# 4.腳本建立與系統管理

## A. 設定單次關機排程 (7月20日 08:00)

參考：[Unit11-11.3.1](https://linux.vbird.org/linux_basic_train/rockylinux9/unit11.php#11.3) 單次工作排程： at

```bash=
# 確認 atd 服務已啟用（排程才會執行）
systemctl status atd

echo "poweroff" | at 08:00 2025-07-20

# 驗證排程是否成功
atq
```

## B. 系統開機的通知訊息

參考：[Unit13-13.2.1](https://linux.vbird.org/linux_basic_train/rockylinux9/unit13.php#13.2) Linux 系統在 systemd 底下的開機流程

```bash=
# 找尋與 local 比較有相關的 unit 或 unit file
systmeectl list-units --all | grep local

# 會發現與/etc/rc.d/rc.local有相容性
systemctl status rc-local.service

vim /etc/rc.d/rc.local
```
:::info
確認檔案存在：如果 /etc/rc.d/rc.local 不存在，則需要建立它。在某些 Linux 發行版中，預設情況下可能沒有此檔案
:::

編輯 /etc/rc.d/rc.local 檔案

```bash=
#!/bin/bash

echo "reboot new" | mail -s 'reboot message' root

# 確保腳本正常結束。
exit 0
```

```bash=
# 設定執行權限
chmod a+x /etc/rc.d/rc.local
```



## C. /usr/local/bin/myprocess 的腳本

* 第一行一定要宣告 shell 為 bash 才行；
* 主要僅執行『 /bin/ps -Ao pid,user,cpu,tty,args 』
* 這隻腳本必須要讓所有人都可以執行才行！

```bash=
#!/bin/bash
/bin/ps -Ao pid,user,cpu,tty,args
```

```bash=
chmod a+x /usr/local/bin/myprocess

myprocess
```

## D. /usr/local/bin/myans.sh 的腳本

參考：[Unit09](https://linux.vbird.org/linux_basic_train/rockylinux9/unit09.php) 搜尋關鍵字 `透過外帶參數`

參考：[Unit09-9.2.4](https://linux.vbird.org/linux_basic_train/rockylinux9/unit09.php#9.2) 透過 if .. then 設計條件判斷

* 腳本內第一行一定要宣告 shell 為 bash
* 當執行 myans.sh true 時，螢幕會輸出『 Answer is true 』，且訊息為預設的 Standard output
* 當執行 myans.sh false 時，螢幕會輸出『 Answer is false 』，且訊息輸出到 starndard error output
* 當外帶參數不是 true 也不是 false 時，螢幕會輸出『 Usage: myans.sh true|false 』
* 這隻腳本必須要讓所有人都可以執行才行！

```bash=
#!/bin/bash

if [ "${1}" == "true" ]; then
    echo "Answer is true"
elif [ "${1}" == "false" ]; then
    echo "Answer is false" >&2
else
    echo "Usage: myans.sh true|false"
fi

```

```bash=
chmod a+x /usr/local/bin/myans.sh

sh myans.sh
```

# 5. 基礎檔案管理與檔案系統維護

## A. 打包檔案的格式錯誤問題


你的系統中有個檔名 /root/mybackup 的檔案，這個檔案原本是備份系統的資料，但副檔名不小心寫錯了！
請將這個檔案修訂成為比較正確的副檔名 (例如 /root/mybackup.txt 之類的模樣)
並且將該檔案在 /srv/testing/ 目錄中解開這個檔案的內容。

:::info
:pushpin: 要修正 /root/mybackup 檔案的副檔名，並將其內容解開到 /srv/testing/ 目錄中，你需要知道該檔案實際是什麼格式的壓縮或打包檔案（如 .tar, .tar.gz, .zip 等）。
:::

```bash=
# 判斷檔案格式
file /root/mybackup

# 重新命名檔案（假設為 .tar.xz）
mv /root/mybackup /root/mybackup.tar.xz
# （請根據 file 指令的輸出選擇正確的副檔名）

# 解壓縮到指定目錄
# 若為 .tar.gz 格式
mkdir /srv/testing/
tar -Jxv -f /root/mybackup.tar.xz -C /srv/testing/
```

## B. LVM 彈性容量變化的效果

參考：[Unit14-14.2.3](https://linux.vbird.org/linux_basic_train/rockylinux9/unit14.php#14.1) 彈性化處理 LVM 檔案系統

* 目前的系統中， /home 應該使用的是 LVM 的維護模式。請找出 /home 所在的 VG 剩餘容量
* 將 VG 所有剩餘容量通通提供給 /home 使用，因此整個 /home 的容量將會放大很多。
* 在目前的系統中，掛載在 /home 的LVM格式資料，請將它的容量變成最大！
* 且這個目錄內的資料並不會消失(無須重新格式化的意思)。

```bash=
# 查詢 /home 所在的 Logical Volume 與 Volume Group
df -Th /home

# 你也可以用以下方式更明確找出 VG 名
lvdisplay /dev/mapper/rocky-home
```


```bash=
# 查詢 VG 剩餘空間
vgdisplay rocky
```

找出 Free PE / Size（剩餘空間）。
`Free PE / Size    1536 / 6.00 GiB`

```bash=
# 先將剩餘空間全數分配給 /home 對應的 LV
lvresize -L +6G /dev/mapper/rocky-home

# 調整檔案系統容量
xfs_growfs /home

# 驗證擴充(選用)
df -Th /home
```
