系統啓動流程 chroot ldd,linux運行級別

系統的加載過程

POST-->BIOS(BOOT sequence) --> MBR(bootloader,446)-->kernel(將kernel加載到內存並解壓,利用虛根系統加載硬盤驅動(當僞文件系統退出時,需將/dev,/sys,/proc目錄搬運至新根))-->initrd(RHLE5)/initramfs(RHEL6)-->init進程(用戶空間的主導程序)

POST-->BIOS(boot squence)-->MBR(bootloader)-->kernl-->initrd--(rootfs)/sbin/init


虛根系統:

    一般是將內存的一段空間做爲磁盤使用(RHLE5叫ramdisk-->名稱叫initrd,RHLE6叫rmfs

    -->名稱叫initramfs)

bootloader加載內核的同時,也加載initrd


kernel功能:

文件管理

進程管理

內存管理

網絡管理

安全功能

驅動程序


內核設計風格:

    單內核:所有功能都做進內核,即單內核。linux使用的內核方式。linux上線程叫LWP.(輕量進             程)

           模塊化的設計:

                核心:KO(kernel object),readhat suse可以實現動態加載模塊功能                                   內核命名:vmlinuz-2.6.32-->/boot/vmlinuz-*(單內核)

                        /lib/modules/2.6.32* (包含了外圍模塊等內容)

                外圍模塊:內核路徑:/lib/modules/”內核版本號命名的目錄“下

    微內核:只是核心,外圍功能都做成子系統,需要用的時候,由內核高度使用,windows,solaris

            微內核真正支持多線程的


/lib/modules/2.6.32-279.e16.X86_64/kernel目錄模塊:

arch:平臺

crypto:加密

drivers:驅動

fs:文件系統

kernel:內核自身的額外功能

lib:庫

mm:內存管理

net:網絡

sound:聲卡


chroot命令:將root切換至一個指定的目錄

chroot /path/to/temprootdir [command...] 默認是運行bash

    1、創建指定目錄

    2、複製bash到指定目錄下的/bin目錄下

    3、使用ldd命令,查看bash的依賴庫,並複製到/lib目錄下

    4、chroot /path/to/tmeprootdir

 

ldd命令

ldd /path/to/binary_file:顯示二進制文件所依賴的共享庫     

[root@localhost kernel]# ldd /bin/bash
        linux-vdso.so.1 =>  (0x00007fff3a1fe000)(虛的,不需要複製)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f15df7df000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f15df5db000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f15df219000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f15dfa1d000)

運行級別:0-6

    0:halt

     1:single user mode(單用戶模式,直接登陸管理員,不需要密碼)s,S,single

     2:multi user mode(多用戶模式,不啓動nfs功能)

     3:multi user mode (多用戶模式,文本格式,text mode)

     4:reseved(保留級別)

     5: multi user mode ,graphic mode(多用戶模式,圖形界面)

     6:reboot

/etc/inittab:定義了系統啓動的默認級別


詳解啓動過程

一、grub引導程序設備及修復和加載過程

bootloader(MBR)

常見的bootloader程序(linux):
    LILO:linux loader(8G以上不支持)

    grub:grand unified bootloader

        stage1:MBR.位於/boot/grub/stage1

        stage1.5:用於識別常見不同的文件系統

        stage2:/boot/grub/stage2

grub配置文件:/boot/grub/grub.conf ,grub一切操作都是需要找到boot目錄,在boot目錄中加載

# 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  #設定默認啓動的title的編號,從0開始編號
timeout=5  #等待用戶選擇的超時時長,單位是秒
splashimage=(hd0,0)/grub/splash.xpm.gz  #指定grub背景圖片
hiddenmenu #隱藏菜單
password PASSWD # 給grub設定密碼
password --md5 $1$/xVOE$JGcDpajNc05m1KIDcCKgI.
title CentOS 6 (2.6.32-504.el6.x86_64) #引導的內核或操作系統標題,純字符串,可修改
  root (hd0,0) #內核文件所在的設備,所有類型硬盤一律爲HD,(hd#,#) #表示第幾個硬盤和分區
        kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=8e3b9a7c-8d09-4fed-8cec-6811d0286063 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=128M LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet #內核文件路徑,及傳遞給內核的參數    
        initrd /initramfs-2.6.32-504.el6.x86_64.img #ramdisk文件(虛根路徑)
        password --md5 $1$/xVOE$JGcDpajNc05m1KIDcCKgI. #把密碼放到title裏面,表示在啓動內核時需輸入密碼。

給grub加密:

 方法一:

    password readhat  #設定密碼爲readhat

 方法二:

    1、使用grub-md5-crypt      

Password: 
Retype password: 
$1$/xVOE$JGcDpajNc05m1KIDcCKgI.

   2、將生成的加密密碼串複製到 password後面

grub修復

一、安裝stage1,運行grub命令: 

