分享100 道 Linux 常見面試題(上)

Luson發表於2021-09-23

本文分別從 Linux 概述、磁碟、目錄、檔案、安全、語法級、實戰、檔案管理命令、文件編輯命令、磁碟管理命令、網路通訊命令、系統管理命令、備份壓縮命令等方面拆解 Linux 常見面試問題。可以先收藏,慢慢讀。

1、Linux 概述

1.1 什麼是 Linux

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

1.2 Unix 和 Linux 有什麼區別?

Linux 和 Unix 都是功能強大的作業系統,都是應用廣泛的伺服器作業系統,有很多相似之處,甚至有一部分人錯誤地認為 Unix 和 Linux 作業系統是一樣的,然而,事實並非如此,以下是兩者的區別。

  1. 開源性 Linux 是一款開源作業系統,不需要付費,即可使用;Unix 是一款對原始碼實行智慧財產權保護的傳統商業軟體,使用需要付費授權使用。

  2. 跨平臺性 Linux 作業系統具有良好的跨平臺效能,可執行在多種硬體平臺上;Unix 作業系統跨平臺效能較弱,大多需與硬體配套使用。

  3. 視覺化介面 Linux 除了進行命令列操作,還有窗體管理系統;Unix 只是命令列下的系統。

  4. 硬體環境 Linux 作業系統對硬體的要求較低,安裝方法更易掌握;Unix 對硬體要求比較苛刻,安裝難度較大。

  5. 使用者群體 Linux 的使用者群體很廣泛,個人和企業均可使用;Unix 的使用者群體比較窄,多是安全性要求高的大型企業使用,如銀行、電信部門等,或者 Unix 硬體廠商使用,如 Sun 等。相比於 Unix 作業系統,Linux 作業系統更受廣大計算機愛好者的喜愛,主要原因是 Linux 作業系統具有 Unix 作業系統的全部功能,並且能夠在普通 PC 計算機上實現全部的 Unix 特性,開源免費的特性,更容易普及使用!

1.3 什麼是 Linux 核心?

Linux 系統的核心是核心。核心控制著計算機系統上的所有硬體和軟體,在必要時分配硬體,並根據需要執行軟體。

  • 系統記憶體管理
  • 應用程式管理
  • 硬體裝置管理
  • 檔案系統管理

1.4 Linux 的基本元件是什麼?

就像任何其他典型的作業系統一樣,Linux 擁有所有這些元件:核心,shell 和 GUI,系統實用程式和應用程式。Linux 比其他作業系統更具優勢的是每個方面都附帶其他功能,所有程式碼都可以免費下載。

1.5 Linux 的體系結構

從大的方面講,Linux 體系結構可以分為兩塊:圖片

使用者空間(User Space) :使用者空間又包括使用者的應用程式(User Applications)、C 庫(C Library) 。

核心空間(Kernel Space) :核心空間又包括系統呼叫介面(System Call Interface)、核心(Kernel)、平臺架構相關的程式碼(Architecture-Dependent Kernel Code) 。

為什麼 Linux 體系結構要分為使用者空間和核心空間的原因?

1.現代 CPU 實現了不同的工作模式,不同模式下 CPU 可以執行的指令和訪問的暫存器不同。

2.Linux 從 CPU 的角度出發,為了保護核心的安全,把系統分成了兩部分。

使用者空間和核心空間是程式執行的兩種不同的狀態,我們可以通過兩種方式完成使用者空間到核心空間的轉移:

1)系統呼叫;

2)硬體中斷。

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

BASH 和 DOS 控制檯之間的主要區別在於 3 個方面:

  1. BASH 命令區分大小寫,而 DOS 命令則不區分;
  2. 在 BASH 下,/ character 是目錄分隔符,\作為轉義字元。在 DOS 下,/用作命令引數分隔符,\是目錄分隔符
  3. OS 遵循命名檔案中的約定,即 8 個字元的檔名後跟一個點,副檔名為 3 個字元。BASH 沒有遵循這樣的慣例。

1.7 Linux 開機啟動過程?

  1. 主機加電自檢,載入 BIOS 硬體資訊。
  2. 讀取 MBR 的引導檔案(GRUB、LILO)。
  3. 引導 Linux 核心。
  4. 執行第一個程式 init (程式號永遠為 1 )。
  5. 進入相應的執行級別。
  6. 執行終端,輸入使用者名稱和密碼。

1.8 Linux 系統預設的執行級別?

  • 關機。
  • 單機使用者模式。
  • 字元介面的多使用者模式(不支援網路)。
  • 字元介面的多使用者模式。
  • 未分配使用。
  • 圖形介面的多使用者模式。
  • 重啟。

