LinuxOS的啓動流程

因6和7倆個系列的啓動流程有區別,因此我把他們分開來寫linux

linux可看做是內核和根文件系統組成咱們把內核單獨拿出來總結一下shell

1、CentOS6系列啓動流程

首先總結一下整體的流程,接下來展開來敘述:POST加電自檢 --  MBR(0扇區前446個字節爲GRUB第1階段) -- (在1扇區後存放GRUB第1.5階段)GRUB(第2階段)--  加載內核(vmlinuz,initramfs)--  啓動第一個進程(init ;/etc/ini/*.conf init 程序的配置文件)-- 讀取/etc/inittab文件來決定進入的系統級別 --  執行/etc/rc.d/rc.sysinit腳原本初始化系統 -- 使用/etc/rc.d/rc腳原本根據當前所在的系統級別來讀取對應/etc/rc#.d/下的腳本 -- K開頭的腳本不啓動,S開頭的腳本啓動,啓動順序按後邊跟的數子大小來決定  --  最後執行的腳本/etc/rc.d/rc.local  --  啓動/bin/login進程來啓動登陸程序 ---  OK!apache

  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控制主機

一、POST

Power-On-Self-Test:加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統等硬件狀況的檢測。c#

BIOS:Basic Input and Output System,保存着有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啓動自舉程序等。安全

CMOS:保存主板的設置時間等參數,依靠主板上的CMOS鈕釦電池。bash

二、BootLoader

引導加載器,Windows使用的bootLoader是ntloader,只能夠引導Windows系統;Linux使用的bootloader早期有LILO(LInux LOader),如今6系列用的GRUB0.97版,7系列使用的是GRUB2。服務器

三、GRUB

grub總共分爲三個階段:cookie

  1. 第1階段:存放在mbr前446個字節
  2. 第1.5階段:1.5階段存放在1-27扇區;因爲grub1階段須要去讀取grub2階段的程序和配置文件,可是grub2階段的程序存放在磁盤的/boot分區中,想要讀取分區中的文件就必需要有驅動文件系統的驅動模塊,1.5階段就是來作這件事的。
  3. 第2階段:存放在磁盤可的/boot分區上(/boot/grub/),啓動時選擇內核版本界面,還有配置文件都是由第2階段負責。

功用:網絡

  1. 提供啓動菜單、並提供交互式接口 
  2. 加載用戶選擇的內核或操做系統 
  3. 爲菜單提供了保護機制 

grub的配置文件(/boot/grub/grub.cfg)框架

default=0  #默認title
timeout=5 #grub菜單選擇超時時間
splashimage=(hd0,0)/grub/splash.xpm.gz #grub菜單背景圖片
hiddenmenu #隱藏grub選擇菜單
password --md5 | ----encrypted  口令 #加密方式和口令,爲grub加密防止進如單用戶模式修改密碼,口令使用下面的命令生成
# grub-md5-crypt  生成MD5的密碼
# grub-crypt 生成sha12的密碼
title Red Hat Enterprise Linux 6 (2.6.32-642.el6.x86_64)
        root (hd0,0) #指定的是/boot所在磁盤的分區"hd0,0"表示第一塊磁盤的第一個分區
        kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=e1d36be7-5027-4847-9d80-135ac9fb798e rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet #向內核傳遞的cmdline參數
        initrd /initramfs-2.6.32-642.el6.x86_64.img  #指定initramfs文件的所在路徑,注意:(這裏的"/"相對的是/boot分區)

若是grub損壞咱們能夠用下面命令修復

grub-install --root-directory=DIR /dev/DISK 
    --root-directory=DIR:根目錄

若是grub配置丟失了怎麼辦:

在開機的時候會進入grub的命令行接口,可是沒法找到內核和ramdisk,因此咱們手動指定參數和路徑就能夠啓動系統了。

help: 獲取幫助列表 
help KEYWORD: 詳細幫助信息 
find (hd#,#)/PATH/TO/SOMEFILE: 
root (hd#,#) 
kernel /PATH/TO/KERNEL_FILE: 設定本次啓動時用到的內核文件;額外還可添加許多內核支持使用的cmdline參數
initrd /PATH/TO/INITRAMFS_FILE: 設定爲選定的內核提供額外文件的ramdisk 
boot: 引導啓動選定的內核

分別指定root(指的是/boot分區),kernel指定內核,initrd指定ramdisk文件,而後boot就能夠啓動系統了,進入系統後從新編輯/boot/grub.cfg文件來修復問題

四、kernel自身初始化

  1. 探測可識別到的全部硬件設備
  2. 加載硬件驅動程序(藉助於ramdisk加載驅動)
  3. 以只讀方式掛載根文件系統
  4. 運行用戶空間的第一個應用程序:/sbin/init

五、ramdisk

在grub第2階段的時候只能識別到/boot分區,這個時候內核開始初始化,探測完硬件後開始須要去找根,可是這時尚未驅動程序,因此這個時候須要藉助ramdisk來驅動硬件。在CentOS5系列中文件名爲/boot/inird,6和7已經改爲initramfs。

initramfs中也提供了一個根文件系統,其中包括了硬件必須的驅動,到了這步內核藉助這個虛根文件系統來掛載真正的根文件系統。

initramfs文件是在安裝系統時按當前的環境來生成的。

若是這個文件損壞了咱們也可使用工具來修復:

# mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 爲當前正在使用的內核從新制做ramdisk文件

六、init初始化

init程序啓動系統的第一個進程init,它負責建立系統啓動後的全部服務進程

init程序的類型:

  • CentOS5.x:SysV
  • CentOS6.x:Upstart
  • CentOS7.x:Systemd

初始化的相關文件:

  • /etc/inittab:定義系統默認的啓動級別
id:3:initdefault:
  • /etc/init/control-alt-delete.conf:設定按Ctrl + Alt + Del 是否會重啓
start on control-alt-delete
exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
  • /etc/init/tty.conf
  • /etc/init/start-ttys.conf
  • /etc/init/rc.conf
  • /etc/init/prefdm.conf

七、系統級別(CentOS6.x)

  • 0:關機
  • 1:單用戶模式(root自動登陸), single, 維護模式
  • 2: 多用戶模式,啓動網絡功能,但不會啓動NFS;維護模式
  • 3:多用戶模式,正常模式;文本界面
  • 4:預留級別;可同3級別
  • 5:多用戶模式,正常模式;圖形界面
  • 6:重啓

init #:切換至#級別

runlevel:查看當前的運行級別和上一運行級別

示例:進入單用戶模式

1)在啓動過程當中看到Booting 。。。的倒計時字樣按下esc鍵

2)按a鍵修改啓動參數,在quiet後加1(單用戶模式)

3)按回車鍵啓動,進入單用戶模式,能夠直接修改root的密碼,或者能夠修改一些其餘服務配置文件錯誤致使的系統沒法進入正常模式的操做。

八、系統初始化腳本(/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. 清理操做

九、啓動服務腳本(/etc/rc.d/rc)

由/etc/rc.d/rc腳本控制服務腳本啓動仍是非啓動

for i in /etc/rc$runlevel.d/S* ; do

    # Check if the subsystem is already up.
    subsys=${i#/etc/rc$runlevel.d/S??}
    [ -f /var/lock/subsys/$subsys ] && continue
    [ -f /var/lock/subsys/$subsys.init ] && continue
    check_runlevel "$i" || continue

    # If we're in confirmation mode, get user confirmation
    if [ "$do_confirm" = "yes" ]; then
        confirm $subsys
        rc=$?
        if [ "$rc" = "1" ]; then
            continue
        elif [ "$rc" = "2" ]; then
            do_confirm="no"
        fi
    fi

    update_boot_stage "$subsys"
    # Bring the subsystem up.
    [ -n "$UPSTART" ] && initctl emit --quiet starting JOB=$subsys
    if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
        export LC_ALL=C
        exec $i start
    fi
    $i start
    [ -n "$UPSTART" ] && initctl emit --quiet started JOB=$subsys
done

rc腳本讀取/etc/rc.d/rc#.d/下的全部腳本,以K開頭的服務腳本不啓動,以S開頭的服務腳本啓動。

  • K*: K##*:##運行次序;數字越小,越先運行;數字越小的服務,一般爲依賴到別的服務
  • S*: S##*:##運行次序;數字越小,越先運行;數字越小的服務,一般爲被依賴到的服務

/etc/rc.d/rc#.d/下的全部腳本都是/etc/rc.d/init.d/下的腳本的符號鏈接,連接名由chkconfig管理。

/etc/rc.d/rc.local:在全部啓動腳本執行完成後執行此腳本,能夠把不便或不需寫爲服務腳本放置於/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置於/etc/rc.d/rc.local文件中。

全部服務啓動完成後啓動登陸程序(/bin/login)。

CentOS 6 init程序爲: upstart, 其配置文件:/etc/inittab, /etc/init/*.conf,配置文件的語法 遵循 upstart配置文件語法格式,和CentOS5不一樣。

服務管理工具(CentOS6.x)

chkconfig

  • --list 查看
  • --level ##:指定級別,默認爲2 3 4 5
  • --add 將腳本加入對應的級別(須要將腳本放到/etc/rc.d/init.d/目錄下,而且在腳本開頭加上chkconfig:   啓動級別   關閉優先級   開啓優先級),通常「關閉優先級 + 開啓優先級 = 100」
  • --del 刪除對應級別腳本

service  服務名  { start | stop | restart }

  • --status-all 查看全部服務的狀態

ntsysv:字符界面工具,用來設置開啓自啓的服務

2、CentOS7系列啓動流程

 CentOS7與6版本的不一樣之處:

  • 6 : grub0.9和upstart
  • 7 : grub2和systemd

主要介紹一下grub2和systemd吧,其餘的啓動流程幾乎同樣

grub2

一、/etc/default/grub  :grub配置文件模板

GRUB_TIMEOUT=5  #grub菜單選項超時時間
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved  #grub菜單默認選擇的title
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rhgb quiet"  #向內核傳遞的cmdline參數
GRUB_DISABLE_RECOVERY="true"

二、/boot/grub2/grub.cfg  :grub配置文件,建議使用如下命令生成

# grub2-mkconfig -o /boot/grub2/grub.cfg 

三、在救援模式下修復grub2

# chroot /mnt/sysimage
# grub2-install /dev/sda
# grub2-mkconfig -o /boot/grub2/grub.cfg

四、在grub命令行啓動系統(grub2配置文件損壞的狀況下)

> insmod xfs
> set root=(hd0,1)
> linux16 /vmlinux-... root=/dev/sda2 selinux=0
> initrd16 /initramfs-...

systemd

系統啓動和服務器守護進程管理器,負責在系統啓動或運行時,激活系統資源,服務器進程和其它進程。

Systemd新特性:

  • 系統引導時實現服務並行啓動
  • 按需啓動守護進程
  • 自動化的服務依賴關係管理
  • 同時採用socket式與D-Bus總線式激活服務
  • 系統狀態快照

unit

  表示不一樣類型的systemd對象

/usr/lib/systemd/system:每一個服務最主要的啓動腳本設置,相似於6系列的/etc/init.d/目錄的功能

/run/systemd/system:系統執行過程當中所產生的服務腳本

/etc/systemd/system:管理員創建的執行腳本,功能相似於6系列中/etc/rc.d/rcN.d/Sxx目錄的功能

類型:

  • Service unit: (.service),用於定義系統服務
  • Target unit: (.target),用於模擬實現運行級別
  • Device unit: (.device),用於定義內核識別的設備
  • Mount unit: (.mount),定義文件系統掛載點
  • Socket unit: (.socket), 用於標識進程間通訊用的socket文件,也可在系統啓動時,延遲啓動服務,實現按需啓動
  • Snapshot unit: (.snapshot),管理系統快照
  • Swap unit: (.swap), 用於標識swap設備
  • Automount unit:(.automount),文件系統的自動掛載點
  • Path unit:(.path),用於定義文件系統中的一個文件或目錄使用,經常使用於當文件系統變化時,延遲激活服務

service unit文件格式

[Unit]  #定義與Unit類型無關的通用選項
Description=The Apache HTTP Server  #描述信息
After=network.target remote-fs.target nss-lookup.target  #依賴服務,定義unit的啓動次序,表示當前unit應該晚於哪些unit啓動,其功能與Before相反
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

#Requires:依賴到的其它units,強依賴,被依賴的units沒法激活時,當前unit也沒法激活 
#Wants:依賴到的其它units,弱依賴 
#Conflicts:定義units間的衝突關係 

[Service]  #與特定類型相關的專用選項;此處爲Service類型 
Type=notify  #定義影響ExecStart及相關參數的功能的unit進程啓動類型 
EnvironmentFile=/etc/sysconfig/httpd  #環境配置文件
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND #指明啓動unit要運行命令或腳本的絕對路徑 
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful #指明重載unit要運行命令或腳本的絕對路徑 
ExecStop=/bin/kill -WINCH ${MAINPID} #指明中止unit要運行的命令或腳本 
KillSignal=SIGCONT 
PrivateTmp=true

#simple:默認值,這個daemon主要由ExecStart接的指令串來啓動,啓動後常駐於內存中 
#forking:由ExecStart啓動的程序透過spawns延伸出其餘子程序來做爲此daemon的主要服務。原生父程序在啓動結束後就會終止 
#oneshot:與simple相似,不過這個程序在工做完畢後就結束了,不會常駐在內存中 
#dbus:與simple相似,但這個daemon必需要在取得一個D-Bus的名稱後,纔會繼續運做.所以一般也要同時設定BusNname= 才行 
#notify:在啓動完成後會發送一個通知消息。還須要配合 NotifyAccess 來讓 Systemd 接收消息 
#idle:與simple相似,要執行這個daemon必需要全部的工做都順利執行完畢後纔會執行。這類的daemon一般是開機到最後才執行便可的服務

[Install]  #定義由「systemctl  enable」以及"systemctl  disable「命令在實現服務啓用或禁用時用到的一些選項
WantedBy=multi-user.target  #被哪些units所依賴,弱依賴

#Alias:別名,可以使用systemctl command Alias.service 
#RequiredBy:被哪些units所依賴,強依賴  
#Also:安裝本服務的時候還要安裝別的相關服務 

 新建立unit文件後或者修改了unit文件須要使用如下命令來重載

# systemctl daemon-reload

systemctl

用法:systemctl  子命令  name.service

 子命令:

start | stop | restart |status | reload :啓動 | 中止 | 重啓 | 狀態 | 重讀配置文件

enable :設置開機自動啓動

disable :設置開機不自動啓動

try-restart:服務在啓動狀態纔會執行重啓,服務在中止狀態不會重啓

reload-or-restart :從新加載配置文件再啓動服務

reload-or-try-restart :重載或服務在啓動狀態纔會執行重啓

mask:禁止服務啓動

unmask:取消禁止服務啓動

is-active:查看服務是否在激活狀態

is-enabled :查看指定服務是否開機自啓

list-dependencies :查看服務的依賴關係

kill :殺掉指定服務的進程

 查看類子命令:

list-units :顯示全部單元(unit)的狀態

  • -t service :查看指定的類型(服務)
  • -a :查看全部的服務

list-unit-files -t service -a:查看全部服務的開機自啓狀態

  • loaded:Unit配置文件已處理
  • active(running):一次或屢次持續處理的運行
  • active(exited):成功完成一次性的配置
  • active(waiting):運行中,等待一個事件
  • inactive:不運行
  • enabled:開機啓動
  • disabled:開機不啓動
  • static:開機不啓動,但可被另外一個啓用的服務激活

--failed -t service:查看啓動失敗的服務

查看指定服務在哪些運行級別下啓用和禁用

ls /etc/systemd/system/*.wants/name.service

運行級別

poweroff.target 	==> 0
rescue.target 		==> 1
multi-user.target 	==> 2,3,4
graphical.target 	==> 5
reboot.target 		==> 6

切換運行級別:

# systemctl isolate multi-user.target

若是須要在啓動中進入rescue模式,須要在linux16後加如下cmdline命令

systemd.unit=rescue.target

破解root口令

方法一:
在grub菜單按e進入編輯模式
在linux16後加rd.break
Ctrl + x啓動
# mount -o rw,remount /sysroot
# chroot /sysroot
# passwd
# touch /.autorelabel 防止selinux打標籤失敗
# exit
# reboot
方法二:
在linux16後加init=/sysroot/bin/sh
# chroot /sysroot
# passwd
touch /.autorelabel

systemctl

相關子命令:

get-default :查看當前默認啓動模式

set-default :設置默認啓動模式

rescue :切換緊急救援模式

emergency:切換至emergency模式,比救援模式更底層一級

halt | poweroff :關機

reboot :重啓

suspend :掛起

hibernate :休眠

hybrid-sleep :休眠並掛起

CentOS7系列啓動流程總結:

  1. UEFi或BIOS初始化,運行POST開機自檢
  2. 選擇啓動設備
  3. 引導裝載程序:grub2
  4. 加載裝載程序的配置文件:/boot/grub2/grub.cfg
  5. 加載initramfs驅動模塊:/boot/initramfs-3.10.0-693.el7.x86_64.img
  6. 加載內核:/boot/vmlinuz-3.10.0-693.el7.x86_64
  7. 內核初始化:systemd
  8. 執行initrd.target全部單元,包括掛載/etc/fstab
  9. 從initramfs根文件系統切換到磁盤根目錄
  10. systemd執行默認target配置,配置文件/etc/systemd/system/default.target
  11. systemd執行sysinit.target初始化系統及basic.target準備操做系統
  12. systemd啓動multi-user.target下的本機與服務器服務
  13. systemd執行multi-user.target下的/etc/rc.d/rc.local
  14. Systemd執行multi-user.target下的getty.target及登陸服務
  15. 若是啓動圖形界面systemd執行graphical須要的服務

3、內核(kernel)

kernel職責:

  進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能 

內核的設計流派分爲單內核和微內核:linux內核爲單內核流派,把全部的功能都集成於同一個程序;Windows,Solaris系統的內核是微內核設計,每種功能都使用一個單獨的子系統來實現,在一箇中心框架下協同工做,從理論上來講微內核的設計更爲先進。

linux內核的特色:

  1. 模塊化:如把文件系統、硬件啓動等編譯成模塊,使用時裝載,
  2. 支持內核模塊的動態裝載和卸載,更靈活

linux的內核組成:

  • /boot/vmlinz-VERSION-release:核心文件
  • ramdisk
    • /boot/initrd-VERSION-release.img(5.x)
    • /boot/initramfs-VERSION-release.img(6.x和7.x)
  • /lib/modules/VERSION-release  :存放模塊文件目錄

查看內核當前運行的cmdline參數:

[root@rhel6 ~]# cat /proc/cmdline 
ro root=UUID=e1d36be7-5027-4847-9d80-135ac9fb798e 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

內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt,須要安裝如下包。

yum install kernel-doc-2.6.32-696.el6.noarch

簡單的內核編譯流程:(環境:CentOS7.4mini版)

 一、準備:

(1) 準備好開發環境(yum groupinstall -y "Development Tools" ; yum install -y ncurses-devel elfutils-libelf-devel openssl-devel bc)

(2) 獲取目標主機上硬件設備的相關信息

(3) 獲取目標主機系統功能的相關信息

(4) 獲取內核源代碼包(www.kernel.org)

 二、解壓內核包,進入linux-xxx目錄;調試配置文件(.config)

(a) make config:基於命令行以遍歷的方式去配置內核中可配置的每一個選項

(b) make menuconfig:基於curses的文本窗口界面

(c) make gconfig:基於GTK (GNOME)環境窗口界面

(d) make xconfig:基於QT(KDE)環境的窗口界面,支持「全新配置」模式進行配置

(a) make defconfig:基於內核爲目標平臺提供的「默認」配置進行配置

(b) make allyesconfig: 全部選項均回答爲「yes「

(c) make allnoconfig: 全部選項均回答爲「no「

三、編譯

  make -j #:全編譯,若是咱們只須要編譯單個模塊,那麼咱們能夠cd到子目錄或者make /path/MODULS.ko能夠實現只對單個模塊進行編譯

    -j:支持並行編譯,#爲物理CPU核心數

四、安裝模塊

  make modules_install

五、安裝內核文件,生成initramfs文件而且自動配置grub菜單

  make install

六、reboot啓動選擇新內核進入系統就完成了

七、若是編譯失敗須要從新編譯咱們可使用如下命令來清理

# make clean:清理大多數編譯生成的文件,但會保留config文件等 
# make mrproper: 清理全部編譯生成的文件、config及某些備份文件 
# make distclean:mrproper、patches以及編輯器備份文件 

八、若是新的內核有bug須要卸載內核

  1. 刪除/lib/modules/目錄下不須要的內核庫文件
  2. 刪除/usr/src/linux/目錄下不須要的內核源碼
  3. 刪除/boot目錄下啓動的內核和內核映像文件
  4. 更改grub的配置文件,刪除不須要的內核啓動列表

 /proc:

內核把本身內部狀態信息及統計信息,以及可配置參數經過proc僞文件系統加以輸出

常見重要參數

/proc/sys/net/ipv4/icmp_echo_ignore_all
/proc/sys/net/ipv4/ip_forward
/proc/sys/net/ipv4/ip_default_ttl
/proc/sys/vm/drop_caches
/proc/sys/net/ipv4/tcp_syn_retries
/proc/sys/net/ipv4/tcp_fin_timeout
/proc/sys/net/ipv4/tcp_syncookies  
/proc/sys/net/ipv4/tcp_max_tw_buckets
/proc/sys/net/ipv4/tcp_max_syn_backlog
/proc/sys/net/ipv4/ip_local_port_range

/sys

sysfs:爲用戶使用的僞文件系統,輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的設定信息;有些參數是能夠修改的,用於調整硬件工做特性。

相關管理工具:

sysctl:修改內核參數的工具

  • -p 從新讀入/etc/sysctl.conf
  • -a 列出當前生效的內核參數
  • -w net.ipv4.ip_forward = 1 即時生效

uname

  • -r:顯示內核版本號
  • -a:顯示所有信息
  • -n:顯示主機名

lsmod:顯示已經裝載的模塊

modinfo:顯示模塊的詳細信息

  • -n:顯示模塊路徑
  • -p:顯示模塊參數
  • -a:顯示模塊做者
  • -d:顯示模塊描述信息
  • -l:顯示模塊的遵循的協議

modprobe:裝載模塊

  • -r:卸載模塊

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

insmod:指定裝載模塊文件,但不自動解決依賴模塊

rmmod:卸載模塊

time cmd 檢測命令執行花的時間

lscpu:查看CPU信息

lspci:查看pci相關信息

lsusb:查看usb相關信息

lsblk:查看塊設備相關信息

hal-device:查看全部硬件信息(CentOS6.x)

4、製做一個mini_linux(環境:CentOS6.9)

爲了對linux系統有更多的認識,咱們能夠基於CentOS的環境本身來在新硬盤上安裝一個mini版的linux,只須要提供最基礎的程序來運行。

1)準備工做

  1. VMware12虛擬機
  2. CentOS6.9系統
  3. 爲系統加一塊虛擬硬盤,20G,若是是在虛擬機開機加的硬盤須要掃描一下硬盤:# echo '- - -' > /sys/class/scsi_host/host2/scan 
  4. 一個腳本,方便咱們cp命令
#/bin/bash
green_OK() { echo -e "[   \033[1;32mOK\033[0m   ]"; }
red_FAILED() { echo -e  "[ \033[1;31mFAILED\033[0m ]"; }
Screen=`stty -F /dev/tty size`
Columus=${Screen#* }
Spa_Col=$[Columus-16]

success() {
        local i
        string="$1"
        Rt_Spa=$[$Spa_Col-${#string}]
        echo -n "$string"
        for i in `seq $Rt_Spa` ;do
                echo -n "."
                sleep 0.005
        done
        green_OK
}
failed() {
        local i
        string="$1"
        Rt_Spa=$[$Spa_Col-${#string}]
        echo -n "$string"
        for i in `seq $Rt_Spa` ;do
                echo -n " "
        done
        red_FAILED
}

Ddir="/mnt/sysroot"
[ ! -d "$Ddir" ] && mkdir "$Ddir"

cpbin() {
        cmddir=`echo "$Cmd_path" |grep -o ".*/\b"`
        [ ! -d "${Ddir}${cmddir}" ] && mkdir -p "${Ddir}${cmddir}"
        cp -n "$Cmd_path" "${Ddir}${cmddir}"
}

