# Linux 期中考
## CH1
### Operating System(OS)
作業系統是電腦硬體與使用者/應用程式之間的媒介
1. 管理電腦的各項資源
2. 提供使用者操作介面
3. 提供應用程式執行的環境
- 核心
就是**作業系統**
- 系統呼叫
核心提供的一系列函式庫
- 應用程式
該系統呼叫的環境
## CH2
### SHELL(殼)
- 使用者和電腦的互動介面
- 指令解釋器
- 預設為 **bash**
`user@ubuntu:~$ command [-options] [parameter1] [parameter2] ...
`
1. 不論空幾格都視為**一格**
2. 英文大小寫不同
3. `\` 跳脫 enter
### 終端機
`Ctrl + Alt + t` 開啟
`@`、`:` 代表分隔符號
`#` 代表 root;`$` 代表一般用戶
`~` 代表home 目錄
### 查詢
1. `指令 --help`
透過滑鼠捲軸或 `ctrl+shift+↑↓`
2. `man 指令`
manual 的縮寫
`space` 下一頁
`/` 搜尋
`n`、`N` 往下/上搜尋下一個
`h` 操作說明
`q` 離開
### Linux 目錄樹系統
- `/`
根目錄,系統管理員的家目錄
- `/usr`
unix software resource,與軟體安裝執行有關
- `/var`
variable,與系統運作過程有關
### 目錄相關
- `pwd`
print working directory 顯示目前工作目錄的路徑
- `ls`
list 列出檔案或目錄
`a` 顯示隱藏檔
`l` 列出詳細資料
`d` 只顯示目錄
- `cd`
change directory
`.` 此層目錄
`..` 上一層目錄
`-` 前一個工作目錄
`~` 目前使用者的家目錄
`~user` 只用者 user 的家目錄
- 建立新的目錄 `mkdir`
- 刪除**空的**目錄 `rmdir`
- 複製檔案或目錄 `cp 來源檔 目標檔`
`-r` 複製目錄
`-u` 目標檔案與來源檔案有差異時才複製(用於備份)
`-a` 屬性權限同樣複製
- 移除檔案或目錄 `rm`
- 移動檔案、目錄或更名 `mv 來源 目標`
- 檢視檔案內容 `cat`
concatenate
- 建立空白檔案 `touch`
`touch aa{a,b,c,d}`
建立較多檔名可用大括號處理,例如 aaa,aab,aac,aad,不同之處以逗號隔開。
檔名連續時利用 `..` 來迭代,如 `touch aa{1..3}` 產生 aa1,aa2,aa3
- `file`
觀察檔案類型
## CH3
### 萬用字元

- `vi` / `vim`
- 一般指令模式
- 編輯模式(i)
- 指令命令列模式
`$` 或 功能鍵[end] 移動到這一行的最尾端
`u` 復原前一動作
`.` 重複前一動作
`G` 移動到檔案最後一行
`nG` 移動到第 n 行
`gg` 移動到第一行(=1G)
`n[Enter]` 游標向下移動 n 行
`dd` 刪除游標所在的那一列
`yy` 複製游標所在的那一列
`p, P` 複製的資料貼在游標下/上一行
`/string` 向游標之下尋找名為 string 的字串
`n` 重複前一個搜尋的動作
`N` 反向進行前一個搜尋動作
## CH4

### 權限
**應用**在某個/某群帳號上;**設定**在目錄/檔案上
- 權限身分
- user/owner/檔案擁有者/使用者
- group/群組
- others/其他人
- 檔案類型
- `l` 連結檔
- `d` 目錄檔
- `-` 一般檔案
- 檔案權限
- r
可以讀取檔案實際內容(cat, less)
具有讀取目錄結構清單的權限(ls)
- w
可以寫入/編輯/新增/修改檔案內容(vi)
具有異動該目錄結構清單的權限(touch, rm, cp, mv)
- x
檔案具有可以被執行的權限
能否進入該目錄成為工作目錄(cd)

### 改變檔案屬性
- 改變擁有者 `chown`
`chown 帳號名稱 檔案或目錄`
- 改變所屬群組 `chgrp`
`chgrp 群組名稱 檔案或目錄`
- 改變權限 `chmod`
`chmod 權限設定 檔案或目錄`
- r=4
- w=2
- x=1