1.9 Linux 使用的程式間通訊方式?

  • 管道(pipe)、流管道(s_pipe)、有名管道(FIFO)
  • 訊號(signal)
  • 訊息佇列
  • 共享記憶體
  • 訊號量
  • 套接字(socket)

1.10 Linux 有哪些系統日誌檔案?

比較重要的是 /var/log/messages 日誌檔案。

該日誌檔案是許多程式日誌檔案的彙總,從該檔案可以看出任何入侵企圖或成功的入侵。另外,如果系統裡有 ELK 日誌集中收集,它也會被收集進去。

1.11 Linux 系統安裝多個桌面環境有幫助嗎

通常,一個桌面環境,如 KDE 或 Gnome,足以在沒有問題的情況下執行。儘管系統允許從一個環境切換到另一個環境,但這對使用者來說都是優先考慮的問題。有些程式在一個環境中工作而在另一個環境中無法工作,因此它也可以被視為選擇使用哪個環境的一個因素。

1.12 什麼是交換空間?

交換空間是 Linux 使用的一定空間,用於臨時儲存一些併發執行的程式。當 RAM 沒有足夠的記憶體來容納正在執行的所有程式時,就會發生這種情況。

1.13 什麼是 root 帳戶

root 帳戶就像一個系統管理員帳戶,允許你完全控制系統。你可以在此處建立和維護使用者帳戶,為每個帳戶分配不同的許可權。每次安裝 Linux 時都是預設帳戶。

1.14 什麼是 LILO?

LILO 是 Linux 的引導載入程式。它主要用於將 Linux 作業系統載入到主記憶體中,以便它可以開始執行。

1.15 什麼是 BASH?

BASH 是 Bourne Again SHell 的縮寫。它由 Steve Bourne 編寫,作為原始 Bourne Shell(由/ bin / sh 表示)的替代品。它結合了原始版本的 Bourne Shell 的所有功能,以及其他功能,使其更容易使用。從那以後,它已被改編為執行 Linux 的大多數系統的預設 shell。

1.16 什麼是 CLI?

命令列介面(英語:command-line interface,縮寫]:CLI)是在圖形使用者介面得到普及之前使用最為廣泛的使用者介面,它通常不支援滑鼠,使用者通過鍵盤輸入指令,計算機接收到指令後,予以執行。也有人稱之為字元使用者介面(CUI)。

通常認為,命令列介面(CLI)沒有圖形使用者介面(GUI)那麼方便使用者操作。因為,命令列介面的軟體通常需要使用者記憶操作的命令,但是,由於其本身的特點,命令列介面要較圖形使用者介面節約計算機系統的資源。在熟記命令的前提下,使用命令列介面往往要較使用圖形使用者介面的操作速度要快。所以,圖形使用者介面的作業系統中,都保留著可選的命令列介面。

1.17 什麼是 GUI?

圖形使用者介面(Graphical User Interface,簡稱 GUI,又稱圖形使用者介面)是指採用圖形方式顯示的計算機操作使用者介面。

圖形使用者介面是一種人與計算機通訊的介面顯示格式,允許使用者使用滑鼠等輸入裝置操縱螢幕上的圖示或選單選項,以選擇命令、呼叫檔案、啟動程式或執行其它一些日常任務。與通過鍵盤輸入文字或字元命令來完成例行任務的字元介面相比,圖形使用者介面有許多優點。

1.18 開源的優勢是什麼?

開源允許你將軟體(包括原始碼)免費分發給任何感興趣的人。然後,人們可以新增功能,甚至可以除錯和更正原始碼中的錯誤。它們甚至可以讓它執行得更好,然後再次自由地重新分配這些增強的原始碼。這最終使社群中的每個人受益。

1.19 GNU 專案的重要性是什麼?

這種所謂的自由軟體運動具有多種優勢,例如可以自由地執行程式以及根據你的需要自由學習和修改程式。它還允許你將軟體副本重新分發給其他人,以及自由改進軟體並將其釋出給公眾。

2、磁碟、目錄、檔案

2.1 簡單 Linux 檔案系統?

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

也就是說在 Linux 系統中有一個重要的概念:一切都是檔案。其實這是 Unix 哲學的一個體現,而 Linux 是重寫 Unix 而來,所以這個概念也就傳承了下來。在 Unix 系統中,把一切資源都看作是檔案,包括硬體裝置。UNIX 系統把每個硬體都看成是一個檔案,通常稱為裝置檔案,這樣使用者就可以用讀寫檔案的方式實現對硬體的訪問。

Linux 支援 5 種檔案型別,如下圖所示:

