20-1.系統啓動和內核管理centos6(grub,chkconfig,proc,lsmod)

Linux組成

Linux: kernel+rootfs

kernel: 進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
rootfs:程序和glibc(庫)
庫:函數集合, function, 調用接口(頭文件負責描述)
程序:二進制執行文件linux

內核設計流派:

  • 單內核(monolithic kernel):Linux
    把全部功能集成於同一個程序
  • 微內核(micro kernel):Windows, Solaris
    每種功能使用一個單獨子系統實現

Centos6(5)啓動流程1

image

詳細過程

  1. 加載BIOS的硬件信息,獲取第一個啓動設備
  2. 讀取第一個啓動設備MBR的引導加載程序(grub)的啓動信息
  3. 加載核心操做系統的核心信息,核心開始解壓縮,並嘗試驅動全部的硬件設備
  4. 核心執行init程序,並獲取默認的運行信息
  5. init程序執行/etc/rc.d/rc.sysinit文件
  6. 啓動核心的外掛模塊
  7. init執行運行的各個批處理文件(scripts)
  8. init執行/etc/rc.d/rc.local
  9. 執行/bin/login程序,等待用戶登陸
  10. 登陸以後開始以Shell控制主機web

  11. POST:Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串並行接口、鍵盤等硬件狀況的檢測
    • ROM:BIOS,Basic Input and OutputSystem,保存着有關計算機系統最重要的基本輸入輸出程序,系統信息設置、 開機加電自檢程序和系統啓動自舉程序等
    • RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定按次序查找引導設備,第一個有引導程序的設備爲本次啓動設備
  12. bootloader: 引導加載器,引導程序
    windows: ntloader,僅是啓動OS
    Linux:功能豐富,提供菜單,容許用戶選擇要啓動系統或不一樣的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,並把系統控制權移交給內核
    • LILO:LInux LOader :早期的,如今不用了
    • GRUB: GRand Unified Bootloader
      GRUB 0.X: GRUB Legacy, GRUB2

