linux基礎(一)— linux基礎知識

2020-08-14 11:06:38

linux 概述

什麼是linux系統

Linux是一套免費使用和自由傳播的類UNIX操作系統,是一個基於POSIX和Unix的多使用者、多工、支援多執行緒和多CPU的操作系統。它能執行主要的Unix工具軟體、應用程式和網路協定。它支援32位元和64位元硬體。Linux繼承了Unix以網路爲核心的設計思想,是一個效能穩定的多使用者網路操作系統。

linux的優勢所在

  • 安全效能高,並且開源
  • 操作方式主流爲命令列模式,但也支援圖形化介面+事件的模式(不常用)
  • 具有跨平臺效能,對硬體要求相較其他操作系統低很多
  • 應用場景爲主流的伺服器

linux是類Unix系統

什麼是開源

開源,即開放原始碼;使用者可以免費的使用它並且可以獲得它的原始碼,更爲重要的是可以根據自己的需要對它進行必要的修改,無償使用,無約束地繼續傳播。開源是一種「共用的」、「免費的」、「可革新」的軟體模式。

linux 基本結構

如圖所示:Linux 系統可以簡單的抽象分爲 Linux 操作系統(linux內核)、 Shell 層(命令解釋執行層)和應用層。

在这里插入图片描述

  1. 內核層
    內核層是 Linux 系統的核心和基礎,它直接附着在硬體平臺之上,控制和管理系統內各種資源(硬體資源和軟體資源),有效地組織進程的執行,從而擴充套件硬體的功能,提高資源的利用效率,爲使用者提供方便、高效、安全、可靠的應用環境。

  2. Shell層
    Shell 層是與使用者直接互動的介面,同時也是和linux系統內核相連線。使用者可以在提示符下輸入命令列,由 Shell 解釋執行並輸出相應結果或者有關資訊,所以我們也把 Shell 稱作命令直譯器,利用系統提供的豐富命令可以快捷而簡便地完成許多工作。事實上,Shell本質上就是應用程式,但是它和系統內核直接相互動,而其他使用者程式則和Shell指令碼互動,是一種內核和使用者程式之間的紐帶。

  3. 應用層
    應用層提供基於 X Window 協定的圖形環境。X Window 協定定義了一個系統所必須具備的功能(就如同 TCP/IP 是一個協定,定義軟體所應具備的功能),可系統能滿足此協定及符合 X 協會其他的規範,便可稱爲 X Window。值得注意的是,絕大部分linux使用者都不選擇安裝X Window影象介面,佔記憶體,功能低,是linux作爲伺服器來說吃力不討好的那種情況。

Linux 開機啓動過程

  1. 主機加電自檢,載入 BIOS 硬體資訊。
  2. 讀取 MBR 的引導檔案(GRUB、LILO)。
  3. 引導 Linux 內核。
  4. 執行第一個進程 init (進程號永遠爲 1 )。
  5. 進入相應的執行級別。
  6. 執行終端,輸入使用者名稱和密碼。
  • 備註:
    1)LILO是Linux的引導載入程式。它主要用於將Linux操作系統載入到主記憶體中,以便它可以開始執行。
    2)CUI即命令列介面,通常不支援滑鼠,使用者通過鍵盤輸入指令,計算機接收到指令後,予以執行。
    3)GUI,即圖形用戶介面,是指允許使用者使用滑鼠等輸入裝置操縱螢幕上的圖示或選單選項,以選擇命令、呼叫檔案、啓動程式或執行其它一些日常任務,也就是採用圖形方式顯示的計算機操作用戶介面。

磁碟、目錄、檔案

linux 一切皆檔案

在 Linux 操作系統中,所有被操作系統管理的資源,例如網路介面卡、磁碟驅動器、印表機、輸入輸出裝置、普通檔案或是目錄都被看作是一個檔案。

也就是說在 Linux 系統中有一個重要的概念**:一切都是檔案**。其實這是 Linux 繼承 Unix 哲學的一個體現,在 Unix 系統中,把一切資源都看作是檔案,包括硬體裝置。Unix 系統把每個硬體都看成是一個檔案,通常稱爲裝置檔案,這樣使用者就可以用讀寫檔案的方式實現對硬體的存取。

linux 基本檔案型別分類如下圖所示
在这里插入图片描述

linux 的目錄結構是什麼樣的?

