Linux的一點回顧

最近在看鳥哥的Linux私房菜,用來補充自己在操作Linux系統方面的一些不足,這裏是對書中一些內容的整理。

一、文件的權限與目錄配置

  • Linux的每個文件中,可分別給予使用者、羣組與其他人三種身份個別的 rwx 權限;
  • 羣組最有用的功能之一,就是當你在團隊開發資源的時候,且每個帳號都可以有多個羣組的支持;
  • 利用ls -l顯示的文件屬性中,第一個字段是文件的權限,共有十個位,第一個位是文件類型, 接下來三個爲一組共三組,爲使用者、羣組、其他人的權限,權限有r,w,x三種;
  • 如果文件名之前多一個“ . ”,則代表這個文件爲“隱藏文件”;
  • 若需要root的權限時,可以使用 su - 這個指令來切換身份。處理完畢則使用 exit 離開 su 的指令環境。
  • 更改文件的羣組支持可用chgrp,修改文件的擁有者可用chown,修改文件的擁有者可用chown,修改文件的權限可用chmod
  • chmod修改權限的方法有兩種,分別是符號法與數字法,數字法中r,w,x分數爲4,2,1;
  • 對文件來講,權限的性能爲:

                r:可讀取此一文件的實際內容,如讀取文本文件的文字內容等

                w:可以編輯、新增或者是修改該文件的內容(但不含刪除該文件);

                x:該文件具有可以被系統執行的權限。

  • 對目錄來說,權限的性能爲:
                r (read contents in directory)
                w (modify contents of directory)
                x(access directory)
  • 要開放目錄給任何人瀏覽時,應該至少也要給予r及x的權限,但w權限不可隨便給;
  • 能否讀取到某個文件內容,跟該文件所在的目錄權限也有關係 (目錄至少需要有 x 的權限)。
  • Linux文件名的限制爲:單一文件或目錄的最大容許文件名爲 255 個英文字符或 128 箇中文字符;
  • 根據FHS的官方文件指出, 他們的主要目的是希望讓使用者可以瞭解到已安裝軟件通常放置於那個目錄下
  • FHS訂定出來的四種目錄特色爲:shareable, unshareable, static, variable等四類;
  • FHS所定義的三層主目錄爲:/, /var, /usr三層而已;
  • 絕對路徑文件名爲從根目錄 / 開始寫起,否則都是相對路徑的文件名。


二、文件與目錄管理

  • 特殊目錄有:., .., -, ~, ~account需要注意;
  • 與目錄相關的指令有:cd, mkdir, rmdir, pwd 等重要指令;
  • rmdir 僅能刪除空目錄,要刪除非空目錄需使用“ rm -r ”指令;
  • 使用者能使用的指令是依據 PATH 變量所規定的目錄去搜尋的;
  • ls 可以檢視文件的屬性,尤其 -d, -a, -l 等選項特別重要!
  • 文件的複製、刪除、移動可以分別使用:cp, rm , mv等指令來操作;
  • 檢查文件的內容(讀檔)可使用的指令包括有:cat, tac, nl, more, less, head, tail, od 等
  • cat -n 與 nl 均可顯示行號,但默認的情況下,空白行會不會編號並不相同;
  • touch 的目的在修改文件的時間參數,但亦可用來創建空文件;
  • 一個文件記錄的時間參數有三種,分別是 access time(atime), status time (ctime), modification time(mtime),ls 默認顯示的是 mtime。
  • 除了傳統的rwx權限之外,在Ext2/Ext3/Ext4/xfs文件系統中,還可以使用chattr與lsattr設置及觀察隱藏屬性。 常見的包括只能新增數據的 +a 與完全不能更動文件的 +i 屬性。
  • 新建文件/目錄時,新文件的默認權限使用 umask 來規範。默認目錄完全權限爲drwxrwxrwx, 文件則爲-rw-rw-rw-。
  • 文件具有SUID的特殊權限時,代表當使用者執行此一binary程序時,在執行過程中使用者會暫時具有程序擁有者的權限
  • 目錄具有SGID的特殊權限時,代表使用者在這個目錄下面新建的文件之羣組都會與該目錄的羣組名稱相同。
  • 目錄具有SBIT的特殊權限時,代表在該目錄下使用者創建的文件只有自己與root能夠刪除!
  • 觀察文件的類型可以使用 file 指令來觀察;
  • 搜尋指令的完整文件名可用 which 或 type ,這兩個指令都是通過 PATH 變量來搜尋文件名;
  • 搜尋文件的完整文件名可以使用 whereis 找特定目錄或 locate 到數據庫去搜尋,而不實際搜尋文件系統;
  • 利用 find 可以加入許多選項來直接查詢文件系統,以獲得自己想要知道的文件名。