libcp() {
        echo "$Lib_path" |while read line ;do
                libdir=`echo "$line" |grep -o ".*/\b"`
                [ ! -d "${Ddir}${libdir}" ] && mkdir -p "${Ddir}${libdir}"
                cp -n "$line" "${Ddir}${libdir}" 2>/dev/null
        done
}

while read -p "Input a cmd. (quit): " CMD ;do
        if [ "$CMD" == 'quit' ] ;then echo "Think you! Bye bye."; break; fi
        if ! which "$CMD" &>/dev/null ;then 
                echo "not find $CMD or is a shell builtin, please input again!"
                failed "copy $CMD failed."
                continue
        fi
        Cmd_path=`which $CMD |grep -o "/.*"`
        Lib_path=`ldd $Cmd_path |sed -nr 's#.*[[:space:]]+(/.*) .*#\1#p'`
        cpbin
        libcp
        success "copy $CMD Complete."
done
copycmd.sh

2)分區格式化新硬盤而且掛載

  1. sdb1分200M做爲boot分區
  2. sdb2分10G做爲根分區
  3. 剩下的能夠自由分配
[root@rhel6 ~]# mkfs.ext4 /dev/sdb1
[root@rhel6 ~]# mkfs.ext4 /dev/sdb2
[root@rhel6 ~]# mkdir /mnt/sysroot #
[root@rhel6 ~]# mount /dev/sdb2 /mnt/sysroot/
[root@rhel6 ~]# mkdir /mnt/sysroot/boot
[root@rhel6 ~]# mount /dev/sdb1 /mnt/sysroot/boot