linux 目錄結構層次分明,如圖所示
常見目錄說明:
/bin: 存放二進制可執行檔案(ls,cat,mkdir等),常用命令一般都在這裏;
/etc: 存放系統管理和組態檔;
/home: 存放所有使用者檔案的根目錄,是使用者主目錄的基點,比如使用者user的主目錄就是/home/user,可以用~user表示;
**/usr **: 用於存放系統應用程式;
/opt: 額外安裝的可選應用程式包所放置的位置。一般情況下,我們可以把jdk、tomcat等都安裝到這裏;
/proc: 虛擬檔案系統目錄,是系統記憶體的對映。可直接存取這個目錄來獲取系統資訊;
/root: 超級使用者(系統管理員)的主目錄(特權階級o);
/sbin: 存放二進制可執行檔案,只有root才能 纔能存取。這裏存放的是系統管理員使用的系統級別的管理命令和程式。如ifconfig等;
/dev: 用於存放裝置檔案;
/mnt: 系統管理員安裝臨時檔案系統的安裝點,系統提供這個目錄是讓使用者臨時掛載其他的檔案系統;
/boot: 存放用於系統引導時使用的各種檔案;
**/lib **: 存放着和系統執行相關的庫檔案 ;
/tmp: 用於存放各種臨時檔案,是公用的臨時檔案儲存點;
/var: 用於存放執行時需要改變數據的檔案,也是某些大檔案的溢位區,比方說各種服務的日誌檔案(系統啓動日誌等。)等;
/lost+found: 這個目錄平時是空的,系統非正常關機而留下「無家可歸」的檔案(windows下叫什麼.chk)就在這裏。

block和inode

block,簡單來說,就是linux系統讀取硬碟的記憶體中快取區域的一塊區域,值得注意的是,block,是linux系統規定記憶體每次讀取最小的記憶體單位,大小爲4KB;它是由8個linux硬碟規定的每次儲存最小單元「磁區」( sector)這麼大,也就是說每個磁區儲存512位元組,其實這兩個是非常重要的概念,貫穿整個硬體和記憶體。
inode是索引節點。是linux檔案或目錄物理儲存位置的體現,它具備基本索引所有的特點,包括檢索快、相同檔案唯一性等特點。

硬鏈接和軟鏈接

首先,先不談硬鏈接和軟鏈接是什麼,我們按照以下程式碼去建立:

#建立原檔案
touch test check

#建立硬鏈接
ln /root/test /tmp/a-hard

#建立軟鏈接
ln -s /root/check /tmp/check-soft

硬鏈接的原理如下圖所示,硬鏈接和原檔案讀寫的是相同的block塊,俺就說明讀寫硬鏈接事實上就是讀取原檔案;**硬鏈接相當於一個原檔案的備用可替換檔案,**只要兩者存在一個,就能夠實現原檔案的功能。對其增刪改查,事實上就是操作原檔案,但是值得注意的是刪除原檔案,硬鏈接的內容還是可以讀取的,這是因爲inode還是存在的,這是容易忽略的。
在这里插入图片描述

軟鏈接的原理如下圖所示,軟鏈接和原檔案的讀寫本質上都是相同的inode,但是記憶體快取區的塊不一樣,但是軟鏈接的塊是讀取原檔案的,可以這樣理解軟鏈接的塊是原檔案塊的硬鏈接。軟鏈接相當於一個快捷方式,對其增改查,事實上就是操作原檔案,但是刪除,卻不是刪除原檔案,而是刪除自己;軟鏈接直接依賴原檔案的存在而存在。
在这里插入图片描述
硬鏈接不會建立自己的 inode 索引和 block(數據塊),而是直接指向原始檔的 inode 資訊和 block,所以硬鏈接和原檔案的 inode 號是一致的;而軟鏈接會真正建立自己的 inode 索引和 block,所以軟鏈接和原始檔的 inode 號是不一致的。硬鏈接不可以跨分割區,軟體鏈可以跨分割區。刪除硬鏈接檔案,不會刪除原檔案,刪除軟鏈接檔案,會把原檔案刪除。

Shell

BASH和DOS之間的基本區別是什麼?

BASH命令區分大小寫,而DOS命令則不區分;
在BASH下,/是目錄分隔符,\作爲跳脫字元。在DOS下,/用作命令參數分隔符,\是目錄分隔符
DOS遵循命名檔案中的約定,即8個字元的檔名後跟一個點,擴充套件名爲3個字元。BASH沒有遵循這樣的慣例。

Shell 簡介

Shell 是一個應用程式,它連線了使用者和 Linux 內核,讓使用者能夠更加高效、安全、低成本地使用 Linux 內核,這就是 Shell 的本質。
Shell 指令碼是一門邊解釋邊執行的弱語言機制 機製的程式語言,因其簡單、易用、高效,所以說它是大多數linux命令列命令的首選語言。

