系統的加載過程
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