---
# System prepended metadata

title: 建構作業環境

---

從系上主機建構成繳交作業環境，我們的資源： 
- 1 vCPU 
- 2GB RAM 
- 2GB Swap 
- 40 GB ROM 

以下是需求 
- 磁碟： 
    - 每人 ~100MB，quota 強制限制 
    - 全部學生共用這台 VM 的 /home 分區 
- 安全/資源管理策略： 
    - 用磁碟 quota 避免濫用空間 
    - 沒有限制 CPU/RAM（大家共用） 
    - 不給 core dump (ulimit -c 0) 避免生成大檔案 
    - 以 Linux user 帳號做隔離（非一人一 VM）

# 建構作業環境步驟

## 1. 啟用磁碟 Quota
### A. 安裝 quota 工具

```bash
sudo apt update
sudo apt install quota
```

### B. 修改 `/etc/fstab`

找到 `/dev/sda2` 掛載 `/` 的那一行，加上：

```
defaults,usrquota,grpquota
```

```
UUID=xxxx-xxxx   /   ext4   errors=remount-ro,usrquota,grpquota   0 1
```

### C. 重新掛載並建立 quota

```bash
sudo mount -o remount /
sudo quotacheck -cugm /
sudo quotaon /
```

---

## 2. 建立 quota 樣板

先建一個「樣板帳號」，給他 quota 100MB（硬限制）。

```bash
sudo useradd -m student
sudo edquota -u student
```

在編輯器裡設定 `/` 分割：
![圖片](https://hackmd.io/_uploads/rJHjTbpsxl.png)
- blocks：目前使用的磁碟空間（KB）。
- soft / hard：使用者能用的上限。soft 是「警告線」，hard 是「強制上限」。
- inodes：檔案數量。soft / hard 同樣是限制數量。

我目前設定：
* blocks：`100000 102400`（大約 100MB）
* inodes：`9000 10000`（避免塞太多小檔）

---

## 3. 批量建立學生帳號

準備好 `students.txt`，每行一個名字與學號。

建立腳本：

```bash
#!/bin/bash
INPUT="students.txt"
DEFAULT_PW="Temp#2025!"

while read -r u; do
  [[ -z "$u" ]] && continue
  sudo useradd -m -k /etc/skel -s /bin/bash "$u"
  echo "${u}:${DEFAULT_PW}" | sudo chpasswd
  sudo chage -d 0 "$u"   # 首次登入強制改密碼
  sudo edquota -p student "$u"
done < "$INPUT"
```

存檔為 `create_students.sh`，給執行權限：

```bash
chmod +x create_students.sh
./create_students.sh
```

---

## 4. 關閉 Core Dump

避免學生亂跑程式產生大檔。

### A. PAM limits

建立 `/etc/security/limits.d/nocore.conf`：

```
* soft core 0
* hard core 0
```

新增 `/etc/pam.d/common-session` 有：

```
session required pam_limits.so
```

### B. systemd-coredump

```bash
sudo mkdir -p /etc/systemd/coredump.conf.d
echo -e "[Coredump]\nStorage=none\nProcessSizeMax=0" | sudo tee /etc/systemd/coredump.conf.d/disable.conf
sudo systemctl daemon-reload
```

---

## 5. 建立繳交作業資料夾

假設課程代號 **IM101**。

### A. 建資料夾

```bash
sudo groupadd ta
sudo mkdir -p /courses/IM101/submit
sudo chgrp ta /courses/IM101
sudo chmod 2755 /courses/IM101
```

### B. 設定「繳交區」

```bash
sudo chown root:ta /courses/IM101/submit
sudo chmod 1733 /courses/IM101/submit
```

* 學生：只能寫入自己的檔案，看不到別人的
* 助教（群組 ta）：可讀所有

---

## 6. 安全與便利

* **SSH**：限制登入群組（學生、TA）

  ```
  AllowGroups students ta admins
  ```
* **Logins 預設 umask**：在 `/etc/login.defs` 設定：

  ```
  UMASK 077
  ```

  → 學生家目錄不互相可讀。
* **公告訊息**：在 `/etc/motd` 寫「quota 100MB、提交方法」

---

## 7. 維運

* 查看所有人 quota 使用：

  ```bash
  sudo repquota -as
  ```
* 查看單人：

  ```bash
  quota -u 學號
  ```
* 調整某人額度：

  ```bash
  sudo edquota -u 學號
  ```

---

# 完成效果

* 每人帳號獨立（不可互訪）
* 每人硬限制 100MB
* 禁止 core dump
* 有「交作業投遞匣」給學生上傳，助教能看