[root@Centos6 ~]# fdisk -l #首先查看有幾塊硬盤

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002c3d3

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1332    10485760   83  Linux
/dev/sda3            1332        1854     4194304   82  Linux swap / Solaris
[root@Centos6 ~]# grub  #運行grub命令
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> root (hd0,0) #查看grub所在硬盤和分區,需注意grub的硬盤識別編號與fdisk編號可能不一致
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0) #安裝grub,並指定grub所在硬盤
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
[root@Centos6 ~]#sync #將操作同步到硬盤

安裝grub(對硬盤的操作)

使用 grub-install --root-directory=DIR

 安裝grub程序到主分區硬盤

 1、將要安裝grub的硬盤分區掛載到目錄(必須要求硬盤中有包含分區,即有分區表的存在)

mount /path/to/dev1 /path/mount/dirctory

2、使用grub--install命令安裝grub程序

grub-install --root-directory=/mnt/boot /dev/sdb # /mnt目錄下必須包含boot目錄,默認是將所有的文件安裝到/boot目錄下

3、配置/boot目錄下的grub.conf文件

[root@Centos6 ~]# cat /mnt/boot/grub/grub.conf 
default=0
timeout=10
title Test linux 6.6
     root (hd0,0)
         kernel /a
         initrd /a

啓動時到grub配置界面(grub配置文件丟失等原因造成無法加載內核及initrd文件)

grub> find (hd#,N)/ 使用TAB鍵補全,即可顯示所在分區的內核文件及initrd文件

grub> root (hd0,0)

grub> kernel /PATH/TO/kernel_file

grub> initrd /path/to/initrd_file

grub> boot

再到系統創建grub.conf配置文件,已完成修復

二、kernel的加載及配置

 kernel初始化的過程

    1、設備探測

    2、驅動初始化(可能會從initrd(initramfs)中裝載驅動模塊)

    3、以只讀方式掛載根文件系統

    4、裝載第一個進程init(PID:1)




三、 init的初始化

    1、/sbin/init:(/etc/inittab) RHEL6的名稱叫upstart(ubuntu開發的)RHEL7上叫systemd

        init只能同時啓動一個進程,upstart或systemd可以並行啓動多人進程

        upsatrt:使用d-bus機制完成進程單的通信,在/etc/init/目錄下有其配置文件,                         將/etc/inittab中的配置切成片,放置到此目錄,以.conf結尾

    initab格式

        id:runlevels:action:process   action(動作)

            id:標識符

            runlevels:在哪個級別運行些行

            action:在什麼情況下執行此行

            process:要運行的程序

        si::sysinit:/etc/rc.d/rc.sysinit,si不指定ID,sysinit指在系統啓動的時候,運行進程

       action:

            initdefault:設定默認運行級別

            sysinit:系統初始化

            wait:等待級別切換至此級別完成時此行

            respawn:一旦程序終止,會再次重新啓動      

    /etc/rc.d/rc.sysinit啓動做哪些事

      1、激活udev和selinux

      2、根據/etc/sysctl.conf文件,來設備內核參數

      3、設定系統時鐘

      4、裝載鍵映射

      5、啓用交換分區

      6、設置主機名

      7、根文件系統檢測,並以讀寫方式重新掛載

      8、激活raid和lvm設備

      9、啓用磁盤配額

      10、根據/etc/fstab,檢測並掛載其他文件系統         

      11、清理過期的鎖和pid文件

啓動過程:

  id:3:initdefault:-->si::sysinit:/etc/rc.d/rc.sysinit-->l3:3:wait:/etc/rc.d/rc 3-->/etc/rc.d/rc3.d/1、K* 執行stop 2、S* 執行 start(所有文件都是連接到/etc/rc.d/init.d下的文件)-->/etc/rc.d/rc.local


/etc/rc.d/init.d下的服務腳本支持的參數:

{start|stop|restart|status|reload|configtest}

在/etc/rc.d/init.d目錄下的所有服務類腳本,都包含如下兩行:

# chkconfig:   345 95 5 
345定義runlevels運行級別,也可以使用“-”,表示沒有級別爲S*開頭的連接 95 即SS定義啓動優先次序 5 即KK定義了關閉的優先次序

當chkconfig命令來爲此腳本在rc#.d目錄下創建連接時,runlevels表示默認創建爲S*開頭的連接,除此之外的級別默認創建爲K*開頭的連接,S後面的啓動優先級爲SS的數字,K後面關閉優先次序爲KK所表示的數字

# description: Runs commands scheduled by the "at" command at the time \

用於說明此腳本的簡單功能,如果超出一行,使用\續行


chkconfig命令(查看所有獨立守護服務的啓動設定,即獨立守護進程)

    --list:查看所有獨立守護服務的啓動設定

chkconfig --add SERVICE_NAME 將存入至/etc/rc.d/init.d/SERVICE_NAME的文件創建連接到                          SERVICE_NAME指定的運行級別中。並且生成以K或S開頭的文件

chkconfig --del SERVICE_NAME 刪除獨立守護進程,即刪除相應啓動項的連接

chkconfig [--level 24] SERVICE NAME {on|OFF}:設定服務的啓動級別,level可以省略,默認是2345級


在/etc/rc.d/init.d中創建服務腳本及生成到相應的rc#.d中示例

#!/bin/bash
#
# chkconfig: 2345 77 22
# description: Test Service
# 
LOCKFILE=/var/lock/subsys/myservice

status() {
  if [ -e $LOCKFILE ]; then
    echo "Running..."
  else
    echo "Stopped."
  fi
}

usage() {
  echo "`basename $0` {start|stop|restart|status}"
}

case $1 in
start)
  echo "Starting..." 
  touch $LOCKFILE ;;