圖片

2.2 Linux 的目錄結構是怎樣的?

這個問題,一般不會問。更多是實際使用時,需要知道。

Linux 檔案系統的結構層次鮮明,就像一棵倒立的樹,最頂層是其根目錄:

圖片常見目錄說明:

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

2.3 什麼是 inode ?

一般來說,面試不會問 inode 。但是 inode 是一個重要概念,是理解 Unix/Linux 檔案系統和硬碟儲存的基礎。
理解 inode,要從檔案儲存說起。
檔案儲存在硬碟上,硬碟的最小儲存單位叫做”扇區”(Sector)。每個扇區儲存 512 位元組(相當於 0.5KB)。
作業系統讀取硬碟的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個”塊”(block)。這種由多個扇區組成的”塊”,是檔案存取的最小單位。”塊”的大小,最常見的是 4KB,即連續八個 sector 組成一個 block。
檔案資料都儲存在”塊”中,那麼很顯然,我們還必須找到一個地方儲存檔案的元資訊,比如檔案的建立者、檔案的建立日期、檔案的大小等等。這種儲存檔案元資訊的區域就叫做 inode,中文譯名為”索引節點”。

每一個檔案都有對應的 inode,裡面包含了與該檔案有關的一些資訊。

簡述 Linux 檔案系統通過 i 節點把檔案的邏輯結構和物理結構轉換的工作過程?

一般來說,面試官不太會問這個題目。

Linux 通過 inode 節點表將檔案的邏輯結構和物理結構進行轉換。

· inode 節點是一個 64 位元組長的表,表中包含了檔案的相關資訊,其中有檔案的大小、檔案所有者、檔案的存取許可方式以及檔案的型別等重要資訊。在 inode 節點表中最重要的內容是磁碟地址表。在磁碟地址表中有 13 個塊號,檔案將以塊號在磁碟地址表中出現的順序依次讀取相應的塊。

· Linux 檔案系統通過把 inode 節點和檔名進行連線,當需要讀取該檔案時,檔案系統在當前目錄表中查詢該檔名對應的項,由此得到該檔案相對應的 inode 節點號,通過該 inode 節點的磁碟地址表把分散存放的檔案物理塊連線成檔案的邏輯結構。

2.4 什麼是硬連結和軟連結?

1)硬連結

由於 Linux 下的檔案是通過索引節點(inode)來識別檔案,硬連結可以認為是一個指標,指向檔案索引節點的指標,系統並不為它重新分配 inode 。每新增一個一個硬連結,檔案的連結數就加 1 。

不足:1)不可以在不同檔案系統的檔案間建立連結;2)只有超級使用者才可以為目錄建立硬連結。

2)軟連結

軟連結克服了硬連結的不足,沒有任何檔案系統的限制,任何使用者可以建立指向目錄的符號連結。因而現在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網路對檔案進行連結。

不足:因為連結檔案包含有原檔案的路徑資訊,所以當原檔案從一個目錄下移到其他目錄中,再訪問連結檔案,系統就找不到了,而硬連結就沒有這個缺陷,你想怎麼移就怎麼移;還有它要系統分配額外的空間用於建立新的索引節點和儲存原檔案的路徑。

實際場景下,基本是使用軟連結。總結區別如下:

· 硬連結不可以跨分割槽,軟體鏈可以跨分割槽。

· 硬連結指向一個 inode 節點,而軟連結則是建立一個新的 inode 節點。

· 刪除硬連結檔案,不會刪除原檔案,刪除軟連結檔案,會把原檔案刪除。

2.5 RAID 是什麼?

RAID 全稱為獨立磁碟冗餘陣列(Redundant Array of Independent Disks),基本思想就是把多個相對便宜的硬碟組合起來,成為一個硬碟陣列組,使效能達到甚至超過一個價格昂貴、 容量巨大的硬碟。RAID 通常被用在伺服器電腦上,使用完全相同的硬碟組成一個邏輯扇區,因此作業系統只會把它當做一個硬碟。

RAID 分為不同的等級,各個不同的等級均在資料可靠性及讀寫效能上做了不同的權衡。在實際應用中,可以依據自己的實際需求選擇不同的 RAID 方案。

當然,因為很多公司都使用雲服務,大家很難接觸到 RAID 這個概念,更多的可能是普通雲盤、SSD 雲盤醬紫的概念。

3、安全

3.1 一臺 Linux 系統初始化環境後需要做一些什麼安全工作?

1、新增普通使用者登陸,禁止 root 使用者登陸,更改 SSH 埠號。修改 SSH 埠不一定絕對哈。當然,如果要暴露在外網,建議改下。

