《前后端面試題
》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。
文章目錄
- 一、本文面試題目錄
- 1. 什么是Linux?它與Unix有什么關系和區別?
- 2. Linux的內核版本和發行版有什么區別?列舉常見的Linux發行版。
- 3. 什么是GNU?GNU/Linux的關系是什么?
- 4. Linux系統的主要組成部分有哪些?
- 5. 簡述Linux的啟動過程。
- 6. BIOS、GRUB在Linux啟動中分別起到什么作用?
- 7. 什么是運行級別(Runlevel)?不同運行級別的含義是什么?
- 8. systemd和init有什么區別?為什么systemd被廣泛采用?
- 9. Linux的文件系統層級結構(FHS)是怎樣的?各主要目錄的作用是什么?
- 10. 什么是Shell?常見的Shell有哪些?
- 11. Bash和Zsh的主要區別是什么?
- 12. 絕對路徑和相對路徑的區別是什么?如何表示當前目錄和父目錄?
- 13. 什么是inode?它包含哪些信息?與文件有什么關系?
- 14. 硬鏈接和軟鏈接(符號鏈接)的區別是什么?
- 15. 什么是虛擬文件系統(VFS)?它的作用是什么?
- 二、120道Linux面試題目錄列表
一、本文面試題目錄
1. 什么是Linux?它與Unix有什么關系和區別?
定義:Linux是一個開源的類Unix操作系統內核,由Linus Torvalds于1991年首次發布。它本身只是內核,通常與GNU項目的工具和其他軟件結合,形成完整的操作系統。
與Unix的關系:
- Linux受Unix設計思想啟發,實現了Unix的大部分功能和接口
- 兩者都遵循"一切皆文件"的理念,擁有相似的命令行界面和編程接口
- Linux可以看作是Unix的現代開源實現
區別:
特性 | Linux | Unix |
---|---|---|
許可證 | 開源(GPL) | 多數為商業授權 |
起源 | 1991年,Linus Torvalds | 1969年,貝爾實驗室 |
硬件支持 | 廣泛支持各種硬件 | 主要支持服務器和工作站 |
價格 | 免費或低成本 | 通常需要商業許可費用 |
擴展性 | 高度可定制 | 定制性受限 |
2. Linux的內核版本和發行版有什么區別?列舉常見的Linux發行版。
內核版本:
- 指Linux操作系統的核心程序版本
- 由Linus Torvalds及其團隊維護
- 版本號格式通常為:主版本.次版本.修訂號(如5.15.0)
- 只包含操作系統最核心的功能:進程管理、內存管理、設備驅動等
發行版:
- 基于Linux內核,整合了各種軟件和工具的完整操作系統
- 由不同組織或公司維護
- 除內核外,還包含桌面環境、應用程序、包管理系統等
常見發行版:
- Debian系列:Debian、Ubuntu、Linux Mint
- Red Hat系列:Red Hat Enterprise Linux (RHEL)、CentOS、Fedora
- SUSE系列:openSUSE、SUSE Linux Enterprise
- 獨立發行版:Arch Linux、Gentoo、Slackware
- 特殊用途:Kali Linux(安全測試)、Raspbian(樹莓派)
示例:查看內核版本命令
uname -r # 輸出示例:5.4.0-91-generic
3. 什么是GNU?GNU/Linux的關系是什么?
GNU:
- 是"GNU’s Not Unix"的遞歸縮寫
- 由Richard Stallman于1983年發起的自由軟件項目
- 目標是創建一個完全自由的類Unix操作系統
- 開發了大量基礎工具:gcc編譯器、bash shell、glibc庫等
GNU/Linux關系:
- Linux內核與GNU項目的軟件結合形成了完整的操作系統
- 嚴格來說,我們使用的"Linux"系統實際上是"GNU/Linux"
- Linux提供內核,GNU提供了用戶空間的大部分工具和庫
- 兩者互補,共同構成了功能完整的操作系統
歷史背景:
GNU項目已經開發了操作系統的大部分組件,但缺乏一個有效的內核。1991年Linux內核的出現填補了這一空白,與GNU軟件結合形成了今天廣泛使用的操作系統。
4. Linux系統的主要組成部分有哪些?
Linux系統由以下主要部分組成:
-
內核(Kernel)
- 系統的核心,管理硬件資源
- 負責進程管理、內存管理、文件系統、設備驅動等
- 是操作系統與硬件之間的接口
-
Shell(外殼)
- 命令解釋器,用戶與內核交互的接口
- 常見的有bash、zsh、sh等
- 接收用戶命令并傳遞給內核執行
-
文件系統
- 組織和存儲文件的方式
- 常見的有ext4、xfs、btrfs等
- 采用樹形目錄結構
-
應用程序和工具
- 用戶使用的各種軟件和工具
- 包括文本編輯器、編譯器、辦公軟件等
- 許多來自GNU項目
-
系統庫(Libraries)
- 提供程序運行所需的函數和資源
- 如glibc(GNU C庫)
- 簡化應用程序開發
-
服務(Services)
- 在后臺運行的程序
- 如網絡服務、打印服務等
- 由systemd或其他初始化系統管理
結構示意圖:
用戶 → Shell → 系統調用 → 內核 → 硬件↓應用程序 → 系統庫 → 內核
5. 簡述Linux的啟動過程。
Linux啟動過程可分為以下幾個主要階段:
-
BIOS/UEFI初始化
- 計算機通電后首先運行基本輸入輸出系統(BIOS)或統一可擴展固件接口(UEFI)
- 進行硬件自檢(POST),檢測CPU、內存、硬盤等設備
- 確定啟動設備(通常是硬盤)
-
引導加載程序(Boot Loader)
- 從啟動設備加載引導程序(如GRUB)
- GRUB顯示啟動菜單,允許用戶選擇操作系統
- 加載并啟動Linux內核
-
內核初始化
- 內核解壓并加載到內存
- 初始化硬件設備,建立內存管理
- 掛載臨時根文件系統(initramfs/initrd)
-
啟動初始化系統
- 內核啟動初始化進程(如systemd、upstart或傳統的init)
- 這是系統啟動的第一個用戶空間進程(PID=1)
-
系統初始化
- 初始化系統負責啟動各種服務和進程
- 掛載/etc/fstab中定義的文件系統
- 設置網絡、時鐘等系統參數
-
用戶登錄
- 啟動圖形界面或命令行登錄界面
- 用戶輸入用戶名和密碼進行身份驗證
- 加載用戶環境,完成啟動過程
簡化流程:
電源啟動 → BIOS/UEFI → GRUB → 內核 → systemd/init → 服務啟動 → 登錄界面
6. BIOS、GRUB在Linux啟動中分別起到什么作用?
BIOS(Basic Input/Output System):
- 作用:是計算機啟動時運行的固件程序,負責硬件初始化和啟動引導
- 具體功能:
- 執行POST(Power-On Self-Test,加電自檢),檢查硬件是否正常
- 初始化硬件設備,如CPU、內存、硬盤等
- 確定啟動順序和啟動設備(通過BIOS設置)
- 從啟動設備的MBR(主引導記錄)加載引導程序
GRUB(Grand Unified Bootloader):
- 作用:是Linux系統中常用的引導加載程序,負責加載操作系統內核
- 具體功能:
- 提供啟動菜單,允許用戶選擇要啟動的操作系統
- 加載并解壓Linux內核到內存
- 向內核傳遞啟動參數
- 支持多種文件系統和操作系統
- 可以在啟動前修改內核參數
兩者關系:
BIOS完成硬件初始化后,從啟動設備加載GRUB,GRUB再負責加載Linux內核。在現代系統中,UEFI正在逐漸取代BIOS,而GRUB也有對應的UEFI版本。
GRUB配置文件:
主要配置文件位于/boot/grub/grub.cfg
或/boot/grub2/grub2.cfg
7. 什么是運行級別(Runlevel)?不同運行級別的含義是什么?
運行級別:
是Linux系統在啟動時或運行中的不同操作模式,定義了系統啟動哪些服務和進程。
傳統運行級別(0-6):
- 0:關機(halt)- 系統關閉
- 1:單用戶模式(single user mode)- 僅root用戶可登錄,無網絡
- 2:多用戶模式,無網絡服務(Debian系)
- 3:多用戶模式,命令行界面(Red Hat系)
- 4:未使用(自定義)
- 5:多用戶模式,圖形界面
- 6:重啟(reboot)- 系統重啟
查看當前運行級別:
runlevel # 傳統命令
systemctl get-default # systemd系統
切換運行級別:
init 3 # 切換到運行級別3
systemctl isolate multi-user.target # systemd系統對應級別3
systemd中的目標(Targets):
systemd使用目標(targets)替代了傳統的運行級別:
poweroff.target
→ 運行級別0rescue.target
→ 運行級別1multi-user.target
→ 運行級別3graphical.target
→ 運行級別5reboot.target
→ 運行級別6
8. systemd和init有什么區別?為什么systemd被廣泛采用?
init:
- 傳統的系統初始化程序,采用串行啟動方式
- 基于Shell腳本,按順序啟動服務
- 啟動速度慢,依賴管理簡單
- 配置文件復雜,分布在多個目錄
systemd:
- 新一代系統和服務管理器,采用并行啟動方式
- 基于C語言編寫,支持并行啟動服務
- 啟動速度快,有更強大的依賴管理
- 集成了多種系統管理功能
主要區別:
特性 | init | systemd |
---|---|---|
啟動方式 | 串行 | 并行 |
配置方式 | Shell腳本 | 單元文件(.service等) |
依賴管理 | 簡單 | 復雜且精確 |
啟動速度 | 較慢 | 較快 |
功能范圍 | 僅初始化 | 集成日志、電源管理等 |
服務控制 | service命令 | systemctl命令 |
systemd被廣泛采用的原因:
- 啟動速度快:并行啟動服務,減少啟動時間
- 強大的依賴管理:精確控制服務啟動順序
- 統一的管理接口:通過systemctl管理所有系統功能
- 更好的日志支持:集成journald日志系統
- 按需啟動服務:只有在需要時才啟動某些服務
- 支持快照和恢復:可以保存和恢復系統狀態
- 更好的硬件支持:對現代硬件和技術有更好的支持
示例命令對比:
# 啟動服務
service httpd start # init
systemctl start httpd # systemd# 設置開機自啟
chkconfig httpd on # init
systemctl enable httpd # systemd
9. Linux的文件系統層級結構(FHS)是怎樣的?各主要目錄的作用是什么?
Linux采用樹形文件系統層級結構(FHS,Filesystem Hierarchy Standard),主要目錄及其作用如下:
-
/(根目錄)
- 文件系統的起點,所有目錄都源于此
-
/bin
- 存放基本命令(二進制文件),如ls、cp、mv等
- 所有用戶都可使用,在單用戶模式下也能訪問
-
/sbin
- 存放系統管理命令,如reboot、ifconfig等
- 通常只有root用戶可使用
-
/etc
- 存放系統配置文件,如網絡配置、用戶配置等
- 重要文件:/etc/passwd、/etc/fstab、/etc/hostname
-
/home
- 普通用戶的主目錄
- 通常每個用戶有一個以用戶名命名的子目錄
-
/root
- 超級用戶(root)的主目錄
-
/usr
- 存放用戶應用程序和文件
- 子目錄包括:/usr/bin(用戶命令)、/usr/sbin(系統命令)、/usr/lib(庫文件)、/usr/share(共享數據)
-
/var
- 存放經常變化的文件
- 子目錄包括:/var/log(日志文件)、/var/spool(郵件、打印隊列)、/var/www(網頁文件)
-
/tmp
- 臨時文件目錄
- 系統重啟后通常會清空
-
/dev
- 設備文件目錄,所有硬件設備以文件形式存在于此
- 如:/dev/sda(第一塊硬盤)、/dev/null(空設備)
-
/proc
- 虛擬文件系統,包含系統進程和內核信息
- 如:/proc/cpuinfo(CPU信息)、/proc/meminfo(內存信息)
-
/sys
- 虛擬文件系統,用于訪問硬件設備和內核設置
-
/mnt 和 /media
- 臨時掛載點,用于掛載外部設備
-
/lib 和 /lib64
- 系統庫文件,供二進制程序使用
10. 什么是Shell?常見的Shell有哪些?
Shell:
是用戶與Linux內核之間的接口程序,負責解釋用戶輸入的命令并傳遞給內核執行。它是一種命令行解釋器,也可以作為腳本語言使用。
工作原理:
- 用戶輸入命令
- Shell解析命令
- Shell將命令轉換為內核可理解的指令
- 內核執行指令并返回結果
- Shell將結果展示給用戶
常見的Shell:
-
Bash(Bourne Again SHell)
- 最常用的Shell,大多數Linux發行版的默認Shell
- 兼容Bourne Shell,增加了許多新特性
- 支持命令歷史、命令補全、管道等功能
-
Sh(Bourne Shell)
- 早期的Unix Shell,由Stephen Bourne開發
- 功能簡單,兼容性好
- 許多系統中sh是bash的符號鏈接
-
Csh(C Shell)
- 語法類似C語言,適合編程
- 引入了命令歷史、別名等功能
- 在BSD系統中較常見
-
Tcsh
- Csh的增強版,增加了命令補全等功能
-
Zsh(Z Shell)
- 功能強大,結合了bash、csh等的優點
- 支持更多擴展和自定義選項
- 具有更強大的自動補全功能
-
Ksh(Korn Shell)
- 結合了Bourne Shell和C Shell的特性
- 適合腳本編程,功能豐富
查看和切換Shell:
# 查看當前使用的Shell
echo $SHELL# 查看系統安裝的Shell
cat /etc/shells# 切換Shell(需注銷后生效)
chsh -s /bin/zsh
11. Bash和Zsh的主要區別是什么?
Bash和Zsh都是流行的Shell,但Zsh在功能和用戶體驗上有更多增強:
主要區別:
-
命令補全
- Bash:基本的命令和文件名補全
- Zsh:更智能的補全,支持:
- 命令選項補全(無需記住完整選項)
- 目錄瀏覽補全(按Tab鍵可瀏覽目錄)
- 插件擴展補全(如git命令補全)
-
主題和外觀
- Bash:外觀定制有限
- Zsh:高度可定制,支持豐富的主題
- 可顯示Git分支、虛擬環境等信息
-
歷史記錄
- Bash:基本的命令歷史功能
- Zsh:更強大的歷史管理:
- 跨會話共享歷史
- 按部分命令搜索歷史
- 歷史記錄去重
-
插件支持
- Bash:插件支持有限
- Zsh:有豐富的插件生態系統(如Oh My Zsh)
- 常用插件:git、autojump、syntax-highlighting等
-
** globbing(模式匹配)**
- Zsh提供更強大的模式匹配功能
- 支持遞歸匹配(**)、擴展通配符等
-
拼寫糾正
- Zsh可以自動糾正命令拼寫錯誤
- Bash無此功能
-
啟動速度
- Bash:啟動較快
- Zsh:由于功能豐富,啟動可能較慢,尤其是加載多個插件時
示例對比:
- Zsh的遞歸目錄匹配:
# 列出所有子目錄中的.md文件
ls **/*.md # Zsh支持,Bash默認不支持
- Zsh的拼寫糾正:
# 如果輸入了錯誤命令
ech hello# Zsh會提示
zsh: correct 'ech' to 'echo' [nyae]?
- 安裝Oh My Zsh增強Zsh功能:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
12. 絕對路徑和相對路徑的區別是什么?如何表示當前目錄和父目錄?
絕對路徑:
- 從根目錄(/)開始的完整路徑
- 無論當前工作目錄是什么,都能準確定位文件
- 示例:
/home/user/documents/file.txt
、/etc/nginx/nginx.conf
相對路徑:
- 相對于當前工作目錄的路徑
- 不包含根目錄,依賴于當前位置
- 示例:
documents/file.txt
、../images/photo.jpg
表示方法:
- 當前目錄:用
.
表示- 示例:
./script.sh
(執行當前目錄下的script.sh)
- 示例:
- 父目錄:用
..
表示- 示例:
cd ..
(切換到上一級目錄)
- 示例:
區別對比:
特性 | 絕對路徑 | 相對路徑 |
---|---|---|
起點 | 根目錄(/) | 當前工作目錄 |
長度 | 通常較長 | 通常較短 |
穩定性 | 不隨當前目錄變化 | 隨當前目錄變化 |
使用場景 | 腳本中引用固定位置文件 | 手動操作或相對位置固定的文件 |
示例:
假設當前目錄是/home/user
# 使用絕對路徑訪問文件
cat /home/user/documents/report.txt# 使用相對路徑訪問同一文件
cat documents/report.txt# 從當前目錄訪問父目錄下的文件
cat ../shared/file.txt# 從當前目錄訪問當前目錄下的文件(兩種方式)
cat ./downloads/image.jpg
cat downloads/image.jpg
查看當前目錄的絕對路徑:
pwd # 輸出示例:/home/user
13. 什么是inode?它包含哪些信息?與文件有什么關系?
inode(索引節點):
是Linux文件系統中的一個數據結構,用于存儲文件的元數據(描述信息)。每個文件都對應一個唯一的inode。
inode包含的信息:
- 文件類型(普通文件、目錄、鏈接等)
- 文件權限(讀、寫、執行權限)
- 文件所有者和所屬組
- 文件大小
- 最后訪問時間(atime)
- 最后修改時間(mtime)
- 最后元數據修改時間(ctime)
- 鏈接數(指向該inode的硬鏈接數量)
- 文件數據塊的位置指針
inode與文件的關系:
- 每個文件對應一個inode,但一個inode可以被多個文件名(硬鏈接)指向
- 文件名不存儲在inode中,而是存儲在目錄文件中
- 目錄是一種特殊文件,包含文件名與inode號的映射關系
- 當訪問文件時,系統先通過文件名找到對應的inode號,再通過inode找到文件數據
重要特性:
- inode號在同一文件系統中是唯一的
- inode也會消耗磁盤空間(通常在格式化時分配)
- 當inode耗盡時,即使有磁盤空間也無法創建新文件
相關命令:
# 查看文件的inode號
ls -i filename # 示例輸出:12345 filename# 查看inode詳細信息
stat filename# 查看文件系統的inode使用情況
df -i
示例:
# 創建文件并查看其inode信息
touch testfile
stat testfile# 輸出結果包含inode號、權限、大小、時間等信息File: testfileSize: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 1048605 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2023-07-15 10:30:00.000000000 +0800
Modify: 2023-07-15 10:30:00.000000000 +0800
Change: 2023-07-15 10:30:00.000000000 +0800Birth: -
14. 硬鏈接和軟鏈接(符號鏈接)的區別是什么?
硬鏈接(Hard Link)和軟鏈接(Symbolic Link,簡稱symlink)是Linux中兩種創建鏈接文件的方式,主要區別如下:
定義:
- 硬鏈接:指向文件inode的另一個文件名,與原文件共享同一個inode
- 軟鏈接:一個特殊的文件,包含指向另一個文件的路徑名
主要區別:
特性 | 硬鏈接 | 軟鏈接 |
---|---|---|
inode | 與原文件相同 | 有自己獨立的inode |
存儲內容 | 不存儲內容,與原文件共享數據 | 存儲指向原文件的路徑 |
跨文件系統 | 不支持 | 支持 |
指向目錄 | 通常不允許(部分系統支持) | 允許 |
原文件刪除 | 仍可訪問文件內容 | 鏈接失效,變為"懸空鏈接" |
大小 | 與原文件相同(實際上不占用額外空間) | 取決于路徑長度 |
權限 | 與原文件共享權限設置 | 權限不影響訪問(實際取決于原文件) |
創建命令:
# 創建硬鏈接
ln 原文件 硬鏈接名# 創建軟鏈接
ln -s 原文件 軟鏈接名
示例:
# 創建測試文件
echo "Hello World" > original.txt# 創建硬鏈接
ln original.txt hardlink.txt# 創建軟鏈接
ln -s original.txt symlink.txt# 查看文件信息
ls -li# 輸出示例(注意inode號)
12345 -rw-r--r-- 2 user user 12 Jul 15 11:00 original.txt
12345 -rw-r--r-- 2 user user 12 Jul 15 11:00 hardlink.txt
67890 lrwxrwxrwx 1 user user 12 Jul 15 11:01 symlink.txt -> original.txt
使用場景:
- 硬鏈接:適用于需要在不同位置訪問同一文件,且不希望原文件刪除后鏈接失效的場景
- 軟鏈接:適用于需要鏈接到目錄、跨文件系統鏈接,或需要明確標識為鏈接的場景
注意事項:
- 刪除原文件后,硬鏈接仍可正常訪問內容,而軟鏈接會變成無效鏈接
- 修改硬鏈接或原文件的內容會相互影響(因為它們指向同一數據)
- 軟鏈接可以指向相對路徑或絕對路徑,建議使用絕對路徑避免鏈接失效
15. 什么是虛擬文件系統(VFS)?它的作用是什么?
虛擬文件系統(VFS,Virtual File System):
是Linux內核中的一個抽象層,提供了一個統一的接口來訪問不同類型的文件系統。它隱藏了各種具體文件系統的實現細節,使得用戶空間程序可以用相同的方式訪問不同的文件系統。
主要作用:
- 提供統一接口:為所有文件系統提供一致的操作接口(如open、read、write等)
- 屏蔽實現差異:隱藏不同文件系統的底層實現細節
- 支持多種文件系統:允許同時使用多種不同類型的文件系統(如ext4、xfs、NTFS等)
- 簡化應用程序開發:應用程序無需關心底層文件系統類型
- 管理文件系統掛載:負責文件系統的掛載和卸載
VFS的核心對象:
- 超級塊(superblock):每個已掛載的文件系統對應一個超級塊對象,存儲文件系統的整體信息
- 索引節點(inode):表示一個文件,存儲文件的元數據
- 目錄項(dentry):表示目錄項,維護文件名與inode的映射關系
- 文件對象(file):表示進程打開的文件,包含文件指針位置等信息
工作流程:
- 應用程序調用文件操作函數(如open())
- 系統調用將請求傳遞給VFS
- VFS根據文件路徑確定對應的文件系統
- VFS調用該文件系統的具體實現函數
- 文件系統與底層存儲設備交互
- 結果通過VFS返回給應用程序
優勢:
- 靈活性:可以同時使用多種文件系統
- 可擴展性:便于添加新的文件系統類型
- 兼容性:可以訪問其他操作系統的文件系統
- 一致性:用戶和應用程序使用統一的方式操作文件
支持的文件系統類型:
- 磁盤文件系統:ext4、xfs、btrfs、NTFS、FAT32等
- 網絡文件系統:NFS、CIFS等
- 虛擬文件系統:proc、sysfs、tmpfs等
查看系統已掛載的文件系統:
mount # 顯示所有已掛載的文件系統及其類型
df -T # 顯示文件系統類型和磁盤使用情況
二、120道Linux面試題目錄列表
文章序號 | Linux面試題120道 |
---|---|
1 | Linux面試題及詳細答案120道(01-15) |
2 | Linux面試題及詳細答案120道(16-30) |
3 | Linux面試題及詳細答案120道(31-45) |
4 | Linux面試題及詳細答案120道(46-60) |
5 | Linux面試題及詳細答案120道(61-75) |
6 | Linux面試題及詳細答案120道(76-95) |
7 | Linux面試題及詳細答案120道(96-110) |
8 | Linux面試題及詳細答案120道(111-120) |