天天看點

+++++++X86平台系統啟動流程

作業系統的組成、核心的功能、庫、函數、頭檔案、函數名、Linux核心、X86平台系統啟動流程

忘記密碼如何登陸系統

作業系統的組成:kernel + rootfs , kernel + 應用程式

kernel的功能

    1、輸出系統調用

    2、實作tcp/ip,檔案系統

    3、協調硬體工作

    4、子產品化裝載驅動,讓硬體工作

kernel完成的功能

程序管理:(建立、排程、銷毀、程序結構體、task struct、tast list、虛拟記憶體空間和位址、實體記憶體空間和位址、常駐記憶體集、虛拟記憶體集、程序間通信IPC機制、核心多任務工作、程序的類型、結構、定義、程序的狀态) 建立程序和銷毀程序系統調用

網絡管理(網絡定義、CSMA/CD、PARC實驗室、網絡拓撲、網橋和交換機隔離沖突産生廣播(MAC表)、MAC、路由器隔離廣播域(路由表)、IP協定、分類、子網路遮罩的作用、ARP協定和攻擊方式?、廣域網和城域網、端口号作用、程序間通信、URL、ISO的OSI模型、如何将主機接入網絡 建立、綁定、監聽socket(多路複用)) 核心中實作tcp/ip協定,通過系統調用輸出

記憶體管理(申請記憶體、釋放記憶體) 通過系統調用完成 

檔案系統 (檔案系統中識别一切皆是檔案,按名存取,交換分區,日志型檔案系統和非日志型檔案系統,格式化,VFS,)通過系統調用open() read() write()

安全管理: selinux,權限模型

驅動程式

為什麼會用到rootfs?

linux系統運作需要路徑完成,目錄格式在FHS中定義。不同路徑提供完成不同的功能,/bin,/sbin開機所需的程式,/lib,/lib64開機程式所依賴的庫

作業系統的組成:kernel + 程式(【程式運作時所依賴的】庫+二進制程式)

庫和二進制程式的差別

相同:都是程式

不同:

    庫: 沒有執行入口,隻能作為有執行入口程式的片段運作,與運作的程式一塊存活(函數的生命周期)

    二進制程式有執行入口

程式開發調用的庫 和 源碼編譯為二進制程式運作時加載至共享記憶體中的庫不相同

程式開發時,調用syscall二次封裝的庫(Glibc庫 gun/libc)及檢視頭檔案

glibc庫的位置: /usr/lib,/usr/lib64,/lib,/lib64

頭檔案:記錄庫的數量和有多少個調用的函數庫,函數名,及可向函數傳遞的參數

庫:函數集合,functions 功能

函數:代碼片段,函數可以接受參數,完成靈活多樣的功能

函數名:友善使用代碼就為其取了一個名字

    調用函數:即為調用函數名,完成功能

    調用接口:即為功能入口或功能的名字

依據庫被調用執行後是否有執行結果傳回對庫調用進行分類

    過程調用:沒有傳回值,procedure

    函數調用:有傳回值:function

kernel了解

   單核心:所有功能在核心單個程序中以線程實作。穩定,效率高。如果任何一處出故障,全體崩潰。(Linux)

   微核心:所有功能獨立成一個子系統。不穩定,效率低。任何處出故障不影響全局,可單子產品修複。(Windows,Solaris)

   微核心理論比單核心更為先進,但是微核心多個子系統間的協調過于複雜,是以單核心和微核心設計思想或建構方式不分伯仲。

Linux核心

    1、程序輕量,輕量到相當于微核心中線程線程的概念。

    2、程序中類似于輕量級程序模式運作程序,程序稱為thread

    3、linux線程實作與windows、Solaris不一樣

    4、當有人質疑Linux使用單核心時,linus曾說:隻要linux能跑起來,而且沒有什麼嚴重的問題,我們就應該讓它進行下去,畢竟穩定壓倒一切

    5、吸收微核心設計:支援子產品化設計:核心中子產品 .ko (kernel object) 程式調用的庫 .so (share object) 子產品相當于程式的庫的概念,隻是子產品隻能被kernel調用。庫隻能被程式調用

    6、更多硬體、協定、檔案系統運作