2、伺服器使用金鑰登陸,禁止密碼登陸。

3、開啟防火牆,關閉 SElinux ,根據業務需求設定相應的防火牆規則。

4、裝 fail2ban 這種防止 SSH 暴力破擊的軟體。

5、設定只允許公司辦公網出口 IP 能登陸伺服器(看公司實際需要)

6、修改歷史命令記錄的條數為 10 條。

7、只允許有需要的伺服器可以訪問外網,其它全部禁止。

8、做好軟體層面的防護。

(1) 設定 nginx_waf 模組防止 SQL 注入。

(2) 把 Web 服務使用 www 使用者啟動,更改網站目錄的所有者和所屬組為 www

3.2 什麼叫 CC 攻擊?什麼叫 DDOS 攻擊?

CC 攻擊,主要是用來攻擊頁面的,模擬多個使用者不停的對你的頁面進行訪問,從而使你的系統資源消耗殆盡。

DDOS 攻擊,中文名叫分散式拒絕服務攻擊,指藉助伺服器技術將多個計算機聯合起來作為攻擊平臺,來對一個或多個目標發動 DDOS 攻擊。

攻擊,即是通過大量合法的請求佔用大量網路資源,以達到癱瘓網路的目的。

怎麼預防 CC 攻擊和 DDOS 攻擊?

防 CC、DDOS 攻擊,這些只能是用硬體防火牆做流量清洗,將攻擊流量引入黑洞。

流量清洗這一塊,主要是買 ISP 服務商的防攻擊的服務就可以,機房一般有空餘流量,我們一般是買服務,畢竟攻擊不會是持續長時間。

3.3 什麼是網站資料庫注入?

由於程式設計師的水平及經驗參差不齊,大部分程式設計師在編寫程式碼的時候,沒有對使用者輸入資料的合法性進行判斷。

應用程式存在安全隱患。使用者可以提交一段資料庫查詢程式碼,根據程式返回的結果,獲得某些他想得知的資料,這就是所謂的 SQL 注入。

SQL 注入,是從正常的 WWW 埠訪問,而且表面看起來跟一般的 Web 頁面訪問沒什麼區別,如果管理員沒檢視日誌的習慣,可能被入侵很長時間都不會發覺。

如何過濾與預防?資料庫網頁端注入這種,可以考慮使用 nginx_waf 做過濾與預防。

Shell

/ Shell 指令碼是什麼? /

一個 Shell 指令碼是一個文字檔案,包含一個或多個命令。作為系統管理員,我們經常需要使用多個命令來完成一項任務,我們可以新增這些所有命令在一個文字檔案(Shell 指令碼)來完成這些日常工作任務。

  • 什麼是預設登入 Shell ?

在 Linux 作業系統,”/bin/bash” 是預設登入 Shell,是在建立使用者時分配的。

使用 chsh 命令可以改變預設的 Shell 。示例如下所示:

## chsh <使用者名稱> -s <新shell>## chsh ThinkWon -s /bin/sh
  • 在 Shell 指令碼中,如何寫入註釋?

註釋可以用來描述一個指令碼可以做什麼和它是如何工作的。每一行註釋以 # 開頭。例子如下:

#!/bin/bash## This is a commandecho “I am logged in as $USER

/ 語法級 /

  • 可以在 Shell 指令碼中使用哪些型別的變數?
    在 Shell 指令碼,我們可以使用兩種型別的變數:
    系統定義變數:系統變數是由系統系統自己建立的。這些變數通常由大寫字母組成,可以通過 set 命令檢視。
    使用者定義變數:使用者變數由系統使用者來生成和定義,變數的值可以通過命令 “echo $<變數名>” 檢視。

  • Shell 指令碼中 $? 標記的用途是什麼?
    在寫一個 Shell 指令碼時,如果你想要檢查前一命令是否執行成功,在 if 條件中使用 $? 可以來檢查前一命令的結束狀態。
    · 如果結束狀態是 0 ,說明前一個命令執行成功。例如:

    root@localhost:~## ls /usr/bin/shar    /usr/bin/shar    
    root@localhost:~## echo $?0

    · 如果結束狀態不是0,說明命令執行失敗。例如:

    root@localhost:~## ls /usr/bin/sharels: cannot access /usr/bin/share: No such file or directory    
    root@localhost:~## echo $?2
  • Bourne Shell(bash) 中有哪些特殊的變數?
    下面的表列出了 Bourne Shell 為命令列設定的特殊變數。

    內建變數 解釋$0 命令列中的指令碼名字$1 第一個命令列引數$2 第二個命令列引數….. …….$9 第九個命令列引數$## 命令列引數的數量$* 所有命令列引數,以空格隔開
  • 如何取消變數或取消變數賦值?
    unset 命令用於取消變數或取消變數賦值。語法如下所示:

    unset <變數名>

    Shell 指令碼中 if 語法如何巢狀?

    if [ 條件 ]
    then
    命令1
    命令2..
    else
    if [ 條件 ]
    then
    命令1
    命令2.
    else
    命令1
    命令2..
    fi
    fi
  • 在 Shell 指令碼中如何比較兩個數字?
    在 if-then 中使用測試命令( -gt 等)來比較兩個數字。例如:
    #!/bin/bash
    x=10
    y=20
    if [ $x -gt $y ]
    then
    echo “x is greater than y”
    else
    echo “y is greater than x”
    fi
  • Shell 指令碼中 case 語句的語法?
    基礎語法如下:

    case 變數 in1)
    命令1
    命令2..
    最後命令
    !!2)
    命令1
    命令2
    ……
    最後命令
    ;;
    esac
  • Shell 指令碼中 for 迴圈語法?
    基礎語法如下:

    for 變數 in 迴圈列表
    do
    命令1
    命令2.
    最後命令
    done
  • Shell 指令碼中 while 迴圈語法?
    基礎語法:

