歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux基礎知識 >> Linux系統的啟動流程以及做個小小的Linux

Linux系統的啟動流程以及做個小小的Linux

日期:2017/3/2 17:14:05   编辑:Linux基礎知識

內核的作用
進程管理:進程間切換
內存管理:內存空間分割為內核空間和用戶空間
IO管理:對底層硬件的使用必須由內來實現,不能由用戶空間進程來實現
文件系統管理
驅動程序管理
安全管理:包括netfilter模塊和selinux模塊等

內核的設計模式
單內核:模塊都是集成在內核內部(Linux是單內核)
微內核:模塊都是獨立的,隨用隨加載(Windows是微內核)
Ps:1.linux是單內核,但是廣泛采用了微內核的設計思想
2.內核模塊是和內核緊密相關的,一旦換了內核,所有的模塊都不能再使用

單線程:只有一個執行流
多線程:有多個執行流

提升程序的執行速度
1、必須尋多線程開發模式
2、運行的主機必須有多個或者多核CPU

啟動流程
1、POST(Power On and Self Test):加電自檢
檢查硬件是否工作正常
將CMOS中的BIOS程序加載到CPU中,依此來檢測硬件工作,然後根據設定的啟動次序去指定的設備上找 系統內核

BIOS的基本功能(很重要)
1、檢查硬件
2、獲取硬件信息
3、指定啟動次序(bootsquence)

2、查找內核
【此時因為沒有內核,所無法直接使用文件系統,因此就找不到文件系統刪的內核文件】
MBR
446:bootloader,在文件系統上找內核【bootloader指定了加載內核的方式】
64:分區表
2:幻數
加載內核步驟(重要)
1)找指定設備的上的MBR(bootloader)
2)根據bootloader的指引去加載內核文件(vmlinuz-xxx)
3)然後會將boot分區當做根分區來使用,來獲取系統的基本信息(硬件、軟件)
PS:因為bootloader可以執行系統加載內核,因此,內核所在的分區的一定是一個特殊分區,此分區沒有文件系統也可以訪問,分區名稱是:/boot
系統中的分區(第一個分區必須是boot)


/:根分區 (5G以上)
/boot:開機引導分區
【在手動分區的時候,第一個分必須是boot分區】
/proc:

/sys:偽文件系統分區

/swap:交換分區




內核(kernel)
源碼:kernel.org
二進制:/boot/vmlinuz-xxx(壓縮存放,支持自解壓)
二進制的好處:
節省內存和存儲空間
提高IO

3、啟動用戶空間進程


啟動用戶空間進程:/sbin/init
1)由內核中的文件系統功能找到並執行/sbin/init,會產生一個ID為1的進程,進程名就是init
2)init生成用戶空間

加載驅動
【不可能就將全部的驅動都加載到內核中】
在安裝linux的時候,最後一步會執行一個腳本,此腳本會收集系統的基本信息,硬件,軟件,驅動,將這些信息打包壓縮成一個文件,此文件在centos5.x 叫做initrd-版本號.img;Centos6.x 叫做 initramfs-版本號.img

因此在加載內核到內存的是,會連同initrd/initramfs一起加載到內存中,而且initrd會在內存中展開,將內存中的內核空間當做根分區來使用,在這個根分區中就有了當前系統索要使用的驅動程序。

由initrd所展開生成的根也是一個虛根,在啟動完成用戶空間以後,會切換到真實根


chroot命令
作用:切換根

PS:總結啟動流程
POST-->BIOS(BootSequence)-->MBR(Bootlader)-->vmlnuz,initrd(initramfs)-->/sbin/init(/etc/inittab)

關於/etc/inittab的相關介紹

