從資策會巨量資料分析就業養成班(BDSE)結訓之後,很快就找到了資料分析工程師的工作,然而因為發生許多不如預期的狀況,選擇於試用期最後一刻提出離職,並於一個月後向新公司報到,但是這次不再是資料科學相關的工作,而是DevOps工程師。
DevOps對我來說是全新的領域,沒有相關工作經驗,也沒有充足知識水準,完全不是現在的我可以駕馭的高複雜度工作,因此必須趁新手時期,盡可能把Shell Script、Git、Docker、Kubernetes、Terraform等常用的基本工具學好,我也回顧了BDSE課程,發現或許只有Linux與Docker課程所學之基礎觀念可以沿用下去,故此次整理這兩個主題的筆記。
Linux是所有資訊領域都需要,基礎中的基礎,因此透過整理課堂筆記,再一次複習相關指令如何操作,以下指令將以課堂上所用之Ubuntu做為操作環境,不同的發行版本所使用的操作指令會有些許差異。
一、Linux
安裝規劃
l 全世界所有Linux版本:
https://distrowatch.com/
l 常見的虛擬機:
VMware:業界標準,承受力較強。
VirtualBox:與KVM(Kernel-based Virtual Machine)接近的技術。
Hyper-V:微軟所屬,與其它虛擬機並存時會干擾,要在「開啟或關閉Windows功能」關閉。
l Putty連線常用設定:
Connection:Sending of null packets to keep session
active設為60,每60秒傳送一次保持連線。
Translation:Remote character set設為UTF-8。
Keyboard:The Function keys and keypad設為Linux。
Session:填寫Host Name的IP與Saved Sessions的名字。
設定完成之後,可以輸入指令ssh username@192.168.23.113連線測試。
安裝Ubuntu Desktop
l LVM:
選擇Use LVM with the new Ubuntu installation,VM若超過檔案上限,可擴大檔案系統避免硬碟空間不足。
l Reboot時退出iso:
Mouse Cursor若被VM吸進去,按下Ctrl + Alt即可。
l 主控台緊急救援:
Ctrl + Alt + F1登出
Ctrl + Alt + F2離開主控台
Ctrl + Alt + F3進入tty3 console 3主控台(共有F3、F4、F5、F6四個主控台)
l 系統升級,使用apt,是apt-get的簡易版:
# 切換使用者,一般使用者提示字元為$,管理員提示字元為#
sudo -i
# 更新倉庫清單
apt update
# 查看更新內容
apt list --upgradable
# 系統升級
apt upgrade
# 查看核心版本
uname -r
# 核心若有升級需要重新開機
reboot
# 移除用不到的舊核心版本檔案以釋放空間
sudo -i
apt autoremove
# 清除之前下載的安裝檔
apt clean
# 移除套件,不移除設定檔
apt remove package_name
# 移除套件,移除設定檔
apt purge package_name
l 安裝基礎套件:
sudo -i
# 安裝dkms(Dynamic Kernel Modules Support)用以辨識硬體
apt install dkms
# 安裝基礎套件例如pip
apt install build-essential
# 安裝核心Header Files,C語言的.h檔
apt install linux-headers-generic
uname -r
apt install linux-headers-<kernel version>
# 安裝Open VMware Tools
apt install open-vm-tools-desktop
reboot
l 安裝OpenSSH Server套件:
sudo -i
apt install openssh-server
# 檢查系統是否有在Listen 22/tcp
lsof -nPi
安裝Ubuntu Server
l 忘記帳號密碼緊急救援:
第一步:開機管理畫面Reboot時,按下右邊的SHIFT鍵
第二步:選Advanced options for Ubuntu
第三步:選recovery mode
第四步:選root
第五步:查看帳號是什麼,cat /etc/passwd
第六步:設定新密碼,passwd username
l 安裝基礎套件,其餘參考安裝Ubuntu Desktop:
# 安裝Open VMware Tools
apt install open-vm-tools
檔案階層式標準
l FHS(Filesystem Hierarchy Standard)標準:
靜態(Static)共享的(Shareable):/usr(系統軟體資源)、/opt(第三方協力程序)
靜態(Static)不共享的(Unshareable):/etc(設定檔)、/boot(啟動程序)
變數(Variable)共享的(Shareable):/var/mail(個人郵件信箱)、/var/spool/news(新聞群組)
變數(Variable)不共享的(Unshareable):/var/run(PID文件)、/var/lock(特定程序目錄)
l Linux的執行檔(指令):
系統開機時使用/bin(可查閱man 1)、/sbin(可查閱man 8),透過apt install安裝。
系統正常運作時使用/usr/bin(可查閱man 1)、/usr/sbin(可查閱man 8),透過apt install安裝。
自行編譯的程式使用/usr/local/bin(可查閱man 1)、/usr/local/sbin(可查閱man 8),透過類似make、make install安裝。
3rd Party免費軟體已編譯完成,使用/usr/local/軟體名稱/bin、/usr/local/軟體名稱/sbin,直接下載軟體安裝。
Vendor相關的軟體,可能要付費,使用/opt/Vendor/軟體名稱/bin、/usr/Vendor/軟體名稱/sbin,直接下載軟體安裝,通常會提供安裝指令,例如install.sh。
l Linux沒有附檔名的觀念,但是會有檔案命名的習慣:
.txt是文字檔
.tgz是打包壓縮檔
.sh是Shell Script
.py是Python Script
l Linux沒有附檔名的觀念,但是可以查看檔案型態:
file filename.txt
基礎入門指令
l Tab鍵命令與檔案補全:
按下一次即補全,若按下第一次無法補全,則第二次列出全部選擇。
l 離開Console:
# Ctrl + D:End of File正常結束,亦可使用此
# Ctrl + C:Interrupt中斷,為Exception異常
# Ctrl + Z:送到背景執行
exit
l 查詢操作手冊:
# https://linux.die.net/man/
# 查詢man指令
man man
# 查詢ls指令
man ls
# 查詢ip指令
man ip
# 空白鍵 向下翻一頁
# [PAGE DOWN] 向下翻一頁
# [PAGE UP] 向上翻一頁
# g或[HOME] 去到第一頁
# G或[END] 去到最後一頁
# /string 向下搜尋string這個字串
# ?string 向上搜尋string這個字串
# n 找下一個
# N 找上一個
# q 結束
l 顯示資訊:
# 顯示使用者資訊,>=1000代表一般使用者,<1000代表系統帳號,==0代表系統管理員root
id
# 顯示所屬群組
groups
# 顯示使用者
whoami
# 顯示誰在線上
who
# 顯示所有時區
timedatectl list-timezones
# 設定目前時區
timedatectl set-timezone Asia/Taipei
# 顯示目前時區
timedatectl
# 顯示目前時區
ls -l /etc/localtime
# 顯示日期時間
date
# 顯示萬年曆
cal 10 1973
# 顯示執行過的指令
history
# 執行第幾個歷史指令
!<command number>
# 顯示系統安裝多少套件(但要減去標頭行數),wc -l行數、wc -w單字數
dpkg -l | wc -l
# 顯示檔案系統的使用大小
df
# 顯示指定目錄的使用大小,-s為summarize,-h為human-readable
du -sh /*
# 顯示ip位址
ip addr show
# 顯示文字
echo hello world
# 清除螢幕
clear
l 新增、切換、刪除使用者:
# 新增使用者
adduser username
# 查看帳號檔、群組檔、密碼檔,現代的Linux,採用Private Group Scheme (PGS)的風格,每一個帳號都有一個專屬的群組
grep '^username' /etc/passwd
grep '^username' /etc/group
grep '^username' /etc/shadow
# 切換使用者,-選項完全使用該使用者的環境,好像用該使用者登入一樣
su - username
# 刪除使用者,完整地連家目錄一起清除
deluser --remove-home username
l 關機與重開機:
# 關機方法一
shutdown -h
# 關機方法二
poweroff
# 重開機方法一,多人用之系統使用較佳
shutdown -r
# 重開機方法二,管理員使用較佳
reboot
l 檔案或目錄基礎入門指令:
# 顯示目前所在的目錄
pwd
# 列出檔案或目錄
ls -l
# 移動到指定的資料夾
cd ~
# 創建資料夾
mkdir -p dir1/dir2/
# 刪除資料夾
rmdir -p dir1/dir2/
# 刪除資料夾下的檔案或目錄
rm -rf ./file-*
# 移動檔案
mv ./file-* ./dir
# 複製檔案
cp -r dir1 dir2
l 讀檔基礎入門指令:
# cat內容標準輸出
cat -n /etc/os-release
# head取出前行
head -n 15 /etc/os-release
# tail取出後行
tail -n 15 /etc/os-release
# less文字檔瀏覽
less /etc/os-release
l 系統服務:
# 讓服務啟動
systemctl start httpd.service
# 讓服務停止
systemctl stop httpd.service
# 讓服務立即重新啟動
systemctl restart httpd.service
# 查看服務資訊
systemctl status httpd.service
# 服務開機自動啟動
systemctl enable httpd.service
# 服務開機不要啟動
systemctl disable httpd.service
# 列出所有服務
systemctl list-unit-files
# 列出所有已啟動的服務
systemctl list-units
I/O重導與管線
l 標準輸入、輸出、錯誤:
標準輸入Keyboard,輸入訊息送到stdin,對應Java為System.in, 0。
標準輸出Screen,執行結果送到stdout,對應Java為System.out, 1。
標準錯誤Screen,錯誤訊息送到stderr,對應Java為System.err, 2。
l 輸出、錯誤:
# 標準輸出為「>」等於「1>」
ls -l test.sh > output.log
# 附加在原來資料的後面為「>>」
wc test.sh >> output.log
# 標準錯誤輸出為「2>」
cp -rv /etc > right.txt 2> error.txt
l 輸入:
# 除非使用Mail、Cpio,否則「<」很少用,此例亦等同cat output.log
cat < output.log
# 符號「<<」為Here Document,撰寫Bash Shell Script使用,表示碰到這個字為止才打完所有指令
# Linux第一提示字元為#或$,第二提示字元為>
# Python第一提示字元為>>>,第二提示字元為...
cat << end
123
456
end
l 管線:
# 管線命令重定向到下一個程式,此例亦等同wc /etc/os-releaase
cat /etc/os-releaase | wc
# 雙管線命令相當於Java的or快速運算,撰寫Bash Shell Script使用
ls -l dir || mkdir dir
資料串流指令
l tr:
# 大寫轉小寫,tr代表translate
echo "HELLO WORLD 123" | tr 'A-Z' 'a-z'
# 刪除字元
echo "HELLO WORLD 123" | tr -d '0-9'
l 單引號、雙引號、反引號:
# 單引號'多用在指令參數,不做任何解釋
# 雙引號"多用在echo,用以解釋特殊符號,例如$取變數內容值
# 反引號`取得指令的執行結果,應用於Bash Shell Script,相當於$()
data=`ls /etc/p* | wc -l`
echo $data
data=$(ls /etc/p* | wc -l)
echo $data
# 若要解釋算術運算
echo $((100 - 5))
l cut:
# 擷取檔案,清單最後五筆資料的權限(權限是第二至十個字元)
ls -l | tail -n 5 | cut -c 2-10
# 擷取檔案,以逗號分隔欄位後的第二欄
cut -d, -f2 tmp.txt
l sort:
# 排序檔案內容,以逗號分隔欄位後的第二欄
sort -t, -k2 -n tmp.txt
l grep:
# 正規表達式不分大小寫選項
grep -i 'ubuntu' /etc/os-release
檔案搜尋
l 尋找執行檔:
# 顯示PATH環境變數
echo $PATH
# 可以依據PATH環境變數所規範的路徑尋找執行檔的檔名
which python3
l 搜尋執行檔、原始檔、說明檔、系統設定檔:
whereis passwd
l 包含子目路尋找檔案:
# 指定-type類型 f檔案、d目錄、l捷徑;-size大小;-atime、-mtime時間
find /usr/bin/* -type f -size +5M
l 檔案搜尋:
locate -i filename.txt
檔案打包
l 將/tmp下的所有檔案,打包成tmp.tar:
# c代表建立tar檔
# v代表顯示打包的過程
# f代表指定tar檔的檔案名稱
tar cvf tmp.tar /tmp
l 將tmp.tar解開:
# x代表解開tar檔
tar xvf tmp.tar
l 將tmp.tar解開並放到/tmp/123目錄下:
# C代表指定檔案路徑
tar xvf tmp.tar -C /tmp/123
l 列出tmp.tar檔中副檔名為.php的所有檔案:
# t代表列出tar檔中的檔案
tar -tvf tmp.tar '*.php'
l .tar.gz等同.tgz:
壓縮指令為gzip,檢視壓縮檔指令為zcat、zgrep,相當普遍。
l .tar.bz2等同.tbz:
壓縮指令為bzip2,檢視壓縮檔指令為bzcat、bzmore、bzless。
l .tar.xz,等同.txz:
壓縮指令為xz,檢視壓縮檔指令為xzcat,壓縮比高的新格式。
l 現代的tar指令在解壓縮時會自動判斷壓縮格式。
檔案與目錄權限
l ls -l看到的十碼:
第一碼為檔案類型,-/d/l代表File/Directory/Soft Link。
第二至十碼為權限,Read Permission的r數字為4,Write Permission的w數字為2,Execute Permission的x數字為1。
第二至四碼的rwx代表Owner Permission (User)。
第五至七碼的rwx代表Group Permission (Group)。
第八至十碼的rwx代表Other Permission (Other)。
l 調整檔案及目錄權限:
# 新增檔案
touch filename
# 範例一寫法一
chmod 777 filename
# 範例一寫法二
chmod a=rwx filename
# 範例二寫法一
chmod 644 filename
# 範例二寫法二
chmod u=rw,go=r filename
# 範例三寫法一
chmod 600 filename
# 範例三寫法二
chmod u=rw,go= filename
l 調整擁有者與群組:
# User修改User Owner,Group Owner未改變
# User:Group同時修改User/Group Owner
# :Group修改Group Owner,User Owner未改變
# 此例亦等同chown username:username filename
chown username: filename
文書處理器
l vi為舊的、Unix來的、選擇性的,RedHat、Debian都預設有提供;
vim (Vi IMproved)為RedHat Distributions (RHEL, Fedora, SuSE,
CentOS)預設提供:
以vi、vim打開檔案後直接進入「指令模式」,可以移動游標、搜尋與取代、刪除複製貼上文字。
在「指令模式」按下i、I、o、O、a、A、r、R等相關參數進入「編輯模式」,可以實際編輯文件內容,要退出時按下ESC即可。
在「指令模式」按下:、/、?等相關參數進入「命令列模式」,/與?可以搜尋資料,:可以讀取、存檔、取代字元、離開vi/vim、顯示行號等。
l 萬一不小心進入vi、vim的互動式環境,如何正確地離開:
第一步:ESC按鍵按三次。
第二步:輸入:q!後按ENTER按鍵。
l nano為Debian Distributions (Ubuntu)預設提供:
nano畫面底部有提示操作,「^」代表PC鍵盤CTRL按鍵,「M-」代表Meta是PC鍵盤ALT按鍵。
環境變數
l 可以把環境變數設定在Shell的環境設定檔(Shell Startup Scripts)。
l 如果需永久儲存環境變數,可在檔案中編輯;如果是使用ssh登入者可在檔案中編輯,當使用者登入時,將讀取其變數值:
# 其它Distribution可能為.bash_profile
/home/username/.bashrc
l 定義環境變數:
export key=value
declare -x key=value
l 檢查環境變數:
# set為檢視全域性變數以及區域性變數,env只檢視全域性變數
set | grep 'BASH'
env | grep 'HOME'
l sourcce命令:
sourcce命令通常用於重新執行剛修改的初始化文件(Startup Script),會強制執行腳本中的全部命令,而忽略文件的權限,在目前Shell載入設定檔,而非像是./scripts啟動一個子Shell來執行命令;另一種寫法是點符號(.)。
l Shebang (#!):
#! /bin/bash
Shebang這個符號通常在Linux系統的腳本中第一行開頭,執行這個腳本文件的解釋程序,如果腳本文件中沒有#!這一行,那麼它執行時會預設用當前Shell去解釋這個腳本。
沒有留言:
張貼留言