14_01
linux系統啓動流程
POST(加電自檢)-->BIOS(Boot Sequence)-->MBR(bootloader,446(mbr只讀取一個,不會再讀取第二個))-->Kernel(一般是壓縮存放的)-->(ROOTFS)/sbin/init(/etc/inittab)-->-->-->
啓動的服務不同:
運行級別:0-6
0:halt(關機)
1:single user mode,直接以管理員身份切入
2:multi user mode, no NFS
3: multi user mode(文本多用戶模式.text mode)
4:reserved(暫未使用,保留的模式)
5: multi user mode(圖形多用戶模式,graphic mode)
6:reboot()
詳細啓動過程:(windows的bootloder不認其他系統,所以如果先安裝linux再安裝windows,windows的bootloader就把linux的bootloader覆蓋掉,安裝雙系統須先安裝windows)
!!win8會鎖定MBR,所以安裝了win8後,該硬盤就安裝不了其他系統
linux的bootloader(MBR)
LILO:LInux LOader(不能引導1024柱面之後的分區的內核,不支持8G後的磁盤,適合於嵌入式)
GRUB:GRand Unified Bootloader
Stage1:MBR
Stage1_5:
Stage2:/boot/grub/
grub.conf
default=0 # 設定默認啓動的title的編號,從0開始
timeout=s # 等待用戶選擇的超時時長,單位是秒
splashimage=(hd0,0)/grub/splash.xpm.gz # grub的背景圖片
hiddemenu: # 隱藏菜單
title Red Hat Enterprice Linux Server(2.6.18-308.el5) #內核標題,或操作系統名稱,字符串,可自由修改
root (hd0,0) #內核文件所在的設備:對grub而言,所有類型硬盤一律hd,格式爲(hd#,N):hd#, #表示第幾個磁盤:最後的N表示對應磁盤的分區;
kernel /vmlinxu-2.6.18-308.el5 ro root=/dev/vo10/root rhgb quiet #內核文件路徑,及傳遞給內核的參數
initrd /initrd-2.6.18-308.el5.img ramdisk文件路徑(安裝系統的過程的最後一步生成的)!!!!版本號要保持一致
,,,,
,,,,
,,,,
內核設計風格:
核心:動態加載 外圍的內核模塊
內核:/lib/modules/"內核版本號命名的目錄"/
內核自身名稱:vmlinux-x.x.x
/lib/modules/2.26.32/
RedHat5: ramdisk-->initrd
RedHat6:ramfs-->initramfs
Redhat,SUSE
單內核:設計簡單,linux(線程在linux中被稱爲,輕量級進程--LWP。)
核心:ko(kernel object)
so()
微內核:設計複雜,windows,Solaris(線程)
chroot: 裝換根的目錄。:chroot /PSTH/TO/TEMPROOT [COMMAND。。。]
chroot /test/virrot /bin/bash
ldd /PSTH/TO/BINARY_FILE:顯示二進制文件所以來的共享庫
根是自引用的。
10:0:wait: /etc/rc.d/rc 0
rc0.d/
K*
stop
S*
start
/etc/rc.d/init.d, /etc/init.d
服務類腳本:
start
SysV: /etc/rc.d/init.d
start|stop|restart|status
reload|configtest
chkconfig(!雖然chkconfig和description被註釋掉了,但是chkconfig還是會分析這兩行。當我們使用chkconfig命令時,任何有了這幾行的腳本,都能夠自動被創建連接)
#chkconfig:runlevels SS(啓動優先次序) KK(關閉優先次序)
runlevels:'-'表示沒有級別,默認爲s*開頭的連接;
如果省略級別指定,默認爲2345級別或當前級別;
當chkconfig命令爲此腳本在rc#.d目錄創建連接時,runlevels表示默認創建爲S*開頭的連接,除此以外的級別都默認創建爲K*開頭的連接;
s後面的啓動優先級爲ss所表示的數字;k後面關閉優先次序爲kk所表示的數字;
#description:說明此腳本的簡單功能;\,續行
@@@先開啓的服務後關閉,後開啓的服務先關閉的原因是,先開啓的服務可能被後面的服務所依賴
chkconfig
--list 空 查看所有獨立守護服務的啓動設定; 獨立守護進程!
--list 服務名 查看特定服務
chkconfig --add SERVICE_NAME 創建/rc.d的鏈接文件
chkconfig --del 服務名 刪除/rc.d下的鏈接文件
chkconfig --level RUNLEVELS 服務名 {on|off}
myservice.sh:通過鎖文件判斷一個服務是否開啓
#!/bin/bash
#
#chkconfig: 2345 77 22
#description:Test Service
#
LOCKFILE=/var/lock/subsys/myservice
status() {
if [ -e $LOCKFILE ]; then
echo "Running..."
else
echo "Stoped."
fi
}
usage() {
echo "'basename $0' {start|stop|restart|status}"
}
case $1 in
start)
echo "Starting..."
touch $LOCKFILE
;;
stop)
echo "Stoping..."
rm -f $LOCKFILE &> /dev/null
;;
restart)
echo "restart..."
;;
status)
status
;;
*)
usage
;;
esac
/etc/rc.d/rc.local:系統最後啓動的一個服務,準確說,應該執行的一個腳本;
S99loacl 系統啓動時,最後一個啓動的腳本。
所以一些不方便定義成服務的,或者我們不易把之寫成腳本的命令,我們可以寫入這裏!!!!!!
/etc/inittab的任務:
1、設定默認運行級別;
2、運行系統初始化腳本;
3、運行指定級別對應的目錄下的腳本;
4、設定Ctrl+Alt+Del組合鍵的操作;
5、定義ups電源在電源故障/恢復時執行的操作;
6、啓動虛擬終端(2345級別);
7、啓動圖形終端(5級別);
守護進程類型:
獨立守護進程
xinitd:超級守護進程(需要關聯運行級別)。超級守護進程是瞬時守護進程的代理人 (多個超級守護進程)
瞬時守護進程:不需要關聯至運行級別(多個瞬時守護進程)
核心: /boot/vmlinuz-version
內核模塊(ko):/lib/modules/version/
內核設計:
單內核
模塊化設計
微內核
裝載模塊:
insmod
modprobe
www.kernel.org
kernel-2.6.17------2(主版本號).6(次版本號).17(修正號)
用戶空間訪問、監控內核的方式:
/proc,/sys
僞文件系統
/proc/sys: 此目錄中的文件很多是可讀寫的
/sys/:某些文件可讀寫
設定內核參數值的方法:(暫時)
echo VALUE > /proc/sys/TO/SOMEFILE
sysctl -W kernel.hostname
永久有效(不能立即生效): /etc/sysctl.conf
立即生效的命令:#sysctl -p -------通知內核重讀sysctl.conf
sysctl -a :顯示所有內核參數及其值
內核模塊管理:
lsmod :查看 使用的內核模塊
modprobe MOD_MAME; 裝載某模塊
modprobe -r MOD_MAME; 卸載某軟件模塊
modinfo:查看某模塊的相關信息
insmod /PATH/TO/MODULE_FILE;裝載模塊
rmmod MOD_NAME;
depmod /PATH/TO/MODULE_DIR;
POST-->BIOS(Boot Sequence) --> BootLoader(MBR)-->Kernel(initrd,initramfs)-->init(/etc/inittab)
/etc/inittab:
設定默認運行級別
系統初始化(/etc/rc.d/rc.sysinit)
運行指定級別的服務腳本
/etc/rc.d/init.d/
/etc/rc.d/rc#.d
rc0.d--rc6.d
K*
S*
00-99:運行次序
啓動虛擬終端
啓動圖形終端
/etc/rc.d/rc.sysinit:
檢測並以讀寫方式重新掛載根文件系統;
設定主機名;
檢測並掛載/etc/fstab中的其他文件系統;
啓動swap分區;
初始化外圍硬件設備的驅動;
RHRL6:
upstart-->init
/etc/inittab
/etc/init/*.conf
內核初始化:
16_01
編譯內核:
1、配置
make menuconfig
make gconfig
make kconfig
make oldconfig
make config
保存爲 .config
2、
make
make modules_install
make install
模塊安裝位置: /lib/modules/KERNEL_VERSION/
如何實現部分編譯:
1、只編譯某子目錄下的相關代碼:
make dir/
make arch/
make drivers/net/
2、只編譯部分模塊
make M=drivers/net/