# linux
bash shell 純文字模式
有.有隱藏檔
ll 詳細資訊
ll/ 跟目錄底下檔
ll-a隱藏檔
ll-d/跟目錄檔名
ll-d.只顯示隱藏檔
ls 列出目前位置檔案
getfacl 可看完整檔案屬性權限
pwd 看目前位子
open<路徑> 打開路徑
cd移動到...
man<指令> 查看man page
mkdir 建立資料夾
touch 建立一般檔
cat 印出檔案 加上-n可以有行號
head 印出前10
tail 印出後10
cp /<來源>/<目的>/ 複製檔案
*cp -r
*cp -a 這個比較完整
來源當一目的不限
來源多元 目的一定是目錄
rm <路徑> 刪除檔案
rm -r 為移除目錄
mv <來源> <目的> 移動檔案(也可以用來改名)
vim <檔名> 用vim開啟
history 搜尋過去指令
exit logout [ctrl]+d 關閉軟體
package manager 工具下載
| poweroff
| shuedown -h now
| systemctl poweroff
都是關機
date 時間
nmcli connection show 查有無網路 如果有 name DEVICE 會有資料
LANG 切換語系
su - 切換身分
echo $var 變數呼叫
locale 查語系
localectl 設定語系
grep / 搜尋
| 將前面的資料給後面的處理
ifconfig 將位置指派給網路介面
file 找檔案的類型或是型態
uname -r 核心版本呼叫
# 檔案用途
/bin 一般身分主要操作指令
/sbin管理員主要操作指令
/boot開機檔的位置
/dev 放置檔硬碟檔鍵盤滑鼠
/etc 系統設定檔包含帳號密碼and服務軟體
/home 家用目錄
/root 管理員的家目錄
/proc 記憶體的檔案
/sys 跟/proc類似 比較針對硬體
/usr unix software resource 簡寫
/var變數暫存
/tmp暫存檔
# 目錄
/ 根目錄
~ 使用者家目錄
.代表本目錄
..上一層目錄
-上一次工作目錄
開頭/就是絕對路徑不是則相對路徑
# 檔案類型
[-]正規檔案,純文字檔
[l]連結檔
[b]區塊設備檔
[s]資料接口檔
[p]資料輸送檔(FIFO,pipe)
# 變數
? 代表一定有一個字元
*0到無限個字元
[]代表一定有一個在括號內(非任意)
[-]若有-在[]裡代表在編碼順序內的所有字元
[^]反向[^ABC]不是ABC就好
# vim
一般模式 按i 進編輯模式 esc離開
一般模式 按^v進入選取模式 esc離開
一般模式 按: 進入延指令 esc離開
v字元方式圈選
[shift]+v 整行圈選
[ctrl]+v 區塊圈選
G 移動到檔案最後一列
gg 移動到檔案第一列
nG n為數字移動到n列
dd 刪除游標所在行 5dd為刪除5行
yy 複製游標所在行 5yy為複製5行
p 在游標底下貼上剛剛刪除/複製的資料
u 恢復前一個動作
:w 將目前的資料寫入硬碟中
:q 離開vim
:q!不儲存(強制)離開vim
# 權限
chgrp 修改群權限
chown 修改權限
chmod +符號 修改權限
drwxrwxr--
d為檔案類型 前3為管理員權限 中3為群組權限 後3為其他人權限
r=4 為讀到檔名
w=2 修改內容
x=1 執行 進入目錄 像鑰匙
chmod u(user)
g(group) =(設定) r
o(other) -(減去) w 檔案或目錄
a(all) +(加入) x
ex chmod 777
# 特殊權限
SUID
SUID 權限僅對二進位程式(binary program)有效;
執行者對於該程式需要具有 x 的可執行權限;
本權限僅在執行該程式的過程中有效 (run-time);
執行者將具有該程式擁有者 (owner) 的權限。
SGID
與 SUID 類似的,SGID 為將特殊的權限旗標設定在群組的 x 上。對檔案來說, SGID 的功能為:
SGID 對二進位程式有用;
程式執行者對於該程式來說,需具備 x 的權限;
執行者在執行的過程中將會獲得該程式群組的支援!
SBIT
前幾堂課談過 /tmp 是所有帳號均可寫入的一個暫存目錄,因此 /tmp 理論上應該是 777 的權限才行。但是如果是 777 的權限, 代表任何人所建立的任何資料,都可能被隨意的刪除,這就有問題。因此 /tmp 會加上一個 Sticky bit 的特殊權限旗標,該旗標的功能為:
當使用者對於此目錄具有 w, x 權限,亦即具有寫入的權限時;
當使用者在該目錄下建立檔案或目錄時,僅有自己與 root 才有權力刪除該檔案
# 進程
ps-l 觀察自己bash介面的程序
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 s 1000 1411 1410 0 80 0 - 6860- pst/0 00:00:00 bash
F 代表程序的總結旗標 常見為4root 0一般程序 1為複製但未執行的程序
S 狀態列
R 正在執行or可執行
S 目前睡眠可喚醒
D 不可喚醒通常在等I/O情況(ex 列印)
T 工作控制
t 可能在除錯
z 終止卻無法被記憶體移除
C CPU使用率百分比
UID/PID/PPID 此程序被該UID所擁有/程序的PID碼/此程序的父程序PID碼
ADDR/SZ/WCHAN 都與記憶體有關 ADDR是kernel fuction 指出該記憶體的哪個部分如果是running顯示為- SZ為用掉多少記憶體(Kbytes)WCHAN 表示目前程序是否運作中,同樣的, 若為 - 表示正在運作中。
TTY:登入者的終端機位置,若為遠端登入則使用動態終端介面 (pts/n);
TIME:使用掉的 CPU 時間,注意,是此程序實際花費 CPU 運作的時間,而不是系統時間;
CMD:就是 command 的縮寫,造成此程序的觸發程式之指令為何。
# pstree ps aux
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.5 244840 10084 ? Ss 3月16 0:04 /usr/lib/systemd/systemd --switched-root -
USER:該 process 屬於那個使用者帳號的?
PID :該 process 的程序識別碼。
%CPU:該 process 使用掉的 CPU 資源百分比;
%MEM:該 process 所佔用的實體記憶體百分比;
VSZ :該 process 使用掉的虛擬記憶體量 (Kbytes)
RSS :該 process 佔用的固定的記憶體量 (Kbytes)
TTY :該 process 是在那個終端機上面運作,若與終端機無關則顯示 ?,另外, tty1-tty6 是本機上面的登入者程序,若為 pts/0 等等的,則表示為由網路連接進主機的程序。
STAT:該程序目前的狀態,狀態顯示與 ps -l 的 S 旗標相同 (R/S/T/Z)
START:該 process 被觸發啟動的時間;
TIME :該 process 實際使用 CPU 運作的時間。
COMMAND:該程序的實際指令為何?
# top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID :每個 process 的識別碼 (PID)
USER:該 process 所屬的使用者;
PR :Priority 的簡寫,程序的優先執行順序,越小越早被執行;
NI :Nice 的簡寫,與 Priority 有關,也是越小越早被執行;
%CPU:CPU 的使用率;
%MEM:記憶體的使用率;
TIME+:CPU 使用時間的累加;
COMMAND:指令
# 程序的優先順序 PRI/NI
但是 PRI 是系統自行彈性規劃的,使用者並不能更改 PRI。為此,Linux 提供一個名為 Nice (NI) 的數值來讓使用者『影響』程序的 PRI。 基本上, PRI 與 NI 的關係如下:
PRI(new) = PRI(old) + NI.
可以知道 NI 越小會讓 PRI 變小,則程序的優先序會往前挪,相反的,NI 越大會造成 PRI 越大,就讓程序的優先序變落後了。 但是 NI 的使用是有限制的,基本限制如下:
nice 值可調整的範圍為 -20 ~ 19 ;
root 可隨意調整自己或他人程序的 Nice 值,且範圍為 -20 ~ 19 ;
一般使用者僅可調整自己程序的 Nice 值,且範圍僅為 0 ~ 19 (避免一般用戶搶佔系統資源);
一般使用者僅可將 nice 值越調越高,例如本來 nice 為 5 ,則未來僅能調整到大於 5;
要影響 NI 主要透過 nice 與 renice 來處理,也能夠透過 top 來處理已經存在的程序的 NI。
一開始執行程式就立即給予一個特定的 nice 值:用 nice 指令;
調整某個已經存在的 PID 的 nice 值:用 renice 指令或 top 指令。
# bash的工作管理
command & 直接將command丟到背景中執行
[ctrl]+z 將目前正在前景終的工作丟到背景
jobs -l 列出目前的工作資訊
fg %n 第 n 個在背景當中的工作移到前景來操作
bg %n 將第 n 個在背景當中的工作變成執行中
# 變數
$ 變數="變數內容"
$ echo $變數
$ echo ${變數}
其中變數有許多的設定規則需要遵守:
變數與變數內容以一個等號『=』來連結
等號兩邊不能直接接空白字元
變數名稱只能是英文字母與數字,但是開頭字元不能是數字
變數內容若有空白字元可使用雙引號『"』或單引號『'』將變數內容結合起來
承上,雙引號內的特殊字元如 $ 等,可以保有原本的特性
承上,單引號內的特殊字元則僅為一般字元 (純文字)
可用跳脫字元『 \ 』將特殊符號(如 [Enter], $, \, 空白字元, ' 等)變成一般字元
在一串指令的執行中,還需要藉由其他額外的指令所提供的資訊時,可以使用反單引號『`指令`』或 『$(指令)』。
若該變數為擴增變數內容時,則可用 "$變數名稱" 或 ${變數} 累加內容
若該變數需要在其他子程序執行,則需要以 export 來使變數變成環境變數
通常大寫字元為系統預設變數,自行設定變數可以使用小寫字元,方便判斷 (純粹依照使用者興趣與嗜好)
取消變數的方法為使用 unset :『unset 變數名稱』
LANG
LC_ALL 語系資料,例如使用 date 輸出資訊時,透過 LANG 可以修改輸出的訊息資料。
PATH 執行檔搜尋的路徑~目錄與目錄中間以冒號(:)分隔,由於執行檔/指令的搜尋是依序由 PATH 的變數內的目錄來查詢,所以,目錄的順序也是重要的。
HOME 代表使用者的家目錄,亦即使用者看到的 ~ 代表的目錄。
MAIL 當我們使用 mail 這個指令在收信時,系統會去讀取的郵件信箱檔案 (mailbox)。
HISTSIZE 這個與『歷史命令』有關。我們曾經下達過的指令可以被系統記錄下來,而記錄的『筆數』則是由這個值來設定的。
RANDOM 『隨機亂數』的變數。目前大多數的 distributions 都會有亂數產生器,亦即 /dev/random 檔案。讀者可以透過這個亂數檔案相關的變數 ($RANDOM) 來 隨機取得亂數。在 BASH 的環境下,RANDOM 變數的內容介於 0~32767 之間,所以,你只要 echo $RANDOM 時,系統就會主動的隨機取出一個介於 0~32767 的數值。
PS1 命令提示字元,可使用 man bash 搜尋 PS1 關鍵字,即可了解提示字元的設定方式。
? $? 這個變數內容為指令的回傳值,當回傳值為 0 代表指令正常運作結束,當不為 0 則代表指令有錯誤。
觀察變數用 set/env/export
env/export 只會顯示全域變數
export 變成全域變數
# kill
kill +PID碼
Kill 是正常關閉的訊號
如果需要強制關閉用 kill -9
# 虛擬機建立

# docker 使用dnf dnf 為新的下載指令
# 新版docker 不能下載compose解法
新增連結
`dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo`
會用到的程式
```
dnf -y install vim wget epel-release python3-pip
pip3 install --upgrade pip
```
安裝docker
`dnf -y install docker-ce --allowerasing`
下載舊版docker compose (v1)
`sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose`
給予執行權限
`sudo chmod 777 /usr/local/bin/docker-compose`
寫入切換的swich
`curl -fL https://raw.githubusercontent.com/docker/compose-switch/master/install_on_linux.sh | sh `
手動安裝
下載適用於您的體系結構的 compose-switch 二進製文件
`curl -fL https://github.com/docker/compose-switch/releases/latest/download/docker-compose-linux-amd64 -o /usr/local/bin/compose-switch`
使 compose-switch 可執行
`chmod 777 /usr/local/bin/compose-switch`
重命名docker-compose二進製文件,如果您已經將其安裝為/usr/local/bin/docker-compose-v1
`mv /usr/local/bin/docker-compose /usr/local/bin/docker-compose-v1`
docker-compose為命令定義一個“替代”組
```
update-alternatives --install /usr/local/bin/docker-compose docker-compose /usr/local/bin/dicker-compose-v1 1
```
```
update-alternatives --install /usr/local/bin/docker-compose docker-compose /usr/local/bin/compose-switch 99
```
檢查安裝
`update-alternatives --display docker-compose`
******版本切換指令
` update-alternatives --config docker-compose`
# 更改服務啟動起始位置
```
mkdir /home/docker
vim /lib/systemd/system/docker.service
```
# 更改其中的內容
```ini=
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
```
# 若docker版本高於1.20,則改成如下:
```ini=9
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --data-root /home/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
```
## 啟動服務
`systemctl daemon-reload`
`systemctl enable docker`
`systemctl start docker`
# 查看os版本
`cat /etc/centos-release`
# 普羅米修斯 設定
創建Prometheus專案資料夾並進入,建立一個docker-compose.yml設定檔
```
mkdir /home/prometheus
cd /home/prometheus
touch ./docker-compose.yml
```
輸入`vim ./docker-compose.yml`,複製以下內容於文檔
```
version: '3.5'
services:
prometheus:
image: docker.io/prom/prometheus:v2.26.0-rc.0
container_name: prometheus
hostname: prometheus
restart: always
command:
--storage.tsdb.retention.time=1y
--storage.tsdb.path=/prometheus
--config.file=/etc/prometheus/prometheus.yml
--web.enable-lifecycle
volumes:
- ./config/prometheus.yml:/etc/prometheus/prometheus.yml
- ./config/node_down.yml:/etc/prometheus/node_down.yml
- ./config/monitor:/etc/prometheus/monitor
- ./data:/prometheus
- /etc/timezone:/etc/timezone/:ro
- /etc/localtime:/etc/localtime/:ro
ports:
- "9090:9090"
node-exporter:
image: prom/node-exporter:v1.5.0
container_name: node-exporter
restart: always
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- "9100:9100"
```
```
mkdir /home/prometheus/config
cd /home/prometheus/config
touch node_down.yml
vim prometheus.yml
```
設定檔編寫參考:Promtheus設定檔-初始化基礎配置
對應第17行,建立將監控資料mapping到容器外部的儲存空間
mkdir /home/prometheus/data
/home/prometheus/data,更改權為777
`chmod data 777`
啟動Prometheus服務
開啟防火牆
```
firewall-cmd --add-port=9090/tcp --permanent
firewall-cmd --add-port=9100/tcp --permanent
firewall-cmd --reload
```
在背景啟動服務
`docker-compose up -d`