2021年9月28日 星期二

BDSE15 - Learn Linux

  從資策會巨量資料分析就業養成班(BDSE)結訓之後,很快就找到了資料分析工程師的工作,然而因為發生許多不如預期的狀況,選擇於試用期最後一刻提出離職,並於一個月後向新公司報到,但是這次不再是資料科學相關的工作,而是DevOps工程師。

  DevOps對我來說是全新的領域,沒有相關工作經驗,也沒有充足知識水準,完全不是現在的我可以駕馭的高複雜度工作,因此必須趁新手時期,盡可能把Shell ScriptGitDockerKubernetesTerraform等常用的基本工具學好,我也回顧了BDSE課程,發現或許只有LinuxDocker課程所學之基礎觀念可以沿用下去,故此次整理這兩個主題的筆記。

  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 NameIPSaved Sessions的名字。
設定完成之後,可以輸入指令ssh username@192.168.23.113連線測試。

 

安裝Ubuntu Desktop

l   LVM
選擇Use LVM with the new Ubuntu installationVM若超過檔案上限,可擴大檔案系統避免硬碟空間不足。

l   Reboot時退出iso
Mouse Cursor
若被VM吸進去,按下Ctrl + Alt即可。

l   主控台緊急救援:
Ctrl + Alt + F1
登出
Ctrl + Alt + F2
離開主控台
Ctrl + Alt + F3
進入tty3 console 3主控台(共有F3F4F5F6四個主控台)

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 FilesC語言的.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),透過類似makemake 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
#
顯示指定目錄的使用大小,-ssummarize-hhuman-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,對應JavaSystem.in, 0
標準輸出Screen,執行結果送到stdout,對應JavaSystem.out, 1
標準錯誤Screen,錯誤訊息送到stderr,對應JavaSystem.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   輸入:
#
除非使用MailCpio,否則「<」很少用,此例亦等同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
#
雙管線命令相當於Javaor快速運算,撰寫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,檢視壓縮檔指令為zcatzgrep,相當普遍。

l   .tar.bz2等同.tbz
壓縮指令為bzip2,檢視壓縮檔指令為bzcatbzmorebzless

l   .tar.xz,等同.txz
壓縮指令為xz,檢視壓縮檔指令為xzcat,壓縮比高的新格式。

l   現代的tar指令在解壓縮時會自動判斷壓縮格式。

 

檔案與目錄權限

l   ls -l看到的十碼:
第一碼為檔案類型,-/d/l代表File/Directory/Soft Link
第二至十碼為權限,Read Permissionr數字為4Write Permissionw數字為2Execute Permissionx數字為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 OwnerGroup Owner未改變
# User:Group
同時修改User/Group Owner
# :Group
修改Group OwnerUser Owner未改變
#
此例亦等同chown username:username filename
chown username: filename

 

文書處理器

l   vi為舊的、Unix來的、選擇性的,RedHatDebian都預設有提供;
vim (Vi IMproved)
RedHat Distributions (RHEL, Fedora, SuSE, CentOS)預設提供:
vivim打開檔案後直接進入「指令模式」,可以移動游標、搜尋與取代、刪除複製貼上文字。
在「指令模式」按下iIoOaArR等相關參數進入「編輯模式」,可以實際編輯文件內容,要退出時按下ESC即可。
在「指令模式」按下:/?等相關參數進入「命令列模式」,/?可以搜尋資料,:可以讀取、存檔、取代字元、離開vi/vim、顯示行號等。

l   萬一不小心進入vivim的互動式環境,如何正確地離開:
第一步:ESC按鍵按三次。
第二步:輸入:q!後按ENTER按鍵。

l   nanoDebian Distributions (Ubuntu)預設提供:
nano
畫面底部有提示操作,「^」代表PC鍵盤CTRL按鍵,「M-」代表MetaPC鍵盤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去解釋這個腳本。

沒有留言:

張貼留言