GRUB相關

  1. MBR:第一個扇區
    前446字節 bootloader
    中間64字節 分區表
    最後2字節 55AA
  2. GRUB
    primary boot loader : 1st stage,1.5 stage
    secondary boot loader :2nd stage,分區文件
  3. kernel
    自身初始化:
    探測可識別到的全部硬件設備
    加載最核心的硬件驅動程序(藉助於ramdisk或者ramfs加載驅動
    以只讀方式掛載根文件系統
    (而後再加載lib下的各類驅動,包括根分區/文件系統驅動等等,從新加載,再也不用img中的驅動。固然此過程也是按需加載)
    運行用戶空間的第一個應用程序:/sbin/init
    (init會根據它的配置文件進行初始化,好比啓動各類服務,並從新RW掛載根/等)

內核相關

  • Linux內核特色:
    支持模塊化:.ko(內核對象) kernel object
    如:文件系統,硬件驅動,網絡協議等
    支持內核模塊的動態裝載和卸載
  • 內核組成部分:
    核心文件:/boot/vmlinuz-VERSION-release
    ramdisk:輔助的僞根系統
    CentOS 5 /boot/initrd-VERSION-release.img
    CentOS 6,7/boot/initramfs-VERSION-release.img
    模塊文件:/lib/modules/VERSION-release

ramdisk管理

  • ramdisk:
    內核中的特性之一:使用緩衝和緩存來加速對磁盤上的文件訪問,並加載相應的硬件驅動
    ramdisk --> ramfs 提升速度
    CentOS 5 initrd.img
    工具程序:mkinitrd
    CentOS 6,7 initramfs.img
    工具程序:mkinitrd, dracut
  • ramdisk文件的製做:
    (1) mkinitrd命令
    爲當前正在使用的內核從新制做ramdisk文件
    mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
    (2) dracut命令
    爲當前正在使用的內核從新制做ramdisk文件
    dracut /boot/initramfs-$(uname -r).img $(uname -r)

注意點:

  1. 第一步POST它是屬於BIOS裏面的一個功能,第一步實際上直接先運行BIOS,而後直接再運行POST。它就是對各類硬件進行檢測,若是沒有問題就運行下一步,有問題就會報錯。任何計算機(包括linux,windows,unix)系統都會運行這一步,它和系統無關。
  2. BIOS裏進行的各類設置(好比啓動引導的選擇)它是經過RAM來進行修改的,它斷電即丟失。但日常咱們電腦關機了以後開機它仍未丟失只是由於BIOS裏面自帶電池,會讓它不斷電。可是若是一臺電腦長時間未插電,電池電量耗光,則全部的設置就會丟失亂套。
  3. 引導設備包括硬盤,U盤,光盤,網卡(從網絡中下載引導的資源)
  4. GRUB不只能引導,還能加密等進行其餘操做,實質是軟件,在linux裏面它就是一個軟件包(6以前叫grub,7上就grub2)。 GRUB和LILO不只能夠啓動linux,還能夠啓動windows.(它能夠裝多系統,啓動時選擇)
  5. GRUB分別存放在了不一樣的部分,第一部分就在MBR的0扇區(512字節)中的前446字節中。後面的存放在boot目錄下的grub(grub2)文件夾中。注意了第一部分的0扇區部分沒有文件系統,它不是文件,就是以01方式存儲的二進制。所以它的第一階段446字節並非文件,後面的第二階段纔是文件保存的。(1.5階段
  6. GRUB引導以後想要啓動什麼系統就把控制權交給什麼系統的內核。好比linux kernel.
  7. init啓動以後會根據它的配置文件進行初始化,啓動各類服務(好比ssh等等)並且會將根/從新RW方式掛載
  8. linux內核也是一個包,它集成了各類文件。除了boot下的文件,在etc下還有配置文件,包括一個調用第三方庫的配置文件,剩下的就是各類驅動模塊在lib/modules
  9. lsmod 能夠查看已經加載到內存中的模塊文件,由此也能夠看出驅動模塊是按需加載而非所有加載。只有有須要的時候纔會加載它。cat /var/log/messages能夠查看相關驅動日誌等信息(固然也包括其餘的各類信息)。 lsusb能夠查看USB設備。
  10. boot下的vmlinuz文件很小,它只存儲了最核心的驅動相關等文件。而那些次要的按需加載的驅動模塊就存放在了lib/modules/VERSION目錄中了(主要就在lib/modules下對應的內核版本VERSION文件夾中的kernel文件夾中)。這樣作的好處就是減小了最核心的內核文件(驅動等)的大小,開機加載的時候也不會加載那些按需加載的驅動模塊,若是都放在此文件裏,不只文件很大,並且開機加載浪費資源加載不少沒有必要的驅動文件。
  11. modinfo MODULE_NAME 命令可查看驅動的相關信息,包括所在位置等。
  12. 由於各類文件系統的驅動模塊不在boot下的vmlinuz文件中(按需加載文件系統,不可能都加載),所以開機通過各類步驟以後,將控制權交給內核以後,它檢測完硬件設備而後加載驅動模塊的時候,必需要知道驅動模塊所在的路徑,(此時通過grub的1.5階段已經知道了找到了各類磁盤和掛載對應等)可是想要找磁盤內的文件必須得利用文件系統來尋找(由於分區以後掛載並使用時必需要指定文件系統)。
    • 可是此時由於沒有加載根分區文件系統驅動,便沒法掛載根分區(雖然磁盤和分區能找到,他們是根據在grub階段中的分區表64字節來找的,如今已是內核階段了,沒有文件系統驅動,因此就沒辦法加載根分區文件系統,便沒法掛載),所以也沒法找到各類文件系統的驅動模塊包括其餘各類驅動等(在根下的lib中,更別說後面的掛載根目錄等操做了(總結就是要掛載根目錄必需要知道它的文件系統才能掛載,而後根據路徑找到各類驅動所在的目錄才能加載lib下的各類驅動),形成了相互矛盾。
    • 所以此時須要一個僞文件系統,把某些特定的驅動和文件(計算機啓動時須要的)放在了initranfs-VERSION.img文件中(老版本命名爲initrd),而根分區的文件系統就在這個僞文件系統img的打包文件中,這個僞文件系統在grub啓動時會和內核一併被grub加載到內存中,所以此時內核即可以從新掛載根而且進行初始化,啓動服務等操做了。
    • 能夠用下面的方式打開查看img文件(6中須要先解壓,它是gzip格式,7中不用直接就是cpio壓縮格式).
Centos6:
 gzip -d -c initramfs-2.6.32-754.el6.x86_64.img >initramfs.img :gzip文件類型,這裏若是不用-c的話會顯示後綴不對,用-c可直接重定向不用管後綴的問題
 ls
 file initramfs.img  : cpio文件類型
 cpio --help
 cpio -tv < initramfs.img  |less :查看裏面的文件
  1. 注意vmlinuz文件是官方編譯完成後的的二進制文件,出廠即給出的,在光盤中直接就存在的(isolinux目錄中)。而initramfs文件是根據本身的根的文件系統等等其餘信息安裝操做系統的時候後期臨時生成的文件,並不是出廠即帶的文件。
  2. 其中光盤中的isolinux中的initrd文件是ramdisk方式的虛擬磁盤(包括centos5),由於無論怎樣只要使用磁盤中的文件都須要文件系統,所以從6以後開始就直接改成了虛擬文件系統ramfs,不須要再畫蛇添足先虛擬磁盤,而後掛文件系統驅動,而後再找文件。
  3. 不管是哪種img(ramfs或者rd)文件,若是被破壞,則計算機啓動時沒法加載驅動模塊,則沒法掛載根分區便會致使沒法啓動。

系統啓動流程

  1. 系統初始化:
    POST --> BootSequence (BIOS) --> Bootloader(MBR) -->kernel(ramdisk) --> rootfs(只讀) --> init(systemd)
  2. init程序的類型:
    • SysV: init, CentOS 5以前
      配置文件:/etc/inittab
    • Upstart: init,CentOS 6
      配置文件:/etc/inittab, /etc/init/*.conf
    • Systemd:systemd, CentOS 7
      配置文件:/usr/lib/systemd/system
      /etc/systemd/system

注意點:

  1. 5 6 7版本的init進程分別來自三個不一樣的rpm包,5中是redhat所寫,6中是ubuntu所寫,7中是紅帽員工所寫。
  2. 5以前版本的/etc/inittab中定義了許多功能,都放在了這個文件中,6中它只有控制開機進入的runlevel功能(其餘的功能分散放在了其餘位置的文件中),而7中徹底不用這個文件了。
  3. 單用戶模式只能一個終端一個用戶(root)登錄使用,它能夠破解root口令。開機的時候按a進入選擇模式而後直接輸入1(或者S s single) 進入單用戶模式便可(centos 6中)。而後此時即可以用passwd命令修改口令或者直接改shadow文件把口令刪掉。
  4. cat /etc/rc.d/rc.sysinit:此文件中(5中6中都有)就是開機以後運行的初始化配置腳本
  5. 以5中的/etc/inittab爲例, 其中第一行設定好初始runlevel以後,而後設置初始化/etc/rc.d/rc.sysinit腳本,而後按照默認的啓動runlevel編號來執行一次性任務/etc/rc.d/rc # 腳本,其中#就是編號。對應編號就會進入到對應/etc/rc#.d/文件夾中執行裏面的K*和S*開頭的腳本.
    • 這些腳本其實都是軟連接,它們指向了真正的服務腳本在/etc/init.d/文件夾中(注意/etc/init.d也是個軟連接,它指向/etc/rc.d/init.d文件夾)。只不過這裏用K*和S*開頭表明在這個模式下以K開頭的腳本服務中止服務,而以S開頭的腳本中的服務啓動服務.(這個配置就寫在/etc/rc.d./rc腳本中),只要第一次開機啓動或者說用init命令切換模式,就會根據此相對應的模式編號文件夾中的KS軟連接來關閉或者啓動相對應的守護進程。
    • 在/etc/init.d/文件夾中的腳本 後面加上參數 stop 就至關於中止此服務,start就是啓動此服務(正好符合rc腳本中的命令)
    • 注意:在這裏K開頭和S開頭的腳本是按照ls的順序來一個一個執行的,有些服務具備關聯性的要先啓動某個服務再啓動它就要放到後面的順序中啓動,固然關閉的時候就要放到前面來關閉。也就是說K後面的排序越小,S後面的排序就越大。反之亦然。(注意排序是按照ls的排序,也就是先數字,再字母;字母按照字符串比較大小的方式來排序)
  6. 接上,若是本身要設置並編寫啓動腳本,放在/etc/init.d/文件夾中,同時在相對應的想要啓動和關閉這個服務的/etc/rc#.d/文件夾中設置軟連接,可是儘可能吧本身的服務K編號寫的比較靠前同時把S編號的腳本寫的比較靠後用於避免依賴性的問題比較好。
    • 注意了針對同一個腳本服務的軟連接文件K和S在一個rc#.d中不可能同時存在,否則K開頭的就至關於沒用了(先執行K而後S將它覆蓋啓動了)

ntsysv 和chkconfig 在下面有詳細介紹用於更改啓動守護進程

  1. service 服務 status , 就至關於 /etc/init.d/服務 status; 這兩個命令等價,只是前面的命令避免了再書寫服務路徑。status,stop,start等等都是服務腳本的參數。
  2. 這些init.d裏面的服務被叫作deamon(守護進程),它和終端以及用戶無關,開機便可以設置啓動或者不啓動。
  3. 參考init.d中的文件格式,能夠本身書寫服務腳本放在init.d文件夾中並加上執行權限。
#!/bin/sh
# chkconfig: 345 99 2   :這一項最前面的數字表明此項服務第一次加入本機的時候在哪些模式下啓動(也就是S的模式,沒寫的就是K,它只在第一次加入服務時有效,後面用chkconfig更改後就無效了),第二個數字表明啓動的S編號數字,第三個表明關閉的K編號數字。
:若是全部模式都是S則寫上0123456,全部模式都是off寫上-(第一位的數字);後面的兩個數字是SK的順序和它無關
# description: testservice   :這一項在5中必須有,在centos6中能夠不寫了。不過chkconfig在5 6中都必須有。
  • 注意init.d中的腳本不必定都在chgconfig --list中顯示出來,有function,還有killall都沒有在裏面顯示,由於它們都不符合格式要求。
  • 所以本身編寫的服務腳本必定要符合格式要求才能夠。
  1. 若是想要實現本身編寫的腳本能夠用service 腳本 start|status|stop|restart 等命令,能夠參考init中其餘腳本所寫的方式,也能夠本身定義函數而後在本身所寫的服務腳本里面引用。則就能夠用這種命令的格式了。(service命令就至關於執行init.d裏面的腳本,把路徑給加上了而已,至於命令參數什麼的都得本身在腳本中寫)
  2. 寫完腳本加上執行權限以後就能夠直接「service 腳本名」 的方式來執行腳本了,可是chkconfig列表中仍未顯示,用「chkconfig -add 腳本名」 加入服務列表中,它就會按照所寫的模式加入。而後能夠再用chkconfig [--level 345] 腳本名 on|off 來調整。
  3. 刪除的話同理用chkconfig -del 腳本名的方式來刪除,這樣才能刪除乾淨,把軟連接和--list中都去除。此時腳本還保留在init.d目錄中,若是不想要了也能夠刪掉。
  4. 更簡單的方式是把想要運行的簡單配置或者程序直接寫在/etc/rc.d/rc.local文件中便可,它在2345模式中都被S99Local軟連接指向。所以它會開機運行全部服務以後本身再運行。ubuntu

    • Centos6上直接寫入此文件中便可,centos7上面由於它沒有執行權限,因此必須本身加上執行權限
  5. 注意了,centos6中 /etc/rc.d/文件夾中的纔是真正的文件,而/etc/下面也有和etc/rc.d文件夾中如出一轍的文件,不過/etc下的文件所有都是軟連接,指向/etc/rc.d下的文件(或者文件夾)
  6. 複習知識點:軟連接文件夾裏面的軟連接其實就是這個軟鏈接文件夾對應的原文件夾內的存儲的軟連接。若是刪除掉這個軟鏈接文件夾內的軟連接則原始文件夾內的軟連接也會被刪除。 雖然路徑在軟鏈接文件夾內和原文件夾內不相同,可是裏面的任何文件包括連接文件其實都是同一個。
  7. service --status-all 能夠看到全部的服務(不論運行不運行)的狀態,注意和chkconfig --list的區別。
  8. 繼續解釋/etc/inittab(centos5中爲例)的下一行,其中解釋了ctrl+alt+delete三個按鍵的操做結果就是3秒後關機,而在6則不在這個文件中,在/etc/init/control+alt+delete.conf中。這三個鍵的功能最好註釋掉以避免錯誤操做致使系統自動重啓(字符界面3模式直接重啓,圖形界面5模式彈出對話框選擇是否重啓)
  9. centos5中還有斷電關機以及來電取消關機的設置。(非正常斷電基本上有UPS電池,它會供電一段時間而後完成必要的工做再關機,若是在這個階段來電了則取消關機命令)
  10. 接着就是重啓6個終端的命令(這也是爲什麼以前kill mingetty命令並不能關掉它的緣由,在這裏規定了自動重啓)。若是想再多開終端,能夠繼續添加(按ctrl+alt+F1-6,本身添加的話能夠更多,其中tty後面的字符表明ctrl+alt後面的FN的數字)
  11. 最後一個是圖形界面模式爲5,若是改成其餘模式則其餘模式也能夠變成圖形模式(注意各類模塊rc#.d中的驅動啓動狀況)。5和3的區別就是在這裏,多運行了一個X11協議守護進程。

啓動流程2

  • /sbin/init CentOS6以前
    運行級別:爲系統運行或維護等目的而設定;0-6:7個級別
    0:關機
    1:單用戶模式(root自動登陸), single, 維護模式,只能一個終端登錄
    2: 多用戶模式,啓動網絡功能,但不會啓動NFS;維護模式
    3:多用戶模式,正常模式;文本界面
    4:預留級別;可同3級別
    5:多用戶模式,正常模式;圖形界面
    6:重啓
  • 默認級別:3, 5
  • 切換級別:init #
  • 查看級別:runlevel ; who -r

init初始化(早期版本)

init讀取其初始化文件:/etc/inittab
初始運行級別(RUN LEVEL)
系統初始化腳本
對應運行級別的腳本目錄
捕獲某個關鍵字順序
定義UPS電源終端/恢復腳本
在虛擬控制檯生成getty
在運行級別5初始化Xc#

CentOS 5 的inittab文件

  • 配置文件:/etc/inittab
  • 每一行格式:
    id:runlevel:action:process
    id:是唯一標識該項的字符序列
    runlevels: 定義了操做所使用的運行級別
    action: 指定了要執行的特定操做

    wait: 切換至此級別運行一次
    respawn:此process終止,就從新啓動之
    initdefault:設定默認運行級別;process省略
    sysinit:設定系統初始化方式,後面跟文件代表按照此文件配置進行初始化
    process:定義了要執行的進程windows

示例:CentOS 5 的inittab文件centos

id:5:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down」
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled」
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon

CentOS 6 /etc/inittab和相關文件

  • /etc/inittab
    只設置系統默認的運行級別
    id:3:initdefault:
  • 示例:
    破解CentOS 6 的root口令操做

/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf緩存

  • 啓動流程
  • /etc/rc.d/rc.sysinit: 系統初始化腳本
    (1) 設置主機名
    (2) 設置歡迎信息
    (3) 激活udev和selinux
    (4) 掛載/etc/fstab文件中定義的文件系統
    (5) 檢測根文件系統,並以讀寫方式從新掛載根文件系統
    (6) 設置系統時鐘
    (7) 激活swap設備
    (8) 根據/etc/sysctl.conf文件設置內核參數
    (9) 激活lvm及software raid設備
    (10) 加載額外設備的驅動程序
    (11) 清理操做安全

  • 說明:rc N --> 意味着讀取/etc/rc.d/rcN.d/
    K*: K##*:##運行次序;數字越小,越先運行;數字越小的服務,一般爲依賴到別的服務
    S*: S##*:##運行次序;數字越小,越先運行;數字越小的服務,一般爲被依賴到的服務

for srv in /etc/rc.d/rcN.d/K; do
$srv stop
done
for srv in /etc/rc.d/rcN.d/S
; do
$srv start
donebash

啓動過程總結centos6(5):

BIOS中POST加電自檢-->BIOS選擇啓動設備(Cmos設置)-->尋找啓動設備MBR分區標頭以及啓動信息bootloader(前446字節)並加載它(grub)-->bootloader(grub)選擇指定的內核加載(同時加載initramfs),並移交控制權-->內核結合initramfs.img文件識別文件系統並掛載根目錄-->內核加載第一個進程/sbin/init --> init根據配置文件(/etc/inittab)運行rc.sysinit腳本(包括設置默認運行級別、完成系統初始化等等)--> (關閉對應下須要關閉的服務)啓動須要啓動服務(rc#.d各類開啓關閉服務,以及最後的rc.loacl服務腳本) --> 設置登陸終端網絡

CentOS 6 init程序爲: upstart, 其配置文件:

/etc/inittab, /etc/init/*.conf,配置文件的語法 遵循 upstart配置文件語法格式,和CentOS5不一樣

利用ntsysv命令能夠來控制服務開機啓動或者不啓動,以及調整啓動順序。不過它默認設置的是當前模式下的服務,星號表明啓動,空表明不啓動,用空格鍵設置。能夠用ntsysv --level=#(編號)來修改特定模式下的啓動服務等

它本質上改的也就是/etc/rc#.d/文件夾中的軟連接標誌將K和S互換。不過須要注意它必須下次啓動才能生效,當前已經啓動的不會有影響。

chkconfig命令

ntsysv命令
chkconfig命令

  • 查看服務在全部級別的啓動或關閉設定情形:
    chkconfig [--list] [name]
  • 添加:
    SysV的服務腳本放置於/etc/rc.d/init.d (/etc/init.d)
    chkconfig --add name
    #!/bin/bash
    #LLLL 表示初始在哪一個級別下啓動,-表示都不啓動
    chkconfig: LLLL nn nn
  • 刪除:
    chkconfig --del name
  • 修改指定的連接類型
    chkconfig [--level levels] name <on|off|reset>
    --level LLLL: 指定要設置的級別;省略時表示2345
    例子: chkconfig atd on :通常都是這樣寫
  • 注意:chkconfig 服務 on|off ; 表明下次開機啓動或者關閉
  • service 服務 start|stop|status 表明當前關閉或者啓動 (7中相似用systemctl)

xinetd管理的服務

  • service 命令:手動管理服務
    service 服務 start|stop|restart
    service --status-all
  • 瞬態(Transient)服務被xinetd進程所管理
    進入的請求首先被xinetd代理
    配置文件:/etc/xinetd.conf、 /etc/xinetd.d/<service>
    與libwrap.so文件連接
    用chkconfig控制的服務:
    示例:chkconfig tftp on

超級守護進程xinetd

  1. 好比安裝telnet-server服務的時候就會順便關聯這個超級守護進程一併安裝。而且在chkconfig --list中能夠查看到。若是是off狀態,說明xinted沒法激活telnet服務也沒法關閉它,至關於沒有開啓監控功能。必須在/etc/xinetd.d/文件夾下的telnet配置文件中修改disabled 爲 no以後才能夠開啓xinetd監護telnet的功能。
    • 固然用chkconfig telnet on|off 也能夠直接開啓關閉telnet,但這裏的開啓關閉也是對於xinetd服務來講的開啓關閉監聽telnet功能,本質上也就至關於更改了上面寫的配置文件。
  2. 但此時新裝好的xinetd服務並無開啓,須要service xinetd start開啓xinetd服務以後才能夠真正監聽telnet服務。(注意它和1的區別以及chkconfig xinetd on|off的區別
  3. 此時當由用戶訪問telnet服務的時候它就會開啓telnet服務,當沒有用戶訪問的時候就會自動關閉telnet服務。可用ss -ntlp 或者lsof -i :23來查看是不是xinetd服務在監聽此23端口。
  4. Centos7中已經用systemd服務來監聽了。xinetd就被淘汰使用了(固然也能夠用,不過不必了)

注意點:

  1. 注意BIOS中按照引導設置找到引導設備(硬盤,光盤,U盤,網卡等)以後,而後根據裏面的MBR表頭的前446字節中的引導信息來進行操做系統的加載引導。這裏面目前經常使用的就是gurb的第一階段。
  2. 注意了grub是一個引導操做系統的程序,用來啓動操做系統,而BIOS也是一個啓動引導程序,它包含POST,找到引導硬件等等(詳情看其餘博客介紹)。BIOS開機就會啓動,然後面用不用grub則要看BIOS找到的引導硬件裏的引導信息中的bootloader是否是grub程序,注意它倆的區別。
  3. BIOS是和UEFI相對應的,一個16位尋址,一個64位尋址,分別主要用於MBR分區和GPT分區格式的系統引導。 MBR分區格式中,BIOS引導必須將系統裝在MBR分區格式的硬盤分區(中,BIOS會找這個硬盤的活動分區(記載了引導程序,也就是ntloader,grub。winloader.exe這種啓動程序的分區),而後根據它的設置來啓動操做系統。UEFI則是另外的方式,BCD文件夾(windows中用winload.efi)
  4. grub則是和ntloader等引導程序對應的,包含於BIOS下面,屬於bootloader,不是和BIOS屬於同一個級別的。它在linux中grub做用於MBR分區格式下,做用階段在BIOS尋找啓動設備,而後在硬盤啓動(其實其餘方式啓動用GRUB也是相似這樣的MBR過程)的活動分區MBR中找啓動信息(前512字節,第一個扇區),它只是用來引導啓動操做系統內核,內核啓動以後就沒它的事情了,就靠內核來運行第一個進程init來進行各類模塊驅動等的初始化了。

grub legacy

CentOS 6啓動流程:
POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) -->rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別 --> 系統初始化腳本rc.sysinit --> 關閉或啓動對應級別的服務 --> 啓動終端
參看:https://s4.51cto.com/wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg

grub: GRand Unified Bootloader
grub 0.97: grub legacy
grub 2.x: grub2

  • grub legacy:
    stage1: mbr
    stage1_5: mbr以後的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統,從而能找到stage2中的grub文件夾以及內核,img文件
    stage2:磁盤分區(/boot/grub/)

grub安裝(修復)

安裝grub:

(1) grub-install:非交互式
安裝grub stage1和stage1_5到/dev/DISK磁盤上,並複製GRUB相關文件到 DIR/boot目錄下
命令:grub-install --root-directory=DIR /dev/DISK
(2) grub:交互式
grub> root (hd#,#)
grub> setup (hd#)

grub legacy

  1. 配置文件:/boot/grub/grub.conf <—— /etc/grub.conf
    stage2及內核等一般放置於一個基本磁盤分區

    • 功用:
      (1) 提供啓動菜單、並提供交互式接口
      a:內核參數
      e: 編輯模式,用於編輯菜單
      c: 命令模式,交互式接口
      (2) 加載用戶選擇的內核或操做系統
      容許傳遞參數給內核
      可隱藏啓動菜單
      (3) 爲菜單提供了保護機制
      爲編輯啓動菜單進行認證
      爲啓用內核或操做系統進行認證
  2. grub的命令行接口
    help: 獲取幫助列表
    help KEYWORD: 詳細幫助信息
    find (hd#,#)/PATH/TO/SOMEFILE:
    root (hd#,#)
    kernel /PATH/TO/KERNEL_FILE: 設定本次啓動時用到的內核文件;額外還可添加許多內核支持使用的cmdline參數
    例如:max_loop=100 selinux=0 init=/path/to/init
    initrd /PATH/TO/INITRAMFS_FILE: 設定爲選定的內核提供額外文件的ramdisk
    boot: 引導啓動選定的內核
  3. cat /proc/cmdline 內核參數
    內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernelparameters.txt

  4. 識別硬盤設備
    (hd#,#)
    hd#: 磁盤編號,用數字表示;從0開始編號
    #: 分區編號,用數字表示; 從0開始編號
    (hd0,0) 第一塊硬盤,第一個分區
  5. 手動在grub命令行接口啓動系統
    grub> root (hd#,#)
    grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
    grub> initrd /initramfs-VERSION-RELEASE.img
    grub> boot

grub legacy配置文件

配置文件:/boot/grub/grub.conf
default=#: 設定默認啓動的菜單項;落單項(title)編號從0開始
timeout=#:指定菜單項等待選項選擇的時長
splashimage=(hd#,#)/PATH/XPM_FILE:菜單背景圖片文件路徑
password [--md5] STRING: 啓動菜單編輯認證
hiddenmenu:隱藏菜單
title TITLE:定義菜單項「標題」 , 可出現屢次
root (hd#,#):查找stage2及kernel文件所在設備分區;爲grub的根
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啓動的內核
initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件
password [--md5|--encrypted ] STRING: 啓動選定的內核或操做系統時進行認證

grub加密

生成grub口令
grub-md5-crypt
grub-crypt

  • 破解root口令:
    啓動系統時,設置其運行級別1
  • 進入單用戶模式:
    (1) 編輯grub菜單(選定要編輯的title,然後使用a 或 e 命令)
    (2) 在選定的kernel後附加1, s, S,single 均可以
    (3) 在kernel所在行,鍵入「b」 命令

注意點:

  1. 若是grub1階段找不到或者錯誤,BIOS會自動尋找下一個能夠啓動的硬盤引導設備(按照啓動順序設置一個一個找設備)。
  2. grub-install命令,後面直接跟上想要修復的硬盤或者設備(好比/dev/sda)
    • 注意若是boot文件夾和不在根文件夾下面,也就是說不是boot不是/boot 而是在其餘的文件夾下,則要寫上boot文件夾所在的上級目錄,若是就在根下面則不用寫了。這一點別忘了.
    • 更多的詳細信息關於--root-directory=DIR直接查看man幫助(6和7不一樣,7是2代grub,且能夠GPT EUFI啓動)
  3. 重要注意點1:只有啓動設備(好比第一個硬盤/dev/sda)的前446字節纔會有bootloader,也就是grub的信息,它會在安裝系統的時候自動寫上grub的信息。然後面添加的新硬盤的MBR(好比/dev/sdb,sdc等)則前面446字節爲0,只有後面64字節有分區信息。
    • 固然能夠裝多個grub,一個硬盤裝一個,則這每個硬盤都可以做爲啓動設備來使用並啓動計算機。
  4. 重要注意點2:grub的做用只是引導啓動操做系統內核,啓動完內核它便會移交控制權,結束自己的工做。同時根據3中能夠看出,若是硬盤MBR前446字節錯誤,只是說它不能做爲啓動引導設備,可是它的硬盤分區表64字節若是並未損害,仍然能夠被識別分區而且掛載(掛載前裏面的各個分區要有文件系統),注意分區表和bootloader的區別。
    • 所以,在光盤救援模式下,只要系統經過光盤引導並加載到內存中啓動了一個小型LINUX系統,則損壞了446字節但64字節分區表沒被損壞的硬盤就至關於3中後加的硬盤同樣,直接掛載使用便可(而後就能夠用光盤對其進行grub的安裝和修復)
  5. 交互式安裝grub時候,指定grub所須要的恢復文件的boot所在的目錄位置時,root(hd#,#),第一個表明硬盤,第二個表明此硬盤內的哪一個分區。通常boot單獨分離出來掛載一個分區的時候(系統安裝時)會自動把它排在硬盤第一個分區。所以/dev/sda1 (boot的掛載目錄),就是root(hd0,0)
    • 注意這個交互式安裝時是按照/boot 所在的目錄的stage1 1.5 2等備份文件來進行恢復的,若是沒有這些備份文件則不能用交互式。
    • 交互式內還能夠輸入一些其餘命令,好比help查看幫助
    • setup(hd0)指定安裝MBR446字節的硬盤位置。因而可知/boot文件夾和啓動設備硬盤能夠不在一個硬盤上,也就是這個硬盤只用來引導啓動而另一個硬盤裝內核和grunstage2來啓動系統。
  6. 重要注意點3:注意grub操做完畢的時候要用sync命令(多輸入幾回)讓命令從緩衝區寫入磁盤中,以避免並無保存。(也能夠從新掛載硬盤設備讓它直接寫入磁盤的方式,在前面所學的mount中可見此命令)
  7. 在啓動過程當中boot目錄grub下的grub2.conf配置文件是最重要的必要文件,而其餘的文件即便丟失或者不存在計算機也可以正常啓動。
    • 它保存了grub第二階段1.操做系統內核位置2.操做系統根相關的掛載配置設置3.initramfs.img僞文件系統的位置。
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password=
title CentOS 6 (2.6.32-754.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=d5db5e08-dc6d-4b6e-84fc-7e490e44ba0c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    initrd /initramfs-2.6.32-754.el6.x86_64.img
  • 由分析可知 root (hd#,#) 就是表明了第幾塊硬盤的第幾個分區,它是grub程序所找的根(狹義上能夠理解爲boot文件夾所在的硬盤分區,由於默認內核和img文件就裝在這裏,)在這裏這個根就表明着boot這個文件夾,或者說表明root (hd#,#) 所指的分區的掛載的文件夾(由於它就是boot 因此 / 符號在這裏就是表明/boot這個文件夾)
  • 而內核掛載後 root=/dev/sda2 纔是操做系統的根,對其進行各類掛載配置
  • 此項也可不寫,不過下面的kernel 和 initrd兩項就要寫成(hd0,0)/##### 的形式了
  • 重要注意4: grub1階段完成以後,由於446字節很小不可能放得下文件系統的驅動,雖然分區表能找到分區/dev/sda1,可是grub程序是如何找到/boot目錄以及它裏面的grub,conf文件的?(尋找文件須要掛載時加載相應的文件系統驅動纔可,只找到分區沒有文件系統不行)。這裏就是靠的1扇區後面的更多扇區的grub1.5階段來實現的。
  • grub 1.5階段就記載了boot目錄的文件系統驅動(且只記載了它的驅動,沒有記載其餘的),它的扇區數量不固定,根據文件系統驅動的大小和安裝時的設定來動態分配的。通過grub1.5階段,識別了boot分區的文件系統,才能找到boot目錄以及它的grub.conf文件
  • 重要注意5:操做系統根分區的虛擬文件系統驅動(第一次只讀掛載時),就是靠grub.conf中寫的initramfs.img文件來加載的(grub1.5只記載了boot的,否則這個img文件缺失了爲什麼根就掛載不了了?,說明grub只管boot,img只管操做系統根,img缺失了機器能用grub硬盤啓動可是沒法掛載根)。
  1. 注意內核kernel和initrd兩行順序不能寫反。title表明了標題欄選項,每一項就是一個選擇內核的標題欄。

    • quiet表示內核安靜模式啓動,不顯示內核啓動的各類信息。這兩項能夠去掉。
    • rhgb項表明圖形界面顯示(轉圈等待的那個圖形界面),在這個界面按esc鍵才能看到被它遮蓋的啓動信息;
    • default表明默認啓動選擇哪個菜單的內核,timeout就是相對應的多少秒內沒有操做就會啓動默認菜單的時長。
    • hiddenmenu 若是不敲任意鍵,則默認隱藏菜單
    • splashimage(=(hd0,0)/grub/splash.xpm.gz)表明啓動的時候後面的背景圖片,能夠本身更改。*(大小就是640480像素圖片,後綴爲xpm,而且要壓縮爲gz)**
      可在linux裏安裝ImageMagick包,而後用convert命令轉換它:convert -resize 640x480 -colors 14 win.jpg win.xpm , 而後路徑寫上便可。
      以後再對其進行壓縮,放到boot目錄中,在grub.conf中指定它便可更改啓動時菜單欄的背景圖片了(注意不是rhgb的那個,這個是菜單欄背景圖)
    • 重要注意6:當規定了root (hd0,0) 以後,經測試要把全部相關文件都放在這個分區內纔可。可放在這個分區不一樣的文件夾,可是必須在這個分區內。緣由就是由於grub一次只能識別一個分區和它相應的文件系統。
  2. 前面也提到過grub交互式只是恢復備份文件,若是沒有這些文件則沒法用這個命令。所以用grub-install命令更加經常使用:

    • grub-insatall /dev/sda :注意直接寫硬盤不要寫分區,由於grub就是在MBR中,它在硬盤的第一個扇區和分區無關。
    • 若是boot文件夾掛載點不直接在操做系統根目錄下,則要加上boot掛載的文件夾目錄--root-directory=DIR.
    • 這個命令不只能修復grubstage1 ,還能修復grubstage1.5 以及grub文件夾下的各個備份文件(其實就是文件系統驅動等),可是不能修復grub.conf文件和圖片文件
  3. 重要注意7:grub-install /dev/sda命令執行過以後,若是隻留下grub.conf文件,機器此次不能像以前那樣正常啓動了,會出現error 15的錯誤。說明此命令和原裝的系統grubstage2的文件仍是略有區別的,雖然表面上看起來是修復成功了。此時只能光盤救援模式(想要用此命令必須切換根纔可)
  4. 爲了不啓動過程當中root口令被破解(按a切換1模式),所以能夠在grub.conf中加一行password=### 來加口令,這樣開機進入選擇界面時就須要輸入密碼了。
    • 固然要用加密的方式進行書寫,利用命令 grub-crypt 或者 grub-md5-crypt 生成密碼而後複製進去暗文便可。(最好用grub-crypt,$6加密)不過須要注意指明加密的方式 :
      password --md5 $1#####
      password --encrypt $6######

/proc目錄

  • /proc目錄:
    內核把本身內部狀態信息及統計信息,以及可配置參數經過proc僞文件系統加以輸出
  • 幫助:man proc
  • 參數:
    只讀:輸出信息
    可寫:可接受用戶指定「新值」來實現對內核某功能或特性的配置
  • /proc/sys目錄
    (1) sysctl命令用於查看或設定此目錄中諸多參數
    sysctl -w path.to.parameter=VALUE
    sysctl -w kernel.hostname=mail.magedu.com
    (2) echo命令經過重定向方式也能夠修改大多數參數的值
    echo "VALUE" > /proc/sys/path/to/parameter
    echo 「websrv」 > /proc/sys/kernel/hostname

sysctl命令

  • sysctl命令:
    默認配置文件:/etc/sysctl.conf
    (1) 設置某參數
    sysctl -w parameter=VALUE
    (2) 經過讀取配置文件設置參數
    sysctl -p [/path/to/conf_file]
    (3) 查看全部生效參數
    sysctl -a
  • 經常使用的幾個參數:
    net.ipv4.ip_forward :數據包轉發
    net.ipv4.icmp_echo_ignore_all :是否忽略icmp的請求,若是改成1則忽略,便禁止了ping本機的功能
    vm.drop_caches :清空buffer/cache,要設置爲3

/sys目錄

  • /sys目錄:
    sysfs:爲用戶使用的僞文件系統,輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的設定信息;有些參數是能夠修改的,用於調整硬件工做特性
    udev經過此路徑下輸出的信息動態爲各設備建立所須要設備文件,udev是運行用戶空間程序
  • 專用工具:udevadmin, hotplug
    udev爲設備建立設備文件時,會讀取其事先定義好的規則文件,通常在/etc/udev/rules.d及/usr/lib/udev/rules.d目錄下

注意

  1. sysctl命令就是經過修改/etc/sysctl.conf文件來永久保存開機以後寫入proc/sys文件夾中的各類配置。直接修改proc/sys的方式只能臨時修改(好比echo 1修改網卡的數據轉發)。
  2. 在這個配置文件中的每一項都省略了/proc/sys標頭,這裏面的每一項的/標誌被換爲了.符號
    • 修改以後不會當即生效,使用sysctl -p命令讓它當即生效。
    • 若是文件中沒有默認寫入的配置,則能夠手寫進去,就好比禁止ping功能的項。不過要注意格式。
  3. 可是要注意若是生效的項被刪除了,則用sysctl -p命令從新載入的時候不會修改被刪除的這一項的值。由於它只是讀入此文件並加載到內存中配置,若是不相同的設置纔會覆蓋掉。
    刪除掉某一項至關於沒有配置,所以只能修改文件中每一項後面的值而不是刪除這一項。
  4. 利用sysctl -a命令查看全部正在生效的配置,也能夠利用sysctl -w 直接修改文件中的每一項的值(也是永久修改保存)。格式也是按照文件中的格式來寫的,都是點.的符號
  5. Centos7中此文件爲空,只能本身所有手寫配置。可先用sysctl -a|grep來查詢而後再書寫。
  6. 利用man proc來查看各類設置的功能和選項,好比drop_caches,由於許多內核默認設置都比較保守,所以須要更改它

內核編譯

  • 單內核體系設計、但充分借鑑了微內核設計體系的優勢,爲內核引入模塊化機制
  • 內核組成部分:
    kernel:內核核心,通常爲bzImage,一般在/boot目錄下名稱爲 vmlinuz-VERSION-RELEASE
    kernel object:內核對象,通常放置於/lib/modules/VERSION-RELEASE/
  • 輔助文件:ramdisk
    initrd
    initramfs

內核版本

  • 運行中的內核:
    uname命令:
    uname - print system information
    uname [OPTION]...
    -n: 顯示節點名稱
    -r: 顯示VERSION-RELEASE
    -a:顯示全部信息

內核模塊命令

lsmod命令:

顯示由核心已經裝載的內核模塊
顯示的內容來自於: /proc/modules文件(cat /proc/modules)

  • 其中各項表明模塊名,大小(以K爲單位),被使用的次數,以及當前模塊被by下面的模塊所依賴

modinfo命令:

顯示模塊的詳細描述信息
modinfo [ -k kernel ] [ modulename|filename... ]
-n:只顯示模塊文件路徑
-p:顯示模塊參數
-a:做者
-d:描述
示例:
lsmod |grep xfs
modinfo xfs
複習知識點:ethtool -i eth0

內核模塊管理

modprobe命令:

裝載或卸載內核模塊
modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ]
modprobe [ -r ] modulename… :-r 卸載 不寫-r 加載

  • 配置文件:/etc/modprobe.conf,或/etc/modprobe.d/*.conf
  • 有些模塊須要某些參數設置,則就會在上面所寫的配置文件中寫入,modprobe裝載模塊時會自動裝載對應的這些配置文件
  • 此命令不須要寫模塊路徑只須要寫名字,同時也能夠自動解決模塊的依賴性,會把相關模塊也同時加載

depmod命令:

內核模塊依賴關係文件及系統信息映射文件的生成工具

裝載或卸載內核模塊:

insmod命令:指定模塊文件,不自動解決依賴模塊

  • (install mod)insmod必須指定模塊的全路徑且不能解決依賴性
    insmod [ filename ] [ module options... ]
    insmod `modinfo –n exportfs`
    lnsmod `modinfo –n xfs`

rmmod命令:卸載模塊,直接寫模塊名便可

rmmod [ modulename ]
rmmod xfs
rmmod exportfs

附加知識點:NTFS文件格式的支持在epel源中有包能夠進行操做。會多一個mount.ntfs命令,對NTFS格式文件系統的分區進行掛載以後即可可讀可寫。

啓動流程圖

相關文章
相關標籤/搜索