linux系統啟動流程
內核的設計結構
單內核:linux(線程–lwp輕量級進程)
微內核:windows(支持真正意義上的多線程)
單內核:很多功能驅動都集成在一起
微內核:內核很小,功能單一。模塊化
linux為了適應眾多用戶的不同硬件需求,linux內核在設計上采用模塊化設計??梢詣討B加載模塊。
核心模塊:ko 內核所獨有的。
共享對象:so
紅帽的系統下內核的模塊在/lib/modules/內核版本號命名的目錄
模塊之間也存在依賴關系。
例如:/lib/modules/3.10.0-327.el7.x86_64/kernel/放的是內核模塊。50多MB
內核名稱 vmlinuz-x.x.xx /boot/vmlinuz-x.x.xx 內核 1.9MB
pc-linux
POST–>BIOS(啟動順序去哪找啟動位置)–>MBR
(bootloader,446字節)–>kernel(探測基本的硬件)–>initrd–>/sbin/init
詳細啟動過程
bootloader(MBR)是個程序
linux的bootloader
LILO:linux loader 不支持硬盤超過1個g的
GRUB:GRadn Unitied bootloader
MBR太小,所以GRUB分成兩段
第一階段是為了引導第二段,在MBR 中。為了識別boot分區。對于grub就是根分區。
grub的1.5階段,在第一個扇區的后續扇區。
也就是mbr在0扇區,后續扇區12…扇區存放1.5 stage(為boot分區提供文件系統驅動,大小不固定)
/boot/grub/ 下有1satge和1.5stage的備份。還有stage2 但是不是備份。
第1.5階段 識別不同類型的文件系統。是的多個文件。 第二階段是引導操作系統的 后兩個階段在/boot/grub目錄下,grub也有配置文件,開機啟動項,雙系統的啟動順序,開啟圖片....
bootload是將內核和initrd一起裝進內核。
init /sbin/int 二進制的可執行程序 (用戶空間的主導程序)
內核啟動之前沒有加載文件系統,而內核又存放在文件系統之上。
/ 根所在的分區,又叫rootfs
內核裝載根文件系統
內核要使用文件系統 ,就要有設備驅動和文件系統模塊
內核靠驅動識別硬件,為了適應安裝到不同平臺的需要,就需要大量的驅動。在安裝操作系統的時候生產了一個包含該平臺設備驅動的中間層臨時的文件系統(不能同時存在兩個根但是根是可以切換的)。使得內核可以識別根文件系統然后加其他模塊。 整個過程就是根切換。
這臨時文件系統其實是一個文件,安裝操作系統時生成的,只不過內核能夠將其再內存中展開為一個模擬的文件系統(紅帽5上通常被稱為ramdisk,紅帽6上成為ramfs)。
ramdisk–>initrd centos5
制作工具:mkinitrd
ramfs–>initramfs centos6、7
制作工具:dracut,mkinitrd
chroot 命令
可以實現根切換,將一個臨時的目錄切換為根,在該目錄下必須存在/bin/bash,以及bash需要的庫文件,復制過去即可保持原有的文件層級結構。就可以在命令界面下切換過去。
用戶也可以實現根切換,與內核的根切換還是不完全一樣。
內核根切換,使用的命令也不一樣,內核切換時將三個目錄帶了過來,/proc,/sys,/dev
[root@localhost ~]# ldd /bin/bash
linux-vdso.so.1 => (0x00007fffb9f05000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f81904ef000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f81902eb000)
libc.so.6 => /lib64/libc.so.6 (0x00007f818ff29000)
/lib64/ld-linux-x86-64.so.2 (0x00007f819072f000)
[root@localhost ~]# tree /test/ /test/ ├── bin └── lib64 ├── ld-linux-x86-64.so.2 ├── libc.so.6 ├── libdl.so.2 └── libtinfo.so.5 [root@localhost ~]# chroot /test bash-4.2# bash-4.2# bash-4.2#
init
級別不同,運行的服務不同。
linux 有運行級別之稱 0-6
0:halt
1:單用戶模式,直接以管理員的身份進入,不需要密碼。
2:多用戶模式,有網絡功能,但是不啟用nfs
3:正常的多用戶模式,test mode 命令行模式
4:保留級別
5:圖形模式
6:reboot
init運行在那個級別取決于配置文件,/etc/inittab
定義了默認運行級別
centos
grub
可以在啟動界面編輯grub的配置。以指定的級別啟動。例如進入1級別,單用戶模式(又叫維護模式)。
grub修改配置文件也可以加密碼。使用grub-md5-crypt命令生成加密的密碼放到grub的配置文件中即可。
在配置文件中加入 password –md5 密碼
顯示當前運行級別
who -r
runlevel
查看內核release號
uname -r
grub損壞如何修復。
先人為破壞MBR中的bootloader 硬盤的前446字節
dd if=/dev/zero of=/dev/sda count=1 bs=400
sync
修復grub,就是從新安裝grub
1、使用grub命令
grub>root (hd0,0) 設置kernel所在的分區。(設置后有提示)
grub> setup (hd0) 安裝到kernel所在的設備上
2、安裝grub
grub-install –root-directory=/ 這里的根指的是boot的父目錄
給其他設備安裝grub,首先設備要有分區表,并且boot目錄已經掛在了分區。
grub配置文件損壞了如何修復
啟動系統后會自動進入grub命令模式
grub>find
grub>root
grub>kernel
grub>initrd
grub>boot
kernel初始化過程
1、探測 2、驅動初始化(從initrd文件中載入驅動模塊(centos6以后都是使用initramfs文件)) initramfs-2.6.32-642.el6.x86_64.img 3、以只讀方式掛載根文件系統 [root@yangyouwei kernel.image]# cat /boot/grub/grub.conf # 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 title CentOS 6 (2.6.32-642.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=d65c9d00-5327-4d1b-ab7c-9d1f01dc3c74 rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-642.el6.x86_64.img 4、裝載第一個進程init(PID:1)
注:內核非常的小,所以有很多硬件驅動都沒有,但是硬件驅動或其他功能模塊,都放在/boot/initrd或initramfs 這個偽文件系統中。這個文件是安裝操作系統時生成的,但也不是必要的。有些情況可以沒有。但是如果系統安裝在lvm或raid..等特殊硬件上,就需要驅動。當然也可以自己編譯內核,將其放進內核中,也就不需要這個文件。
系統初始化流程(內核級別):post–>讀取bios中啟動次序–>bootloader–>kernel和ramdisk–>裝在根文件系統–>/sbin/init
/sbin/init;(/etc/inittab)
cenos5之前的: SysV int
配置文件:/etc/inittab
centos6以后使用另外一種版本的init---upstart;ubuntu開發的init程序,可以并行啟動多個服務。 upstart是對sysv init改進的。 配置文件:/etc/init/*.conf centos7:systemd;另一種init程序??梢圆⑿袉佣鄠€服務。(比較優秀) 配置文件:/usr/lib/systemd/system /etc/systemd/system
以centos5為例講解sysvinit
運行級別:為了系統的運行或維護等目的而設定的機制 0-6:7個級別 0: 關機 1: 單用戶模式(single user),root用戶,無須認證;維護模式 2: 多用戶模式(multl user),會啟動網絡功能,但不會啟動NFS;維護模式 3: 多用戶模式(multl user),完全功能模式,文本界面 4: 預留級別;目前無特別使用目的,但習慣以同3級別功能使用 5: 多用戶模式(multl user),圖形界面。完全功能 6: 重啟,reboot 默認級別3、5、 級別切換 init # 級別查詢 who -r runlevel
init
/sbin/init /etc/inittab 以cenos5為例 /etc/inittab 每行定義一種action以及與之相對應的process id:runlevel:action:process id:一個任務的標識符 runlevel:在那些級別下啟動次任務,為空表示所有級別 action:在什么條件下啟動次任務 process:指具體的任務,一個程序或腳本。 action: wait:等待切換至次任務所在的級別時執行一次。 respawn:此任務終止時就會自動啟動 initdefault:設定默認運行級別;此時process省略 sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本 10:0:wait:/etc/rc.d/rc 3 /etc/rc.d/rc 腳本的作用。 意味著去啟動或關閉/etc/rc.d/rc3.d目錄下的服務腳本所控制的服務 所有以k開頭的都是要停止的服務 所有以s開頭的都是要啟動的服務 腳本執行的順序是先關閉k的后啟動s的 k后面的數字只的是優先級。glob風格排序。 服務之間也有依賴關系。所以啟動和關閉的順序不一樣。 centos6為例: [root@yangyouwei ~]# ls /etc/init/ ###這個目錄是/etc/inittab的文件的切片。 ck-log-system-restart.conf rcS.conf ck-log-system-start.conf rcS-emergency.conf ck-log-system-stop.conf rcS-sulogin.conf control-alt-delete.conf readahead-collector.conf init-system-dbus.conf readahead.conf kexec-disable.conf readahead-disable-services.conf plymouth-shutdown.conf serial.conf prefdm.conf splash-manager.conf quit-plymouth.conf start-ttys.conf rc.conf tty.conf [root@yangyouwei ~]# ls /etc/init.d ####這個文件是init的腳本 abrt-ccpp firstboot messagebus portreserve sandbox abrtd functions mysqld postfix saslauthd abrt-oops haldaemon netconsole pppoe-server single acpid halt netfs psacct smartd atd htcacheclean network quota_nld spice-vdagentd auditd httpd NetworkManager rdisc sshd autofs ip6tables nfs rdma sssd blk-availability iptables nfslock restorecond svnserve bluetooth irqbalance nfs-rdma rngd sysstat certmonger kdump ntpd rpcbind udev-post cpuspeed killall ntpdate rpcgssd wdaemon crond lvm2-lvmetad oddjobd rpcidmapd winbind cups lvm2-monitor openct rpcsvcgssd wpa_supplicant dnsmasq mdmonitor pcscd rsyslog ypbind 每個程序基于事件驅動來編寫的。
/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文件
**init在完成系統初始化時,檢測文件系統,此時文件系統還是以只讀放是掛載的。如果文件系統有問題,很多時候不能進入系統。會提示輸入密碼進入系統。進入后也是不能刪除修改任何文件,可以使用 mount -o remount,rw / /dev/sda# 即可修改配置文件。
**
rc.sysinit
/etc/rc.d目錄下存放的腳本
[root@yangyouwei ~]# ls /etc/rc.d/
init.d rc0.d rc2.d rc4.d rc6.d rc.sysinit
rc rc1.d rc3.d rc5.d rc.local
對應系統啟動級別的腳本 相應目錄下的以k開頭的腳本是在該級別下要停止的腳本 以s開頭的是要在該級別下運行的腳本。
/etc/rc.d/init.d/(鏈接)—>/etc/init.d/
chkcofig –add 創建的鏈接
服務類腳本
start
Sysv風格 :/etc/rc.d/init.d下面的腳本要支持以下參數
start|stop|restart|status
reload|configtest
都有一下的行 # chkconfig: 2345 13 99 ###定義默認啟動的級別,啟動的優先次序,關閉的優先次序 如果定義啟動級別為 - 表示都是k。 # description: 描述該腳本的簡單功能 設置啟動和關閉優先級時,應考慮依賴關系。依賴的先啟動,后關閉。 運行級別下的腳本執行順序 當chkconfig命令來為此腳本在rc#.d目錄創建鏈接時,runlevels表示默認創建為s*開頭的鏈接。除此自外的級別默認創建為k*開頭的鏈接。s后面的啟動優先級為ss所表示的數字‘k后面關閉優先次序為kk所表示的數字。 這兩行必須有#號
創建腳本后需要放到/etc/init.d/目錄下,運行一下
chkconfig –add SERVICENAME
SERVICENAME 服務腳本的名稱不帶.sh
chkconfig: 2345 13 99 執行chkconfig –add 時,在指定級別里添加s開頭的鏈接,其他級別的均為k
chkconfig 使用方法
SYNOPSIS
chkconfig [–list] [–type type][name] 列出(指定/所有)服務各個級別的狀態
chkconfig –add name 添加服務
chkconfig –del name 刪除服務
chkconfig –override name
chkconfig [–level levels] name 修改 相應系統運行級別下的啟動還是關閉
chkconfig [–level levels] [–type type] name
服務腳本,通過chkcofing加入服務后,就可以通過service SERVICENAME stop|start… 控制服務
如果沒有能力寫服務腳本還可以將要運行的服務命令直接寫在/etc/rc.d/rc.local中
[root@yangyouwei ~]# cat /etc/rc.d/rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff.
系統初始化腳本:/etc/rc.d/rc.sysinit
1、設置主機名
2、設置歡迎信息
3、激活udev和selinux
4、掛在/etc/fstab文件中定義的所有文件系統
5、檢測根文件系統,如果沒有問題以讀寫方式掛在
6、設置系統始終;讀取硬件時鐘,通過腳本實現
7、根據/etc/sysctl.conf文件來設置內核參數
8、激活lvm及軟RAID設備
9、激活個swap設備
10、加載額外設備的驅動程序
11、清理操作
總結用空間的啟動流程
/sbin/init(/etc/inittab)
init的配置文件inittab的任務
設置默認運行級別–>運行系統初始化腳本,完成系統初始化–>關閉對應級別下要停止的服務,啟動對應級別下要開啟的服務–>設置登陸終端
centos6啟動流程
centos6以后使用另外一種版本的init—upstart;ubuntu開發的init程序,可以并行啟動多個服務。
upstart是對sysv init改進的。
init程序: 為了兼容init,其執行主程序依然叫init /sbin/init 配置文件:/etc/init/*.conf /etc/inittab(僅用于定義系統默認啟動級別)
centos7啟動流程
init程序 systemd 配置文件 /usr/lib/systemd/system/* /etc/systemd/system/* 默認的服務都不啟動,當訪問那個服務,那個服務才啟動。 兼容centos6的服務 /etc/init.d/下的服務 systemd 的服務腳本放在 /usr/lib/systemd/system 設置系統默認啟動級別 systemctl set-default TARGET.target
完全兼容sysv腳本機制;因此,service還是可以使用。不過建議使用systemctl來控制服務;
systemctl {start|stop|restat|status} name[.service]
yum install ImageMagick
win.jgp
convert -resize 640×480 -colors 14 win.jpg win.xpm
gzip win.xpm
vim /boot/grub/grub.conf
原創文章,作者:yyw,如若轉載,請注明出處:http://www.www58058.com/47801