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