# 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
```