三、磁盤與文件管理

  • 一個可以被掛載的數據通常稱爲“文件系統, filesystem”而不是分區 (partition) 喔!
  • 基本上 Linux 的傳統文件系統爲 Ext2 ,該文件系統內的信息主要有:
  • superblock:記錄此 filesystem 的整體信息,包括inode/block的總量、使用量、剩餘量, 以及文件系統的格式與相關信息等;
  • inode:記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的 block 號碼;
  • block:實際記錄文件的內容,若文件太大時,會佔用多個 block 。
  • Ext2 文件系統的數據存取爲索引式文件系統(indexed allocation)
  • 需要磁盤重組的原因就是文件寫入的 block 太過於離散了,此時文件讀取的性能將會變的很差所致。 這個時候可以通過磁盤重組將同一個文件所屬的 blocks彙整在一起。
  • Ext2文件系統主要有:boot sector, superblock, inode bitmap, block bitmap, inode table, data block 等六大部分。
  • data block 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及 4K 三種而已
  • inode 記錄文件的屬性/權限等數據,其他重要項目爲: 每個 inode 大小均爲固定,有 128/256Bytes 兩種基本容量。每個文件都僅會佔用一個 inode 而已; 因此文件系統能夠創建的文件數量與 inode 的數量有關;
  • 文件的 block 在記錄文件的實際數據,目錄的 block 則在記錄該目錄下面文件名與其 inode 號碼的對照表;
  • 日誌式文件系統 (journal) 會多出一塊記錄區,隨時記載文件系統的主要活動,可加快系統復原時間;
  • Linux 文件系統爲增加性能,會讓內存作爲大量的磁盤高速緩存;
  • 實體鏈接只是多了一個文件名對該 inode 號碼的鏈接而已;
  • 符號鏈接就類似Windows的捷徑功能。
  • 磁盤的使用必需要經過:分區、格式化與掛載,分別慣用的指令爲:gdisk, mkfs, mount三個指令
  • 分區時,應使用 parted 檢查分區表格式,再判斷使用 fdisk/gdisk 來分區,或直接使用 parted 分區
  • 爲了考慮性能,XFS 文件系統格式化時,可以考慮加上 agcount/su/sw/extsize 等參數較佳
  • 如果磁盤已無未分區的容量,可以考慮使用大型文件取代磁盤設備的處理方式,通過 dd 與格式化功能。
  • 開機自動掛載可參考/etc/fstab之設置,設置完畢務必使用 mount -a 測試語法正確否



四、文件壓縮


  • 壓縮指令爲通過一些運算方法去將原本的文件進行壓縮,以減少文件所佔用的磁盤容量。 壓縮前與壓縮後的文件所佔用的磁盤容量比值, 就可以被稱爲是“壓縮比”
  • 壓縮的好處是可以減少磁盤容量的浪費,在 WWW 網站也可以利用文件壓縮的技術來進行數據的傳送,好讓網站帶寬的可利用率上升喔
  • 壓縮文件的擴展名大多是:“*.gz, *.bz2, *.xz, *.tar, *.tar.gz, *.tar.bz2, *.tar.xz”
  • 常見的壓縮指令有 gzip, bzip2, xz。壓縮率最佳的是 xz,若可以不計時間成本,建議使用 xz 進行壓縮。
  • tar 可以用來進行文件打包,並可支持 gzip, bzip2, xz 的壓縮。
  • 壓 縮:tar -Jcv -f filename.tar.xz 要被壓縮的文件或目錄名稱
  • 查 詢:tar -Jtv -f filename.tar.xz
  • 解壓縮:tar -Jxv -f filename.tar.xz -C 欲解壓縮的目錄

tar -J 中的J對應了xz指令, 可以用z對應gzip,j對應bzip2



