2013年1月24日 星期四

《鳥哥的Linux私房菜:基礎學習篇》筆記

本篇筆記大多記錄指令的用法,欲瞭解Linux觀念請參閱 鳥哥的 Linux 私房菜


一、Linux 的檔案權限與目錄配置

1.所有系統上的帳號、一般身份使用者及 root 資訊,都記錄在 /etc/passwd 檔案內。


2.個人密碼的資訊記錄在 /etc/shadow 檔案內。


3.所有的群組名稱記錄在 /etc/group 檔案內。


4.Linux 檔案屬性:
# ls -al

[權限] [連結] [擁有者] [群組名稱] [檔案容量] [修改日期] [檔名]


5.檔案權限:












圖片來源:鳥哥

(1)第一個字元:
  • -:檔案
  • d:目錄
  • l:連結檔案
  • b:可供存取的週邊設備
  • c:序列埠設備
  • s:資料接口(socket)
  • p:資料輸送(FIFO)

(2)其他字元:
  • r:可讀
  • w:可寫
  • x:可執行
  • -:沒有權限
  • t:sticky bit(只能刪自己,不能刪別人)


6.改變檔案屬性與權限:
  • chgrp:檔案所屬群組
chgrp [-R] 目錄名稱或檔案名稱
//-R 會變更某一目錄內所有檔案的情況。
  • chown:檔案擁有者
chown [-R] 帳號名稱 目錄名稱或檔案名稱
chown [-R] 帳號名稱:群組名稱 目錄名稱或檔案名稱
  • chmod:檔案權限
chmod [-R] 三位數屬性數值 目錄名稱或檔案名稱
  • r:4
  • w:2
  • x:1
  • -:0

第一位數為檔案擁有者;第二位數為群組;第三位數為其他人


7.Linux 目錄配置:

/bin*:在單人維護模式下還能夠被操作的指令。
/boot:開機會使用到的檔案。
/dev*:以檔案形態存在的任何裝置或週邊設備。
/etc*:系統主要的設定檔。
/home:家目錄。「~」代表目前使用者的家目錄;「~xxx」代表xxx的家目錄。
/lib*:開機時會用到的函式庫。
/media:可移除的裝置。
/mnt:暫時掛載的裝置。
/opt:放置第三方協力軟體。
/root:系統管理員的家目錄。
/sbin*:開機過程中需要的指令。
/srv:網路服務啓動時所需取用的資料。
/tmp:使用者或是正在執行的程序暫時放置的檔案。
/lost+fond:當檔案系統發生錯誤時,會將一些遺失的片段放置於此。
/proc:放置在記憶體中的資料。
/sys:記錄與核心系統相關的資訊。

/usr:Unix 作業系統的軟體資源。
/usr/bin:大部份使用者可使用的指令。
/usr/include:程式語言的 header 與 include。
/usr/lib:包含各應用軟體的函式庫、object file,以及不被一般使用者慣用的執行檔或 script。
/usr/local:系統管理員在本機自行安裝自己下載的軟體。
/usr/sbin:非系統正常運作所需要的系統指令。
/usr/share:共享的文件。
/usr/src:一般的原始碼。

/var:常態性變動的檔案。
/var/cache:程式在執行過程中,需要使用到的資料檔案。
/var/lock:裝置或檔案上鎖,以確保同時間只會有一個裝置或檔案被使用。
/var/log:登錄檔。
/var/mail:個人的電子信箱。
/var/run:程式或服務的 PID。
/var/spool:佇列資料。

//*標示的目錄表示不可與根目錄分開在不同的分割槽。













圖片來源:鳥哥(看大圖請點連結)




二、Linux 檔案與目錄管理

1.目錄的分類:

  • .:此層目錄。
  • ..:上一層目錄。
  • -:前一個工作目錄。
  • ~:目前使用者的家目錄。
  • ~xxx:xxx使用者的家目錄。


2.處理目錄的指令:

  • cd變換目錄

cd [相對路徑或絕對路徑]

  • pwd顯示目前的目錄

pwd [-P]
//-P 會顯示出確實的路徑,而非使用連結路徑

  • mkdir建立一個新的目錄

mkdir [-mp] 目錄名稱
//-m 可設定檔案的權限,後面需加上權限數值;-p 會自動將所需要的目錄(包含上層目錄)遞迴建立起來。

  • rmdir刪除一個的目錄

rmdir [-p]目錄名稱
//-p 會連同上層「空的」目錄一起刪除。


3.檔案與目錄的檢視:

ls [-aAdfFhilnrRSt] 目錄名稱
ls [--color={never,auto,always}] 目錄名稱
ls [--full-time] 目錄名稱

-a:全部的檔案,連同隱藏檔一起列出來。
-A:全部的檔案,連同隱藏檔,但不包括 . 與 .. 這兩個目錄。
-d:僅列出目錄本身,而不是列出目錄內的檔案資料。
-f:直接列出結果,而不進行排序 。
-F:根據檔案、目錄等資訊,給予附加資料結構。
-h:將檔案容量以較易讀的方式列出來。
-i:列出 inode 號碼。
-l:長資料串列出,包含檔案的屬性與權限等等資料。
-n:列出 UID 與 GID 而非使用者與群組的名稱 。
-r:將結果以大到小排序輸出。
-R:連同子目錄內容一起列出來。
-S:以檔案容量大小排序。
-t:依時間排序。

--color=never:不要依據檔案特性給予顏色顯示。
--color=always:顯示顏色。
--color=auto:讓系統自行依據設定來判斷是否給予顏色。

--full-time:以完整時間模式輸出。
--time={atime,ctime}:輸出 access 時間(atime)或改變權限屬性時間(ctime),而非內容變更時間。


4.複製檔案或目錄:

cp [-adfilprsu] source destination

cp [-adfilprsu] source1 source2 ... destination