### 基礎帳號管理
- 新增使用者
`useradd` 或 `adduser`
- 刪除使用者
`userdel` 或 `deluser`
- 查看帳號 `id`
`id` 帳號名稱
- 查看帳號參與的群組 `groups`
`groups 帳號名稱`
- 新增群組
`groupadd` 或 `addgroup`
- 刪除群組
`groupdel` 或 `delgroup`
- 群組加入/移除帳號 `gpasswd`
`gpasswd 帳號名稱 群組名稱`
- 指定帳號支援群組 `usermod`
`usermod 群組名稱 帳號名稱`
- 查看群組內成員 `groupmems`
`groupmems -g 群組名稱 -l`
## CH5
- UID 使用者ID
**/etc/passwd**
- GID 群組GID
**/etc/passwd & /etc/group**
檔案系統紀錄的是**UID**,代表使用者

- 查看資訊 `change -l 帳號名`


## 檔案特殊權限
- SUID(Set UID)
設置使文件在執行階段具有文件所有者的權限
- 權限 x 變成 s
- SUID 權限對**二進位程式**有效
- 執行者對於該程式需要具有 **x** 的可執行權限
- 本權限僅在執行該程式的過程中有效
- 執行者將具有該程式擁有者 (owner) 的權限。
- SGID
目錄被設置後,任何用戶在此目錄下建立的文件,所屬群組皆與該目錄所屬的群組相同
- 與 SUID 類似的,將特殊的權限旗標設定在群組的 x 上
- SBIT(Sticky Bit)
防刪除屬性,只對目錄有效
- 權限 x 變成 t
- 當使用者在該目錄下建立檔案或目錄時,僅有自己與 root 才有權力刪除該檔案

如果本來在該位上有 x 屬性,則這些特殊屬性顯示為小寫字母 (s, s, t),否則顯示為大寫字母 (S, S, T)


檔案預設權限:666
目錄預設權限:777
`umask 022` 代表在原有預設值上減去權限,變成
檔案:644
目錄:755
## CH6
### 程式(program)
儲存在硬碟中,實體檔案
### 程序(porcess)
正在運作中的程式。觸發任何一個事件時,系統都會將他定義成為一個程序,並且給予這個程序一個 ID ,稱為 **PID**
PID1,由 Linux 核心所主動呼叫的第一支程式
所有的程序都是依附在 **systemd** 這支程序底下


### 觀察 bash 相關程序 `ps -l`

- F (flag)
代表程序的總結旗標
1, 此子程序僅進行複製而沒有實際執行
4, 此程序使用 super-user 權限
- UID
此程序被該 UID 所擁有
- PID
程序的 PID 號碼
0, swapper (scheduler), 負責分頁任務
1, init, 負責產生其他用戶程序
- PPID
此程序的父程序 PID 號碼
- C:代表 CPU 使用率,單位為百分比
- S (stat)
狀態列
R (Running):該程式**正在運作**中
S (Sleep):**正在睡眠狀態(idle)**,可以被喚醒(signal)
D :**不可被喚醒的睡眠狀態**,通常這支程式可能在等待 I/O 的情況 (列印)
T :**停止狀態**(stop),可能是在工作控制(背景暫停)或除錯 (traced) 狀態
Z (Zombie):**殭屍狀態**,程序已經終止但卻無法被移除至記憶體外
- ADDR
該程序在記憶體的哪個部分
如果是 running 的程序,顯示『 - 』
- SZ
代表此程序用掉多少記憶體
- WCHAN
表示目前程序是否運作中
如果是 running 的程序,顯示『 - 』
- PRI/NI
此程序被 CPU 所執行的優先順序
Priority/Nice 的縮寫
數值越小代表該程序越快被 CPU 執行
- TTY
登入者的終端機位置
- TIME
花費 CPU 運作的時間,不是系統時間
- CMD
造成此程序的觸發程式之指令為何
### 程序呼叫(fork & exec)
系統複製(fork)一個與父程序相同的暫存程序,這個暫存程序會有自己的 PID 以及多一個 PPID (父程序的程序識別碼)

暫存程序開始以執行 (exec) 的方式載入實際要執行的程式,最終子程序的程式碼變成 qqq
- fork()
- pid -1 代表發生錯誤
- pid 0 代表子程序
- pid >0 代表父程序
### 程序狀態
- 孤兒 (Orphan)
- 子程序還沒結束時,父程序已先結束
- 孤兒由 init 接管,不會有危害
- 殭屍 (Zombie)
- 子程序在exit之後,並非馬上就消失掉,而是留下一個稱為殭屍狀態 (Zombie) 的數據結構,等待父程序處理
- 父程序沒有來得及處理已經結束的子程序,子程序就變成殭屍狀態,佔據記憶體資源
### 程序優先權 = PRI + NI
- 值越低代表越優先
- PRI 值由核心動態調整,使用者無法直接調整 PRI 值
- 使用者要調整程序的優先執行序,就要透過調整 Nice 值(範圍為 -20 ~ 19)
- 使用者只能調高 Nice 值 (備份 or 不重要的程序)