3)安裝grub,提供內核和ramdisk文件,而且編輯配置文件

[root@rhel6 ~]# grub-install --root-directory=/mnt/sysroot/ /dev/sdb
[root@rhel6 ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/sysroot/boot/initramfs.img
[root@rhel6 ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/sysroot/boot/vmlinuz
[root@rhel6 ~]# cat >/mnt/sysroot/boot/grub/grub.conf <<EOF
default=0
timeout=3
title mini_linux
    root(hd0,0)
    kernel /vmlinuz ro root=UUID=ce79412f-72b8-4313-8a55-5fb734ffacfe selinux=0 init=/bin/bash  #這裏是/dev/sdb2(mini_linux的根)的UUID
   initrd /initramfs.img

4)接下來咱們就能夠把經常使用的cmd和對應依賴的庫文件複製到咱們的/mnt/sysroot/下了

[root@rhel6 ~]# mkdir -pv /mnt/sysroot/{bin,dev,etc,home,lib,lib64,media,mnt,opt,proc,root,sbin,sys,usr/{bin,etc,include,lib,lib64,libexec,local,sbin,share,src,tmp},var,tmp}
[root@rhel6 ~]# ./copycmd.sh
Input a cmd. (quit): bash
copy bash Complete................................................................[   OK   ]
Input a cmd. (quit): ifconfig
copy ifconfig Complete............................................................[   OK   ]
Input a cmd. (quit): insmod
copy insmod Complete..............................................................[   OK   ]
Input a cmd. (quit): ping
copy ping Complete................................................................[   OK   ]
Input a cmd. (quit): mount
copy mount Complete...............................................................[   OK   ]
Input a cmd. (quit): ls
copy ls Complete..................................................................[   OK   ]
Input a cmd. (quit): cat
copy cat Complete.................................................................[   OK   ]
Input a cmd. (quit): df
copy df Complete..................................................................[   OK   ]
Input a cmd. (quit): lsblk
copy lsblk Complete...............................................................[   OK   ]
Input a cmd. (quit): blkid
copy blkid Complete...............................................................[   OK   ]
Input a cmd. (quit): vi
copy vi Complete..................................................................[   OK   ]
Input a cmd. (quit): sed
copy sed Complete.................................................................[   OK   ]
Input a cmd. (quit): grep
copy grep Complete................................................................[   OK   ]
Input a cmd. (quit): awk
copy awk Complete.................................................................[   OK   ]
Input a cmd. (quit): quit  
Think you! Bye bye.

5)接下來咱們去提供網卡驅動模塊

[root@rhel6 ~]# mkdir /mnt/sysroot/lib/modules
[root@rhel6 ~]# cp /lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules 

6)如今一切都完成了,咱們接下來關閉虛擬機,在關閉前執行幾回sync命令來保證數據同步到磁盤上,而後將咱們的mini_linux虛擬磁盤掛到新虛擬機上,調BIOS讓其成爲第一啓動項,啓動後將e1000.ko模塊裝載後就可使用網絡了

insmod /lib/modules/e1000.ko
ifconfig eth0 192.168.222.222 up

 

我的學習筆記  2018.5.14 18:19

相關文章
相關標籤/搜索