五、Shell基礎


  • 由於核心在內存中是受保護的區塊,因此我們必須要通過“ Shell ”將我們輸入的指令與 Kernel 溝通,好讓 Kernel 可以控制硬件來正確無誤的工作
  • 學習 shell 的原因主要有:命令行的 shell 在各大 distribution 都一樣;遠端管理時命令行速度較快; shell 是管理 Linux 系統非常重要的一環,因爲 Linux 內很多控制都是以 shell 撰寫的。
  • 系統合法的 shell 均寫在 /etc/shells 文件中;
  • 使用者默認登陸取得的 shell 記錄於 /etc/passwd 的最後一個字段;
  • bash 的功能主要有:命令編修能力;命令與文件補全功能;命令別名設置功能;工作控制、前景背景控制;程序化腳本;萬用字符
  • type 可以用來找到執行指令爲何種類型,亦可用於與which 相同的功能;
  • 變量就是以一組文字或符號等,來取代一些設置或者是一串保留的數據
  • 變量主要有環境變量與自訂變量,或稱爲全域變量與區域變量
  • 使用 env 與 export 可觀察環境變量,其中 export 可以將自訂變量轉成環境變量;
  • set 可以觀察目前 bash 環境下的所有變量;
  • $? 亦爲變量,是前一個指令執行完畢後的回傳值。在 Linux 回傳值爲 0 代表執行成功;
  • locale 可用於觀察語系數據;
  • 可用 read 讓使用者由鍵盤輸入變量的值
  • ulimit 可用以限制使用者使用系統的資源情況
  • bash 的配置文件主要分爲 login shell 與 non-login shell。login shell 主要讀取 /etc/profile 與 ~/.bash_profile, non-login shell 則僅讀取 ~/.bashrc
  • 在使用 vim 時,若不小心按了 [crtl]+s 則畫面會被凍結。你可以使用 [ctrl]+q 來解除凍結
  • 萬用字符主要有: *, ?, [] 等等
  • 數據流重導向通過 >, 2>, < 之類的符號將輸出的信息轉到其他文件或設備去;
  • 連續命令的下達可通過 ; && || 等符號來處理
  • 管線命令的重點是:“管線命令僅會處理 standard output,對於 standard error output 會予以忽略” “管線命令必須要能夠接受來自前一個指令的數據成爲 standard input 繼續處理纔行。”
  • 本章介紹的管線命令主要有:cut, grep, sort, wc, uniq, tee, tr, col, join, paste, expand, split, xargs 等。


六、正則表達式與文件格式化處理


  • 正則表達式就是處理字串的方法,他是以行爲單位來進行字串的處理行爲;
  • 正則表達式通過一些特殊符號的輔助,可以讓使用者輕易的達到“搜尋/刪除/取代”某特定字串的處理程序;
  • 只要工具程序支持正則表達式,那麼該工具程序就可以用來作爲正則表達式的字串處理之用;
  • 正則表達式與萬用字符是完全不一樣的東西!萬用字符 (wildcard) 代表的是 bash 操作接口的一個功能, 但正則表達式則是一種字串處理的表示方式!
  • 使用 grep 或其他工具進行正則表達式的字串比對時,因爲編碼的問題會有不同的狀態,因此, 你最好將 LANG 等變量設置爲 C 或者是 en 等英文語系!
  • grep 與 egrep 在正則表達式裏面是很常見的兩支程序,其中, egrep 支持更嚴謹的正則表達式的語法;
  • 由於編碼系統的不同,不同的語系 (LANG) 會造成正則表達式擷取數據的差異。因此可利用特殊符號如 [:upper:] 來替代編碼範圍較佳;
  • 由於嚴謹度的不同,正則表達式之上還有更嚴謹的延伸正則表達式;
  • 基礎正則表達式的特殊字符有: *, ., [], [-], [^], ^, $ 等!
  • 常見的支持正則表達式的工具軟件有: grep , sed, vim 等等
  • printf 可以通過一些特殊符號來將數據進行格式化輸出;
  • awk 可以使用“字段”爲依據,進行數據的重新整理與輸出;
  • 文件的比對中,可利用 diff 及 cmp 進行比對,其中 diff 主要用在純文本方面的新舊版本比對
  • patch 指令可以將舊版數據更新到新版 (主要亦由 diff 創建 patch 的補丁來源文件)