kernel組成

    核心檔案: /boot/vmlinuz-VERSION-release

        ramdisk: (安裝系統後由,安裝程式生成)

            CentOS 5: /boot/initrd-1.2.3-1.OS.CPU.img

            CentOS 6+: /boot/initramfs-1.2.3-1.OS.CPU.img

    子產品: /lib/modules/1.2.3-1.OS.CPU

CentOS x86平台 啟動流程

    加電自檢、Bootsquence(MBR)、MBR工作(系統引導)、Kernel工作、隻讀切換挂載rootfs、啟動init

加電自檢

 加電 -- CPU自舉(CPU找到ROM特定位址空間中的特定指令,CPU運作指令,完成硬體自檢)-- 顯示BIOS界面

Bootsquence(MBR)

    根據BIOS設定,從上至下依次查找第一個有MBR的裝置或模拟MBR的裝置。

    如果儲存設備都沒有MBR,到網絡裝置時:

        1、通過網卡發送廣播,找到dhcp伺服器,擷取一個IP位址

        2、并通過dhcp獲得能夠傳遞過來一個引導加載程式的檔案伺服器(tftp)

        3、傳遞引導程式過來,完成系統引導

MBR工作(系統引導)

    引導加載器:MBR=446(bootloader) + 64(fat) + 2 SSAA

    作用:顯示菜單,加載核心至記憶體,移交控制權

    引導加載器分類:

        Windows NT Loader (New Technology)

        Linux 

            LILO Linux Loader 古老,無法加載1024後的柱面,現多用于嵌入式

            grub:grand uniform boot 統一引導加載器(Linux,Windows,BSD),突破LILO限制

                grub1 CentOS5,6 0系

                grub2 CentOS 7 1系

    Step1: 找到MBR時,運作MBR進入1

    Step1.5:是分區的檔案系統的驅動。 step1.5在MBR後面的一段空間中,1完成後自動運作1.5

    Step2:進入分區,運作grub程式,根據配置顯示菜單,根據使用者選擇的核心,和ramdisk,加載至記憶體。移交控制權給核心

Kernel工作

    核心自動解壓、展開

    1、探測硬體

    2、加載驅動(包括從ramdisk中加載驅動)

            ramdisk分類

                CentOS 5: ramdisk 在記憶體中當作磁盤,當核心挂載根時,需要再一次緩沖ramdisk

                CentOS 6,7: ramfs 在記憶體中當作檔案系統,直接挂載

隻讀切換挂載rootfs

