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