stop)
  echo "Stopping..." 
  rm -f $LOCKFILE &> /dev/null
  ;;
restart)
  echo "Restarting..." ;;
status)
  status ;;
*)
  usage ;;
esac
[root@Centos6 tmp]# mv myservice /etc/rc.d/init.d/  #移動服務腳本到/etc/rc.d/init.d目錄
[root@Centos6 init.d]# find . -name "myservice"
./myservice
[root@Centos6 rc.d]# chkconfig --add myservice #添加服務腳本
[root@Centos6 rc.d]# find . -name "*myservice"
./rc4.d/S77myservice
./init.d/myservice
./rc1.d/K22myservice
./rc3.d/S77myservice
./rc6.d/K22myservice
./rc0.d/K22myservice
./rc2.d/S77myservice
./rc5.d/S77myservice
[root@Centos6 rc.d]# /etc/rc.d/init.d/myservice status #查看服務運行狀態
Stopped.
[root@Centos6 rc.d]# /etc/rc.d/init.d/myservice stop
Stopping...
[root@Centos6 rc.d]# /etc/rc.d/init.d/myservice start
Starting...
[root@Centos6 init]# chkconfig --list myservice
myservice      	0:off	1:off	2:on	3:on	4:on	5:on	6:off


/etc/rc.d/rc.local:系統最後啓動的一個服務,準確說,應該執行的一個腳本,可以將系統啓動時要執行的命令寫入此腳本中,可以完成開機啓動



inittab總結:

運行級別0:系統停機狀態,系統默認運行級別不能設爲0,否則不能正常啓動
運行級別1:單用戶工作狀態,root權限,用於系統維護,禁止遠程登陸
運行級別2:多用戶狀態(沒有NFS)
運行級別3:完全的多用戶狀態(有NFS),登陸後進入控制檯命令行模式
運行級別4:系統未使用,保留
運行級別5:X11控制檯,登陸後進入圖形GUI模式
運行級別6:系統正常關閉並重啓,默認運行級別不能設爲6,否則不能正常啓動

運行級別的原理:
1。在目錄/etc/rc.d/init.d下有許多服務器腳本程序,一般稱爲服務(service)
2。在/etc/rc.d下有7個名爲rcN.d的目錄,對應系統的7個運行級別
3。rcN.d目錄下都是一些符號鏈接文件,這些鏈接文件都指向init.d目錄下的service腳本文件,命名規則爲K+nn+服務名或S+nn+服務名,其中nn爲兩位數字。
4。系統會根據指定的運行級別進入對應的rcN.d目錄,並按照文件名順序檢索目錄下的鏈接文件
     對於以K開頭的文件,系統將終止對應的服務
     對於以S開頭的文件,系統將啓動對應的服務

5、/etc/rc.d/rc.local 是最後執行的腳本,可以將命令添加至裏面,達到系統啓動就運行的效果
6。查看運行級別用:runlevel
7。進入其它運行級別用:init N
8。另外init0爲關機,init 6爲重啓系統

RHEL5 /etc/inittab的任務:

1、定義默認運行級別;

2、運行系統初始化腳本/etc/rc.d/rc.sysinit

3、運行指定運行級別對應的目錄下的腳本,K爲殺死,S爲開始

4、設定ctrl+alt+del組合鍵的操作

5、定義UPS電源故障/恢復時執行的操作

6、啓動虛擬終端 (2345級別)

7、啓動圖形化終端(5級別)


守護進程的類型:

    獨立守護進程

        xinetd:超級守護進程,所有守護進程都由他管理,需關聯運行級別

    瞬時守護進程:不需要關聯至運行級別

查看運行級別:

runlevel

[root@Centos6 ~]# runlevel 
N 3

who -r 

[root@Centos6 ~]# who -r
         run-level 3  May  8 11:18

查看內核release號

  uname -r 

[root@Centos6 ~]# uname -r
2.6.32-504.el6.x86_64

  uname -a

[root@Centos6 ~]# uname -a
Linux Centos6.6A 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章