-a:相當於 -pdr 的意思。
-d:若來源檔(source)為連結檔的屬性,則複製連結檔屬性而非檔案本身。
-f:若目標檔案(destination)已經存在且無法開啟,則移除後再嘗試一次。
-i:若目標檔案已經存在時,在覆蓋時會先詢問動作的進行。
-l:進行 hard link 的連結檔建立,而非複製檔案本身。
-p:連同檔案的屬性一起複製過去,而非使用預設屬性。
-r:遞迴持續複製,用於目錄的複製行為。
-s:複製成為捷徑檔案。
-u:若 destination 比 source 舊才更新 destination。


5.移除檔案或目錄:

rm [-fir] 檔案或目錄

-f:忽略不存在的檔案,不會出現警告訊息。
-i:在刪除前會詢問使用者是否刪除。
-r:遞迴刪除。


6.移動檔案或目錄,或重新命名:

mv [-fiu] source destination
mv [options] source1 source2 source3 .... directory

-f:若目標檔案已經存在,不會詢問就直接覆蓋。
-i:若目標檔案已經存在,會詢問是否覆蓋。
-u:若目標檔案已經存在,且 source 比較新,才會更新。


7.直接檢視檔案內容:
  • cat:由第一行開始顯示檔案內容。
cat [-AbEnTv] 檔案

-A:相當於 -vET 的整合選項,可列出一些特殊字符而不是空白而已。
-b:列出行號,僅針對非空白行做行號顯示,空白行不標行號。
-E:將結尾的斷行字元 $ 顯示出來。
-n:列印出行號,連同空白行也會有行號。
-T:將 [tab] 按鍵以 ^I 顯示出來。
-v:列出一些看不出來的特殊字符。

  • tac:從最後一行開始顯示內容。
tac 檔案

  • nl:顯示的時候會輸出行號
nl [-bnw] 檔案

-b:指定行號指定的方式,主要有兩種:
-b a:表示不論是否為空行,也同樣列出行號
-b t:如果有空行,空的那一行不要列出行號

-n:列出行號表示的方法,主要有三種:
-n ln:行號在螢幕的最左方顯示。
-n rn:行號在自己欄位的最右方顯示,且不加 0
-n rz:行號在自己欄位的最右方顯示,且加 0

-w:行號欄位的佔用的位元數。


8.翻頁檢視檔案內容:
  • more一頁一頁的顯示檔案內容。
more 檔案

空白鍵:向下翻一頁。
Enter:向下翻「一行」。
/字串:向下搜尋「字串」。
:f:顯示檔名以及目前顯示的行數。
q:離開 more 。
b:往回翻頁。
  • less:與 more 類似,但可以往前翻頁
less 檔案

空白鍵:向下翻一頁。
[pagedown]:向下翻一頁。
[pageup]:向上翻一頁。
/字串:向下搜尋「字串」。
?字串:向上搜尋「字串」。
n:重複前一個搜尋。
N:反向的重複前一個搜尋。
q:離開 less。


9.資料擷取:
  • head:只看幾行。
 head [-n 行數] 檔案

-n:後面接數字,代表顯示幾行。

  • tail:只看幾行。
tail [-n 行數] 檔案

-n:後面接數字,代表顯示幾行的意思。
-f:表示持續偵測後面所接的檔名,要等到按下[ctrl]-c才會結束tail的偵測。


10.檢視二進位檔:
  • od:以二進位的方式讀取檔案內容。
od [-t 類型] 檔案

-t:後面可以接各種類型的輸出,包括:
a:利用預設的字元來輸出。
c:使用 ASCII 字元來輸出。
d[size]:利用十進位來輸出資料,每個整數佔用 size bytes。
f[size]:利用浮點數值來輸出資料,每個數佔用 size bytes。
o[size]:利用八進位來輸出資料,每個整數佔用 size bytes。
x[size] :利用十六進位來輸出資料,每個整數佔用 size bytes。


11.修改檔案時間或建置新檔:

touch [-acdmt] 檔案

-a:僅修訂 access time。
-c:僅修改檔案的時間,若該檔案不存在則不建立新檔案。
-d:後面可以接欲修訂的日期而不用目前的日期,也可以使用 --date="日期或時間"。
-m:僅修改檔案內容時間(mtime)。
-t:後面可以接欲修訂的時間而不用目前的時間,格式為[YYMMDDhhmm]。


12.設定檔案預設權限:

umask [-S] 檔案

-S:以符號類型的方式顯示權限。

//umask 的分數指的是「該預設值需要減掉的權限」。第一位數為特殊權限,後三位數分別代表檔案擁有者、檔案所屬群組、其他人之權限。


13.設定檔案隱藏屬性:

chattr [+-=][ASacdistu] 檔案或目錄名稱

+:增加某一個特殊參數,其他原本存在參數則不動。
-:移除某一個特殊參數,其他原本存在參數則不動。
=:設定一定,且僅有後面接的參數。

A:若你有存取此檔案(或目錄)時,存取時間(atime)將不會被修改,可避免I/O較慢的機器過度的存取磁碟。
S:當你進行任何檔案的修改,該更動會「同步」寫入磁碟中。
a:這個檔案將只能增加資料,不能刪除也不能修改資料。只有root才能設定這個屬性。
c:自動的將此檔案「壓縮」,在讀取的時候將會自動解壓縮,但是在儲存的時候,將會先進行壓縮後再儲存。
d:可使檔案或目錄不會被 dump 備份。
i:可以讓一個檔案不能被刪除、改名、設定連結,也無法寫入或新增資料。只有 root 能設定此屬性。
s:若檔案被刪除,將會被完全的移除出這個硬碟空間。
u:若檔案被刪除,則資料內容會備份存在磁碟中。


14.顯示檔案隱藏屬性:

lsattr [-adR] 檔案或目錄

-a:將隱藏檔的屬性顯示出來。
-d:若接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名。
-R :連同子目錄的資料也一併列出來。


15.特殊權限的限制與功能:

(1)SUID
  • 僅對二進位程式有效。
  • 執行者對於該程式需要具有 x 的可執行權限。
  • 本權限僅在執行該程式的過程中有效。
  • 執行者將具有該程式擁有者的權限。
(2)SGID

對檔案:
  • 僅對二進位程式有效。
  • 執行者對於該程式需要具有 x 的可執行權限。
  • 執行者在執行的過程中將會獲得該程式群組的支援。
對目錄:
  • 使用者若具有 r 與 x 的權限時,能夠進入此目錄。
  • 使用者在此目錄下的有效群組將會變成該目錄的群組。
*用途:若使用者在此目錄下具有 w 的權限(可以新建檔案),則使用者所建立的新檔案,該新檔案的群組與此目錄的群組相同。

(3)SBIT
  • 僅對目錄有效。
  • 當使用者對於此目錄具有 w, x 權限,即具有寫入的權限。
  • 當使用者在該目錄下建立檔案或目錄時,僅有自己root 才有權力刪除該檔案。


16.特殊權限的權限設定:
  • SUID:4
  • SGID:2
  • SBIT:1


17.查看檔案類型:

file 檔案


18.指令檔名搜尋:

which [-a] 指令

-a:將所有由 PATH 目錄中可以找到的指令均列出,而不止第一個被找到的指令名稱。

*whereis:不只列出指令,還包含指令的組態檔。

19.指令、檔案檔名的搜尋:
  • whereis:只搜尋幾個特定的路徑,如 /usr/bin/etc 等。
whereis [-bmsu] 檔案或目錄名稱

-b:只找 binary 格式的檔案。
-m:只找在說明檔 manual 路徑下的檔案。
-s:只找 source 來源的檔案。
-u:搜尋不在上述三個項目當中的其他特殊檔案。

  • locate:從資料庫搜尋,而非硬碟。以檔案的完整名稱搜尋。
locate [-ir] keyword

-i:忽略大小寫的差異。
-r:後面可接正規表示法的顯示方式。
//更新資料庫:updatedb

  • find:必須指定搜尋的路徑
find [路徑] [選項] [動作]

選項包括:
-name:檔案名稱。
-perm:檔案權限。
-prune:不在目前指定的目錄下查詢。
-user:檔案使用者名稱。
-group:按照所屬群組。
-nogroup:檔案的擁有群組不存在的檔案。
-nouser:檔案的擁有者不存在的檔案。
-type:檔案類型。

動作包括:
-print:將結果輸出。
-exec :對符合的檔案執行該參數所給出的 shell 指令。形式為 command  {} \。
-ok :與 -exec 作用相同,區別在於,在執行指令之前,都會給出提示,讓使用者確認是否執行。




三、Linux 磁碟與檔案系統管理

1.檔案系統存放的三種資料區塊:

(1)superblock:記錄此檔案系統的整體資訊,包括inode/block的總量、使用量、剩餘量, 以及檔案系統的格式與相關資訊等。

(2)inode:記錄檔案的權限與屬性,一個檔案佔用一個inode,同時記錄此檔案的資料所在的 block 號碼。

(3)block:記錄檔案的內容


2.瀏覽磁碟與目錄的容量:

  • df:列出 superblock 內的資訊。
df [-ahikHTm] [目錄或檔名]

-a:列出所有的檔案系統。
-h:以 GB, MB, KB 等格式顯示。
-T:連同該 partition 的 filesystem 名稱 (例如 ext3) 也列出。
-i:不用硬碟容量,而以 inode 的數量來顯示。

  • du:列出檔案系統內所有的檔案資料
du [-ahskm] 檔案或目錄名稱

-a:列出所有的檔案與目錄容量。
-h:以 GB, MB, KB 等格式顯示。
-s:只列出總量,而不列出每個目錄的佔用容量。
-S:不包括子目錄下的總計。


3.Linux 下的兩種連結檔:

(1)Hard Link實體連結):在某個目錄下新增一筆檔名連結到某 inode 號碼的關聯記錄。

//不可跨檔案系統、不可 link 目錄。

(2)Symbolic Link符號連結,即捷徑):建立一個獨立的檔案,而此檔案會讓資料的讀取指向它 link 的那個檔案的檔名。


4.製作連結檔:

ln [-sf] 來源檔 目標檔

-s:symbolic link。不加任何參數就進行連結則為 hard link。
-f:若 目標檔 存在時,就將目標檔直接移除後再建立。


5.磁碟分割:

fdisk [-l] 裝置名稱

-l:輸出後面接的裝置所有的 partition 內容。若僅有 fdisk -l 時,則系統將會把整個系統內能夠搜尋到的裝置的 partition 均列出來。


6.磁碟格式化:

mkfs [-t 檔案系統格式] 裝置檔名

-t:選擇格式化的檔案系統格式。


7.磁碟檢驗:

fsck [-ACay] 裝置名稱

-A:依據 /etc/fstab 的內容,將需要的裝置掃瞄一次。
-a:自動修復檢查到的有問題的磁區。
-y:與 -a 類似,但是某些 filesystem 僅支援 -y 這個參數。
-C:使用一個長條圖來顯示目前的檢驗進度。


8.磁碟掛載與卸載:

掛載前必須確定:
(1)單一檔案系統不應該被重複掛載在不同的掛載點(目錄)中。
(2)單一目錄不應該重複掛載多個檔案系統。
(3)要作為掛載點的目錄,理論上應該都是空目錄才是。

  • mount -a
-a:依照設定檔 /etc/fstab 的資料將所有未掛載的磁碟都掛載上來。

  • mount [-l]
-l:未加參數時, mount 會顯示目前掛載的資訊。加上 -l 可增列 Label 名稱。

  • mount [-t 檔案系統] [-L Label名] [-o 額外選項] \ [-n]  裝置檔名  掛載點
-t:可以加上檔案系統種類。
-n:可在單人維護模式下,強制系統將實際掛載的情況即時寫入 /etc/mtab 中。
-L:利用檔案系統的標頭名稱(Label)來進行掛載。

-o:後面可以接一些掛載時額外加上的參數:

ro, rw:掛載檔案系統成為唯讀(ro) 或可讀寫(rw)。
async, sync:此檔案系統是否使用同步寫入 (sync) 或非同步 (async) 的記憶體機制。
auto, noauto:允許此 partition 被以 mount -a 自動掛載(auto)。
dev, nodev:是否允許此 partition 上,可建立裝置檔案。
suid, nosuid:是否允許此 partition 含有 suid/sgid 的檔案格式。
 exec, noexec:是否允許此 partition 上擁有可執行 binary 檔案。