啟動init

            init分類

                CentOS 5 System V init (1、程序切換,2、程序依賴 。 串行啟動程序)

            配置檔案:/etc/inittab

                CentOS 6 Ubuntu upstart --> init (dbus:程序間通信基于BUS總線。基于dbus機制,沒有依賴。接近并行啟動程序 )

            配置檔案: /etc/inittab, /etc/init/*.conf

                CentOS 7 MAC/OS systemd (1、不借助bash解釋器 ,systemd能完成初始化[僅啟動需要的程序,不需要的程序,假啟動,在需要通路此程序時,都會啟動])

            配置檔案: /etc/systemd/system , /usr/lib/systemd/system

    CentOS5,6: service

    CentOS 7: systemctl

init程式初始化

1、設定主機名

1

2

3

4

5

6

<code>1</code><code>)CentOS </code><code>5</code><code>: HOSTNAME=`/bin/hostname`</code>

<code>2</code><code>)CentOS </code><code>6</code><code>: HOSTNAME=$(/bin/hostname)</code>

<code># Set the hostname.</code>

<code>update_boot_stage RChostname</code>

<code>action $</code><code>"Setting hostname ${HOSTNAME}: "</code> <code>hostname ${HOSTNAME}</code>

<code>[ -n </code><code>"${NISDOMAIN}"</code> <code>] &amp;&amp; domainname ${NISDOMAIN}</code>

2、設定歡迎資訊 baner

<code>1)CentOS 5: </code><code>echo</code> <code>-en $</code><code>"\t\tWelcome to "</code>

<code>2) CentOS 6:</code><code>echo</code> <code>-en $</code><code>"\t\tWelcome to "</code>

3、激活udev和selinux

4、挂載/etc/fstab檔案中定義的檔案系統

<code>action $</code><code>"Mounting local filesystems: "</code> <code>mount -a -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev</code>

<code>else</code>

<code>        </code><code>action $</code><code>"Mounting local filesystems: "</code> <code>mount -a -n -t nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev</code>

<code>fi</code>

5、檢測根檔案系統,并以讀寫挂載檔案系統

<code> </code><code>mount</code> <code>-n -o remount,ro /</code>

6、設定系統時鐘

7、激活swap設定

8、根據/etc/sysctl.conf檔案設定核心參數

9、激活lvm2及software RAID

10、加載額外裝置的驅動

11、清理操作

CentOS 6啟動差別

    程式: upstart

    配置檔案: /etc/inittab , /etc/init/*.conf

        注意: /etc/init/*.conf遵循upstart文法格式

    tty.conf 與終端相關

<code>exec /sbin/mingetty $TTY</code>

    rc.conf 啟動服務

<code>exec /etc/rc.d/rc $RUNLEVEL</code>

    rcS.conf 初始化

<code>exec</code> <code>/etc/rc</code><code>.d</code><code>/rc</code><code>.sysinit</code>

如何跳過開機密碼,進入維護模式

    1、啟動系統

<a href="https://s5.51cto.com/wyfs02/M01/03/E2/wKiom1mim3nguOhJAAASWcZY-Pc725.png" target="_blank"></a>

     2、在此界面下,按任意鍵。      

      向上下箭頭:完成上下移動。

      e : 在啟動前編輯高亮菜單 

      a : 在啟動前修改核心參數

      c : 列印一個指令行

<a href="https://s5.51cto.com/wyfs02/M00/A2/93/wKioL1mim62jq0scAAAuTKzUPlQ650.png" target="_blank"></a>

     3、按e編輯高亮菜單

        b 引導起動

        e 編輯boot順序所選的指令行

        c 列印一個指令行

        o 在所選行後,打開一個新行

        O 在所選先前,打開一個新行

        d 删除,光标所在行

<a href="https://s5.51cto.com/wyfs02/M01/A2/93/wKioL1minIDzcf3nAAA3xPfuiNc611.png" target="_blank"></a>

    3、光标移到kernel /vmlinuz行,按e鍵。    

        類BASH的行編輯器,支援指令行補全(TAB)

        ENTER:在編輯完畢後,可以按ENTER鍵,接受你的改變

<a href="https://s4.51cto.com/wyfs02/M00/03/E2/wKiom1minbyQ_yEBAAAmhLsTdsE356.png" target="_blank"></a>

    4、在其後可以輸入 1 或 s 或 S 或 single , 并按ENTER鍵,儲存

<a href="https://s1.51cto.com/wyfs02/M01/03/E2/wKiom1minzLj2-KOAAAczpOpHgU210.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M02/A2/93/wKioL1minyLinFTFAAANXvcSGyk783.png" target="_blank"></a>

    5、按b鍵引導,即可完成元密碼登入bash

    6、修改密碼

1)echo "PASSWORD" | passwd -n 2 -x 2 -i 100 root

2)passwd root

3)openssl passwd -salt $(openssl rand -hex 4) -1 和 usermod -p PASSWORD user

本文轉自 lccnx 51CTO部落格,原文連結:http://blog.51cto.com/sonlich/1959597,如需轉載請自行聯系原作者

繼續閱讀