### 觀察全系統的程序
- pstree
- ps aux
- ps -ef
- top(動態觀察程序變化)
### 工作管理
- 前景
可以控制與下達指令的環境
- 背景
可以自由運作的工作,無法使用 ctrl+c 終止
背景中執行程序不能等待 terminal/shell 的輸入
- 將指令丟到背景執行 `指令 &`
- 將目前工作丟到背景中暫停 `ctrl+z`
- 觀察目前背景工作狀態 `jobs`
- 將背景工作拿到前景 `fg`
- 讓工作在背景下的狀態變成運作 `bg`
- 管理當中的工作 `kill`
## CH7
### 檔案系統
- inode
- 紀錄檔案的屬性(類型、大小和權限等)
- 紀錄檔案資料所在的 block 號碼
- 預設大小 256bytes
- block
- 實際記錄檔案的內容
- 預設大小 **4K**
- superblock
- 檔案系統的總結資訊處,要讀取檔案系統一定要從 superblock 讀起
- 紀錄檔案系統整體資訊(inode, block總量、使用量、剩餘量等)
- inode table
- 檔案的存取模式/擁有者與群組/容量、建立或改變時間/真正內容的指向
- **每個檔案都僅會佔用一個 inode **
- 建立的檔案數量與 inode 總數有關
- data block
- 每個 block 只能放置一個檔案
- 若檔案size__於 block
大 → 占用多個 block
小 → 剩餘空間不能再使用
### 索引式檔案系統
某一個檔案的屬性與權限資料是放置到 inode 4 號,而這個 inode 記錄了檔案資料的實際放置點為 2, 7, 13, 15 這四個 block 號碼,此時作業系統就能夠據此讀取順序將四個 block 內容讀出來

### 鏈結式檔案系統
檔案的資料依序寫入1->7->4->15號這四個 block 號碼中, 但檔案系統沒有辦法一次就知道四個 block 的號碼,要一個一個的將 block 讀出後,才會知道下一個 block 在哪

### 日誌式檔案系統
- superblock、inode、block 變動產生不一致
- 檔案系統中規劃出一個區塊,該區塊專門在記錄寫入或修訂檔案時的步驟
- 當系統要寫入一個檔案時,會先在日誌記錄區塊中紀錄某個檔案準備要寫入的資訊
- 完成資料更新後,在日誌記錄區塊當中完成該檔案的紀錄
- ext4, xfs
### 目錄
- 建立目錄時,檔案系統會分配**一個 inode 與至少一塊 block**
- inode 紀錄該目錄相關的**權限、屬性與分配到 block 的號碼**
- block 紀錄目錄下的**檔名,與該檔名占用的 inode 號碼**
### 磁碟與目錄容量
- **檔案系統**整體磁碟使用量 `df`
- `H` 易閱讀格式顯示
- `T` 連同檔案系統名稱列出
- `-i` 以 inode 數顯示
- 評估目錄所占**block 配置**容量 `du`
- 查看 superlock 資訊 `dumpe2fs`, `xfs_info`
### 實體連結 `ln 原始檔案 目的檔案`
- 多個檔名對應到同個 inode 號碼
- 檔名只與目錄有關,檔案內容與 inode 有關
- 不能跨檔案系統、連結目錄

- 將任何一個檔名刪除, inode 與 block 都還是存在的
- 磁碟的空間與 inode 的數目都不會改變
### 符號連結 `ln -s`
- 建立一個獨立檔案,有自己的 inode 與 block(儲存原始檔案的路徑)
- 會占用 inode 與 block
- 來源檔案被刪除後,符號連結的檔案會開不了
- 連結檔會寫上目標檔案的檔名
現在是快速符號連結,直接**把檔案路徑寫在 inode 上**,不會再配置一個 block
### 掛載 `mount 裝置檔名 掛載點`
利用目錄當成進入點,將磁碟分割槽的資料放置在該目錄下
- 單一檔案系統不能被重複掛載在不同的掛載點(目錄)中
- 單一目錄可以掛載多個檔案系統
USB 掛載點預設 /media/user
卸載 `umount 掛載點`
建立 iso 檔 `genisoimage`