七、學習Shell Scripts


  • shell script 是利用 shell 的功能所寫的一個“程序 (program)”,這個程序是使用純文本文件,將一些 shell 的語法與指令(含外部指令)寫在裏面, 搭配正則表達式、管線命令與數據流重導向等功能,以達到我們所想要的處理目的
  • shell script 用在系統管理上面是很好的一項工具,但是用在處理大量數值運算上, 就不夠好了,因爲 Shell scripts 的速度較慢,且使用的 CPU 資源較多,造成主機資源的分配不良。
  • 在 Shell script 的文件中,指令的執行是從上而下、從左而右的分析與執行;
  • shell script 的執行,至少需要有 r 的權限,若需要直接指令下達,則需要擁有 r 與 x 的權限;
  • 良好的程序撰寫習慣中,第一行要宣告 shell (#!/bin/bash) ,第二行以後則宣告程序用途、版本、作者等
  • 對談式腳本可用 read 指令達成;
  • 要創建每次執行腳本都有不同結果的數據,可使用 date 指令利用日期達成;
  • script 的執行若以 source 來執行時,代表在父程序的 bash 內執行之意!
  • 若需要進行判斷式,可使用 test 或中括號 ( [] ) 來處理;
  • 在 script 內,$0, $1, $2..., $@ 是有特殊意義的!
  • 條件判斷式可使用 if...then 來判斷,若是固定變量內容的情況下,可使用 case $var in ... esac 來處理
  • 循環主要分爲不定循環 (while, until) 以及固定循環 (for) ,配合 do, done 來達成所需任務
  • 我們可以使用 sh -x script.sh 來進行程序的debug

八、程序管理

  • 程序 (program):通常爲 binary program ,放置在儲存媒體中 (如硬盤、光盤、軟盤、磁帶等),爲實體文件的型態存在;
  • 程序 (process):程序被觸發後,執行者的權限與屬性、程序的程序碼與所需數據等都會被載入內存中, 操作系統並給予這個內存內的單元一個識別碼 (PID),可以說,程序就是一個正在運行中的程序。
  • 程序彼此之間是有相關性的,故有父程序與子程序之分。而 Linux 系統所有程序的父程序就是 init 這個 PID 爲 1 號的程序。
  • 在 Linux 的程序調用通常稱爲 fork-and-exec 的流程!程序都會藉由父程序以複製 (fork) 的方式產生一個一模一樣的子程序, 然後被複製出來的子程序再以 exec 的方式來執行實際要進行的程序,最終就成爲一個子程序的存在。
  • 常駐在內存當中的程序通常都是負責一些系統所提供的功能以服務使用者各項任務,因此這些常駐程序就會被我們稱爲:服務 (daemon)。
  • 在工作管理 (job control) 中,可以出現提示字符讓你操作的環境就稱爲前景 (foreground),至於其他工作就可以讓你放入背景 (background) 去暫停或運行。
  • 與 job control 有關的按鍵與關鍵字有: &, [ctrl]-z, jobs, fg, bg, kill %n 等;
  • 程序管理的觀察指令有: ps, top, pstree 等等;
  • 程序之間是可以互相控制的,傳遞的訊息 (signal) 主要通過 kill 這個指令在處理;
  • 程序是有優先順序的,該項目爲 Priority,但 PRI 是核心動態調整的,使用者只能使用 nice 值去微調 PRI
  • nice 的給予可以有: nice, renice, top 等指令;
  • vmstat 爲相當好用的系統“資源使用情況觀察指令;
  • SELinux 當初的設計是爲了避免使用者資源的誤用,而 SELinux 使用的是 MAC 委任式存取設置;
  • SELinux 的運行中,重點在於主體程序 (Subject) 能否存取目標文件資源 (Object) ,這中間牽涉到政策 (Policy) 內的規則, 以及實際的安全性本文類別 (type);
  • 安全性本文的一般設置爲:“Identify:role:type”其中又以 type 最重要;
  • SELinux 的模式有: enforcing, permissive, disabled 三種,而啓動的政策 (Policy) 主要是 targeted
  • SELinux 啓動與關閉的配置文件在: /etc/selinux/config
  • SELinux 的啓動與觀察: getenforce, sestatus 等指令
  • 重設 SELinux 的安全性本文可使用 restorecon 與 chcon
  • 在 SELinux 有啓動時,必備的服務至少要啓動 auditd 這個!
  • 若要管理默認的 SELinux 布林值,可使用 getsebool, setsebool 來管理!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章