---
# System prepended metadata

title: linux

---

# 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 
 
#  虛擬機建立
![](https://i.imgur.com/C9mHhwn.png)

# 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`

