Linux Notes === ![image](https://hackmd.io/_uploads/H1SRRwvs0.png =150x) :::info :notebook_with_decorative_cover: This Notes is for preparing RHCSA & RHCE Certification<br> :information_desk_person: Editor by P.Y.Huang <br> :bulb: Reference : * 鳥哥私房菜 Linux 基礎學習篇 * Udemy courses : The BEST Linux Administration course that prepares you for corporate jobs and for RHCSA, RHCE, LFCS, CLNP certifications ::: ## Linux fundamentals: ### What is Linux? Linux是**Unix-like**的**開源作業**(open-source)系統,由Linus Torvalds在1991年的專案,其原本目的是被設計為 **MINIX**(一種用於教育目的的類 Unix 作業系統)的免費替代品。後續因其開源及免費的特色,被廣泛被運用在伺服器,嵌入式系統,超級電腦...etc。Linux的核心(Linux kernal)由一個核心組成,通常稱之為Linux核心構建的一系列作業系統。這種廣泛的用途涵蓋了將核心與其他工具和應用程式捆綁在一起的**不同發行版(distributions)**。 #### Linux Kernal 核心是作業系統的核心,位於硬體和應用程式之間。它管理 CPU、記憶體和設備等資源,並處理來自軟體應用程式的系統調用。其主要的功能如下: * Process Management: 處理進程的建立、調度和終止方式。 * Memory Management: 管理系統內存,確保不同進程可以安全地使用內存而不會相互幹擾。 * Device Management: 透過驅動程式與硬體設備接口,為使用者空間應用程式提供抽象層(abstraction layer) * File System Management: 在各種類型的文件系統上儲存、檢索和管理數據。 * :::info 什麼是抽象層(Abstraction layer)? **Abstraction layer** 是指作業系統簡化硬體設備和使用者空間應用程式(Apps)之間互動的方式,使得Apps可在不用完全理解硬體運作下仍能與硬體互動。在 Linux 和 Unix-like中,通常是透過裝置**驅動程式(device drivers)** or **系統呼叫(system calls)**來實現的。 * **Device Drivers** : 直接與硬體通訊的軟體組件。他們了解硬體使用的特定命令commands和通訊協議protocol ports * e.g : `nouveau` (Nouveau是Nvidia一個自由及開放原始碼的顯示卡驅動程式). * **System Calls** : 提供用戶空間應用程式和核心之間的介面。以下是一些與設備管理相關的系統函數調用。 * open() : 開啟檔案(或裝置)以進行讀取或寫入。e.g,打開/dev/sda(硬碟)進行讀取。 * read() : 從檔案或裝置讀取資料。程式可以使用它從檔案或直接從磁碟等硬體讀取資料。 * write() :將資料寫入檔案或裝置。e.g,向/dev/sdb1等磁碟分割區寫入資料> * mmap():將檔案或裝置映射到記憶體中。這對於記憶體映射 I/O 設備(例如 GPU)非常有用,允許透過記憶體直接存取硬體 #### Linux Operating System key components : 除了核心之外,一個完整的 Linux 作業系統還包括幾個基本要素。條列如下: * GNU Tools: GNU工具由Free Software Foundation開發,其包含基本實用程序,如shell(bash)、編譯器(GCC)和文字編輯器(Vim) * Shell : 允許使用者與系統互動的命令列介面(command line interface).e,g : bash、zsh 和 Fish * X Window System (X Server ): 為Linux提供圖形介面,允許使用者運行圖形應用程式. e.g X11 * Desktop Enviroments : 它們透過將視窗管理器、面板、選單和其他圖形元素綁在一起來提供有更好的的UI。e.g: GNOME、KDE。 * Package Manager: 允許使用者安裝、更新和刪除軟體包的軟體。例如 apt(適用於基於 Debian 的系統)、yum/dnf(適用於基於 Red Hat 的系統)和 pacman(適用於基於 Arch 的系統)。 ::: #### Linux Architecture Linux 通常被稱為類 Unix 作業系統,因為它與 Unix 共享許多設計原則,Unix 是 20 世紀 70 年代 AT&T 貝爾實驗室開發的作業系統。這些原則包括: * Multi-user capability : 多個使用者可以同時對系統進行操作,互不干擾工作 * Multi-tasking :可以同時運行多個進程。 * Portability: Linux 可以在多種硬體架構上運行,從 x86 到 ARM 等等 * Security : Linux 繼承了 Unix 的權限和所有權模型,使其成為一個可以對使用者操作進行細粒度控制的安全平台 * Modular design :與 Unix 一樣,Linux 是模組化的,允許添加或刪除組件而不影響整個系統。 而其結構以: * kernal(核心) : OS的核心,管理硬體資源(CPU、記憶體等)並提供進程管理和安全等服務 * Shell: 用於命令列互動的使用者介面 * User Space & and Kernel Space: 解釋用戶應用程式如何在用戶空間中運行,而核心作業系統操作如何在核心空間中運行,以確保安全性和效能。 #### Linux Distributions: 雖然核心構成了 Linux 的核心,但一個完整的作業系統需要的不僅只有核心。不同的發行版將Linux核心與自己開發的軟體包、桌面環境結合和管理工具來建立可用的作業系統。下列舉幾個著名的發行版: * **Centos/RHEL**: CentOS 是 Red Hat Enterprise Linux (RHEL) 的社群重建版本,專為在伺服器環境中使用而設計。**也是此筆記主要介紹與使用的發行版** * ![image](https://hackmd.io/_uploads/B1rYEwph0.png =150x) ![image](https://hackmd.io/_uploads/HyqpNPa30.png =150x) * **Ubuntu **: 它以其易用性和龐大的社群而聞名,是最受歡迎的 Linux 發行版之一 ![image](https://hackmd.io/_uploads/H1uvmw620.png =150x) ![image](https://hackmd.io/_uploads/rJA1NDT3A.png =150x) * **Debian** : 最古老的發行版之一,以其穩定性和對自由軟體原則的堅定遵守而聞名。 ![image](https://hackmd.io/_uploads/rJq9HP62A.png =110x) #### Linux I/O System Linux I/O 系統抽象化了底層硬體,並為使用者空間應用程式執行輸入和輸出操作提供了標準化的方式。在 Linux 中,幾乎所有內容都被視為文件,這簡化了進程與硬體設備和其他系統元件互動的方式。檔案、設備和網路介面都表示為位元組流。 1. Regular Files: 磁碟上的文字或二進位文件. 2. Device Files: 代表硬體設備(e.g,/dev/sda 代表硬碟驅動器,/dev/ttyS0 代表序列埠). 3. Sockets: 用於網路通訊(e.g TCP 或 UDP)。 4. Pipes: 用於進程之間的通訊。 **I/O Operations**: Linux 和類別 Unix 系統中的 I/O 重定向操作允許使用者更改命令的預設輸入和輸出流。 * **Standard Input(stdin)** 標準輸入 & file descriptor number as 0 * Standard Output(stdout) 標準輸出 & file descriptor number as 1 * Standard Error(stderr) 標準錯誤 & file descriptor number as 2 : **Table1 : Summary of Redirection Symbols:** | **Operation** | **Symbol** | **Description**| |:---------:|:-------------:|:---------:| |Redirect studout| > | Redirects stdout to a file (overwrite)| |Append stdout| >>| Appends stdout to a file| |Redirect stdin| < | Redirects stdin from a file | |Redirect stderr| 2> |Redirects stderr to a file (overwrite) | |Append stderr| 2>> | Appends stderr to a file | |Redirect stdout and stderr| &> or 2 > &1 | Redirects both stdout and stderr to the same file| **實用範例**: 1. `ls > output.txt` 將`ls` 的stdout **寫入**至output.txt,若output.txt存在則**複寫** 2. `ls >> output.txt` 將`ls` 的stdout **新增**至output.txt 3. `wc -l < input.txt` wc -l 指令計算 input.txt 中的行數,input.txt作為輸入 4. `ls -l nonexistfile 2> error.txt` 列出不存在的檔案時的產生的錯誤訊息寫入 error.txt 5. `ls -l nonexistfile 2>> error.txt` 列出不存在的檔案時的產生的錯誤訊息新增寫入 error.txt 6. `ls -l > output.txt 2>&1` 將 stdout 和 stderr 同時寫入output.txt --- ## Linux System Access & File System 檔案管理: RHEL(centos)的資料夾架構,與其他Linux發行版一樣根據**Filesystem Hierarchy Standard (FHS)** 定義: ### RHEL主資料夾結構: * **/boot** :bootloader-related所需檔案,如kernal image ,boot configuration files (grub.cfg) * **/root** :root 目錄 * **/home** :各user的專屬資料夾(/user/pin) * **/dev** :硬體裝置的文件 , 如disk drive(/dev/dsa)、virtual devices * **/etc** :系統設定檔案路徑,設置user account(/etc/passwd)與fstab * **/bin** :基本放置在booting執行的程式,與在Single-user mode執行的指令,如`ls、cp、mv。 * **/sbin** :包含系統管理的基本二進制文件,通常由root使用 * **/tmp** :用來存放臨時檔案,此類檔案在**系統啟動過程或應用端使用時創建,但不會永久存在。** * 存取速度: 因其作用是存放臨時資料,**某些系統會將/tmp配置在一個RAM中,以提高讀寫速度**。 * **/lib** :用來存放系統運行所需的Libraries & Kernal 的可執行檔 * Shared Libraries : 共享庫提供多個應用程式共用使用的函示庫,其檔案通常以.so結尾,**是C的標準函示庫** * Kernal 可執行檔: 包含與系統啟動或運行相關的可執行檔。 * /lib 與 /usr/lib的差別: **/lib用於存放系統啟動和基本運行的library**,**/usr/lib則包含應用程式所需的library,不涉及系統啟動過程**,通常是第三方的library。 * **/var** :用於儲存作業系統在運行中經常變更的檔案,例如log、cache data * /var/cache/: 儲放各種cached data * /var/crash/: 儲放crash files , 常用於Debug 系統問題 * /var/lib/: 常用於儲放不同應用端產生的數據或資訊 * **/var/log/**: 在var/中最重要的一個資料夾,紀錄系統與應用端產生的log,events,error message ...等. * /var/run/ : 儲放runtime data , 例如PID(Porcess ID) ,此種Data通常在boot時會被清除 * /var/spool/: **儲放spooled files 的資料夾** :::info spool(Simultaneous Peripheral Operations On-line),在作業系統中將要處理的任務存放在暫存區,形成一個等待處理的任務對(Queued),用於處理無法立即完成的任務。 * 非同步性:Spool 允許作業系統和應用程式以非同步方式運行。e.g 當發送一個列印命令時,該命令會被存入 Spool 中,而列印操作可以稍後進行。 * 應用程序: * Print(列印佇列) * Mail Spooling(郵件大量傳送時會先放置spool目錄-> 再由伺服器發送) * cron job ::: * **/opt** :非屬於Linux Base下的額外軟體 (Optional add-on),例如SunOS自己開發的 * **/usr** :各使用者安裝的軟體和工具,通常分為子目錄: /usr/local、/usr/bin、/usr/sbin、/usr/lib * **/proc** :Linux 動態創建虛擬文件系統,提供訪問hardware資訊(CPUINFO)及運行中的程序(PID) * Process information: 各執行程序(PID)在proc裡有對應的資料夾`/proc/123` * System Information: * CPU : /proc/cpuinfo * memory usage : /proc/meminfo * system uptime : /proc/uptime * kernel Parameters : /proc/sys 路徑下包含紀錄kernal參數的文件 * **/sys** :此資料夾的資料架構類似/proc,但以標準化、結構化的方式來公開System information,以便於之後相容性的問題。 * **/mnt** : 在unix-like 原始作為暫存手動mounting task的資料夾 * **/media** : 目前Linux&Unix當儲存媒介(usb、CD、DVD)插入or移會自動mounting的資料夾, ### **資料資訊與屬性** 在terminal中,我們可以透過`ls -l` 來檢視檔案的資訊,包含File type , Links, Owner,Group,....etc. | **File type** | **#of Links** | **Owner** | **Group** | **Size** | **Month** | **Day** | **Time** | **Name** | |:---------:|:-------------:|:---------:|:---------:|:--------:|:---------:|:----------:|:--------:|:--------:| | <font color=#800000>d</font>rwxr-xr-x| 21 | root | root | 4096 | Fab | 27 | 14:21 |var | | <font color=#800000>l</font>rwxrwxrwx| 1 | root | root | 5 | Mar | 15 | 17:30 |bin | | <font color=#800000>-</font>rw-r-r-- | 1 | pin | root | 1 | Fab | 2 | 18:51 |testing.txt| * **File Type**: 在file type中(如上方紅色處): * "-" Regular file(一般檔案) * "d" Directory(資料夾) * "l" link(連結) * "c" Special file or device file * "s" Socket file - 提供由文件系統訪問進行通信(不通過IP) * "p" Named pipe - 與regular file 不同,named pipe(FIFO)用於實現進程間通信(IPC)。不同於regular pipes只存在process的lifetime。Named pipe持久存在且可以被多個進程訪問。 * "b" block devices - 與regular file請求傳送傳送到kernal不同,block device的檔案讀取或寫入會由設備的驅動處理。 * **File Permission Type** | **Number** | **Permission Type** | **Symbol**| |:---------:|:-------------:|:---------:| |0| No Permission | ---| |1| Execute | --x| |2| Write | -w-| |3| Execute + Write | -wx| |4| Read | r--| |5| Read + Execute | r-x| |6| Read + Write | rw-| |7| Read + Write + Execute | rwx | * **Softlink & Hardlink**: | **Feature** | **Hard link** | **Soft link(Sysbolic Link)**| |:---------:|:-------------:|:---------:| |syntax| ln target_f dest_f| ln -s target_f dest_f| |Points To| inode(file data directly)|File path(location of the file)| |Inode Number|與原始檔同|與原始檔不同| |FilesSystem |必須與原始filesystem|可以跨越不同的檔案系統| |Link Directories?|N|Y| |Dependency on Target|N(檔案永遠存在)|Y(檔案隨原始檔)| * **WildCards** (*,?,^,[]) * "*" - represents zero or more characters * "?" - represents a signal character * "{}" - represents a range of character 如下方範例<br> ![image](https://hackmd.io/_uploads/SJZ1YL7oA.png ) --- ## User Administrator 使用者帳戶管理 ### **Users Type(使用者種類)**: * Root User : The superuser(最高管理員)可以控制整個系統 * Regular Users: 一般使用者 * System Users: Non-login users typically created by the system for running services. ### **Files Involved in User Management(User Account 相關檔案)** * **/etc/sudoers**: 定義user與group對root訪問的權限 * **/etc/passwd**: 儲存user的基本帳戶資訊<br> 其內容如示:<br> ![image](https://hackmd.io/_uploads/BJbJooCi0.png) e.g: ![image](https://hackmd.io/_uploads/Bkv6k20s0.png) * `username`: User定義的名稱 * `x`: 密碼的佔位浮,實際密碼儲存在**/etc/shadow**裡 * `UID`: User 各ID的獨有代碼 * `GID`: **主要Group**ID的代碼 * `comment`: addtional information * `home directory`:user home定義的路徑 * `shell`: default 使用的shell (e.g `/bin/bash`,`/bin/csh` * **/etc/group** : 定義user groups與list members的檔案<br> 其內容如示:<br> ![image](https://hackmd.io/_uploads/Bk4mToCs0.png) 範例:<br> ![image](https://hackmd.io/_uploads/r15KynCj0.png) * **/etc/shadow**: 儲存user secure資訊(密碼、密碼變動時間...etc) <br> 內容如示: ![image](https://hackmd.io/_uploads/ByY9g2AoA.png) 範例:<br> ![image](https://hackmd.io/_uploads/BJ7_bhAjR.png) * `username`: User定義的名稱 * `password`: User密碼 * `last_change`: 最後密碼修正時間 * `min` : 密碼變更最短天數 * `max` : 密碼最大有效天數(超過系統要求變更) * `warn`: 密碼過期前向使用者發出警告的天數 * `inactive`: 密碼過期後帳號被停用的天數 * `expire` : 帳號到期日 * `reseved`: 保留字段,通常留空 * **/etc/gshadow**: 定義group secure資訊 格式如示<br> ![image](https://hackmd.io/_uploads/HJvvmhCjR.png) 範例<br> ![image](https://hackmd.io/_uploads/SyOK7hAs0.png) <br> * `group_name`: Group名稱 * `password` : Group 密碼 **不常設定** * `group_admins`: Group管理員列表,seprated by "," * `group_members`: Group成員列表,seprated by "," * **/etc/login.defs**: 可設定當user **被創建時**的基本配置:<br> 格式如示:<br>![image](https://hackmd.io/_uploads/rkxrIn0iR.png) * PASS_MAX_DAYS: 密碼的最大有效天數 * PASS_MIN_DAYS: 密碼變更之間所需的最短天數 * PASS_WARM_AGE: 密碼過期前向使用者發出警告的天數 * UID_MIN(MAX)* : 新帳號最小(最大)的UID值 * GID_MIN(MAX)* : 新帳號最小(最大)的GID值 * CREATE_HOME* : 是否建立user 資料夾在home * **/etc/skel/**: 定義當user**被創建時**其defualt home/裡的配置。這個目錄下會將所有檔案複製到新增的user下。<br> 如圖所示: <br> **Source** ![image](https://hackmd.io/_uploads/SJGhOhRoA.png) **Dest** ![image](https://hackmd.io/_uploads/SknXd3CiC.png) ### Account Common comment (帳戶相關常用指令) #### Account Management (帳戶管理) * **useradd** : 新增使用者帳戶 * syntax: `useradd [options] username` * options: * -m : Creates the user's home directory * -s : 定義該user defaul shell . e.g: /bin/bash * -G : 將user新增至group * **passwd** : 編輯使用者密碼 * syntax:`passwd <username>` * **usermod** : 修改已存在使用者帳戶: * syntax:`usermod [options] <username>` * option: * -aG: 新增user至**額外的**Groups * -l : 修改username * -d : 修改user的home directory. * **userdel** :刪除已存在的使用者帳戶 * syntax: `userdel [options] <username>` * option: * -r : 移除user's home 路徑與mail spool * **groupadd** : 新增group群組 * syntax: `groupadd <groupname>` * **groupdmod**: 修正已存在group: * syntax: `groupmod [options] <groupname>` * option: * -n : 重新命名 -> `groupmod -n newname oldname` * **groupdel**: 刪除已存在的group: * syntax: `groupdel groupname` * **chage** : 以指令的方式修正user對應的/etc/shadow內容: * syntax: `chage [options] username` * option: * -l :display 目前user 時效(aging)的設定 ![image](https://hackmd.io/_uploads/Sywq-TRoC.png) * -M days : 修正密碼最大有效天數 * -m days : 修正密碼最小有效天數 * -W days : 修正密碼過期前向使用者發出警告的天數 * -E date : 修正帳號到期日 * -I days : 修正密碼到期日後帳戶停用天數 #### User Login Management(User登入管理) * **who** : 顯示User 登入系統的資訊 * Syntax: `who [options]` ![image](https://hackmd.io/_uploads/BJoRKaAoR.png) * Options: * -b : 顯示**最近的**reboot time * -q : 單純顯示總共的users登入數 * -r : 顯示目前的run-level * **last** : 顯示**User登入**與**系統重啟**的歷史資訊 * Syntax: `last [options] [username]` * Options: * -n or -number : 顯示最新的n組資訊 e.g `last -5` * -x : 顯示system shudown, runlevel change , and boot information :::info **Run-level:** Linux沿用System V(Unix的其中一個分支)init的概念,每個run level定義哪些服務或進程可用並在系統上運行。而Modern Linux Distributions**已用明確名稱**代替傳統用數字代表run level,例如在Unix/Linux下`init x`時,x即代表runlevel * **Tradtion Runlevels**: * 0: `Halt(shutdown`) * 1: `Singal-User Mode`: 只有**root** 可以登入,通常用來修復系統 * 2: `Multi-User Mode without networking` : 允許各user登入,但**不啟用**網路 * 3: `Multi-User Mode with Networking` : 允許各user登入,但不**啟用**網路 * 4: `Undefined/Unused` : 客製化模式,未定義於kernal中 * 5: `Multi-User Mode with Networking and GUI` 允許各user登入且使用啟用GUI + Internet模式 * 6: `Reboot`: 重啟系統 * **Modern linux distribution** * 0: `power off` * 1: `rescue` * 3: `multi-user` * 5: `graphical` * 6: `reboot` ![image](https://hackmd.io/_uploads/BkvvJ0CsC.png) ::: * **w** : `who` 的進階指令 ,會顯示目前登入的user,與其工作狀態等更多的資訊 * syntax: `w [options] [user]` ![image](https://hackmd.io/_uploads/BkEGGA0o0.png) * options: * -u 顯示processes started by use * -s 簡略模式 :::info What is **TTY (teletype)**: TTY是指與使用者會話關聯的終端裝置。傳統上指的是**電傳打字機(紫羅蘭永恆花園!? )**,是**打字機用打印機**通過閱讀和寫信息,後來打印機被鍵盤與顯示器取代。 * seat0: 指系統的主要位置,通常與使用者直接與機器互動的實體控制台相關聯 * tty: terminal = text input/output environment。現在大多以終端稱呼,在Unix/Linux中,可藉由(ctrl-alt-Fx)進行不同的terminal切換,例如上圖所使用**centos9-stream**的tty2為GUI介面,(3-7)則為text-editor介面。 * pts/1: pseudo-terminal slave(虛擬終端) :表示在GUI或透過網路(例如 SSH)運行的Session,是在使用者開啟終端視窗( physical terminal )或遠端連接到系統時動態建立的 ::: ### User comminucation manage (User溝通管理) * **user**: : 列表出目前登錄的users * Syntax: `user [options]` ![image](https://hackmd.io/_uploads/B1RAcrWnA.png) * **wall** : 跟所有使用者廣播訊息 * Syntax: `wall [options] [message]` * Options: * -n : 不顯示廣播者的資訊 ![image](https://hackmd.io/_uploads/HkSS2S-nA.png) * **write** : 傳送單一訊息給其他使用者 * Syntax: `write [username] [tty]` --- ## Process Adminstractor(進程管理): 本段落介紹Linux在管理進程(Process)的方法。Process作業系統核心(Kernal)管理,它分配系統資源並調度進程在CPU上運行。學會如何控制和監視Linux系統上運行的進程,包括管理資源(Manage)、調配(schedule)及中斷(terminate)。 ### Type of Process(Process 種類): * Foreground Processes: 在終端機或shell中運行並直接接受使用者輸入(User I/O),e.g **Vim** * Background Processes: 在背景執行的非互動式操作,不需要使用者的任何參與。e.g **Run script with "&" Operator** ### Process Life Cycle in Linux : **Step 1** : **Process Creation 進程創建**: 當一個process被創建時(執行),第一步是由**fork()**透過複製現有程序(**parent process** 來建立子程序(**child process**)。我們用下面流程圖來解釋 ```mermaid graph TD; A[Parent Process] --> B["fork()"]; B --> |Parent| C[Continues Parent Execution]; B --> |Child| D[Child Process]; D --> E["exec()"]; E --> F[New Program]; F --> G[Runs New Program]; ``` * **fork()** 函式的運行步驟: 1. fork()被呼叫時,OS會對parent process進行複製成child process,包括其代碼(code)、數據(data)和棧(stack)。**Parent & Child process占用不同的memory space。** 2. 複製後,child process被賦予**PID**(Process ID) 3. Parent & Child 將剩餘的program 執行完成。 4. Return (回傳值) * Parent Process **fork() return child's PID**。 * Child Process **fork() return 0**。 * 若失敗 , return -1。 * **exec()** 函式的運行步驟: 1. 不同於fork(),exec 將新的Program**取代**將新的Program ,**New 將新的Program 占用舊Program的memory space。** 2. 再執行exec()後,新程式開始執行,舊程式不再存在。 3. **新的program保留原始的PID** 4. Return(回傳值): * 若成功,不回傳 * 若失敗,return -1 **Step 2** : **Process state 進程狀態**: 一個進程在其整個生命週期中可以存在於多種狀態,並且由**Kernal來管理這些狀態** * **Running** : 該進程**正在 CPU 上主動運行**或準備運行。核心調度進程在可用的 CPU 核心上運行 * **Sleeping**(idle): 該進程正在等待某個事件(例如,I/O 完成、訊號或資源可用性)。sleeping有兩種模式: * Interruptible sleep : 此種模式**可被訊號(signal)中斷** * Uninterruptible sleep: 此種模式**不可被訊號(signal)中斷** 該進程正在等待硬體資源(例如磁碟存取)直到事件完成。 * **Stopped** : 進程已暫停,通常是透過接收 **SIGSTOP** 訊號或當使用者停止進程時(e.g,**使用 Ctrl+Z , Ctrl+C**)。 * **Zombie**: 該進程已完成執行,但其退出狀態尚未被其父進程讀取。行程暫時處於此狀態,直到其父行程使用 wait() 或 waitpid() 收集退出訊息。 * **Terminated**: 行程完成或被殺死,其資源由核心釋放。一旦核心清理了其資源,它就不再存在,e.g **使用`kill <pid>`**。 **Step 3** : **Process Termination** 進程終止: * 當進程完成執行(正常退出)或使用 **SIGKILL** 或 **SIGTERM** 等訊號明確終止(異常退出)時,進程將終止。 * 終止的程序進入殭屍(Zombie)狀態,並保持該狀態直到父程序讀取其退出狀態。一旦發生這種情況,該進程就會從進程表中完全刪除,從而釋放所有關聯的資源。 :::info 什麼是Zombie(defunct) Status? 在許多程式中,父進程能夠獲取其已退出的子進程的基本資訊是至關重要的。這些基本資訊包括子進程的退出狀態和資源使用情況。當父進程準備獲取已死亡子進程的資訊時,它會調用 wait() 函數之一來等待子進程退出並獲取退出狀態和資源使用情況。 但如果子進程在父進程等待之前就退出了會怎麼樣呢?這時候,殭屍進程就變得必不可少了。操作系統不能簡單地丟棄子進程;父進程的操作可能依賴於知道子進程的退出狀態或資源使用情況。也就是說,父進程可能需要知道子進程是否異常退出,或者它可能正在收集子進程的 CPU 使用統計資料等。因此,唯一的選擇是保存這些資訊,並在父進程最終調用 wait() 時將其提供給父進程。這些資訊就是殭屍進程,它是 Unix/Linux 中進程管理的一個關鍵部分。殭屍進程保證父進程無論是在子進程退出之前還是之後調用 wait(),都能夠檢索退出狀態、計算資訊以及子進程的進程 ID。 ::: ### Process control commands 常用指令: * **ps**: 查閱各process的資訊**PID,TTY,TIME,CMD** * syntax: ps [options] * options: * -aux 最常一起使用的options,**a**代表all,**u**不在terminal run,**x** user-oriented format. 此指令可用來查看CPU & Memory 。 * -f 提供更詳細的輸出,包括 UID、**PPID(Parent PID)**、C、STIME、TTY、TIME 和 CMD 欄 。 * -u 顯示特定使用者擁有的進程 * e.g : **ps aux --sort=-%mem |head -n6** * top: 提供Linux system process的即時(real-time)、動態視圖,其主要有兩個Sections資訊 **(summary information)** and **(Process List)** * summary information : 此section 顯示整個系統的狀態 * Uptime: 系統目前使用時間,同`uptime` 。 * Number of users: 多少使用者登入,同`uptime`。 * Load averages: 平均loading在1,5,15min內,同`uptime` * CPU Usage: 分析 * us(user process) * sy(system process) * ni(nice value of the process) * **id(idle time : if low , CPU overworked)** * **wa(wait time :if high,CPU is waiting for I/O)** * hi(hardware interrupts) * si(software interrupts), * st(virtual CPU wait for physical CPU) * Process information : 此section 顯示正在運作的process * PID : Process ID * User: Process's Owner(user) * PR : Process's Piority (優先度) * NI : Process's nice value * Virt: Process使用的虛擬記憶體(virtual Memory) used * RES : Process使用的常駐記憶體 * SHR : Process使用的分享記憶體 * S : Process狀態(R: running, S: sleeping) * %CPU: Process占用的CPU比例 * %MEM: Process占用的Memory比例 * TIME+: Process使用CPU 總共time * Command:Process來自於哪個command **e.g : Summary Information** ![image](https://hackmd.io/_uploads/rkt11rS20.png) **e.g : Process information** ![image](https://hackmd.io/_uploads/Sk68Jrr30.png) :::info 何謂Virutal memory,Resident memory,Shared memory,Physical memory? * Physical memory: 實體記憶體是指系統上安裝的實際硬體(RAM),是CPU 直接存取以執行操作的有形記憶體。 * Virtual memory: 虛擬記憶體主要是避免所有程序都須由RAM進行load,避免應RAM不足或衝突導致系統crash Reference: [從作業系統的角度來談為什麼需要"虛擬記憶體"](https://medium.com/starbugs/why-do-os-need-virtual-memory-b47d6eeecbce) * Resident memory: 代表Virtual memory實際保存在實體 RAM中的部分。 * Shared memory : 可以在multi-process中共享的記憶體部分。這通常用於進程間通訊(IPC)或共享公共數據 e.g: 若在top指令我們看到如下 * VIRT: 500M (Total virtual memory) * RES: 100M (Actual memory in RAM) * SHR: 50M (Shared with other processes) This means that the process can access up to 500MB of memory,is currently using 100MB of physical RAM, and is sharing 50MB of that RAM with other processes. ::: * **bg**: 用於在背景恢復停止的進程,**若沒有接任一參數,bg 在背景恢復最近暫停的作業** * syntax: `bg <job_spec>`, * e.g ![image](https://hackmd.io/_uploads/BkAGWZo3C.png) * **fg**: 用於將後台程序帶回前台,以便可以直接與之交互作用 * syntax:`fg <job_spec>` * e.g ![image](https://hackmd.io/_uploads/rkP3bZshC.png) * **nohup**: 當用戶**已登出**或與**終端中斷連接**,仍允許進程繼續在背景運行,其忽略SIGHUP signal。優點是能使**long-running job不**會中斷 * syntax : `nuhup <command> &` 其中"&"將進程傳送到後台下運作 * e.g `nohup ./hello.sh * e.g `nohup ./hello.sh > output.log 2>&1 &` 此指令將./hello.sh執行到背景,並將其**stdout** & **stderr** redirect 到 output.log * **nice**: 用於執行具有修改的調度優先權的進程,Linux 使用從 -20(最高優先權)到 19(最低優先權)。Defaul:進程以 0 的啟動 * syntax: `nice [option] [command] ` * option: * -n : increament --- ## Pacakge Adminstraction 套件管理: 本段落主要介紹Red Hat Linux系列在系統與補丁更新,以及套件管理,針對以上介紹不同的工具和方法。 ### System Upgrade and Patch Management : 首先我們討論Redhat作業系統的版本維護與升級,在說明到Patch的安裝與管控。 * **系統版本查閱**: `cat /etc/redhat-release` // Centos Stream release 9 * **Major Version(主要版本)** : 在Centos 的版本,目前已到 Centos 9 Stream , 較之前的版本有Centos 9,Centos 8, Centos7 另外,Redhet系列的另一個Linux為Read Het Enterprise Linux(RHEL),是目前 Red Hat 開發的商業開源 Linux 發行版。 * 主版本更新:**不同於Ubuntu可以藉由指令進行主版本升級,Redhet不支援主版本直接更新**,請看官網說明 Red Hat does not support in-place upgrades between major versions 4, 5 and 6 of Red Hat Enterprise Linux. (A major version is denoted by a whole number version change. For example, Red Hat Enterprise Linux 5 and Red Hat Enterprise Linux 6 are both major versions of Red Hat Enterprise Linux). * **Minor version(次版本**): ![image](https://hackmd.io/_uploads/SJDM9H_j0.png ) --- * **Package 安裝與維護**: Linux有數個安裝指package的指令,例如dnf、yum、rpm,透過這些指令可進行package的升級與安裝。我們將一一介紹這些指令: * **dnf(Dandified YUM)**: 此指令為目前Redhet新版 **(Centos8 & RHEL8 以後)** 主要所使用的安裝方式: * syntax: * `sudo dnf upgrade` 升級已安裝的套件 * `sudo dnf check-update` 顯示更新套件的清單 * `sudo dnf install <package name>` 安裝新套件 * `sudo dnf remove <package name>` 移除新套件 * **yum**(Yellowdog Updater, Modified): 此指令為 **(Centos8 & RHEL8 以前)** 主要所使用的安裝方式: * syntax: * `sudo yum upgrade` 升級已安裝的套件 * `sudo yum check-update` 顯示更新套件的清單 * `sudo yum install <package name>` 安裝新套件 * `sudo yum remove <package name>` 移除新套件 * **rpm** 在Red Hat系列的Linux,是一個核心的套件管理系統,用於安裝、升級級、查詢和移除軟件包。用於直接處理.rpm格式的軟件包文件。 * syntax: * `sudo rpm -ivh` <package-name>.rpm 安裝.rpm * `sudo rpm -Uvh` <package-name>.rpm 升級.rpm * `sudo rpm -e` <package-name> 移除.rpm * `rpm -qpR` <package.rpm> package的依賴性 * `rpm -qa | grep *` 查詢已安裝的pacakge * `rpm -qc` <package.rpm> 找出package包含的configure file ![image](https://hackmd.io/_uploads/Bk_dwDFoR.png) * `rpm -qf` <configure file > 從configure file 找出對應的package ![image](https://hackmd.io/_uploads/H1gTDwYsC.png) ### Create Local Repository : 在未有網路環境下,可以藉由DVD or 其他方式將預安裝的.rpm放置在預設的Repository後,編輯對應的repo檔,即可透過yum.repo進行rpm離線安裝: 詳細步驟如下: 1. 安裝 createrepo or createrepo_c (**註: createrpo_c 在RHEL8 使用**) 2. 建立預放置rpm的repository. e.g :`mkdir /my_repo` 3. 在/etc/yum.repos.d編輯.repo檔 `touch my_repo.repo` 4. vi my_repo.repo<br> ![image](https://hackmd.io/_uploads/r1NZ4LFoR.png) * ID: Repository的ID,是Repository的ID的唯一識別碼,其名稱必須獨立不能重複,且必須定義在[]。 * name: 與ID類似,賦予此repo的名稱,讓使用者名稱 * baseurl: 向儲存庫位置的 URL。這可以是本機目錄 file:///、或是HTTP(S) * enabled: boolen(1 or 0) : 當使用repo使啟用(1)或忽略(0) * gpgcheck: boolen(1 or 0): 當使用repo使是否進行檢視GPG簽章啟用(1)或忽略(0) 5.執行`createrepo [repository path] e.g `createrepo_c /my_repo/` ![image](https://hackmd.io/_uploads/Bkxj_8Yj0.png =400x) --- ## Networking & Sevice (網路管理與服務): 本章節主要介紹基本: * 了解網路架構 * Interface Configuration files 常見的網路相關設定檔 * DNS(Domain Name System) 配置 * NTP(Network Time Protocol)設置 * 防火牆設置 * 通訊協定傳輸 * 檔案伺服器NFS,SAMBA * Mail Service * 網路控制常用指令 ### **Internal Basic Concept:** 先簡單介紹幾個常用的網路硬體裝置及實際網路在運作的簡易步驟。 * 網路卡NIC(Network Interface Card)<br> 網卡負責將設備連接到網絡,使用 MAC 和 IP 地址發送和接收數據 * NIC Bonding: NIC Bonding 是一種技術,將多個網路介面卡結合在一起,來提升網路的可靠性、帶寬和負載平衡。<br> ![image](https://hackmd.io/_uploads/ry89ezwjC.png) * 交換器Switch 主要將多個設備連接在同一個局域網內,根據 MAC 地址將數據轉發到正確的目的地 * 路由器Router 路由器透過充當不同網路(例如區域網路 (LAN) 和外部廣域網路 (WAN) 或網際網路)之間的 **閘道(Gateway)** 來連接外部和內部通訊。以下是其運作方式: 1. * **nternal Communication (LAN)** :在internal Network(如公司辦公室或家庭)內,Device透過交換器和路由器相互連接,這些設備具有private IP(通常在 192.168.x.x、10.x.x.x 或 172.16.x.x 等範圍內),並且它們透過Switch直接相互通訊。Switch根據設備的MAC位址轉送資料。 * **External Communication (WAN/Internet)**:當內部網路內的設備需要與網路外的設備進行通訊(例如瀏覽網際網路上的網站),它將請求發送到路由器。路由器充當私人內部網路和公共外部網路之間的橋梁。 設備取得內/外部數據流程 ```mermaid flowchart TD A[Device with NIC<br>設備上的網卡] -->|Internal or External Request<br>內部或外部請求| B[NIC<br>網卡] B -->|Packet with MAC and IP<br>帶有 MAC 和 IP 的數據包| C["Switch交換器"] C --> D[Router<br>路由器] D -->|Firewall Check<br>防火牆檢查| G[Firewall<br>防火牆] G -->|Allow/Block Traffic<br>允許或阻擋流量| H["地址轉換(NAT)"] H -->|Internal IP Check<br>內部 IP 檢查| E[Internal Device<br>內部設備 例如: 印表機] H -->|External IP Check<br>外部 IP 檢查| F[External Network<br>外部網絡 例如: 互聯網] F -->|Public IP Data<br>帶有公有 IP 的數據| H E -->|Internal MAC/IP Data<br>內部 MAC/IP 數據| H H -->|Address Translation<br>地址轉換| G G -->|Firewall Check<br>防火牆檢查| D D -->|Return Data<br>返回數據| C C -->|Frame with MAC<br>帶有 MAC 的數據幀| B B -->|Data Sent to Device<br>數據發送至設備| A ``` ### **Interface Configuration files** (常見的網路相關設定檔) * **/etc/nsswitch.conf** : 告知linux決定hostname與ip的檔案,主要作用是指定系統在處理特定服務的查詢順序,例如系統在解析hostname,user,可以由不同的數據庫(/etc/hosts,DNS,LDAP等查詢)<br> ![image](https://hackmd.io/_uploads/B1vVMRIoR.png)<br> 如上圖所示 hosts的查找方式為 file(/etc/hosts) -> dns -> myhostname * **/etc/hosts** : 用於主機名稱解析的配置文件,主要作用是將hostname映射到對應的IP, 其格式`IP_address hostname [alias...]` <br> ![image](https://hackmd.io/_uploads/BkOPQCIoR.png) * **/etc/sysconfig/network** : 此檔案為RHEL用於配置網絡設置的文件。主要作用是配置系統網路,其影響系統啟動與關閉時的網路行為<br> ![image](https://hackmd.io/_uploads/SyflIRLjA.png) * **/etc/syscibfug/network-scripts/** : 此目錄中包含用於配置網路介面的腳本和設定檔,在RHEL Linux中,以下是幾個重要的檔案與介紹 1. **ifcfg-<interface>**: 此檔案室每個網路介面的設定檔,<interface>是網路介面的名稱,如eth0、eth1、wlan0....etc,如下圖範例: ![image](https://hackmd.io/_uploads/rkxnv08j0.png) * DEVICE: 指定網路介面的名稱 * BOOTPROTO:指定網路介面IP位址的分配方式: 常見的有 **none(靜態設定,不使用任何動態配置),dhcp(DHCP協定自動獲取),static(手動設定靜態IP)** * ONBOOT: 指定系統啟動時是否啟用 ( yes or no) * IPADDR: 網路介面指定靜態IP (BOOTPROTO設定為`static`時啟用) * NETMASK:網路介面指定子網路遮罩 (BOOTPROTO設定為靜態IP時) * GATEWAY:網路介面指定預設閘道 * DNS1 DNS2 設定首選與備用的DNS伺服器IP位址 2. **ifcfg-lo** 檔案配置的是系統的本地迴圈介面(loopback interface),通常`lo`這個介面是系統內部通訊使用的<br> ![image](https://hackmd.io/_uploads/BJnVMlvsA.png) 3. **ifdown** **ifup** 此兩個script用於手動控制網路介面的啟動與停用: `ifdown eth0 -> 停用eth0` `ifup eth0 ->啟用eth0` 4. **network-funtions** 此檔案包含了常用的網路設定函數,包含上述ifup & ifdown都會調用此檔案的函數來執行。 5. **route <interface>** 此類檔案用於為特定的網路介面配置**靜態路由**,舉例我們需要為`eth0`介面配置靜態路由,可以創建一個名為`route-eth0`的檔案: ![image](https://hackmd.io/_uploads/B1kzBgPoR.png) 6. `ifcfg-br0`(橋接介面) 使用網路橋接設定(通常在虛擬環境),可以看到類似的檔案。 ![image](https://hackmd.io/_uploads/HyEHSxwiA.png) :::info 補充: 網路配置中的靜態static,橋接bridege,動態dynamic(DHCP)<br> * 靜態配置(Static): 手動設定一個固定IP,此IP不隨時間改變。 當設備使用靜態IP時,需手動設置**IP位址**,子網路遮罩(Netmask),預設閘道(GateWay),DNS伺服器<br> * 常用對象: 印表機 & NAS * 橋接(Bridge): 橋接是將多個網路介面連接再一起,使他們如同一個單一網路運作。此種配置常見於虛擬化環境,允許虛擬機與實體網路設備互相通訊。<br> * 常用對象: Virtual Server,Web Server<br> * 動態配置(Dynamic):動態IP使用DHCP(動態主機配置協定)自動從DHCP伺服器獲取IP位址,當設備啟動時,DHCP會分配一個可用的IP位址給設備,此IP會在不同的時間改變。<br> ::: ### **DNS基本概念與配置**: DNS(Domain Name System) 是用於將常見的網域格式(e.g www.example.com)轉換成IP address電腦可讀格式 (e.g `192.0.2.1`),方便使用者記憶網址而非IP。 * DNS 架構: DNS是以樹狀(Tree)架構進行管理 * .root - highest host * Top-Level Domains (TLDs) : root下管理的第二層host. (e.g),可分為以下兩種 * Genric TLDs : .com .edu(學網) , .gov(政府機構), .net(通訊)... * Country code TLDs : .tw , .cn , (國碼) * RHEL DNS 設置方式 * A Record : **未完成** ### **NTP(Network Time Protocol)** : 適用於將系統時間同步的Server。電腦硬體在BIOS內部的時間會因電池沒電或晶片問題而出現時間偏差,因此需要藉由此Sever來使時同步化。 * NTP架構: (Stratum Levels):類似於DNS的階層架構 <br> Stratum0 : 最高階層,通常是原子鐘或 GPS 時鐘等高精度計時設備。<br> Stratum1 : 直接連接到 Stratum 0 設備並為較低層提供時間<br> Stratum2 : 連接到Stratum 1伺服器並進一步分配時間 <br> * NTP 傳輸流程(FLOW) ``` mermaid graph LR; A[Client Request Time] --> B[NTP Server Receives Request] B --> C[Server Responds with Timestamp & Network Delay] C --> A[Client Receives & Adjusts Clock] ``` * Linux配置檔(/etc/ntpd.conf) & (/etc/chronyd.conf)<br> chronyd.conf 是現代版本的ntpd,在較新的Linux以chronyd為主 `vi /etc/chronyd.conf` ![image](https://hackmd.io/_uploads/SJc_Dh9sC.png) * 相關指令: ntrp , chronyd , timedatectl ### **通訊協定傳輸** 在此介紹幾種常用的傳輸方式**ftp,ssh,rsh,rsync** * **FTP(File Transfer Protocol)**: 是一種用於在網絡上傳輸文件的標準協定,使用不同的端口來處理命令(port :21)和數據(port :20)的傳輸 * 支持上傳&下載 * FTP傳輸過程未加密 * **SSH(Secure Shell)**:是一種加密的網絡協定,用於在不安全的網絡上安全的進行遠程登錄和指令執行。默認端口為(port :22) * 提供加密的數據傳輸(以public key & private key)進行認證 * 可用於遠端登入(ssh user@hostname)與遠端執行命令、文件傳輸(SFTP & SCP) * syntax: ssh [option] username@hostname<br> scp [option] [file] [target] <br> ex: `scp data.txt username@hostname:/home/usr/`<br> ex: `scp username@hostname:/home/usr/data.txt ./`<br> * option: * -i 指定priviate 文件, * -p 指定port名稱 * **ssh 配置** * ssh-key generation <br> **未完成** * **RSH(Remote Shell)**: 是一種早期的遠程命令執行工具,用於在遠端機器上執行指令。它屬於 Berkeley r-commands 之一,默認端口為(port :514) * 提供遠程命令的方法 * 傳輸過程未加密 * 需要透過.rhosts的文件配置作為信任主機的方式,此檔案東常放置/home/user下。 * syntax : rsh -l user hostname <br> * **Rsync**:是一種用於高效文件同步和傳輸的工具。它可以在本地或網絡上的不同主機之間同步文件和目錄 * 支持 SSH 進行加密傳輸(通過使用 rsync -e ssh) * 常用於備份和鏡像創建-> 僅傳輸改變的部分,從而提高傳輸效率 * syntax : rsync [option] [source] [dest] <br> * option: * -v (verbose):顯示詳細資訊 * -h 顯示檔案大小 * -a 歸檔mode,保留檔案權限,時間,群組 * --delete 使source與dest完全同步,刪除目標目錄中不存在的檔。**(使用上請務必小心!!)** ### **Mail Service** 在Linux 上的電子郵件傳送代理(MTA, Mail Transfer Agent)負責在郵件伺服器之間傳遞電子郵件,其可視為應用程式與收件人郵件伺服器之間的橋樑。以下介紹兩個MTA的Package 。 ``` mermaid flowchart LR A[MUA : Mail User Agent ] -->|SMTP| B[MTA : Mail Transfer Agent ] B -->|SMTP| C[MTA : Target MTA Recipient's ] C -->|LDA| D[MRA: Mail Retrieval Agent ] D -->|IMAP/POP3| E[MUA :Recipient ] subgraph Sender A B end subgraph Recipient C D E end ``` 1. SendMail : 是一個經典的電子郵件傳送代理(MTA),在許多 UNIX 和 Linux 系統上廣泛使用。它的主要功能是負責在不同的郵件伺服器之間傳遞電子郵件。但由於配置複雜和安全問題,現代的系統管理員更傾向於使用更易配置和管理的 MTA,比如 Postfix。 2. Postfix: 相較於sendmail,Postfix 是一種開源的電子郵件傳送代理(MTA),因其易於配置和更好的安全性,在現代系統中廣泛取代了 Sendmail。 ### **網路設定常用指令集** **ethtool:** :此指令用來查詢和修改NIC參數的指令,主要用於檢查和調整網路介面的設定,例如Supported link modes , 雙工模式。<br> * syntax: * -s <interface> <setting item>: 調整網路介面設定 * -g eth0 : 常看當前eth0接受封包長度 * -i eth0 : 查看eth0的驅動名稱,版本...等資訊 * 常見的setting item<br> speed 1000 -> 將eth0的網路設為1000Mbps<br> Duplex full ->將通尋模式設為Full (全雙工模式) :::info 數據通訊模式1. 全雙工(Full-Duplex) 2. 半雙工(Half-Duplex)<br>**當網卡(NIC)與Switch(交換機)或HUB(集線器)溝通時需定義使用何種通訊模式** <br> 1. Full-Duplex: 數據(封包)可以同時雙向(發送&接受)進行傳輸,不會發生碰撞或干擾。 大多數Switch採用此通訊模式<br> 2. Half-Duplex: 數據(封包)只能發送或接受,HUB採用此通訊模式。<br> ::: **nmcli**: 在RHEL8版本之後,nmcli與ethtool類似,可用來查閱與修改NIC參數的指令,用於配置、顯示和管理網路連接和設備。與直接編輯ifcfg-xxx檔案類似,**差別在於nmcli修正後直接請用,無須重啟網路才生效** * syntax: nmcli [options] [help|general|device...] * 以下介紹幾個nmcli常用指令: 1. **一般資訊查詢** * `nmcli general status` : 顯示目前所有NetworkManager的狀態 * `nmcli device status` : 顯示目前使用的網路裝置狀態(連線中or未連線) * `nmcli connection show` :顯示所有已配置的網路連接(active or non-active 2. **裝置管理** * `nmcli device connect [DEVICE]`: 啟用網路裝置e.g`nmcli device connect eth0 ` * `nmcli device disconnect [DEVICE]`: 關閉網路裝置 3. **連線控制** * nmcli connection modify eth0 ip4.address 192.168.x.x : 修正已存在的IP * nmcli connection modify eth0 ip4.dns 修正已存在的dns **curl**: 此指令用於透過各種傳輸協議(FTP,HTTP....)從伺服器傳輸或向伺服器傳輸數據。例如下載文件,與RESTAPI互動。 * syntax : curl [option ][dest] * Option : * -o [filename] : 將輸出保存至文件中 * -X [HTTP method]: 指定要用的請求方法:如 POST、GET、DELETE * -s : 靜默mode,適用於不產生stdout的script **wget**: 此指令用於從網路下載文件(提供其url),在許多 Linux 和 Unix 系統上都預裝。 * syntax : wget [url] * Option : * -r 遞迴下載,可以下載整個網路或目錄結構(例如從github下載整個資料夾) * -q 靜默mode,適用於不產生stdout的script **nslookup**: 用於查詢網頁DNS資訊的命令工具,他可以查詢一個網域名稱或IP,**此指令較為老舊,現代版本已`dig`作為查DNS**。 * syntax: <br> nslookup <example.com> <br> nslookup <ip address> ![image](https://hackmd.io/_uploads/BkZK05ciR.png) **dig(Domain information Groper)**: 相對於nslookup提供更詳細的DNS資訊,可獲取域名的A、MX、CNAME等紀錄。 * syntax : <br> * dig <example.com> <br> * dig -x <ip address> * **iplookup**: * syntax * **netstat**: --- ## Linux Service introduction (Linux 常見服務) ### Directory Service (資料夾服務): **目錄服務**是儲存有關網路上的使用者和資源的資訊的資料庫。它允許組織人員、設備和應用程式並管理對它們的存取。除了管理資訊之外,目錄服務還有助於**身份驗證(驗證使用者身分)** 和 **授權(確定資源的存取權限)**。管理員使用它們來加入新使用者、管理存取權限以及控制對公司內應用程式和資源的存取。**其使用LDAP(Lightweight Directory Access Protocol)的通訊協定,通過 IP 網路存取和管理目錄資訊服務。e.g :user account,group information ....etc** ![image](https://hackmd.io/_uploads/S1Evkcf3A.png) **Referemce**: [Oracle® Fusion Middleware Administrator's Guide for Oracle Internet Directory 11g Release]( 1https://docs.oracle.com/cd/E16764_01/oid.1111/e10029/intro.htm) 其主要功能為: * Centralized Resource Management 集中資源管理: 管理User,Group及permission.並將資訊儲存在資校夾服務 * Authentication and Authorization: 藉由Directory Service根據使用者權限授予可使用的功能 * Efficient Information Lookup : * Single Sign On (SSO) : 支援SSO身分驗證解決方案,使用者只需一次登入就能夠訪問多個應用程式和資源,無需再次輸入使用者名稱和密碼。 * Support for Standards 支援標準 確保與各種應用程式和系統的相容性和整合。這允許不同的軟體與目錄服務進行通信,使其成為企業 IT 環境中的多功能元件。 :::info Single Sign-On 介紹: 參考網站: [**什麼是 SSO (單一登入)?**](https://aws.amazon.com/tw/what-is/sso/) <br> [**什麼是 SSO 單點登入? 5種模式介紹,我的網站需要導入嗎? (單一登入 Single Sign-On)**](https://simular.co/blog/post/what-is-sso-and-whether-necessary-for-my-website) ::: 以下介紹幾種目錄服務: * AD (Active Directory) <br> AD是Microsoft為Windows域網路開發的目錄服務。Azure * IDM : Red-Hat 開發類似於Microsoft AD的目錄服務。 * Winbind : **在此提的Winbind 不是一種目錄服務**而是 Samba 套件的元件,可讓 UNIX/Linux 系統針對基於 Windows 的 Active Directory 進行驗證。 ### Schedule Tasks Service (排程服務): **排程**: 如同windows內建排程工作,Linux也提供兩個指令**crontab** & **at** 來達到定時執行程序和指定時間指定任務,或是在booting時執行任務。接下來我們來介紹這兩個指令的應用與差異 * **crontab** : 用在schedule tasks在特定時間**重複**執行。常用於**資料備份**與**系統維護** * syntax: <br> `systemctl <status|enable|disable> crond` : 顯示狀態|啟用|停用 crontab <br> `crontab -e` 進入編譯crontab模式<br> `crontab -l` 列出已登陸的排程任務<br> `crontab -r` 刪除目前的已登陸的排程任務<br> * `crontab -e`編輯模式中,crontab field 欄位與符號說明:<br> **一般格式**: `<Minute> <Hour> <Day of the month> <Month> <Day of the Week> <Command>` - **Minute (0-59):** The minute of the hour when the task should run. - **Hour (0-23):** The hour of the day (in 24-hour format) when the task should run. - **Day of the Month (1-31):** The specific day of the month when the task should run. - **Month (1-12):** The month of the year when the task should run. - **Day of the Week (0-7):** The day of the week when the task should run (Sunday = 0 or 7). * 特殊符號 - **`*`**: 萬用符號,代表"每個",e.g: 在"小時欄位"的話,意思是"每個"小時執行任務 - **`,`**: 分割符號,e.g: 1,15 在"小時欄位"的話代表,**每天的1AM & 15PM 執行任務** - **`-`**: 範圍符號,e.g: `9-17` 在"小時欄位"的話代表,**從9AM 到 5PM每小時執行任務.** - **`/`**: 部階符號. e.g, `*/5` in the minute field means the task runs every 5 minutes. * 常用模式範例 1. **Run a task every minute:** ```bash * * * * * /path/to/command ``` 2. **Run a task at 2:30 AM every day:** ```bash 30 2 * * * /path/to/command ``` 3. **Run a task at 4:00 PM every Sunday:** ```bash 0 16 * * 0 /path/to/command ``` 4. **Run a task every 5 minutes:** ```bash */5 * * * * /path/to/command ``` 5. **Run a task at 3:00 AM on the 1st of every month:** ```bash 0 3 1 * * /path/to/command ``` * **特殊使用模式:** - `@reboot`: 在boot的時候進行**一次任務** - `@yearly` or `@annually`: Run the task once a year, equivalent to `0 0 1 1 *`. - `@monthly`: Run the task once a month, equivalent to `0 0 1 * *`. - `@weekly`: Run the task once a week, equivalent to `0 0 * * 0`. - `@daily`: Run the task once a day, equivalent to `0 0 * * *`. - `@hourly`: Run the task once an hour, equivalent to `0 * * * *`. * 特殊使用模式範例: 1. **Run a task at system startup:** ```bash @reboot /path/to/command ``` 2. **Run a task daily at midnight:** ```bash @daily /path/to/command ``` * `at` :不同於crontab,at 只在設定的時間**執行一次**,但相對於crontab,可以很明確地給定**絕對時間**或**相對時間**來執行。 * syntax: <br> `at <timespec>` 進入該時段欲的模式後,輸入欲執行的.sh `atq` :顯示目前等待執行的job <br> `at -l`:顯示目前等待執行的job,同atq<br> `atrm <job_number>` :依據job的號碼刪除任務 * e.g: **絕對時間範例:** **在 11:23執行`touch text.txt`** ![image](https://hackmd.io/_uploads/HJid4o8nA.png) **產生text.txt** ![image](https://hackmd.io/_uploads/rywFEi83C.png) **相對時間範例:** **在一分鐘後執行**`touch hello.txt` ![image](https://hackmd.io/_uploads/rkbswi82A.png) **產生hello.txt** ### Service common commands Service 常用指令 * **systemctl(service**): systemctl為Redhat在RHEL6以後取代service的指令,主要用來控制(control)system service的指令。 * syntax: systemctl [options] [service_name] * Options: * start: 啟動 * stop: 停用 * status:顯示狀態 * reboot:重啟 * enable:自動啟用在boot time * disable:停止啟用在boot time * list-units 條列所有units(service , mount points, device...etc) ## Unix/Linux common command 常用指令集 : ### <font color=#E0FFFF>System utility commands 系統級別常用指令</font> * **date**: 提供系統時間資訊的查詢與設定: * syntax: date [command] e.g `date +"%Y-%m-%d %H:%M:%S"` * command: * `%Y`:Year * `%m`:Month * `%d`:Day * `%H`:Hour * `%M`:Minute * `%S`:Second * e.g : set system time sudo date <font color=#800000>1002</font><font color=#567831>1430</font><font color=#773921>2023</font>` /// 2023 Oct 2 at 14:30 * **uptime**: Linux 中的命令提供了系統運行時間的快速摘要 * **curremt time** : 目前系統的時間 * **running time** : 目前系統已經使用的時間 * **current login user** : 目前登錄系統的**使用者數量** * **load average** : average number of jobs in your system's queue 平均CPU loading * **timedatectl** : **現代版date command**,提供的時間資訊的查詢,與修改(包含NTP) * syntax: timedatectl [option] {command} * command: * set-time e.g `sudo timedatectl set-time "YYYY-MM-DD HH:MM:SS"` * set-timezone e.g `sudo timedatectl set-timezone Asia/Taipei` * set-ntp e.g `sudo timedatectl set-ntp true` * **cal** : 提供系統日曆的 * syntax: cal [options] * options: * -1 | -3 : show 1 months or show 3 months * -n show current month to next (n-1) month * -y [year] show specific year calendar * **bc** : Linux內建計算機: * syntax: bc // 進入計算季mode * options: * -w 警告mode **使用範例** ![image](https://hackmd.io/_uploads/rJzxju42C.png) ### <font color=#E0FFFF>File management command( Maintenance & Display ) </font> 此段落更改檔案讀取權限及所屬使用者的幾個指令,特別提到使用ACL(Access control list) 的相關指令,其提供更方便的機制在更改權限上 * **chmod** : 更改檔案之讀取權限 * **chgrp** : 更改檔案所屬之**族群** * **chown** : 更改檔案所屬之**使用者**或**族群** * **getfacl** :取得檔案之ACL屬性. syntax: `getfacl filename` * **setfacl** :設定檔案之ACL屬性.f syntax : `setfacl -m u:username:permissions filename` `ex: setfack -m u:pin:rwx myfile.txt` 或 `setfacl -m u:username:permissions filename . ex: setfack -m u:pin_gp:rwx` myfile.txt` 其中 第二參數可以是: * -m: 修改 * -x: 移除 * -b: 移除所有 * -rm:Recusivetly 修改 * **more** : viewing the content of a file * **less** : advanced pager compared to more. 1. supoort forward/backward 2. scroll foward/backward `f` & `b` ### <font color=#E0FFFF>Text Process Command</font> * **cut: 分割字串** syntax : cut -[option] stdinput<br> option : <br> &emsp;-f 以定界字元區隔欄位,通常配合-d一起使用 cut -f 1,5 -d ":" output.txt <br> &emsp;-c 指定字元位置 -> cut -c 1,3 output.txt <br> &emsp;-d 已指定符號作為分界 -> cut -d ":" -f1 output.txt <br> e.g : the input is "myname:is:pin::root"<br> cut -f 1,5 -d ":" $input // myname:root * **awk:** 擷取符合pattern的,對字行執行符合此pattern動作。<br> syntax: awk 'pattern { action }' input_file <br> e.g : input is "myname:is:pin::root"<br> awk -F: '{ print $1, $3}' input // myname pin awk -F: '{ if ($3=="pin") print $1}' input // myname * **sed:** inplace(取代,刪除)文字檔中的字元。 syntax: sed [option] {only script} input_file<br> option: <br> &emsp; -i : edit file in-place<br> &emsp; -e script : add script to execute<br> &emsp; -r : expand regular-expression <br> e.g : file.txt : ``` Hello world This is a test file Hello again Goodbye world ``` 1. replace the Hello to Hi <br> `sed -i 's/Hello/Hi/g' file.txt 2. remove world <br> `sed '/world/d' file.txt 3. append new line of text <br> `sed '/pattern/a\New line of text' file.text 4. remove the empty line <br> `sed '/^$/d' file.text 5. remove the first line <br> `sed '1d' filte.txt :::info 在script欄位中,'s','g','d'<br> s: Substitute 替代: 給定新的字串(元)來替代符合pattern的字串(元) s/Hello/Hi <br> g: Global 全局:通常搭配's',若未使用'g',指取代每行**第一個**符合的字體<br> d: Delete 刪除: 刪除**整行**若有符合的pattern<br> a: Append 新增: ::: * grep: Abbr."Global Regular Expression Print" ,且適用於正規表達式擷取 <br> syntax: grep [options] pattern [file...]<br> option : <br> &emsp;-r or -R: Recursively search directories.<br> &emsp;-v : Invert match (select not-matching lines).<br> &emsp;-n : Show line numbers .<br> &emsp;-l : Show file names only.<br> &emsp;-c : Count the number of lines that match.<br> &emsp;-e : Specify multiple patterns.<br> &emsp;-i : Ignore case (search is case-insensitive).<br> * sort: <br> syntax: sort [options] [file...]<br> option: <br> &emsp; -r : Reverse the sort order<br> &emsp; -n : Sort numerically<br> &emsp; -k : Sort by a specific column or field<br> &emsp; -t : Specify a delimiter other than the default.<br> &emsp; -u : Remove duplicates after sorting.<br> * uniq: * wc: ### Searching file 搜尋相關檔案: 此段落介紹常用搜尋檔案的幾個指令 * **find** : iterates over a filesystem to locate files * syntax: `find ./ -name "my_find"` * * **locate** : use prebuild database to locate file * syntax: `locate "my_find" ` * need run `updatedb` with **"root"** to update the local file ### File Editor檔案編輯: * **tee** * syntax: * ex: <br> `(any command) | tee filename -> stdout & enter file` <br> `(any command) | tee -a filename -> stdout & enter file` (insert 輸入) ## :white_check_mark: Related Test Question :::success This is a place which I collect some problems online to practice ::: ### :small_orange_diamond: File Management related question ### 容器管理: 參考資料: