1. 概述:
極客時間發表了 linux 知識體系的知識圖譜,在參照其地圖整理學習 linux 過程中,對原内容做了整理修改,并增加了容器篇等内容,圖譜不少内容抄自原地圖,分享一下:

2. 基礎篇
2.1 Linux常見發行版本
- Red Hat
- Ubuntu
- CentOS
- Debian
- Fedora
2.2 目錄結構
- /bin 最常用指令存放目錄
- /boot linux 啟動時核心檔案,包括連接配接檔案以及鏡像檔案
- /dev Linux 外部裝置,linux 一切都是檔案
- /etc 系統管理者需要配置的檔案和子目錄
- /home 所有使用者的主目錄,按照使用者名建立子目錄
- /lib 系統最基本的動态連接配接共享庫
- /lost+found 非法關機時存放臨時檔案
- /media linux 系統自動識别的一些裝置,比如 U 盤,光驅
- /mnt 使用者臨時挂載的檔案系統,比如挂載光驅的CD光牒
- /opt 主機額外安裝軟體的目錄,比如 oracle 安裝
- /proc 虛拟目錄,系統記憶體的映射,通過這個目錄擷取系統資訊,比如程序資訊等
- /root 系統管理者主目錄
- /sbin 存放系統管理者使用的系統管理程式
- /selinux 安全機制 selinux 的目錄(redhat/centos 特有)
- /srv 服務啟動後需要提取的資料
- /sys linux2.6核心新目錄,sysfs 檔案
- /tmp 臨時檔案目錄
- /usr 使用者自身的程式與檔案目錄
- /usr/bin 系統使用者使用的應用程式
- /usr/sbin 系統管理者的應用程式和守護程式
- /usr/src 核心源代碼預設的放置目錄
- /var 存放不斷擴充的東西,包括日志檔案等
- /run 臨時檔案系統,存儲系統啟動以來的資訊
3.系統操作篇
3.1 使用終端
1. 指令提示符
$ 普通使用者
# root 使用者
2. 指令和路徑補全: tab 鍵
3. 指令的分類(使用 type 檢視某個指令的所屬分類) type ls
3.2 幫助指令
1. man
man xxx: 擷取 xxx 指令的幫助
man 1 man:檢視 man 指令自身的幫助
2. help
help xxx: 擷取内部指令的幫助
xxx --help: 擷取外部指令的幫助
3. info
比 man 更豐富的幫助資訊,格式:info xxx
3.3 檔案與目錄管理
1. 檔案與目錄檢視指令:ls
-l 顯示檔案的詳細資訊
-a 顯示隐藏檔案
-r 逆序顯示
-t 按時間排序
-R 遞歸顯示
2. 建立和删除目錄
mkdir 建立目錄
rmdir 删除空目錄
rm -r 遞歸删除目錄與檔案
3. 路徑操作(絕對路徑與相對路徑)
cd 進入指定路徑
pwd 顯示目前路徑
4. 通配符
* 比對任意字元
? 比對單個字元
[xyz] 比對 xyz 任意一個字元
[a-z] 比對字元串
[|xyz]或[^xyz] 比對不在 xyz 中的任何字元
5. 複制檔案cp
-r 複制目錄
-p 保留使用者權限時間
-a 盡可能保留原始檔案的屬性,等同于-dpr
6. 删除檔案 rm
-r 遞歸删除
-f 不提示
7. 移動與重命名 MV
移動檔案 mv file1 dir1/
重命名檔案 mv file1 file2
3.4 文本檢視
1. head
head -n 20 顯示前20行
2. tail
tail -f -n 300 顯示結尾300行并重新整理
3. cat
cat filename |more
4. wc
cat filename|grep 'name' | wc -l 統計行數
3.5 打包和壓縮
1. tar
指令
-c:建立新的tar檔案
tar -zcvf /tmp/etc.tar.gz /etc 打包并以 gz 方式壓縮檔案
-x:解開tar檔案
tar -zxvf /tmp/etc.tar.gz 解壓以gzip壓縮的檔案
-t:列出tar檔案中包含的檔案的資訊
tar -tvf /tmp/etc.tar
-r:附加新的檔案到tar檔案中
參數
-z:使用gzip進行解壓縮
tar -zcvf /tmp/etc.tar.gz /etc
-j:使用bzip2進行解壓縮
tar -jcvf /tmp/etc.tar.bz2 /etc
-Z:使用compress進行解壓縮
tar -Zcvf /tmp/etc.tar.Z /etc
-v:顯示解壓縮執行過程
-f:指定要處理的檔案名
2. gzip
gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ... ]
gzip -c file1 file2 > foo.gz
gzip -ld 1.c.gz //解壓,并顯示詳細過程
3. bzip2
bzip2 [-cdfhkLstvVz][--repetitive-best][--repetitive-fast][- 壓縮等級][要壓縮的檔案]
bzip2 -v temp.bz2 //解壓檔案顯示詳細處理資訊
bzip2 -c a.c b.c c.c 壓縮檔案
3.6 vim 文本編輯器
3.6.1. 正常模式
浏覽和修改文本内容
預設打開模式,其他模式按Esc 鍵就可以傳回正常模式
3.6.2. 指令模式(底線)
- 儲存操作指令
:q 退出程式
:w 儲存檔案
ZQ | :q! 強制退出并忽略所有更改
:e! 放棄所有修改,并打開原來檔案
ZZ | :wq | :x 儲存并退出
* 查找指令
/text:查找text,按n查找下一個,按N查找前一個
?text:查找text,反向查找,按n查找下一個,按N查找前一個
:set ignorecase/noignorecase 忽略/不忽略 大小寫的查找
:set hlsearch/nohlsearch 高亮搜尋結果/關閉高亮,所有結果都高亮顯示,而不是隻顯示一個比對。
:nohlsearch 關閉目前的高亮顯示,如果再次搜尋或者按下n或N鍵,則會再次高亮;
:set incsearch 逐漸搜尋模式,對目前鍵入的字元進行搜尋而不必等待鍵入完成。
:set wrapscan 重新搜尋,在搜尋到檔案頭或尾時,傳回繼續搜尋,預設開啟。
- 其它
:set number/nu 顯示行号
:!command 執行 shell 指令 command
:n,m w!command 将檔案中 n 行到 m 行的内容作為 command 的輸入并執行,若不指定 n,m,則代表整個檔案内容作為 command 執行
:r!command 将指令 command 的輸出結果放到目前行
:set nonu 取消行号
:r filename 把 filename 檔案的内容插入到目前光标所在位置下
ctrl + g 目前行資訊
g ctrl + g 字數統計
- 替換指令
:s/regexp/replacement 替換目前行第一個比對
:S/regexp/replacement 替換目前行所有比對
:n,\$s/regexp/replacement/ 替換n行到最後一行中第一個比對
:n,$S/regexp/replacement/g 替換第 n 行到最後的每個比對
- 多行拷貝移動
:n,m co p 将行 n 到 m 行之間的内容拷貝到第 p 行下
:n1,n2 m p 将 n1行到 n2行之間的内容移動到第 p 行下
3.6.3. 插入模式
- 進入插入模式
i 在光标所在字元前開始輸入文字并進入插入模式
a 在光标所在字元後開始輸入文字并進入插入模式
o (字母o) 在光标所在行的下面單獨開一新行來輸入文字并進入插入模式
s 删除光标所在的字元并進入插入模式
I 在行首開始輸入文字并進入插入模式。此行首指第一個非空白字元處。如果行首有空格,則在空格之後輸入文字并進入插入模式
A 在行尾開始輸入文字并進入插入模式。這個好用,您不必管光标在此行的什麽地方,隻要按 A 就會在行尾等着您輸入文字。
O (大寫字母O) 在光标所在行的上面單獨開一新行來輸入文字并進入插入模式。
S 删除光标所在行并進入插入模式
- 删除指令
行删除
D | d$ 删除光标到行尾
d^ 删除至行首
dd 删除行
dnG 删除第 n 行到目前行
dG 删除目前行到最後一行
S 删除目前行且處于可編輯狀态
C 删除到行尾,并處于可編輯狀态
:n,m d 将第 n 行到 m 行的内容删除
字元删除
x 向後删除一個字元
nx 向後删除 n 個字元
X 向前删除一個字元
nX 向前删除 n 個字元
s 删除光标所在字元,并處于可編輯狀态
i 在光标前插入
a 在光标後插入
單詞删除
diw 删除光标所在單詞,不包括空白字元
daw 删除光标所在的單詞,包括空白字元
dw 目前光标位置删除到下一個單詞詞首
ndw | ndW 删除光标處開始及最後的 n-1個詞
- 複制粘貼指令
yy 複制目前行
nyy 複制從目前行開始的 n 行
ynw 複制 n 個單詞
ynl 複制 n 個字元
y$ 複制目前光标至行尾處
p 粘貼到光标之後
P 粘貼到光标之前
-
移動指令
單詞
w 下一個單詞第一個字元
W 下一個長單詞第一個字元
e 下一個單詞最後字元
E 下一個長單詞最後一個字元
b 前一個單詞第一個字元
B 前一個長單詞第一個字元
ge 前一個單詞的最後一個字元
行
$ 行尾
0(數字) 行第一個字元
^ 第一個非空字元
gg 第一行
G 到最後一行
nG 到第 n 行
螢幕
ctrl+u 向上滾動半屏
ctrl+d 向下滾動半屏
Pgup | ctrl+b 向上滾動一屏
PgDn | ctrl + f 向下滾動一屏
句子
( 句首
) 句尾
段落
{ 段首
} 段尾
- 撤銷與重複
u 撤銷前次操作
ctrl + r 重複前次操作
:e! 文檔還原原始狀态
3.6.4. 可視模式
3.7 使用者管理
3.7.1 使用者指令
- 使用者主目錄/home /root
- 常用使用者指令
useradd -p 'PASSWORD' ${USERNAME} 添加使用者
userdel 删除使用者
passwd 設定使用者密碼
usermod 修改使用者資訊
groupadd 添加組
groupdel 删除使用者組
- 以管理者身份運作
su 切換目前使用者身份
sudo 用 root 身份執行某條指令
visudo 修改 sudo 指令配置檔案
3.7.2 使用者配置檔案
/etc/passwd 使用者資訊配置檔案
/etc/shadow 使用者密碼資訊配置檔案
3.8 權限管理
- 權限的表示方法
- 檔案權限
r 讀權限
w 寫權限
x 執行權限
- 目錄權限
rx 進入目錄讀取檔案名
wx 修改目錄内檔案名
x 進入目錄
- 特殊權限
/etc/passwd 使用者資訊配置檔案
2.權限的相關指令
chmod 修改權限
chown 更改屬主,屬組
chgrp 修改屬組
4.系統管理篇
4.1 正規表達式
- 正規表達式是什麼
對字元串操作的一組邏輯公式
用于對符合規則的字元串進行查找和替換
- 初識元字元
^ 字元開始位置
$ 字元結束位置
. 單個換行之外所有字元
3.擴充元字元
- 比對字元内容
\d 單個數字0-9
\D 單個非數字 a,-,'
\w 單個字母,數字,下劃線 a,1,_
\W 非字母、數字、下劃線 {,-,[
\s 空白字元 單個空格、回車(\n)、制表符(\t)
\S 非空白字元
. 換行以外的所有字元
- 比對次數
* 0次及0次以上 \d* 比對數字,123,02,空
+ 1次及1次以上 \d+ 比對數字 123,02,3
? 0次或1次 \d? 比對數字,2、空
{m,n} m次到n次 \d{1,3} 比對數字,2、12、123
{n} n次 \d{2} 比對數字,12
{n,} n次及n次以上 \d{2,} 比對數字,12、123、1234
- 分組符号
() 分組比對的内容可以在後續的正則中重複使用,隻需要指定分組的序号即可。分組的序号是從左往右以此遞
- 比對位置
^ 字元串開始位置 (^)abc 比對字元串開頭位置,a前面的位置
$ 字元串結束位置 abc($) 比對字元串結束位置,c後面的位置
\b 單詞(\w)與非單詞之間的位置 a(\b)= 比對"a"與"="之間的位置
\B 字元與字元之間的位置 a(\B)b 比對"a"與"b"之間的位置
- 其它元字元
[] 比對範圍 [a-zA-Z] 比對單個英文字母
^ 在上面的比對位置元字元中,僅僅介紹了比對字元串開頭位置的作用,這裡另外一個作用就是放在範圍元字元中,起到取反的作用 [^a-d] 比對單個非a,b,c,d四個英文字母之外的字元
\ 轉義元字元 1\+ 比對"1+"
| 分支條件 ab|cd 比對ab、cd
## 4.2 軟體安裝與更新
- RPM 安裝
-i 安裝
-q 查詢
-U 更新
-e 解除安裝
2.移動與重命名
安裝 yum install xxx
解除安裝 yum remove xxx
更新 yum update xxx
3.源代碼編譯安裝
./configure
make
make install
4.3 文本與檔案查找
- grep
-i 忽略大小寫
-v 反轉
-a 處理二進制檔案
-R 遞歸方式
- find
-name 按照檔案名搜尋
-perm 按照權限搜尋
-user 按照屬主搜尋
-type 按照檔案類型搜尋
4.4 網絡配置
- 網絡配置指令
ifconfig 檢視和配置網絡接口
ip 檢視和配置網絡,路由
netstat 檢視程序監聽端口和狀态
network 與 NetworkManager 網絡管理腳本
- 配置檔案
ifcfg-eth0 etho 網卡配置檔案
networking 主機名配置檔案
resolv.conf 域名配置檔案
## 4.5 防火牆
- SELinux
- 通路控制方式分類
DAC 自主通路控制
MAC 強制通路控制
- 常用指令
getenforce 檢視 selinux 狀态
setenforce 修改通路狀态
/etc/selinux/config
enforcing 強制控制
permissive 通知但不強制控制
disable 禁用通路控制
- iptables
- 表
filter 用于過濾
nat 用于位址轉換
- 鍊
INPUT 進入本主機方向
OUTPUT 本主機發出方向
FORWARD 轉發方向
PREROUTING 路由向前轉換
POSTROUTING 路由後轉換
- 選項
-i -o 接口
-s -d IP 位址/子網路遮罩
-p tcp/udp 指定協定
--sport 源端口
--dport 目标端口
-j 動作
ACCEPT:允許資料包通過。
DROP:直接丢棄資料包,不給任何回應資訊,這時候用戶端會感覺自己的請求泥牛入海了,過了逾時時間才會有反應。
REJECT:拒絕資料包通過,必要時會給資料發送端一個響應的資訊,用戶端剛請求就會收到拒絕的資訊。
SNAT源位址轉換,解決内網使用者用同一個公網位址上網的問題。
MASQUERADE:是SNAT的一種特殊形式,适用于動态的、臨時會變的ip上。
DNAT:目标位址轉換。
REDIRECT:在本機做端口映射。
LOG:在/var/log/messages檔案中記錄日志資訊,然後将資料包傳遞給下一條規則,也就是說除了記錄以外不對資料包做任何其他操作,仍然讓下一條規則去比對。
- tcpdump
- 儲存和讀取規則
-r filename 從檔案讀取已經抓取的資料包
-w filename 将抓取的資料包儲存至檔案
- 常用選項
-v 顯示詳細資訊
-n 不将 IP 位址解析為主機名
-i 接口 例如 -i eth0
host 主機
port 端口
- 常用過濾
過濾主機 tcpdump -i eth1 src/dst host 192.168.1.1
過濾端口 tcpdump -i eth1 src/dst port 25
網絡過濾 tcpdump -i eth1 src/dst net 192.168
協定過濾 tcpdump -i eth1 tcp
表達式過濾 tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾資料報的類型
-i eth1 : 隻抓經過接口eth1的包
-t : 不顯示時間戳
-s 0 : 抓取資料包時預設抓取長度為68位元組。加上-S 0 後可以抓到完整的資料包
-c 100 : 隻抓取100個資料包
dst port ! 22 : 不抓取目标端口是22的資料包
src net 192.168.1.0/24 : 資料包的源網絡位址為192.168.1.0/24
-w ./target.cap : 儲存成cap檔案,友善用ethereal(即wireshark)分析
4.6 服務與日志
1.服務狀态的檢視
service 用法: service 服務名稱 start|stop|restart|status
systemctl: 用法: systemctl start|stop|restart|status 服務名稱 service
service list: systemctl list-unit-files chkconfig --list
2.服務配置檔案 /etc/systemd/system/*.service
3.常用系統日志
/var/log 系統日志預設目錄
message 系統日志
dmesg 核心啟動日志
secure 安全日志
- 應用程式日志
4.7 磁盤分區
- 連結檔案
符号連結 ln -s 源檔案 目标檔案(目标檔案不能事先存在)
硬連結 ln 源檔案 目标檔案
- mount 挂載指令
-t 檔案系統類型
-o 挂載選項
ro 隻讀挂載
rw 讀寫挂載
remount 重挂載
3.配置檔案 /etc/fstab 啟動自動加載分區資訊
fdisk 分區工具
-l 檢視分區資訊
fdisk /dev/sdx 為某一存儲分區
mkfs 格式化 mkfs.ext4
parted -l 檢視分區資訊
## 4.8 檔案系統
df -l
檢視分區所占磁盤空間資訊
du -a
du -ah --max-depth=1 檢視目前目錄下每個目錄所占磁盤大小
mkfs 格式化系統
mkfs.ext4 -i 1048576 -n /dev/sdc
列出系統打開檔案 lsof
lsof -D /path 指定路徑顯示,-D 遞歸所有子目錄和檔案
lsof -c java 列出 java 程式打開的檔案
lsof -u user 顯示指定使用者打開的檔案
lsof -i 符合條件 lsof -i tcp:80
lsof -p 234 234程序打開的檔案
lsof -g gid 顯示使用者組打開檔案
- ext4
- XFS
4.9 Linux 系統啟動過程與故障修複
4.9.1 系統啟動過程
- Power on
- BIOS
- 上電自檢POST
- 初始化硬體: 顯示卡.記憶體.時間.磁盤
- 查找啟動媒體:CD-ROM,PXE,HDD
- 查找加載磁盤上的啟動扇區 .
- MBR(主引導記錄)
- BootLoader 446bytes
- Partition Table 64bytes: 分區 ID,起始磁柱,數量,最多4個
- Magic Number 有效性驗證 2bytes .
-
GRUB(多系統引導)
stage_1 就是MBR,裝載 stage_2
stage_1.5 識别檔案系統,引導 stage_2
stage_2 /boot/grub/grub.conf,查找并裝載Kernel到記憶體,将控制權從 GRUB 交給 Kernel .
-
Kernel 核心引導
核心程式 Kernel, 保留最基本子產品,GRUB讀取後解壓 Kernel鏡像
initrd 臨時 rootfs,挂載驅動和 rootfs 後從記憶體清除 .
- sys init 系統初始化
- /sbin/init
(1). /etc/inittab 初始化鍵盤,字型,網絡,裝載子產品 (2)./etc/rc.d/rc.sysinit 執行初始化腳本 /etc/fstab /etc/rd.d/rc.local (3).初始化進行基本配置
- /sbin/init
1. 擷取網絡環境與主機類型:讀取網絡環境設定檔案"/etc/sysconfig/network",擷取主機名與預設網關等網絡環境。
2.測試與載入記憶體裝置/proc及usb裝置/sys 除/proc外,主動檢測是否有usb裝置并加載usb驅動,載入usb檔案系統
3.根據配置決定是否啟動SELinux
4.接口裝置的檢測與即插即用(pnp)參數的測試
5.使用者自定義子產品的加載。使用者"/etc/sysconfig/modules/*.modules"加入自定義的子產品,此時會加載到系統中
6.加載核心的相關設定。按"/etc/sysctl.conf"這個檔案的設定值配置功能
7.設定系統時間(clock)
8.設定終端的控制台的字形
9.設定raid及LVM等硬碟功能
10.以方式檢視檢驗磁盤檔案系統。
11.進行磁盤配額quota的轉換。
12.重新以讀取模式載入系統磁盤。
13.啟動quota功能
14.啟動系統随機數裝置(産生随機數功能)。
15.清除啟動過程中的臨時檔案
16.将啟動資訊加載到"/var/log/dmesg"檔案中
(4). 執行/etc/rc.d/rc*.d(*=0~6)腳本: Snn Script
b. /sbin/mingetty
/etc/login
- 啟動完成 (使用控制台)
/etc/X11/prefdm
gdm 進入 Gnome 桌面環境
kdm 進入 KDE 桌面環境
xdm 進入 X window 桌面環境
Xinit
(gdm 進入 Gnome 桌面環境, kdm 進入 KDE 桌面環境, xdm 進入 X window 桌面環境)
~/.xinitrc
~/.xserverrc
4.9.2 更新核心版本
* RPM方式更新
* 源代碼編譯方式更新
## 4.10 邏輯卷與 LVM
- 分層管理磁盤Logical Volume Manager
- LVM 分為三層
PV(實體卷,最底層,實體硬碟或者分區)
PE,實體區域,用于配置設定的最小存儲單元
VG:卷組,在 PV 之上,包含多個 PV
LV:邏輯卷,VG 之上,相當于分區概念,大小可以改變
pvcreate /dev/sdb1 在分區上建立 PV
pvs 檢視 pv 資訊
pvdisplay 檢視 pv 詳細資訊
vgcreate vg1 /dev/sdb1 将建立的 pv 加入 vg1組
vgs/vgdisplay 檢視 vg 詳細資訊
lvcreate -L 200M -n lv1 vg1
lvs/lvdisplay 檢視 lv 詳細資訊
5. Shell 篇
## 5.1 認識 BASH
- shell 是指令解析并在核心執行,傳回結果
- shell 腳本的用處
- 組合系統指令實作自動化功能
- 組成腳本的基本元素是指令,不用深入賬務系統函數集
- 内建指令和外部指令
- 内部指令不會建立子程序,但是對子 shell 無效
- 外部指令會建立子程序
5.2 管道與重定向
- 管道符 |
- 重定向符
< 輸入重定向
> 輸出重定向,覆寫方式
>> 輸出重定向,追加方式
- sort 對文本進行排序
- join 連接配接2個字元串
5.3 程序與記憶體檢視調整
- 程序檢視指令: ps top 對系統程序排序檢視
- 記憶體檢視指令
- free 檢視系統的記憶體使用率
- sar 顯示詳細的系統運作狀态,用于排查故障
- 流量監控工具: iftop 檢視某一程序的網絡流量
5.4 變量與環境變量
- 變量的定義
- shell 變量無需聲明
- 銷毀變量 unset 變量名
- 變量的指派: 變量名=變量值
- 環境變量: path 變量解析路徑
- 環境變量定義檔案
- /etc/profile 系統環境變量預設儲存檔案
- /etc/bashrc shell 執行初始化配置新聞
5.5 轉義與引用
- 特殊符号
- 轉義符 /
- 引用符号
單引号 '' 雙引号 ""
5.6 循環
- while 循環
- while 循環根據 while 判斷結果确定是否繼續執行
- 判斷結果為指令的傳回值,0繼續執行
-
如果判斷結果為0,無法到達循環結束成為死循環
2.for 循環
- Shell 的 for 循環使用周遊方式 for ... in ...格式
- for 循環支援 c 語言寫法,需要使用(())格式
- 支援使用 break,continue 對循環進行控制
- for 循環支援嵌套使用
5.7 函數
-
函數的定義
定義方法: 函數名(){}
2.函數的使用
直接使用函數名()
5.8 計劃任務
-
一次性計劃任務 at
2.周期性計劃任務 cron
- 檢視 crontab -l
- 編輯 crontab -e
5.9 運算符
- 運算符号 + - * / 加減乘除
- 弊端 運算速度低,對浮點運算支援不好
5.10 測試與判斷
- test 測試
- 書寫 if test $[num1] -eq $[num2]
- 數值測試 -eq -ne -gt -ge -lt -le
#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '兩個數相等!'
else
echo '兩個數不相等!'
fi
a=5
b=6
result=$[a+b] # 注意等号兩邊不能有空格
echo "result 為: $result"
傳回結果:result 為:11
- 字元串測試 = != -z -n (字元串的長度為零)
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '兩個字元串相等!'
else
echo '兩個字元串不相等!'
fi
= 等于為真
!= 不等于為真
-z 字元串 字元串長度為0 則真
-n 字元串 長度不為0則真
- 檔案測試
-e 檔案名 存在為真
-r 檔案名 存在且可讀為真
-w 檔案名 存在且可寫為真
-x 檔案名 存在且可執行為真
-s 檔案名 存在且至少一個字元為真
-d 檔案名 存在且為目錄為真
-f 檔案名 存在且為普通檔案為真
-c 檔案名 存在且為字元型特殊檔案為真
-b 檔案名 存在且為塊特殊檔案為真
- if 判斷
- if : if condition command1 then command2 fi
- if else
- if else-if else
- case 分支
case 值 in
模式1)
command1
commandN
;;
模式2)
command1
commandN
;;
esac
6 文本操作篇
6.1 SED
6.1.1 sed 基礎
1. 字元流編輯器
2. sed [options] [sed-commands] [input-file]
3. sed [查找條件] [操作指令] 檔案
6.1.2 查找條件
1. 數字、正規表達式組合定位
2. 數字定位 删除第2行 sed '2d' file
3. 正規表達式 加/ 例如: 包含 john 的行 sed '/john/d' file 以 john 開頭的行 sed '/^john/d' file
4. 逗号分割線 第1行與第3行之間的範圍 sed '1,3d' file west 和 east 之間的所有行 sed '/west/,/east/d' file
5. 組合方式 第1行到 west 所有行 sed '1,/west/d' file
6. 特殊情況 $删除最後一行 sed '$d' file
6.1.3 選項
- -n 輸出到螢幕,取消預設列印
sed -n '3p' file 顯示第幾行
查找1-3行 sed -n '1,3p' file
查找指定幾行 sed -n '1p;3p;5p' file
顯示 包含 'Thread-70' 到 'DiamondEnv'行之間的行 sed -n '/Thread-70/,/DiamondEnv/p' ./diamond-client.log
顯示1-5行并顯示行号
- -e 多重編輯
- -f 指定 sed 腳本檔案
- -r 正則擴充使用
- i 插入 在目前行上添加一或者多行: sed -i 's/root/world/g' yum.log 用world 替換yum.log檔案中的root真實寫入
6.1.4 基礎指令
-
a 追加 在某一行追加内容
sed '$a106,wuxingge,UFOn107,lee,XO' file 最後一行
-
d 删除
d 删除行 sed '2,50d' file 删除不顯示2-50行内容
-
s 替換
sed 's/west/north/g' file 将 west 替換為 north,g 表示全局替換
-
c 更改
sed '2,5c replacechars' 替換2-5行内容為 replacechars
-
r 讀取檔案
sed '/root/ r /var/log/test.txt' yum.log yum.log 比對root後讀入text.txt的内容在比對内容之下
-
w 寫檔案
sed '/root/ w /home/omc/root.txt' yum.log 【yum.log比對root後寫入root.txt',真實寫入】
- q 退出
- y 替換
- p 列印
6.1.5 進階指令
-
多行指令
N 将多行最佳到模式空間進行處理
D 删除多行模式空間的第一個字元至第一個換行符,并傳回到腳本的開頭執行
P 輸出模式空間中的第一個字元至第一個換行符号
-
保持空間模式
h 将模式空間記憶體存儲至保持空間,覆寫保持空間内容 sed -e '/John/h' -e '$G' file
H 将模式空間記憶體存儲至保持空間,追加到保持空間内容
g 保持空間内容存儲至模式空間,覆寫模式空間内容
G 保持空間内容存儲至模式空間,追加模式空間内容
x 交換模式空間和保持空間的内容
-
條件分支
: 标簽
b branch 指令用于腳本中将控制轉移到另一行,沒有指定标簽就轉移到結尾
t 測試指令
6.2 AWK
6.2.1 工作方式
- 流處理器: awk -F|-f|-v 'BEGIN{ commands } pattern{ commands } END{ commands }' file
- -F 指定分割符: awk -F: '{print $1,$3,$6}' OFS="t" /etc/passwd
- -f 調用腳本: awk -f script.awk file
- -v 定義變量 var=value
- '' 引用代碼塊
- BEGIN{Command} 語句塊 awk 輸入流中讀取行之前被執行
- // 比對代碼塊
- pattern{Command} 通用指令,預設執行{print}
- ; 多條指令使用分号間隔
- END{Command} 在執行結束後執行
6.2.2 運算符
- 算數運算符
- 邏輯運算符
6.2.3 循環
- for 循環
- break continue
6.2.4 系統變量
- FS 字段分割符
- OFS 輸出字段分隔符
- RS 記錄分隔符
- ORS 輸出記錄分隔符
6.2.5 條件
文法格式
if ... else ..
if嵌套
6.2.6 函數
算數函數
随機函數
字元串函數
7. 容器篇
7.1 容器原理
- KVM-ECS
- Namespace
- CGroup
- Rootfs
7.2 Docker
7.2.1 docker 指令
-
容器生命周期管理
docker run -it nginx:latest /bin/bash 建立新的容器并運作一個指令
docker start [OPTIONS] CONTAINER 啟動/停止/重新開機容器
docker kill [OPTIONS] CONTAINER 殺掉運作中的容器
docker exec [OPTIONS] CONTAINER COMMAND 在運作的容器中執行指令
docker create --name con_name nginx:latest 建立容器不啟動它
docker pause/unpause [OPTIONS] CONTAINER 暫停或者回複容器中的程序
docker rm [OPTIONS] CONTAINER 删除容器
-
容器操作
docker ps -a -q 列出容器
docker inspect [OPTIONS] NAME|ID 擷取容器/鏡像的中繼資料
docker top [OPTIONS] CONTAINER 檢視容器中運作的程序資訊,支援 ps 指令參數
docker attach [OPTIONS] CONTAINER 連接配接到正在運作中的容器
docker events [OPTIONS] 從伺服器擷取實時事件
docker logs [OPTIONS] CONTAINER 擷取容器的日志
docker wait [OPTIONS] CONTAINER 阻塞運作直到容器停止,然後列印出它的退出代碼
docker export [OPTIONS] CONTAINER 将檔案系統作為一個tar歸檔檔案導出到STDOUT
docker port [OPTIONS] CONTAINER 列出指定的容器的端口映射
-
容器rootfs指令
docker commit -a "alibaba.com" -m "mysql" CONTAINER [REPOSITORY[:TAG]] 從容器建立一個新的鏡像
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH 容器主機之間的資料拷貝
docker diff [OPTIONS] CONTAINER 檢查容器裡檔案結構的更改
-
鏡像倉庫
docker login/logout -u 使用者名 -p 密碼 登陸/登出到一個Docker鏡像倉庫
docker pull [OPTIONS] NAME[:TAG] 從鏡像倉庫中拉取或者更新指定鏡像
docker push [OPTIONS] NAME[:TAG] 将本地的鏡像上傳到鏡像倉庫,要先登陸到鏡像倉庫
docker search [OPTIONS] TERM 從Docker Hub查找鏡像
-
本地鏡像管理
docker images [OPTIONS] [REPOSITORY[:TAG]] 列出本地鏡像
docker rmi -f IMAGE 删除本地一個或多少鏡像
docker tag [OPTIONS] IMAGE[:TAG] 标記本地鏡像,将其歸入某一倉庫
docker build [OPTIONS] --build-arg -f -t PATH | URL | - 指令用于使用 Dockerfile 建立鏡像
docker history [OPTIONS] IMAGE 檢視指定鏡像的建立曆史
docker save -o filename IMAGE 将指定鏡像儲存成 tar 歸檔檔案
docker load -i 導入使用 docker save 指令導出的鏡像。
docker import [OPTIONS] file|URL 從歸檔檔案中建立鏡像
-
info|version
docker info [OPTIONS] 顯示 Docker 系統資訊,包括鏡像和容器數
docker version [OPTIONS] 顯示 Docker 版本資訊
7.2.2 dockerd
用于管理容器的守護程序,docker的引擎
7.2.3 docker-compose
使用者定義和運作多個容器的 Docker 應用程式
7.3 kubernetes
7.3.1 etcdctl
etcdctl --endpoints=$ENDPOINTS member list
etcdctl --endpoints=$ENDPOINTS put foo "Hello World!" 增加資料
etcdctl --endpoints=$ENDPOINTS get web --prefix 根據字首查資料
etcdctl --endpoints=$ENDPOINTS del k --prefix 根據字首删除資料
etcdctl --write-out=table --endpoints=$ENDPOINTS endpoint status 叢集狀态檢視
etcdctl --endpoints=$ENDPOINTS endpoint health
etcdctl --endpoints=$ENDPOINTS member list/add/remove/update 叢集成員操作
7.3.2 kubectl
- 基礎指令
- kubectl create
configmap
kubectl create configmap my-config --from-file=path/to/bar
deployment
kubectl create deployment my-dep --image=busybox
cronjob
kubectl create cronjob my-job --image=busybox
service
kubectl create service clusterip my-cs --tcp=5678:8080
serviceaccount
kubectl create serviceaccount my-service-account
secret
kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
role
kubectl create role pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod
rolebinding
kubectl create rolebinding admin --clusterrole=admin --user=user1 --user=user2 --group=group1
priorityclass
kubectl create priorityclass default-priority --value=1000 --global-default=true --description="default priority"
* kubectl get
kubectl get pods -namespace nsname
* kubectl run
kubectl run nginx --image=nginx --dry-run
* kubectl expose
kubectl expose -f nginx-controller.yaml --port=80 --target-port=8000
* kubectl delete
kubectl delete pod,service baz foo
2. 應用管理
* kubectl apply
kubectl apply --prune -f manifest.yaml -l app=nginx
* kubectl annotate
kubectl annotate pods --all description='my frontend running nginx'
* kubectl autoscale
kubectl autoscale rc foo --max=5 --cpu-percent=80
* kubectl convert
kubectl convert -f . | kubectl create -f -
* kubectl diff
kubectl diff -f pod.json
* kubectl edit
kubectl edit job.v1.batch/myjob -o json
* kubectl label
kubectl label --overwrite pods foo status=unhealthy
* kubectl patch
kubectl patch -f node.json -p '{"spec":{"unschedulable":true}}'
* kubectl replace
kubectl replace -f ./pod.json
* kubectl rollout
kubectl rollout status daemonset/foo
* kubectl scale
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql
* kubectl set
kubectl set env deployment/registry STORAGE_DIR=/local
* kubectl wait
kubectl wait --for=condition=Ready pod/busybox1
3. 應用執行
* kubectl attach
kubectl attach podname -c ruby-container -i -t
* kubectl auth
kubectl auth can-i create pods --all-namespaces
* kubectl cp
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir
* kubectl describe
kubectl describe nodes kubernetes-node-emt8.c.myproject.internal
kubectl describe po -l name=myLabel
* kubectl exec
kubectl exec -it mypod /bin/bash
* kubectl logs
kubectl logs -lapp=nginx --all-containers=true
* kubectl port-forward
kubectl port-forward service/myservice 5000 6000
* kubectl proxy
kubectl proxy --www=/my/files --www-prefix=/static/ --api-prefix=/api/
* kubectl top
kubectl top node
4. 叢集管理
* kubectl api-versions
* kubectl approve (-f FILENAME | NAME)
* kubectl cluster-info
* kubectl cordon foo
* kubectl drain foo --force --grace-period=0
* kubectl taint node -l myLabel=X dedicated=foo:PreferNoSchedule
* kubectl uncordon foo
5. 設定與用法
* kubectl api-resources -o wide
* kubectl completion bash
* kubectl config current-context
* kubectl explain pods
* kubectl kustomize /home/configuration/production
* kubectl version
* kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2
### 7.3.3 kubeadm
* kubeadm init: 初始化master 節點
* kubeadm join: 初始化 worker 節點,并加入叢集
* kubeadm upgrade: 更新叢集到新版本
* kubeadm config: v1.7.x 或者更低版本 kubeadm 初始化叢集,需要對叢集做一些配置以使用 kubeadm upgrade
* kubeadm reset: 還原 kubeadm init 或者 kubeadm join 對主機所做的任何更改
* kubeadm token: 管理 kubeadm join 使用的令牌
* kubeadm version: 列印 kubeadm 版本
* kubeadm alpha: 預覽一組可用的新功能以便從社群搜集回報
### 7.3.4 helm
helm install 安裝
helm search 查找包
helm list 清單已安裝
### 7.3.5 CFSSL
cfssl sign
cfssl bundle
cfssl genkey
cfssl gencert
cfssl serve
## 7.4 istio
1. Galley
2. istio_ca
3. istioctl
istioctl auth
istioctl authn
istioctl dashboard
istioctl kube-inject
istioctl proxy-config
istioctl experimental
istioctl proxy-status
istioctl register
istioctl validate
istioctl verify-install
istioctl version
4. mixs
5. node_agent
6. operator
7. pilot-agent
8. pilot-discovery
9. sidecar-injector
## 7.4 KNative
Build 建構
Serving 服務