# Linux上課筆記 ## 2023.04.18 ### 檔案系統 * CentOS 7所使用的檔案系統為**XFS** * XFS檔案系統 * 最大可達8EB * 支援日誌 * 大檔傳輸效能 * 檔案系統大小 * Linux所使用的檔案系統舊至新依序為: 1. Ext2 2. Ext3 * 以Ext2為基礎再加上 **日誌功能** * 日誌功能: 節省傳統需掃描整顆硬碟所耗費 的時間 4. Ext4 * 突破檔案系統的大小限制 * 減少檔案在寫入磁碟時的 **游離區塊的程度** 6. XFS * FAT32無法存取超過4GB的單一檔案 * 現今硬碟大部分格式化為NTFS或EXFAT * 檔案資訊紀錄檔: **inode** * 屬於一種meta data * 用來描述真正資料的資料 * 用來描述檔案大小(file size)、擁有者(owner)、擁有群組(group)、修改時間(Ctime)、儲存位置(block location)等屬性 * 增加安全性 * 典型的例子如 /tmp 的權限是 『drwxrwxrwt』,任何用戶都可在 /tmp 內新增、修改檔案,但僅有該檔案/目錄建立者與 root 能夠刪除自己的目錄或檔案。 (Sticky bit的功用) ![](https://hackmd.io/_uploads/HkwS2yjUn.png) ![](https://hackmd.io/_uploads/HkxYIhyjLh.png) * change time : 除了內容改變會變動外,屬性變動也會變更時間 * ls-I 可列出inode檔案編號 ### link連結(期末必考) * 硬連結(hard link) * 不可跨越分割區 * 不可使用於目錄 * 符號連結(simbolic link) * 在ls指令加上-s * 由不同的inode做存取 * **若刪除原始資料將會變成無效連結** * 沒有自己的權限 * **windows下"捷徑"可以連結到任意的"檔案"或者是"資料夾"** ### df指令 * 查看硬碟空間的使用情況(磁碟切割) * 在指令後加上-h指令可顯示較常見的單位 ![](https://hackmd.io/_uploads/H1benbo82.png) * $: 以什麼為結尾 ![](https://hackmd.io/_uploads/SyJJyMjI2.png) ## 2023.04.25 ### du指令 * du針對的是包含目錄加總後的大小(file) * df針對的是磁碟分割區(disk) ![](https://hackmd.io/_uploads/SyJ9-4iIh.png) * 執行du -h指令時,將會條列出所有資料夾和檔案 ![](https://hackmd.io/_uploads/ByADGEoU2.png) * 了解某個資料夾佔系統多少空間 ![](https://hackmd.io/_uploads/SknnfViL3.png) * 使用-max-depth指令了解當前目錄下子資料夾的大小 ![](https://hackmd.io/_uploads/Ski07VsIn.png) ### 指令的輸入輸出 * 標準輸出,"1" 可省略 ![](https://hackmd.io/_uploads/SJ0iNNi8h.png) * 標準錯誤輸出,將monitor改為file ![](https://hackmd.io/_uploads/Sy1DBVi82.png) * 將正確結果寫在a.txt,將錯誤結果寫在b.txt ![](https://hackmd.io/_uploads/HJQ6SVsLh.png) * 正確、錯誤結果皆會放入c.txt ![](https://hackmd.io/_uploads/rJpK84jI2.png) * 將資料丟進/dev/null指令,不管結果如何都不會顯示在螢幕上 ![](https://hackmd.io/_uploads/SyJ8D4oU3.png) * 使用echo $?指令了解剛剛執行的指令是對是錯,如返回值為0即正確,非0則錯誤 ![](https://hackmd.io/_uploads/SJzMONsL3.png) * 管線 "|" * 結合2個以上的指令來處理較複雜的工作 * 前面輸出的結果將作為後面的輸入 * 並非所有指令都可用管線,必須具備標準輸入才可放在管線右手邊 * rm指令不可直接放在管線右邊 ![](https://hackmd.io/_uploads/r1ILqEoLh.png) * xargs rm -f ![](https://hackmd.io/_uploads/SyzBjVj83.png) * 有名管道testfifo,代表符號為 "p" ![](https://hackmd.io/_uploads/SJb0iVs82.png) ![](https://hackmd.io/_uploads/Bkp16EjIh.png) * 有名管道的優點: 1. 將兩個程式拆開,可先執行後者 2. 無先後順序,是兩個獨立的東西 * 符號的補充: 1. "echo hello > a.txt",取代原本的內容 2. "echo hello >> a.txt",追加新的檔案 3. "> a.txt" : 清空檔案內的內容 ![](https://hackmd.io/_uploads/HJUHgroL3.png) ### 搜尋指令 #### which * 搜尋PATH裡的所有目錄中是否有執行檔 #### locate * 查詢部分檔名 * 可用來找一般檔案或執行檔 * 使用此指令之前需先用"updatedb"指令更新資料庫 ![](https://hackmd.io/_uploads/B1qeNSo83.png) ![](https://hackmd.io/_uploads/SJn4VSiL3.png) #### find * 效率最差 * 可附加很多搜尋條件 * 在name前面加上"-i"指令表示不分大小寫 ![](https://hackmd.io/_uploads/rkUyIHsLh.png) ### 執行指令 (期末必考) * 前面找到的檔案會被填充到後面 { } 中 * 結束時以 "| ;" 為結尾 ![](https://hackmd.io/_uploads/ryeJqBoU2.png) * [期末必考](https://blog.gtwang.org/linux/unix-linux-find-command-examples/) ### 檔案修改與存取日期 (期末必考) * time(天)、min(分鐘) * m(最後修改時間)、a(最後存取時間)、c(檔案狀態最後修改時間) * n(剛好n天)、-n(n天以內)、+n(n天以上) * 範例:今天是 4/20 1. " find. -mtime 7", 4/13當天 2. " find. -mtime -7" ,4/13-4/20之間 3. " find. -mtime +7" ,4/13之前 ### 檔案大小 (期末必考) * 與上面時間同理 * 50MB(剛好50MB檔案)、+50MB-100MB(50MB到100MB之間的檔案) * 範例: ![](https://hackmd.io/_uploads/HkwBxLjU3.png) ### 增量備份 ![](https://hackmd.io/_uploads/ByXHfLjL2.png) ![](https://hackmd.io/_uploads/H1cHGUo83.png) ## 2023.05.02 ### 篩選內容 * [通配符/正則表達式](https://bpdocs.blueprism.com/bp-7-1/zh-hans/helpWildcardsAndRegex.htm) * 通配符 * 匹配檔案的**名稱** ![](https://hackmd.io/_uploads/rkR-uLjI2.png) * 正則表達式 * 針對檔案的**內容**進行匹配 ![](https://hackmd.io/_uploads/Sy9Nu8iIh.png) * [grep](https://blog.gtwang.org/linux/linux-grep-command-tutorial-examples/) * 可用來匹配檔案內容和名稱 * "-n"可顯示行號 ![](https://hackmd.io/_uploads/Hkoc2LsU3.png) * "-i" 為不分大小寫 ![](https://hackmd.io/_uploads/HyHt68oUn.png) * 參數可拆開、合併、顛倒 ![](https://hackmd.io/_uploads/HJMeRLs82.png) * "-v"為反向匹配 ![](https://hackmd.io/_uploads/S1QfAIiUh.png) * "-A" (after)、"-B" (before)為顯示前後幾行 ![](https://hackmd.io/_uploads/HyhMyvj8h.png) * 顏色標示 ![](https://hackmd.io/_uploads/H1j6kDoLh.png) * " \ " 恢復到指令本身 ![](https://hackmd.io/_uploads/BylqlviUn.png) * "/etc/passwd" 存放系統帳號及相關資訊 1. account 帳號名稱 2. password 帳號密碼 (真正的密碼存放在shadow檔) 3. uid 使用者ID 4. gid 使用者的群組ID 5. comment 帳號資訊 6. home directory 家目錄 ![](https://hackmd.io/_uploads/H1yA-PjL3.png) * "^root": 以root為開頭 ![](https://hackmd.io/_uploads/r1GvmvoI2.png) * "$" 以..為結尾 ![](https://hackmd.io/_uploads/HJj6mPiI3.png) * " ^$ " 為空白行 ![](https://hackmd.io/_uploads/SyRrVDjLh.png) * -v "^#"去掉註解、-v "^$"去掉空白 ![](https://hackmd.io/_uploads/BJKZHwiU2.png) * "^A" 大寫A開頭、"^a" 小寫a開頭、"[aA]" a或A開頭 ![](https://hackmd.io/_uploads/rJ1GLvoUh.png) * 匹配數字、大小寫 ![](https://hackmd.io/_uploads/HkZ1Ovo83.png) ![](https://hackmd.io/_uploads/BkxztDo82.png) ### 硬體設備 * /dev放置所有設備 * c: 字元設備(char) * b: 區塊設備(block) * tty: 終端設備 * 主設備號: 區分不同裝置 * 次設備號: 同個裝置裡第幾個 * 掛載儲存設備 * mount: 掛載設備 * umount: 卸載設備 * 掛載硬體 1. 新增硬碟 2. fdisk磁碟切割 3. mkfs格式化硬碟 4. mount掛載硬碟 5. 確認硬碟 * 卸載硬體 * 注意當前目錄 ![](https://hackmd.io/_uploads/BJ2Tbdo83.png) ## 2023.05.09 ### 新增使用者帳號 * /etc/passwd並不是存放密碼的位置,而是一般使用者和系統帳號 * /etc/shadow才是真正存放密碼的位置 * 使用者編號(uid)從1000開始 * **系統管理者稱為root, uid=0** * /bin/bash為一般帳號,/sbin/nologin為系統帳號 * passwd和shadow檔為Linux系統中不可外傳的兩個檔案 * useradd指令規格 ![](https://hackmd.io/_uploads/ByU03KiLh.png) * useradd範例: ![](https://hackmd.io/_uploads/H1EFTtsI3.png) * 寫腳本設置密碼(無互動) ![](https://hackmd.io/_uploads/Byb2Ats82.png) * 停止帳號登入 * 修改/etc/passwd中帳號的密碼檔 * 利用chsh改變該帳號的shell ### 檔案與目錄的權限 * 權限代表的意義 ![](https://hackmd.io/_uploads/H1i6yciIh.png) * r: 可讀,可使用cat編輯器讀取內容,但無法修改 * w: 可寫入,也可新增、修改或刪除檔案 * x: 可被執行 * -: 不允許該權限 * "chmod"指令更改權限 * r=4、w=2、x=1 * 解讀權限 * 644: "rw-r--r--"擁有者可讀寫,群組可讀,其他人可讀 * 語意描述法 ![](https://hackmd.io/_uploads/SJXSG9iI3.png) * u: 該檔案擁有者user * g: 該檔案群組group * o: 其他人other(權限第三人) * a: 所有人all,也可是上述ugo集合 * 目錄的權限 * r: 可列出該目錄的檔案清單,可察看資料夾內容 ![](https://hackmd.io/_uploads/rkSrIcsUn.png) * w: 該目錄中的檔案和目錄都可異動 ![](https://hackmd.io/_uploads/rJkYL5sI3.png) * x: 可用"cd"指令進入目錄中 ![](https://hackmd.io/_uploads/HkQILqi8h.png) * 如果目錄權限沒有w,就無法刪除檔案,但這只是對一般使用者,管理者還是可以照常刪除 * **若想查看資料夾權限需加入"-d"參數** ![](https://hackmd.io/_uploads/SkBt4qsL2.png) * "chown"指令更改檔案擁有者 * "-R"連同下面檔案一起更改 ![](https://hackmd.io/_uploads/ry149qoL2.png) ### 行程狀態指令"ps" * **在Linyx系統下,PID=1的程式叫做systemd** ![](https://hackmd.io/_uploads/ByYPoqs8n.png) ## 2023.05.16 ### mkdir -p 目錄名稱 * 加上"-p",如果資料夾不存在則**創建資料夾** * 如果資料夾存在則**不動作**,也不會有錯誤發生 ![](https://hackmd.io/_uploads/rk6l4Ybwn.png) * 刪除權限 ![](https://hackmd.io/_uploads/B1if4FZv3.png) ![](https://hackmd.io/_uploads/rkeEEKbv3.png) ![](https://hackmd.io/_uploads/r1DBVtZDh.png) ![](https://hackmd.io/_uploads/SyODVFZwh.png) ### 將檔案上"i"鎖 * 連root都無法新增、刪除、修改 ![](https://hackmd.io/_uploads/HJDqSYWD2.png) * 如果目錄權限沒有w,就無法刪除檔案 * 只針對一般使用者,管理者還是可以照常刪除 ![](https://hackmd.io/_uploads/B1kQHYbw2.png) * 無法刪除 ![](https://hackmd.io/_uploads/BJOhrFbP3.png) ### 將檔案上"a"鎖 * 只能用echo新增 ![](https://hackmd.io/_uploads/SkrpKYWPh.png) ### "&" 背景執行 * 睡眠n秒 ![](https://hackmd.io/_uploads/SkNKcF-w2.png) * 查看Memory資訊 "free -h" ![](https://hackmd.io/_uploads/S1IsqtWvn.png) * 查看終端執行的行程 * "-f"指令更完整 ![](https://hackmd.io/_uploads/Sy0JoF-Dn.png) * systemd(pid=1) : 父行程 * ModemManager : 子行程 * 2*[{ModemManager}] : 孫行程 ![](https://hackmd.io/_uploads/HJlzjKbDn.png) * 最詳細的行程資訊 ![](https://hackmd.io/_uploads/HJB4st-wn.png) ## 2023.05.23 ### [ALC](https://ithelp.ithome.com.tw/articles/10221185) * 為細部權限,讓特定的人和情況有特殊的權限 * 控制權 * user: 針對**使用者**設定權限 * group: 針對**群組**設定權限 * mask: 該目錄新建檔案和目錄時,規範新資料的**最大允許權限** * 設定ALC ![](https://hackmd.io/_uploads/H1VP2KZDn.png) * 切換使用者查看是否可寫入 ![](https://hackmd.io/_uploads/B1Wshtbwh.png) ![](https://hackmd.io/_uploads/B1U3ht-Ph.png) * 在檔案中去做存取跟修改 ![](https://hackmd.io/_uploads/rkW03YWP2.png) ### [SRE](https://ithelp.ithome.com.tw/m/articles/10264860) * 網站可靠性工程 * MTBF(平均故障間隔時間)、MTTR(平均修復時間) * SPF (single point failure) * fault tolerance (容錯率) * 防火牆的兩個工具為iptable、firewalld * firewalld 設定好後不用重啟,且不會中斷連線,並能提供多個zone供管理者選擇設定 ![](https://hackmd.io/_uploads/rkmw6Fbvn.png) ![](https://hackmd.io/_uploads/B1yuatbv2.png) * 防火牆規則 ![](https://hackmd.io/_uploads/B1qY6KbD2.png) * **新增**規則http ![](https://hackmd.io/_uploads/ryz3aKbP2.png) * **移除**規則http ![](https://hackmd.io/_uploads/SkLRaYWvn.png) * 新增port2222 ![](https://hackmd.io/_uploads/BkzxCt-w2.png) * 查看是否在22port ![](https://hackmd.io/_uploads/SkgH7AFbvn.png) ### [防火牆進階](https://blog.gtwang.org/linux/centos-7-firewalld-command-setup-tutorial/) (期末必考) ![](https://hackmd.io/_uploads/ryNu0F-vn.png) ## 2023.05.30 * 建立與時間相關的檔案 ![](https://hackmd.io/_uploads/BkinAt-w2.png) * NTP protocol (network time protocol)主要為時間矯正用 * synchronization 同步 * cluster集群有很多很多的server * ntpdate 指令會去跟時間伺服器(NTP server)做**同步時間**的部分 * 在使用ntpdate指令之前先確認時間 timezones ![](https://hackmd.io/_uploads/HkTKycWvh.png) * "history" 指令顯示歷史 * 執行特定歷程的指令為"!數字" ![](https://hackmd.io/_uploads/HJO01cbwn.png) * "!keyword"會往上匹配相關的指令 ![](https://hackmd.io/_uploads/rJDxxqWD3.png) * 安裝完sever卻無法連接 * systemctl status伺服器查看狀態態 * 查看防火牆、selinux * 檢查port number * 查看對應的port ![](https://hackmd.io/_uploads/B1K_gqbv3.png) * 網頁伺服器狀態 * 1XX 資訊 * 2XX 成功 * 3XX 重新導向 * 4XX 用戶端錯誤 * 5XX 伺服器錯誤 ### 期末考必考 * ![](https://hackmd.io/_uploads/BkBV-qWvn.png) * "df"指令: 查看**硬碟空間(磁碟切割)** 使用情況 * "du"指令: 針對**目錄下**已使用的檔案空間 * "which"指令: 搜尋**PATH**裡的**執行檔** * "locate"指令: 執行之前先執行**updatedb**(更新資料庫) * [find用法](https://blog.gtwang.org/linux/unix-linux-find-command-examples/) * 檔案執行 * 修改與存取日期 * 檔案大小 * 不分大小寫(-iname) * 找尋空目錄(find . -type d -empty) * 設備目錄 * c: 字元(鍵盤滑鼠) * b: 區塊(硬碟 隨身碟) * 掛載: **mount**、卸載: **umount** * 磁碟切割: **fdisk** * 格式化: **mkfs** * 新增使用者帳號: **useradd** * 新增後使用者資訊儲存於 **/etc/passwd** * 使用者密碼儲存於 **/etc/shadow** * id使用者名稱: 列出使用者**帳號相關資訊**,且能判斷**帳號存在與否** * 新增tom使他加入兩個群組 * rd(主要的 "-g") * manager(次要的 "-G") * linux下**root pid=1**的系統程序名稱: **systemd** * 目錄的權限 (與檔案的rwx不一樣) * 沒有r: 不能ls * 沒有x: 不能cd(進入.txt) * 沒有w: 不能修改刪除內部檔案 ![](https://hackmd.io/_uploads/ByhDXc-v3.png) * 改變使用者權限: **chmod** * 更改擁有者: **chown** ![](https://hackmd.io/_uploads/SJygV5ZDh.png) * 刪除行程: **kill** * 前景拿到背景 ![](https://hackmd.io/_uploads/S1hQV5-w2.png) * 背景拿到前景 ![](https://hackmd.io/_uploads/B11BE5bw3.png) * 打包(tar)壓縮 * crontab表示式 ![](https://hackmd.io/_uploads/ryq8N9Ww2.png) ## 資料來源 * 柯志亨教授上課影片 * 《CentOS 7.3建置管理與伺服器架設實戰》 * 此筆記為上課時經由老師講解和參考課堂用書所完成,為原創筆記,圖片部分為老師上課示範時的時做截圖