執行shell指令碼的方式

#方法一:shell指令碼的第一行必須宣告:#!/bin/bash
#建立shell 指令碼
touch text.sh
chmod u+x text.sh
#執行shell指令碼(當前目錄下)
./text.sh

#方法二:使用/bin/bash的直譯器執行
#執行shell指令碼
bash text.sh

# 方法三:當前進程執行shell指令碼(可以忽略指令碼的許可權,可以不是可執行檔案)
#執行shell指令碼
source text.sh

Shell 變數

Shell 中變數的值都是以字串的形式進行儲存的,shell變數和其他弱語言機制 機製一樣無需宣告,直接使用;過程中無型別限制。
shell變數賦值的時候「=「」兩側不能有空格。原因是shell中一切皆字串的原因,空格也會被當做爲字串的一部分。

分類

在这里插入图片描述

單引號‘’、雙引號「」和反引號``的區別

單引號‘’:字串常數;任何字元都會原樣輸出,在其中使用變數包括跳脫符都是無效的。

雙引號「」:模板字串;變數會被解析,跳脫符會生效。

反引號``:命令表達式,只能放linux命令。相當於$(…)

字串和陣列常用方法(瞭解)

事實上shell指令碼主要是用來執行linux命令的,而其也提供了一些字串和陣列的方法,但這些方法對於使用命令來說,基本上不用。

字串 str=」…」
1.	獲取字串的長度 ${#str}
2.	字串拼接
	a)	$str1$str2		中間不能有空格
	b)$str1 $str2」 	中間有空格
	c)	$str1」-」$str2	中間可以有其他字串
	d)	str4="$name: $url" #這樣寫也可以
	e)	str5="${name}Script: ${url}index.html" #這個時候需要給變數名加上大括號
3.	字串擷取:${string: start [:length]}	從0開始,包括start,擷取長度爲length
4.	反向擷取字串:${string: 0-start [:length]}	從1開始,包括start
5.	從指定字串開始擷取(左邊開始)
	a)	${string#[*]chars}:*爲萬用字元,chars不包括,第一次出現開始擷取
	b)	${string##*chars}:*爲萬用字元,chars不包括,最後一次出現開始擷取
6.	從指定字串開始反向擷取(右邊開始)
	a)	${string%chars*}
	b)	${string%%chars*}


陣列		
1.	宣告:
	a)	array_name=(ele1  ele2  ele3 ... elen)		#陣列型別可以不相同
	b)	array_name=([3]=24 [5]=19 [10]=12)		#指定陣列下標宣告
2.	array_name[n]=…		賦值
3.	獲取陣列元素	
	a)	${nums[*]}或者${nums[@]}		#獲取陣列所有元素
	b)	${array_name[index]}		#index從0開始
