kernel的功能:進程管理、檔案系統、硬體驅動、記憶體管理、安全功能:SELinux、網路子系統,標準庫:glibc
進程是運行在cpu上但使用者進程受控於核心,使用者進程需要完成特權指令時將觸發非強制中斷由使用者模式轉為核心模式,由核心代為執行特權指令並把結果返回給使用者進程。
Linux為單核心體繫結構但是它支援模組化,模組還可以動態裝載或卸載,Linux核心:核心 + 外圍模組
核心:/boot/vmlinux-VERSION-release
模組:/lib/modules/VERSION-release,核心模組一般都以.ko結尾: kernel object
ramdisk: /boot/initramfs-VERSION-release.img:在核心啟動過程中裝載根檔案系統時有用
linux支援多版本核心共存,在以上目錄中會體系多版本號碼
linux系統啟動流程:POST:加電自檢,cpu定址空間由ROM+RAM共同組成:ROM(bios)今後會被EFI所代替。
引導次序:按次序找引導裝置,第一個有引導程式的裝置為啟動裝置
MBR:Master Boot Record尋找啟動裝置第一個扇區(sector):512bytes組成(446: bootloader、64: partation table、2: 5A)
運行bootloader: Centos5/6linux為傳統GRUB(GRand Unified Bootloader),提供可啟動核心,並自身可識別核心所在分區的檔案系統,當核心啟動後bootloader把控制權交給核心自己退場
核心和ramdisk一同被GRUB裝載在記憶體中,ramdisk提供硬碟驅動模組,核心是在記憶體中結合cpu運行
kernel核心啟動後:自身初始化、識別硬體、裝載驅動程式、以唯讀方式裝載根檔案系統、/sbin/init,當核心把init進程啟動後整個啟動過程結束
CentOS 5: SysV, init檔案在:/etc/inittab --> /etc/rc.d/rc.sysinit
entOS 6 Upstart,init檔案功能被分為多個檔案 /etc/init/*.conf --> /etc/rc.d/rc.sysinit
CentOS 7 Systemd:系統開機檔案/usr/lib/systemd/system/
啟動步驟一、CentOS 5: kernel 會根據設定檔 /etc/inittab啟動系統第一個進程 /sbin/init
設定系統預設運行層級:共有7個層級0-6:
0:關機、1:單一使用者模式 single user mode、2: multi user mode,非完全多使用者模式不支援NFS功能、3:完全多使用者模式,文本介面、4:未使用,預留層級、5:完全多使用者械,圖形介面、6: 重啟。切換層級:init #
啟動步驟二、通過/etc/rc.d/rc.sysinit指令碼,進一步初始化系統
啟動步驟三、啟動指定運行層級的預設啟動服務,停止指定運行層級下預設關閉服務;在/etc/rc.d/下有各個運行層級對應目錄,每個目錄都記錄著程式在該層級運行狀態、S##: 啟動的服務、K##:停止的服務、##:01-99,數字越小,越優先啟動或關閉;
指令碼如果期望能夠被chkconfig命令使用,要在指令碼中添加如下行:
# chkconfig: - 85 15
-:當此指令碼由chkconfig控制時時,預設哪些層級就是開啟的,也可以指定層級如:# chkconfig: 345 85 15,當chkconfig控制該程式時只對345層級生效。85為開啟優先順序。15為關閉優先順序。添加程式如下:
複製指令碼到/etc/init.d/下,用 chkconfig --add 添加指令碼啟動項並在各啟動層級目錄下建立連結檔案,chkconfig --del刪除自啟動項,chkconfig SRV_SCRIPT {on|off}設定啟動或關閉項,預設2345,也可以針對某一個層級設定相關服務例如:chkconfig --level
/etc/rc.d/rc.local (/etc/rc.local):該指令碼為系統啟動完成最後運行一個指令碼。
啟動步驟四:定義一些按鍵組合的功能,通常是Ctrl+Alt+Delete
啟動步驟五:初始化字元終端
啟動步驟六:如果有需要,啟動圖形終端
CentOS 6: /etc/inittab,由/etc/init/*.conf 下設定檔定義init的初始化動作,由upstart調用,程式為/sbin/init
/etc/rc.d/rc.sysinit: 系統初始化指令碼包括如下操作(設定主機名稱:讀取/etc/sysconfig/network檔案中的HOSTNAME參數、顯示文本歡迎資訊、啟用SELinux和udev、掛載/etc/fstab檔案中定義的其它檔案系統、啟用swap、檢測根檔案系統,並以讀寫方式重新掛載、設定系統時鐘、根據/etc/sysctl.conf設定核心參數、啟用LVM和RAID裝置、載入額外裝置的驅動程式、清理操作)
初始化流程:POST --> (BIOS)boot sequence --> MBR(bootloader) --> kernel + ramdisk(5和6不同的檔案名稱,initrd、initramfs) --> mount rootfs (ro) --> /sbin/init (CentOS 5: /etc/inittab, CentOS6 /etc/init/*.conf)
設定預設運行層級 --> 使用/etc/rc.d/rc.sysinit初始化系統 --> 分別啟動並關閉指定服務 -->Ctrl+Alt+Delete按鍵組合 --> 啟動字元終端 --> 啟動圖形終端
GRUB: GRand Unified Bootloader,grub程式由兩段組成:stage1: MBR (0柱面 0磁軌 1扇區)只為讀取隨後檔案系統指定扇區。stage1_5: MBR隨後的扇區裝載檔案系統類型。stage2: 讀取grub.conf設定檔,並實現引導功能的擴充
GRUB功能:
1、提供菜單,並提供互動式介面(e: 進入編輯模式 在核心後添加single,後按b就可以進入單一使用者模式、c:進入命令列介面模式)
2、選擇要啟動的核心或系統(允許傳遞引導參數給核心,選擇介面可隱藏)
3、為編輯功能提供保護機制(選擇運行指定的核心得先輸入密碼、使用e命令得先輸入密碼)
grub命令列介面:
root:指定哪個分區為要啟動的系統或核心檔案所在的分區,所有硬碟都識別為hd,不同的硬碟基於數位識別碼:如hd0, hd1等,同一個硬碟上的不同分區,也使用數位識別碼,如root (hd0,0)
find (DEVICE)/path/to/file,用於尋找核心在那個分區上。
kernel: 指定要啟動並執行核心檔案,例如:kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/sda3,唯讀模式掛載根檔案系統事先需要知道根檔案系統位置,必須指定ramdisk檔案
initrd:為要啟動並執行核心指定其可用的ramdisk檔案例如:initrd /initramfs-2.6.32-358.el6.x86_64.img
boot: 啟動此前配置好的核心或系統。
grub.conf檔案在/boot/grub目錄下。設定檔內容說明:
default=: 選擇第幾個title配置的核心或系統,各title從0開始編號
timeout=#: 菜單顯示的逾時時間長度;
splashimage=/path/to/some_image_file:指定菜單的背景圖片;此圖片只能為14bits色,xpm格式,gzip壓縮;
hiddenmenu: 隱藏菜單
title :顯示於菜單中的標題
root (hd0,0):指定裝載盤符
kernel /vmlinuz-2.6.32-504.12.2.el6.x86_64 ro root=/dev/sda2 selinux=0 init=/bin/bas:指定核心檔案和掛載方式,
initrd /initramfs-2.6.32-504.12.2.el6.x86_64.img:指定ramdisk檔案
grub保護機制:
產生密碼:grub-md5-crypt
保護編輯功能如(進入單一使用者模式和命令列模式),則需要title之外的添加:password --md5 密碼串
保護使用某核心,則需要核心對應的title之下添加,password --md5 密碼串
安裝grub的方式:使用grub-install命令,
安裝方式一,當前所在硬碟上安裝例如:grub-install /dev/sda
安裝方式二,在第二塊盤上添加grub常用選項:--root-directory=path,該路徑必須是核心和initrd檔案所在boot的父目錄,例如:在/mnt/boot,該指定目錄為/mnt,掛載方式:grub-install --root-directory=/mnt /dev/sdb
總結啟動次序:POST --> 引導次序(BIOS)--> BootLoader(MBR) --> kernel + ramdisk (臨時根) --> 根切換 (rootfs) --> /sbin/init (設定檔)
設定檔:設定預設運行層級 --> 指定系統初始化指令碼進行系統初始化 --> 啟動服務(關閉服務)(/etc/rc.d/rc#.d, /etc/rc.d/init.d/) --> /etc/rc.d/rc.local -> 設定CtrlAltDel組合的功用 --> 啟動終端(mingetty),並在終端附加登入程式(login) --> 如果層級為5, 則要啟動 X server
nsswitch: 檢查使用者帳號否存在如果存在,將其解析為UID;nsswitch是庫檔案,而非服務:在/usr/lib64/libnss*、/lib64/libnss*
pam: pluggable authentication module, 做使用者認證,庫 (API):/lib64/security/*
GRUB: GRand Unified Bootloader,(stage1、stage1_5、stage2)
Linux核心:單核心,模組化,核心的組成部分:/boot/vmlinuz-VERSION、/lib/modules/VERSION/下*.ko(kernel object)
核心模組管理:lsmod: 顯示核心已裝載模組
動態裝卸載模組:卸載:modprobe -r MOD_NAME或rmmod MOD_NAME、裝載:modprobe MOD_NAME 或 insmod /path/to/module_file,用insmod 必須寫明模組的完整路徑。
查看模組詳細資料:modinfo MOD_NAME。欄位說明:depends顯示相依模組
檢查並產生模組間依賴關係的命令:depmod
bash編程函數:可調用:函數名出現的地方,會被自動替換為函數體;
函數的傳回值:函數的執行結果傳回值:代碼輸出echo, print,命令執行後返回的結果
執行狀態傳回值:函數體中最後一次執行的命令狀態結果,自定函數執行狀態的傳回值:return
函數可以接受參數:在函數體中調用函數參數:位置參數($1, $2,$#, $*, [email protected])