程序:/sbin/init
配置文件:/etc/inittab(vim /etc/inittab)
linux的運行級別(模式)
0 - halt (Do NOT set initdefault to this)(關機)
1 - Single user mode(通常用來修復系統)
2 - Multiuser, without NFS (The same as 3, if you do not have networking) (為了解決網絡不通導致系統啟動異常)
3 - Full multiuser mode(字符級別的多用戶模式)
4 - unused(系統保留功能)
5 - X11(圖形界面,前提必須安裝圖形界面)
6 - reboot (Do NOT set initdefault to this) (重啟)

*查看級別
# runlevel
返回: N 3
N:表示沒有切換過級別
切換級別
# init N

inittab詳解
格式:
id:level:action:process

action的相關介紹
initdefault: 設置默認級別
sysinit:指定系統初始化過程中,要執行的腳本
wait:等待,監控一旦處於指定級別就執行的操作
ctrlaltdel:設置當用戶按下 ctrl + alt + del時候所觸發的操作
powerfail:設置當發生斷電的情況下,所執行的操作
respawn:指定終端

linux系統啟動過程中,會將指定級別下的程序啟動或關閉
程序的存放位置:/etc/init.d
程序加入到系統服務以後,會自動生成連接文件
# chkconfig --add 腳本名
程序的鏈接文件位置: /etc/rc.d/rcN.d
/etc/rc0.d
/etc/rc1.d
/etc/rc2.d
/etc/rc3.d
/etc/rc6.d
分別對應系統的七個運行級別
image
系統啟動的時候,會首先判斷級別(假設判斷級別為3)
判斷級別以後,會在/etc/rcN.d下,將所有S開頭的程序啟動,所有K開頭的程序關閉

注意:
一旦將一個程序添加到系統服務,那麼會自動在/etc/rcN.d下創建鏈接文件
grub引導系統啟動,分為三個階段
stage1:其實就是使用MBR中的bootloader完成內核檢索
stage1.5:在boot分區中,用來識別文件系統,此階段只有在分區的時候才有用
stage2:使用 /boot/grub/grub.conf 中的程序完成系統的最終啟動

grub.conf詳解(vim /boot/grub/grub.conf)

default=0 #指定默認使用哪個內核文件,零表示第一個
timeout=5 #設置開機等待時間(可以自己改了玩著試試)
splashimage=(hd0,0)/grub/splash.xpm.gz #開機背景圖片,也可修改但是照片的格式必須和系 統相同
hiddenmenu #隱藏菜單
title CentOS (2.6.32-431.el6.x86_64) #開機提示信息
root (hd0,0) #指定內核文件所在分區,這裡表示第一個磁盤第一個分區
kernel /vmlinuz-2.6.32-431.el6.x86_64(指定內核) ro root=/dev/mapper/vg_chenxiaoxu-lv_root rd_LVM_LV=vg_chenxiaoxu/lv_swap rd_NO_LUKS rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 (指定語言)rd_LVM_LV=vg_chenxiaoxu/lv_root(指定根分區位置) KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img


Grub的基本使用(忘了Linux密碼可以修改)
1、進入grub界面:在等待時間內按回車鍵
可用的命令
e:進入編輯界面(其實編輯/boot/grub/grub.conf)
a:編輯內核功能
c:進入命令行模式
2、進入編輯模式
e:進入編輯模式
c:同上
b:引導開始進入系統
o:新添加一行
d:刪除
3、編輯kernel行
【修改此行可以設置系統的運行模式】
在原有內容後寫上一個 1 ,進入單用戶模式,然後回車,返回到grub.conf的編輯界面
按 b 開始引導進入系統
4、給grub設置密碼
修改grub.conf,添加一個字段passwd
方式是:
在title 上面添加一行內容
password 123
注意:添加是的明文密碼,不安全,所以看下邊啦

5、給grub設置加密的密碼
1)生成加密密碼
image

2)將密碼添加到/boot/grub/grub.conf中
password --md5 $1$4ixMm$UXtaHOHwyyQtdtDlk/9no/

--md5:是指定的加密方式大名叫MD5加密
在新的磁盤上安裝grub

