# 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 ### 萬用字元 ![](https://i.imgur.com/IGgAeCe.png) - `vi` / `vim` - 一般指令模式 - 編輯模式(i) - 指令命令列模式 `$` 或 功能鍵[end] 移動到這一行的最尾端 `u` 復原前一動作 `.` 重複前一動作 `G` 移動到檔案最後一行 `nG` 移動到第 n 行 `gg` 移動到第一行(=1G) `n[Enter]` 游標向下移動 n 行 `dd` 刪除游標所在的那一列 `yy` 複製游標所在的那一列 `p, P` 複製的資料貼在游標下/上一行 `/string` 向游標之下尋找名為 string 的字串 `n` 重複前一個搜尋的動作 `N` 反向進行前一個搜尋動作 ## CH4 ![](https://i.imgur.com/Njolsag.png) ### 權限 **應用**在某個/某群帳號上;**設定**在目錄/檔案上 - 權限身分 - user/owner/檔案擁有者/使用者 - group/群組 - others/其他人 - 檔案類型 - `l` 連結檔 - `d` 目錄檔 - `-` 一般檔案 - 檔案權限 - r 可以讀取檔案實際內容(cat, less) 具有讀取目錄結構清單的權限(ls) - w 可以寫入/編輯/新增/修改檔案內容(vi) 具有異動該目錄結構清單的權限(touch, rm, cp, mv) - x 檔案具有可以被執行的權限 能否進入該目錄成為工作目錄(cd) ![](https://i.imgur.com/mtEs3CC.png) ### 改變檔案屬性 - 改變擁有者 `chown` `chown 帳號名稱 檔案或目錄` - 改變所屬群組 `chgrp` `chgrp 群組名稱 檔案或目錄` - 改變權限 `chmod` `chmod 權限設定 檔案或目錄` - r=4 - w=2 - x=1 ![](https://i.imgur.com/c7DdhJZ.png) ### 基礎帳號管理 - 新增使用者 `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**,代表使用者 ![](https://i.imgur.com/Kilkozt.png) - 查看資訊 `change -l 帳號名` ![](https://i.imgur.com/QQ3cPSx.png) ![](https://i.imgur.com/oK2wnlU.png) ## 檔案特殊權限 - SUID(Set UID) 設置使文件在執行階段具有文件所有者的權限 - 權限 x 變成 s - SUID 權限對**二進位程式**有效 - 執行者對於該程式需要具有 **x** 的可執行權限 - 本權限僅在執行該程式的過程中有效 - 執行者將具有該程式擁有者 (owner) 的權限。 - SGID 目錄被設置後,任何用戶在此目錄下建立的文件,所屬群組皆與該目錄所屬的群組相同 - 與 SUID 類似的,將特殊的權限旗標設定在群組的 x 上 - SBIT(Sticky Bit) 防刪除屬性,只對目錄有效 - 權限 x 變成 t - 當使用者在該目錄下建立檔案或目錄時,僅有自己與 root 才有權力刪除該檔案 ![](https://i.imgur.com/6yiTfA1.png) 如果本來在該位上有 x 屬性,則這些特殊屬性顯示為小寫字母 (s, s, t),否則顯示為大寫字母 (S, S, T) ![](https://i.imgur.com/U2rGLeq.png) ![](https://i.imgur.com/5HFbwA4.png) 檔案預設權限:666 目錄預設權限:777 `umask 022` 代表在原有預設值上減去權限,變成 檔案:644 目錄:755 ## CH6 ### 程式(program) 儲存在硬碟中,實體檔案 ### 程序(porcess) 正在運作中的程式。觸發任何一個事件時,系統都會將他定義成為一個程序,並且給予這個程序一個 ID ,稱為 **PID** PID1,由 Linux 核心所主動呼叫的第一支程式 所有的程序都是依附在 **systemd** 這支程序底下 ![](https://i.imgur.com/J6kpdrt.png) ![](https://i.imgur.com/KugTNzE.png) ### 觀察 bash 相關程序 `ps -l` ![](https://i.imgur.com/UQeDXOM.png) - 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 (父程序的程序識別碼) ![](https://i.imgur.com/BnZth0o.png) 暫存程序開始以執行 (exec) 的方式載入實際要執行的程式,最終子程序的程式碼變成 qqq - fork() - pid -1 代表發生錯誤 - pid 0 代表子程序 - pid >0 代表父程序 ### 程序狀態 - 孤兒 (Orphan) - 子程序還沒結束時,父程序已先結束 - 孤兒由 init 接管,不會有危害 - 殭屍 (Zombie) - 子程序在exit之後,並非馬上就消失掉,而是留下一個稱為殭屍狀態 (Zombie) 的數據結構,等待父程序處理 - 父程序沒有來得及處理已經結束的子程序,子程序就變成殭屍狀態,佔據記憶體資源 ### 程序優先權 = PRI + NI - 值越低代表越優先 - PRI 值由核心動態調整,使用者無法直接調整 PRI 值 - 使用者要調整程序的優先執行序,就要透過調整 Nice 值(範圍為 -20 ~ 19) - 使用者只能調高 Nice 值 (備份 or 不重要的程序) ![](https://i.imgur.com/8OX8xrG.png) ### 觀察全系統的程序 - 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 內容讀出來 ![](https://i.imgur.com/j1B2KE0.png) ### 鏈結式檔案系統 檔案的資料依序寫入1->7->4->15號這四個 block 號碼中, 但檔案系統沒有辦法一次就知道四個 block 的號碼,要一個一個的將 block 讀出後,才會知道下一個 block 在哪 ![](https://i.imgur.com/N8MisJd.png) ### 日誌式檔案系統 - 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 有關 - 不能跨檔案系統、連結目錄 ![](https://i.imgur.com/htHeJjJ.png) - 將任何一個檔名刪除, inode 與 block 都還是存在的 - 磁碟的空間與 inode 的數目都不會改變 ### 符號連結 `ln -s` - 建立一個獨立檔案,有自己的 inode 與 block(儲存原始檔案的路徑) - 會占用 inode 與 block - 來源檔案被刪除後,符號連結的檔案會開不了 - 連結檔會寫上目標檔案的檔名 現在是快速符號連結,直接**把檔案路徑寫在 inode 上**,不會再配置一個 block ### 掛載 `mount 裝置檔名 掛載點` 利用目錄當成進入點,將磁碟分割槽的資料放置在該目錄下 - 單一檔案系統不能被重複掛載在不同的掛載點(目錄)中 - 單一目錄可以掛載多個檔案系統 USB 掛載點預設 /media/user 卸載 `umount 掛載點` 建立 iso 檔 `genisoimage`