4.	陣列長度		${#array_name[@]}或者${#array_name[*]}	#元素的個數,和下標無關
5.	刪除陣列元素:unset array_name[index]		
6.	刪除陣列:unset array_name 
7.	陣列的拼接		
array_new=(${array1[@]}  ${array2[@]})
array_new=(${array1[*]}  ${array2[*]})


備註:[]代表可選操作

Shell 表達式

算術表達式

  1. $((EXP)): 使用變數時不用加(())字首,(( )) 會自動解析變數名。爲 獲取表達式的值 ,當表達式有多個結果時以最後一個表達式的結果作爲整個(())命令的執行結果。

  2. $[EXP]: EXP爲表達式。

  3. expr EXP :分佈計算。注意:*表示乘法,其他相同,運算子前後必須加空格
    例如:S=expr 2 \* 3

  4. let簡單表達式

條件表達式

Shell 條件表達式的結果是0(true)和1(false),這一點和其他語言不一樣。
關於條件表達式shell有三種表達式,但是最常用的就是[ condition ](兩邊均有空格),其他不常用,不做介紹。值得注意的是條件表達式中的算術運算子要被「-eq -ne -gt -lt -ge -le」它們所替代,邏輯運算子「&& || !」被「-a -o !」取代。有的時候也可以用(())來取代,它支援所有的以上運算子。

輸出輸入重定向

之前看到的3張表,我覺得很詳細,於是先借用它們來說:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
上述三張表已經非常清晰的解釋了shell 程式設計的輸入和輸出重定向了。我主要說一下linux中最常用的三種輸出重定向。

  1. nohup bash xxx.sh [PARAMS] >file 2>&1 & 所有資訊輸出到file
  2. nohup bash xxx.sh [PARAMS] >file1 2>file2 & 正常file1 異常file2
  3. nohup bash xxx.sh [PARAMS] >/dev/null 2>&1 & 所有資訊不輸出(遠端)

這三種是我們最常用的輸出重定向,主要用於我們使用shell指令碼去啓動我們的應用程式,比如說elasticsearch,我們並不想在控制檯去看他的正常和提示資訊,因爲提示資訊太長,這時候我們就需要將輸出的這些資訊記錄在日誌檔案中,方便我們去檢視資訊。此外,下面 下麪也是我們常用的結束後臺執行的命令:

  • Ctrl+z 暫停掛在後臺 ctl+d(EOF,退出shell指令碼) ctl+c(中斷進程退出)
  • fg命令重新啓動前臺被中斷的任務(可以繼續掛起),bg命令把被中斷的任務放在後台執行(不能再掛起)
  • jobs 顯示當前所有後台執行命令
  • jobs -l 顯示所有後台執行命令狀態:PID,STATE(running,stopped,terminated),被kill的後臺命令將被從jobs 列表中剔除。

回圈跳轉語句

  1. continue[n]:n表示跳出第幾層的本次回圈,預設爲當前回圈
  2. break[n]:n表示跳出到第幾層回圈,預設爲當前回圈
  3. return n:n表示方法執行的狀態
  4. exit n:n程式結束的狀態:0表示支援結束

範例:Shell jdk & tomcat 發佈

#!/bin/bash

INSTALL=/opt/install/java/
JDK=jdk-8u111-linux-x64.tar.gz
TOMCAT=apache-tomcat-8.5.57.tar.gz
BIGDATA=/opt/bigdata/java/
CMD=''

show(){
 msg=''
 for p in $*
 do 
  msg=$msg' '$p
 done
}

err(){
 show $*
 if [ $? -ne 0 ]
 then
  echo '異常:'$msg
  exit 1
 else
  echo '成功:'$msg
 fi
}

if [ -e $BIGDATA ]
then
 echo "${BIGDATA} exist"
else
 CMD="mkdir -p ${BIGDATA}"
 $CMD
 err "建立目錄 ${BIGDATA}"
fi

CMD="cd ${INSTALL}"
$CMD
err "${CMD}"

CMD="tar -zxf ${JDK} -C ${BIGDATA}"
$CMD
err "${CMD}"
 
CMD="tar -zxf ${TOMCAT} -C ${BIGDATA}"
$CMD
err "${CMD}"

CMD="mv ${BIGDATA}apache-tomcat-8.5.57/ ${BIGDATA}tomcat85/"
$CMD
err "${CMD}"

CMD="mv ${BIGDATA}jdk1.8.0_111/ ${BIGDATA}jdk180/"
$CMD
err "${CMD}"

CMD=`sed -i "/unset i/i\export JAVA_HOME=${BIGDATA}jdk180" /etc/profile`
$CMD
err "create environment variable JAVA_HOME"

CMD=`sed -i "/unset i/i\export TOMCAT_HOME=${BIGDATA}tomcat85" /etc/profile`
$CMD
err "create environment variable TOMCAT_HOME"

CMD=`sed -i '/unset i/i\export PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$PATH' /etc/profile`
$CMD
err "create environment variable PATH"

CMD=`sed -i '/unset i/i\export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' /etc/profile`
$CMD
err "create environment variable CLASSPATH"

CMD="source /etc/profile"
$CMD
err "${CMD}" 

echo "發佈 jdk && tomact 成功"

結果:

[root@vm03 ~]# ./deployloyjt.sh 
成功: 建立目錄 /opt/bigdata/java/
成功: cd /opt/install/java/
成功: tar -zxf jdk-8u111-linux-x64.tar.gz -C /opt/bigdata/java/
成功: tar -zxf apache-tomcat-8.5.57.tar.gz -C /opt/bigdata/java/
成功: mv /opt/bigdata/java/apache-tomcat-8.5.57/ /opt/bigdata/java/tomcat85/
成功: mv /opt/bigdata/java/jdk1.8.0_111/ /opt/bigdata/java/jdk180/
成功: create environment variable JAVA_HOME
成功: create environment variable TOMCAT_HOME
成功: create environment variable PATH
成功: create environment variable CLASSPATH
成功: source /etc/profile
發佈 jdk && tomact 成功
[root@vm03 ~]# cat /etc/profile | tail -8


export JAVA_HOME=/opt/bigdata/java/jdk180
export TOMCAT_HOME=/opt/bigdata/java/tomcat85
export PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
unset i
unset -f pathmunge
[root@vm03 ~]#