user, nouser:是否允許此 partition 讓任何使用者執行 mount。
defaults:預設值為:rw, suid, dev, exec, auto, nouser, and async。
remount:重新掛載。

  • umount [-fn] 裝置檔名或掛載點
-f:強制卸載。
-n:不更新 /etc/mtab 情況下卸載。


9.磁碟參數修訂:
  • mknod 裝置檔名 [bcp] [Major] [Minor]
裝置種類:
b:設定裝置名稱成為一個周邊儲存設備檔案。
c:設定裝置名稱成為一個周邊輸入設備檔案。
p:設定裝置名稱成為一個 FIFO 檔案。
Major:主要裝置代碼。
Minor:次要裝置代碼。

  • tune2fs [-jlL] 裝置代號
-l:將 superblock 內的資料讀出來。
-j:將 ext2 的 filesystem 轉換為 ext3 的檔案系統。
-L:可修改 filesystem 的 Label。




四、檔案與檔案系統的壓縮與打包

1.壓縮、解壓縮:
  • gzip [-cdtv#] 檔名
-c:將壓縮的資料輸出到螢幕上。
-d:解壓縮的參數。或使用 zcat 檔名.gz。
-t:檢驗壓縮檔的一致性。
-v:可以顯示出原檔案/壓縮檔案的壓縮比等資訊。
-#:壓縮等級,-1 最快,-9 最慢。

  • bzip2 [-cdkzv#] 檔名
-c:將壓縮的過程產生的資料輸出到螢幕上。
-d:解壓縮的參數。或使用bzcat 檔名.bz2。
-k:保留原始檔案,而不會刪除原始的檔案。
-z:壓縮的參數。
-v:可以顯示出原檔案/壓縮檔案的壓縮比等資訊。
-#:壓縮等級,-1 最快,-9 最慢。


2.tar 打包指令:
  • 打包與壓縮:tar [-j|-z] [cv] [-f 建立的檔名] filename...
  • 查看檔名:tar [-j|-z] [tv] [-f 建立的檔名]
  • 解壓縮:tar [-j|-z] [xv] [-f 建立的檔名] [-C 目錄]
-c:建立打包檔案,可搭配 -v 來查看過程中被打包的檔名。
-t:查看打包檔案的內容含有哪些檔名。
-x:解打包或解壓縮的功能,可以搭配 -C (大寫) 在特定目錄解開。 -c, -t, -x 不可同時出現在一串指令列中。
-j:透過 bzip2 的支援進行壓縮/解壓縮。此時檔名最好為 *.tar.bz2。
-z:透過 gzip 的支援進行壓縮/解壓縮。此時檔名最好為 *.tar.gz。
-v:在壓縮/解壓縮的過程中,將正在處理的檔名顯示出來。
-f filename:-f 後面要立刻接要被處理的檔名。
-C 目錄:在特定目錄下解壓縮。


3.完整備份工具:
  • dump [-Suvj] [-level] [-f 備份檔] 待備份資料
-S:僅列出後面的待備份資料需要多少磁碟空間才能夠備份完畢。
-u:將這次 dump 的時間記錄到 /etc/dumpdates 檔案中。
-v:將 dump 的檔案過程顯示出來。
-j:加入 bzip2 的支援。
-level:從 -0 ~ -9 共十個等級。
-f:後面接產生的檔案,亦可接例如 /dev/st0 裝置檔名等。

  • dump -W
-W:列出在 /etc/fstab 裡面的具有 dump 設定的 partition 是否有備份過。


4.還原被 dump 建置的備份檔:
  • 察看 dump 檔:restore -t [-f dumpfile] [-h]
  • 比較dump與實際檔案:restore -C [-f dumpfile] [-D 掛載點]
  • 進入互動模式:restore -i [-f dumpfile]
  • 還原整個檔案系統:restore -r [-f dumpfile]
-t:查看 dump 起來的備份檔中含有什麼重要資料。
-C:將 dump 內的資料拿出來跟實際的檔案系統做比較,最終會列出「在 dump 檔案內有記錄的,且目前檔案系統不一樣」的檔案。
-i:進入互動模式,可以僅還原部分檔案,用在 dump 目錄時的還原。
-r:用在還原針對檔案系統的 dump 備份。
-h:查看完整備份資料中的 inode 與檔案系統 label 等資訊。
-f:後面就接欲處理的那個 dump 檔案。
-D:與 -C 進行搭配,可查出後面接的掛載點與 dump 內有不同的檔案。




五、vim 程式編輯器

vim 推薦參考網站:vi 與 vim 的指令整理




六、認識與學習 Bash Shell Script

1.查詢指令來自外部或為 bash 內建指令:

type [-tpa] name

-t:以底下這些字眼顯示出它的意義:
file:外部指令。
alias:命令別名所設定的名稱。
builtin:bash 內建的指令功能。

-p:如果後面接的 name 為外部指令時,才會顯示完整檔名。
-a:會由 PATH 變數定義的路徑中,將所有含 name 的指令都列出來,包含 alias。
//不加任何選項與參數時,type 會顯示出 name 是外部指令還是 bash 內建指令


shell script 推薦參考網站:Bash Shell Script教學與心得




七、正規表示法與文件格式化處理

1.格式化列印:

printf '列印格式' 實際內容

\a:警告聲音輸出。
\b:倒退鍵(backspace)。
\f:清除螢幕 (form feed)。
\n:輸出新的一行。
\r:亦即 Enter 按鍵。
\t:水平的 [tab] 按鍵。
\v:垂直的 [tab] 按鍵。
\xNN:NN 為兩位數的數字,可以轉換數字成為字元。


2.資料處理工具:

awk '條件類型1{動作1} 條件類型2{動作2} ...' filename


3.檔案比對工具:

diff:以行為單位比對檔案。

  • diff [-bBi] from-file to-file

-b:忽略一行當中,僅有多個空白的差異。
-B:忽略空白行的差異。
-i:忽略大小寫的不同。

cmp:以位元組單位比對檔案。

  • cmp [-s] file1 file2

-s:將所有的不同點的位元組處都列出來。
//不加參數僅會輸出第一個發現的不同點。

patch:檔案更新還原

  • 更新:patch -pN < patch_file 
  • 還原:patch -R -pN < patch_file

正規表示法推薦參考網站:正規表示式 Regular Expression




八、Linux 帳號管理

1./etc/passwd 結構:

[帳號名稱]:[密碼]:[UID]:[GID]:[備註]:[該名使用者的預設家目錄]:[使用者能用的命令列]


2./etc/shadow 結構:

[帳號名稱]:[密碼]:[最後一次密碼更動日期]:[密碼不可被更動的天數]:[密碼需要重新變更的天數]:[密碼需要變更期限前的警告天數]:[密碼失效日期]:[帳號失效日期]:[保留]


3./etc/group 結構:

[群組名稱]:[群組密碼]:[GID]:[此群組支援的帳號名稱]


4./etc/gshadow 結構

[群組名稱]:[群組密碼]:[群組管理者帳號]:[此群組支援的帳號名稱]


5.新增使用者:

useradd [-u UID] [-g 初始群組] [-G 次要群組] [-mM]\>  [-c 說明欄] [-d 家目錄絕對路徑] [-s shell] 使用者帳號名

-u:後面接的是 UID,直接指定一個特定的 UID 給這個帳號。
-g:後面接的是 group。
-G:這個帳號還可以加入的群組。
-M:強制不要建立使用者家目錄(系統帳號預設值)。
-m:強制要建立使用者家目錄(一般帳號預設值)。
-c:備註。
-d:指定某個目錄成為家目錄,而不要使用預設值。必須使用絕對路徑。
-r:建立一個系統的帳號,這個帳號的 UID 會有限制。
-s:後面接一個 shell ,若沒有指定則預設是 /bin/bash。
-e:後面接一個日期,格式為「YYYY-MM-DD」,為帳號的失效日。
-f:指定密碼是否會失效。0為立刻失效,-1 為永遠不失效。


6.設定帳號的密碼:

一般使用者:
passwd [--stdin]

root:
passwd [-l] [-u] [--stdin] [-S] \>  [-n 日數] [-x 日數] [-w 日數] [-i 日期] 帳號

-l:Lock。
-u:Unlock。
-S:列出密碼相關參數。
-n:多久不可修改密碼天數。
-x:多久內必須要更動密碼。
-w:密碼過期前的警告天數。
-i:密碼失效日期。

chage [-ldEImMW] 帳號名

-l:列出該帳號的詳細密碼參數。
-d:最近一次更改密碼的日期。
-E:帳號失效日。
-I:密碼失效日期。
-m:密碼最短保留天數。
-M:密碼多久需要進行變更。
-W:密碼過期前警告日期。


7.修改帳號資料:

usermod [-cdegGlsuLU] username

-c:備註。
-d:帳號的家目錄。
-e:帳號失效日。
-f:密碼失效日期。
-g:初始群組。
-G:次要群組。
-a:與 -G 合用,可「增加次要群組的支援」而非「設定」。
-l:帳號名稱。
-s:Shell 的實際檔案。
-u:UID 數字。
-L:凍結使用者的密碼。
-U:解凍使用者的密碼。


8.刪除帳號:

userdel [-r] username

-r:連同使用者的家目錄也一起刪除。


9.檢查使用者資訊:

finger [-s] username

-s:僅列出使用者的帳號、全名、終端機代號與登入時間等等。
-m:列出與後面接的帳號完全相同者。


10.新增群組:

groupadd [-g gid] [-r] 群組名稱

-g:直接給予某個 GID。
-r:建立系統群組啦。


11.修改群組資料:

groupmod [-g gid] [-n group_name] 群組名

-g:修改既有的 GID 數字。
-n:修改既有的群組名稱。


12.刪除群組:

groupdel [groupname]


13.群組管理員功能:

群組管理員:

gpasswd [-ad] user groupname

-a:將某位使用者加入到 groupname 這個群組當中。
-d:將某位使用者移除出 groupname 這個群組當中。

root:

gpasswd groupname
//修改群組密碼。

gpasswd [-A user1,...] [-M user3,...] groupname
gpasswd [-rR] groupname

-A:將 groupname 的主控權交由群組的管理員。
-M:將某些帳號加入這個群組當中。
-r:將 groupname 的密碼移除。
-R:讓 groupname 的密碼欄失效。




九、磁碟配額(Quota)與進階檔案系統管理

1.Quota 僅能針對整個 filesystem


2.Quota 是透過分析整個檔案系統中,每個使用者(群組)擁有的檔案總數與總容量,再將這些資料記錄在該檔案系統的最頂層目錄,然後在該記錄檔中再使用每個帳號(群組)的限制值去規範磁碟使用量。

3.Quota 的規範設定項目:

(1)容量限制或檔案數量限制(block 或 inode):

  • 限制 block 用量:管理使用者可建立的檔案數量
  • 限制 inode 用量:管理使用者磁碟容量

(2)柔性勸導與硬性規定(soft 或 hard):

  • soft:當使用者低於 soft 限值時,可正常使用磁碟。
  • hard:使用者的用量的極限值,若超過此數值則系統會鎖住用戶的磁碟使用權。

(3)會倒數計時的寬限時間(grace time):

當超過 soft 且低於 hard 的限值時,每次使用者登入系統,系統會主動發出磁碟容量即將額滿的警告訊息,且會給予一個 grace time。

一旦在 grace time 期限內未進行任何磁碟管理,則 soft 限制值會即刻取代 hard 限值來作為 quota 的限制


4.soft、hard、grace time之間的關係:


圖片來源:鳥哥


5.掃描檔案系統並建立 Quota 的記錄檔:

quotacheck [-avugfM] [/mount_point]

-a:掃瞄所有在 /etc/mtab 內,含有 quota 支援的 filesystem。
-u:針對使用者掃瞄檔案與目錄的使用情況,會建立 aquota.user。
-g:針對群組掃瞄檔案與目錄的使用情況,會建立 aquota.group。
-v:顯示掃瞄過程的資訊。
-f:強制掃瞄檔案系統,並寫入新的 quota 設定檔。
-M:強制以讀寫的方式掃瞄檔案系統。


6.啟動 Quota 的服務:

quotaon [-avug]
quotaon [-vug] [/mount_point]

-u:針對使用者啟動 Quota (aquota.user)。
-g:針對群組啟動 Quota (aquota.group)。
-v:顯示啟動過程的相關訊息。
-a:根據 /etc/mtab 內的 filesystem 設定啟動有關的 quota 。若不加 -a, 則後面就需要加上特定的那個 filesystem 。


7.關閉 Quota 的服務:

quotaoff [-a]
quotaoff [-ug] [/mount_point]

-a:全部的 filesystem 的 quota 都關閉 (根據 /etc/mtab)。
-u:僅針對後面接的 /mount_point 關閉 user quota。
-g:僅針對後面接的 /mount_point 關閉 group quota。


8.編輯帳號/群組的限值與寬限時間:

edquota [-u username] [-g groupname]
edquota -t 修改寬限時間
edquota -p 範本帳號 -u 新帳號

-u:後面接帳號名稱。
-g:後面接群組名稱。
-t:修改寬限時間。
-p:複製範本。範本帳號為已經存在並且已設定好 quota 的使用者,意義為「『將範本帳號』這個人的 quota 限制值複製給『新帳號』」。

//可以進入 quota 的編輯畫面 (vi) 去設定 username/ groupname 的限制值。


9.顯示用戶的 Quota 報表:

quota [-uvs] [username]
quota [-gvs] [groupname]

-u:顯示出該使用者的 quota 限制值。若不接 username 則顯示執行者的 quota 限制值。
-g:顯示出該群組的 quota 限制值。
-v:顯示每個用戶在 filesystem 的 quota 值。
-s:使用 M, G 為單位顯示結果。


10.針對檔案系統的限額做報表:

repquota -a [-vugs]

-a:直接到 /etc/mtab 搜尋具有 quota 標誌的 filesystem ,並報告 quota 的結果。
-v:輸出的資料將含有 filesystem 相關的細部資訊。
-u:顯示出使用者的 quota 限值 (預設值)。
-g:顯示出個別群組的 quota 限值。
-s:使用 M, G 為單位顯示結果。


11.對超過限額者發出警告信:

warnquota


12.直接於指令中設定 quota 限額:

setquota [-u|-g] 帳號或群組名稱 block(soft) block(hard) \ > inode(soft) inode(hard) 檔案系統


13.以動畫方式學習磁碟陣列概論(日):RAIDとは

PS:不會日文也能輕鬆看懂。



14.軟體磁碟陣列的設定:

mdadm --detail /dev/md0
mdadm --create --auto=yes /dev/md[0-9] --raid-devices=N \ > --level=[015] --spare-devices=N /dev/sdx /dev/hdx...

--detail:後面所接的那個磁碟陣列裝置的詳細資訊。
--create:建立 RAID 的選項。
--auto=yes:決定建立後面接的軟體磁碟陣列裝置,亦即 /dev/md0, /dev/md1...。
--raid-devices=N:使用幾個磁碟 (partition) 作為磁碟陣列的裝置。
--spare-devices=N:使用幾個磁碟作為備用 (spare) 裝置。
--level=[015]:設定這組磁碟陣列的等級。


15.LVM(邏輯磁碟機系統管理)推薦網站:好用的Linux LVM 管理




十、例行性工作排程(crontab)

1.突發性排程:

須先開啟 atd 服務:
/etc/init.d/atd restart
chkconfig atd on

at -c 工作號碼
at [-mldv] TIME

-m:當 at 的工作完成後,即使沒有輸出訊息,亦以 email 通知使用者該工作已完成。
-l:列出目前系統上面的所有該使用者的 at 排程。
-d:取消一個在 at 排程中的工作。
-v:使用較明顯的時間格式列出 at 排程中的工作列表。
-c:列出後面接的該項工作的實際指令內容。


2.at 指令會產生所要運作的工作,並將這個工作以文字檔的方式寫入 /var/spool/at/ 目錄內,該工作便能等待 atd 服務的取用與執行了。


3.at 指令的列管:

  • /etc/at.allow:將可以使用 at 指令的帳號寫入其中。
  • /etc/at.deny:將不可使用 at 指令的帳號寫入其中。
  • 若兩個檔案都不存在,則只有 root 才能使用 at。


4.查詢目前主機上有幾個 at 工作排程:

atq


5.移除工作排程:

atrm [jobnumber]


6.當系統有空時才進行背景任務:

batch TIME

//同樣使用 atq/atrm 管理。


7.例行性排程:

crontab [-u username] [-l|-e|-r]

-u:只有 root 才能進行這個任務,亦即幫其他使用者建立/移除 crontab 工作排程。
-e:編輯 crontab 的工作內容。
-l:查閱 crontab 的工作內容。
-r:移除所有的 crontab 的工作內容,若僅要移除一項,則以 -e 去編輯。


8.當使用者使用 crontab 這個指令來建立工作排程之後,該項工作就會被紀錄到 /var/spool/cron/。


9.crontab 指令的列管:

  • /etc/cron.allow:將可以使用 crontab 的帳號寫入其中。
  • /etc/cron.deny: 將不可以使用 crontab 的帳號寫入其中。


10.喚醒停機期間的工作任務:

anacron [-sfn] [job]..
anacron -u [job]..

-s:開始一連續的執行各項工作 (job),會依據時間記錄檔的資料判斷是否進行。
-f:強制進行,而不去判斷時間記錄檔的時間戳記。
-n:立刻進行未進行的任務,而不延遲 (delay) 等待時間。
-u:僅更新時間記錄檔的時間戳記,不進行任何工作。

job :由 /etc/anacrontab 定義的各項工作名稱。


11.anacron 並不能指定何時執行某項任務, 而是以天為單位或者是在開機後立刻進行 anacron 的動作,他會去偵測停機期間應該進行但是並沒有進行的 crontab 任務,並將該任務執行一遍後,anacron 就會自動停止了。


12.anacron 其實也是透過 crontab 來運作的。因此 anacron 運作的時間通常有兩個,一個是系統開機期間運作,一個是寫入 crontab 的排程中。




十一、程序管理

1.觀察目前的背景工作狀態:

jobs [-lrs]

-l:除了列出 job number 與指令串之外,同時列出 PID 的號碼。
-r:僅列出正在背景 run 的工作。
-s:僅列出正在背景當中暫停的工作。


2.將背景工作拿到前台來處理:

fg jobnumber

jobnumber:為工作號碼(數字)。


3.將背景工作拿到後台來處理:


bg jobnumber

jobnumber:為工作號碼(數字)。



4.管理背景當中的工作:

kill -signal jobnumber
kill -l

-l:列出目前 kill 能夠使用的訊號 (signal) 有哪些。

-signal:代表給予後面接的那個工作什麼樣的指示:
-1:重新讀取一次參數的設定檔。
-2:代表與由鍵盤輸入 [ctrl]-c 同樣的動作。
-9:立刻強制刪除一個工作。
-15:以正常的程序方式終止一項工作。


5.離線管理問題:

nohup [指令與參數]
nohup [指令與參數] &

//加上 & 表示在終端機後台中工作,不加則表示在前台。


6.將某個時間點的程序運作情況擷取下來:

ps [Aauxljf]

-A:所有的 process 均顯示出來。
-a:不與 terminal 有關的所有 process。
-u:有效使用者相關的 process。
x:通常與 a 這個參數一起使用,可列出較完整資訊。

輸出格式規劃:
l:較長、較詳細的將該 PID 的的資訊列出。
j:工作的格式。
-f:做一個更為完整的輸出。


7.動態觀察程序的變化:

top [-d 數字] | top [-bnp]

-d:整個程序畫面更新的秒數。
-b:以批次的方式執行 top ,通常會搭配資料流重導向來將批次的結果輸出成為檔案。
-n:與 -b 搭配,意義是需要進行幾次 top 的輸出結果。
-p:指定某些個 PID 來進行觀察監測。


8.列出程序樹:

pstree [-A|U] [-up]

-A:各程序樹之間的連接以 ASCII 字元來連接。
-U:各程序樹之間的連接以萬國碼的字元來連接。
-p:並同時列出每個 process 的 PID。
-u:並同時列出每個 process 的所屬帳號名稱。


9.觀察記憶體使用情況:

free [-b|-k|-m|-g] [-t]

-b:以B、K、M、G來顯示單位。
-t:在輸出的最終結果,顯示實體記憶體與 swap 的總量。


10.查閱系統與核心相關資訊:

uname [-asrmpi]

-a:所有系統相關的資訊,包括底下的資料都會被列出來。
-s:系統核心名稱。
-r:核心的版本。
-m:本系統的硬體名稱。
-p:CPU 的類型。
-i:硬體的平台。


11.觀察系統啟動時間與工作負載:

uptime


12.追蹤網路或插槽檔:

netstat -[atunlp]

-a:將目前系統上所有的連線、監聽、Socket 資料。
-t:列出 tcp 網路封包的資料。
-u:列出 udp 網路封包的資料。
-n:不以程序的服務名稱,以埠號來顯示。
-l:列出目前正在網路監聽的服務。
-p:列出該網路服務的程序 PID。


13.分析核心產生的訊息:

dmesg


14.偵測系統資源變化:

vmstat [-a] [延遲 [總計偵測次數]]
vmstat [-fs]
vmstat [-S 單位]
vmstat [-d]
vmstat [-p 分割槽]

-a:使用 inactive/active 取代 buffer/cache 的記憶體輸出資訊。
-f:開機到目前為止,系統複製的程序數。
-s:將一些事件 (開機至目前為止) 導致的記憶體變化情況列表說明。
-S:讓顯示的資料有單位。
-d:列出磁碟的讀寫總量統計表。
-p:後面列出分割槽,可顯示該分割槽的讀寫總量統計表。


15.藉由檔案(或檔案系統)找出正在使用該檔案的程序:

fuser [-umv] [-k [i] [-signal]] file/dir

-u:除了程序的 PID 之外,同時列出該程序的擁有者。
-m:後面接的那個檔名會主動的上提到該檔案系統的最頂層。
-v:列出每個檔案與程序還有指令的完整相關性。
-k:找出使用該檔案/目錄的 PID ,並試圖以 SIGKILL 這個訊號給予該 PID。
-i:必須與 -k 配合,在刪除 PID 之前會先詢問使用者意願。
-signal:例如 -1 -15 等等,若不加的話,預設是 SIGKILL (-9)。


16.列出被程序所開啟的檔案檔名:

lsof [-aUu] [+d]

-a:多項資料需要「同時成立」才顯示出結果時。
-U:僅列出 Unix like 系統的 socket 檔案類型。
-u:後面接 username,列出該使用者相關程序所開啟的檔案。
+d:後面接目錄,亦即找出某個目錄底下已經被開啟的檔案。


17.找出某支正在執行的程式的 PID:

pidof [-sx] program_name

-s:僅列出一個 PID 而不列出所有的 PID。
-x:同時列出該 program name 可能的 PPID 那個程序的 PID。




十二、認識系統服務(daemons)

1.daemon 的分類:

  • stand_alone:可自行啟動而不必透過其他機制的管理。
  • super daemon:當沒有用戶端的要求時,各項服務都是未啟動的情況,等到有來自用戶端的要求時,super daemon 才會喚醒相對應的服務。


2.啟動 stand alone 服務的腳本:

service [service name] (start|stop|restart|...)
service --status-all

service name:亦即是需要啟動的服務名稱,需與 /etc/init.d/ 對應。
start|... :亦即該服務要進行的工作。
--status-all:將系統所有的 stand alone 的服務狀態通通列出來。


3.管理系統服務預設開機啟動與否:

chkconfig --list [服務名稱]
chkconfig [--level [0123456]] [服務名稱] [on|off]

--list:僅將目前的各項服務狀態列出來。
--level:設定某個服務在該 level 下啟動或關閉。


4.類圖形介面管理模式:

ntsysv [--level <levels>]

--level:後面可以接不同的 run level。


5.設定自己的系統服務:

chkconfig [--add|--del] [服務名稱]

--add:增加一個服務名稱給 chkconfig 來管理,該服務名稱必須在 /etc/init.d/ 內。
--del:刪除一個給 chkconfig 管理的服務。




十三、開機流程、模組管理與 Loader

1.系統開機的流程:

(1)載入 BIOS 的硬體資訊與進行自我測試,並依據設定取得第一個可開機的裝置。

(2)讀取並執行第一個開機裝置內 MBR 的 boot Loader (亦即是 grub, spfdisk 等程式)。

(3)依據 boot loader 的設定載入 Kernel ,Kernel 會開始偵測硬體與載入驅動程式。

(4)在硬體驅動成功後,Kernel 會主動呼叫 init 程式,而 init 會取得 run-level 資訊。

(5)init 執行 /etc/rc.d/rc.sysinit 檔案來準備軟體執行的作業環境 (如網路、時區等)。

(6)init 執行 run-level 的各個服務之啟動 (script 方式)。

(7)init 執行 /etc/rc.d/rc.local 檔案。

(8)init 執行終端機模擬程式 mingetty 來啟動 login 程式,最後就等待使用者登入。


2.init 的 runlevel:

0 - halt (系統直接關機)。
1 - single user mode (單人維護模式,用在系統出問題時的維護)。
2 - Multi-user, without NFS (類似底下的 runlevel 3,但無 NFS 服務)。
3 - Full multi-user mode (完整含有網路功能的純文字模式)。
4 - unused (系統保留功能)。
5 - X11 (與 runlevel 3 類似,但加載使用 X Window)。
6 - reboot (重新開機)。


3.建立記錄在核心支援的模組的各項相依性的檔案:

depmod [-Ane]

-A:不加任何參數時, depmod 會主動的去分析目前核心的模組,並且重新寫入 /lib/modules/$(uname -r)/modules.dep 當中。若加入 -A 參數時,則 depmod 會去搜尋比 modules.dep 內還要新的模組,如果真找到新模組,才會更新。
-n:不寫入 modules.dep,而是將結果輸出到螢幕上。
-e:顯示出目前已載入的不可執行的模組名稱。


4.觀察核心模組:

lsmod


5.查閱在核心內的模組、檢查某個模組檔案:

modinfo [-adln] [module_name|filename]

-a:僅列出作者名稱。
-d:僅列出該 modules 的說明。
-l:僅列出授權。
-n:僅列出該模組的詳細路徑。


6.核心模組的載入與移除:

modprobe [-lcfr] module_name

-c:列出目前系統所有的模組。
-l:列出目前在 /lib/modules/`uname -r`/kernel 當中的所有模組完整檔名。
-f:強制載入該模組。
-r:移除該模組。




十四、軟體安裝:RPM 與 YUM 功能

1.RPM 安裝:

rpm -ivh package_name

-i:安裝。
-v:查看更細部的安裝資訊畫面。
-h:以安裝資訊列顯示安裝進度。


2.RPM 查詢:

rpm -qa
rpm -q[licdR] 已安裝的軟體名稱
rpm -qf 存在於系統上面的某個檔名

-q:僅查詢,後面接的軟體名稱是否有安裝。
-qa:列出所有的,已經安裝在本機 Linux 系統上面的所有軟體名稱。
-qi:列出該軟體的詳細資訊,包含開發商、版本與說明等。
-ql:列出該軟體所有的檔案與目錄所在完整檔名。
-qc:列出該軟體的所有設定檔 (找出在 /etc/ 底下的檔名而已)。
-qd:列出該軟體的所有說明檔 (找出與 man 有關的檔案而已)。
-qR:列出與該軟體有關的相依軟體所含的檔案。
-qf:由後面接的檔案名稱,找出該檔案屬於哪一個已安裝的軟體。

rpm -qp[licdR] 未安裝的某個檔案名稱

-qp[icdlR]:-qp 後面接的所有參數以上面的說明一致。但用途僅在於找出某個 RPM 檔案內的資訊,而非已安裝的軟體資訊。


3.RPM 驗證與數位簽章:

rpm -Va
rpm -V 已安裝的軟體名稱
rpm -Vp 某個 RPM 檔案的檔名
rpm -Vf 在系統上面的某個檔案

-V:後面加的是軟體名稱,若該軟體所含的檔案被更動過,才會列出來。
-Va:列出目前系統上面所有可能被更動過的檔案。
-Vp:後面加的是檔案名稱,列出該軟體內可能被更動過的檔案。
-Vf:列出某個檔案是否被更動過。


4.RPM 移除:

rpm -e 軟體名稱


5.重建 RPM 資料庫:

rpm --rebuilddb


6.YUM 安裝:

yum [option] [查詢工作項目] [相關參數]

install:後面接要安裝的軟體。
update:後面接要升級的軟體,若要整個系統都升級,就直接 update 即可。


7.YUM 查詢:

yum [option] [查詢工作項目] [相關參數]

[option]:
 -y:當 yum 要等待使用者輸入時,這個選項可以自動提供 yes 的回應。
--installroot=/some/path :將該軟體安裝在 /some/path 而不使用預設路徑。

[查詢工作項目] [相關參數]:
search:搜尋某個軟體名稱或者是描述的關鍵字。
list:列出目前 yum 所管理的所有的軟體名稱與版本。
info:同上,類似 rpm -qai 的執行結果。
provides:從檔案去搜尋軟體。


8.YUM 移除:

yum remove 軟體名稱


9.YUM 修改容器產生的問題與解決的方法:

yum clean [packages|headers|all]

packages:將已下載的軟體檔案刪除。
headers:將下載的軟體檔頭刪除。
all:將所有容器資料都刪除。


10.YUM 的軟體群組功能

yum [群組功能] [軟體群組]

grouplist:列出所有可使用的「套件組」。
groupinfo:後面接 group_name,則可瞭解該 group 內含的所有套件名。
groupinstall:安裝一整組的套件群組。
groupremove:移除某個套件群組。

沒有留言:

張貼留言