(前提:添加一個新的磁盤大小為1G,必須使用單個文件作為磁盤文件,將此文件存到一個容易找到的地方,

1)這個新磁盤必須提前進行分區
2)這個新磁盤必須掛載到系統的某個目錄之上


有兩種安裝方式
第一種方式:grub-install 進行安裝
第二種方式:進入grub模式進行安裝

方式二:grub模式安裝
# grub
grub >
破壞grub的第一階段
bootloader(MBR-446)
# dd if=/dev/zero of=/dev/sda bs=1 count=1(泡泡機)
修復grub的第一階段
1)進入grub模式
# grub
2)測試根分區的編號
# root (hd#,#) PS:這裡的hd#是磁盤編號,#是分區編號
出現信息:filesystem type unkown 表示不是boot所在分區
3)在根分區所在的磁盤上安裝grub(bootloader)
安裝grub的格式:
grub > setup (hd#) PS:hd# 表示在指定的磁盤上來安裝grub

方式一:grub-install方式安裝
格式:grub-install --root-directory=路徑
注意:這個路徑指的是boot所在分區
1)分區操作
分區
格式化
掛載
# mount /dev/sdb1 /media
2)安裝grub
# gurb-install --root-directory=/media /dev/sdb

模塊相關的命令
lsmod
已經加載的模塊名稱以及依賴的模塊
modinfo
格式:modinfo 模塊名稱
作用:顯示一個莫得詳細信息
depends:該模塊所依賴的模塊
filename:模塊的保存位置
description:模塊的描述信息
modprobe
格式:modprobe 模塊名稱
作用:動態加載模塊

modprobe -r 模塊名稱:卸載模塊

insmod
格式:insmod /patt/to/模塊名稱
作用: 加載模塊

rmmod
格式:rmmod 模塊名稱
作用:卸載模塊


例子:查看顯示floppy模塊信息

查看模塊的相信信息
# modinfo floppy

查看該模塊是否已經被加載
# lsmod | grep floppy
floppy 61447 0

卸載此模塊
# modprobe -r floppy
# lsmod | grep floppy

重新加載此模塊
# modprobe floppy
# lsmod | grep floppy
floppy 61447 0



准備一個新磁盤
安裝grub
編寫一個grub.conf
向這個磁盤移植幾個常用命令ls cd mkdir。。。



制作簡單的linux
1、添加硬盤,創建兩個分區
1)創建分區
/dev/sdb1->200M
/deb/sdb2->xx
2)掛載分區
sdb1 --> /media/boot
sdb2 --> /media/sysroot

2、在該硬盤上安裝grub
# grub-install --root-directory=/media/boot /dev/sdb

3、移植kernel和initrd

4、創建系統的必要目錄
bin
sbin
etc/rc.d
var
usr
tmp
home
root
proc
sys
meida
mnt
lib
lib64

5、移植系統命令
bash
mount
cd
ls
cp
mkdir
rm
touch

6、給bash創建軟件鏈接sh

7、生成grub的配置文件
default=0
timeout=10
title my mini linux
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
initrd /initramfs.img

8、創建一個init程序,來完成系統初始化
1)創建init
#!/bin/bash
echo -e "wellcome to linux \033[32m zxhk \033[0m"
# mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
mount -n -o remount,rw /dev/sda2 /
/bin/bash
2)賦予執行權限

3)修改grub.conf

9、導入網絡功能模塊
1)導入命令

2)移植網卡模塊
# cp `modinfo e1000 | head -n1 | awk '{print $2}'` /media/sysroot/lib/

3)修改init,加載網卡模塊
#!/bin/bash
echo -e "wellcome to linux \033[32m zxhk \033[0m"
# mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
insmod /lib/e1000.ko
ifconfig eth0 10.100.0.112 netmask 255.255.0.0
ifconfig lo 127.0.0.1 netmask 255.0.0.0
mount -n -o remount,rw /dev/sda2 /
/bin/bash

Copyright © Linux教程網 All Rights Reserved