while [ 條件 ]
do
命令…
done
  • do-while 語句的基本格式?
    do-while 語句類似於 while 語句,但檢查條件語句之前先執行命令(LCTT 譯註:意即至少執行一次。)。下面是用 do-while 語句的語法:
do
{
命令
} while (條件)
  • Shell 指令碼中 break 命令的作用?
    break 命令一個簡單的用途是退出執行中的迴圈。我們可以在 while 和 until 迴圈中使用 break 命令跳出迴圈。

  • Shell 指令碼中 continue 命令的作用?
    continue 命令不同於 break 命令,它只跳出當前迴圈的迭代,而不是整個迴圈。continue 命令很多時候是很有用的,例如錯誤發生,但我們依然希望繼續執行大迴圈的時候。

  • 如何使指令碼可執行?
    使用 chmod 命令來使指令碼可執行。例子如下:chmod a+x myscript.sh 。

    #!/bin/bash 的作用?
    #!/bin/bash 是 Shell 指令碼的第一行,稱為釋伴(shebang)行。
    
      這裡 # 符號叫做 hash ,而 ! 叫做 bang。
      它的意思是命令通過 /bin/bash 來執行。
  • 如何除錯 Shell 指令碼?

    使用 -x’ 數(sh -x myscript.sh)可以除錯 Shell指令碼。
    另一個種方法是使用 -nv 引數(sh -nv myscript.sh)。

  • 如何將標準輸出和錯誤輸出同時重定向到同一位置?
    方法一:2>&1 (如## ls /usr/share/doc > out.txt 2>&1 ) 。
    方法二:&> (如## ls /usr/share/doc &> out.txt ) 。

  • 在 Shell 指令碼中,如何測試檔案?
    test 命令可以用來測試檔案。基礎用法如下表格:

    test-d 檔名 如果檔案存在並且是目錄,返回 true
    test-e 檔名 如果檔案存在,返回 true
    test-f 檔名 如果檔案存在並且是普通檔案,返回 true
    test-r 檔名 如果檔案存在並可讀,返回 true
    test-s 檔名 如果檔案存在並且不為空,返回 true
    test-w 檔名 如果檔案存在並可寫,返回 true
    test-x 檔名 如果檔案存在並可執行,返回 true
  • 在 Shell 指令碼如何定義函式呢?
    函式是擁有名字的程式碼塊。當我們定義程式碼塊,我們就可以在我們的指令碼呼叫函式名字,該塊就會被執行。示例如下所示:

    $ diskusage () { df -h ; }
    譯註:下面是我給的shell函式語法,原文沒有
    [ function ] 函式名 [()]
    {
    命令;
    [return int;]
    }
  • 如何讓 Shell 就指令碼得到來自終端的輸入?
    read 命令可以讀取來自終端(使用鍵盤)的資料。read 命令得到使用者的輸入並置於你給出的變數中。例子如下:

    ## vi /tmp/test.sh
    #!/bin/bash
    echo ‘Please enter your name’
    read name
    echo “My Name is $name”
    ## ./test.sh
    Please enter your name
    ThinkWon
    My Name is ThinkWon
  • 如何執行算術運算?
    有兩種方法來執行算術運算:
    1、使用 expr 命令:## expr 5 + 2 。
    2、用一個美元符號和方括號($[ 表示式 ]):test=$[16 + 4] ; test=$[16 + 4] 。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章