系統的啟動流程;
POST加電自檢–>Boot Sequence(BIOS)–>Boot Loader(MBR)–>kernel(Ramdisk)–>rootfs–>switchroot–>/sbin/init–>/etc/inittab /etc/init.d/*.conf–>設定默認啟動級別–>系統初始化腳本–>關閉或啟動對應級別下的服務–>啟動終端
grub:Grand Unified Bootloader
grub 0.x:grub legacy
grub 1.x:grub2
grub legacy:
stage1:mbr
stage1_5:mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統
stage2:磁盤分區/boot/grub/
grub的配置文件:/etc/grub.conf–>/boot/grub/grub.conf
stage2及內核通常放置于一個基本磁盤分區上:
1.提供啟動菜單,并提供交互式接口
a.內核參數
b.編輯模式,用于編輯菜單
c.命令模式,交互式接口
2.加載用戶選擇的內核或操作系統
允許傳遞參數給內核
可以藏菜單啟動項
3.為菜單提供了保護機制
為編輯啟動菜單進行認證
為啟用內核或操作系統進行認證
如何獲取設備
(hd#,#)
hd#:磁盤編號,用數字表示,從0開始編號
#:分區編號,用數字表示,從0開始編號
grub的命令行接口
help:獲取幫助列表
help keyword:詳細幫助信息
find(hd#,#) /path/to/somefile
root (hd#,#)
kernel /path/to/kernel_file:設定本次啟動時用到的內核文件;額外還可以添加許多內核使用的cmdline參數
如:init=/path/to/init ,selinux=0
initrd /path/to/initramfs_file:設定為選定的內核提供額外的ramdisk
boot:引導啟動選定的內核
手動在grub命令行接口啟動系統:
當系統中的grub文件損壞時,除了對文件進行編輯操作進行修復,我們也可以通過COMMAND Line的模式自己手動進行grub的配置
grub>root(hd#,#)
grub>kernel /vmlinuz-version-release ro root=/dev/device
grub>initrd /initramfs-version-release.img
grub>boot
配置文件:
/etc/grub/grub.conf
配置項:
Default=#:設定默認啟動的菜單項,菜單項(title)編號從0開始
Timeout=#:指定菜單項等待用戶選擇的時長
Splashimage=(hd#,#)/path/to/xpm_pic_file:指明菜單背景圖片文件路徑
Hiddenmenu:隱藏菜單
password [–md5] STRING:菜單編輯認證
title TITLE:定義菜單項“標題”,可出現多次
root (hd#,#):grub查找stage2及kernel文件所在設備分區,即’grub’的根
kernel /path/to/vmlinuz_file[parameters]:啟動的內核,為grub的根
initrd /path/to/initramfd_file:內核匹配的ramfs文件
password [–md5] STRING:啟動選定的內核或操作系統式進行認證
grub-md5-crypt命令:
該命令可以是用簡單的加密算法md5對明文進行加密
進入單用戶模式:
1. 編輯grub菜單(選定要編輯的title,而后使用e命令);
2. 在選定的kernel后附加
1,s,S,single
3. 在kernel所在行,鍵入b命令
安裝grub:
1.grub-install
grub-install –root-directory=dir /dev/disk
2.grub
grub>root(hd#,#)
grub>setup(hd#)
SITUATION ONE:
當系統啟動stage1過程出現問題,即MBR上前446個字節出現問題,系統不能正確讀取數據,導致系統無法正常啟動,解決方案:
首先掛載光盤
由于系統無法讀取MBR,所以直接進入光盤啟動界面,選擇救援模式
切換當前的根至系統實際的根分區上:chroot /mnt/sysimage
使用命令grub-install /dev/device 來修復受損的MBR,然后重啟系統
出現這個畫面表示系統已經能夠成功啟動了,只需要等待系統掃描完成就可以了。
SITUATION TWO
在系統進行MBR引導啟動時,如果在stage1.5階段出現問題時,即MBR扇區第一個512字節讀取完后,后面的數據遭到了損壞,無法讀取,系統也無法啟動,這是我們可以進行如下的操作將系統恢復正常:
可以看到,512字節(55 aa)之后的數據都被擦出了,然后重啟系統
同樣系統啟動不了,因為破壞了stage1.5,從而系統無法獲取/boot分區掛載的相關數據信息
同樣,我們選擇光盤的救援模式,進入之后,查看下掛載情況,切換根,同樣使用grub-install命令加上要修復的磁盤,進行修復,修復完成后重啟系統
SITUATION THREE
當系統在執行stage2過程中出現問題,如/boot下grub的配置文件配置錯誤或者誤刪了,我們可以除了通過使用光盤掛載來恢復系統,也可以使用網絡中的主機進行修復,具體步驟如下:
如果有網絡源,我們可以通過配置IP,選擇通過網絡上的某臺主機來恢復
選擇網卡設備,設置IP地址,如果是通過dhcp服務自動獲取IP,就不需要設置IP,直接通過dhcp服務獲取
另開啟一個終端,可以查看ip獲取情況
通過df命令,我們可以看到系統的根分區被掛載在/mnt/sysimage上,當前我們是在光盤的根目錄下,所以我們要切換至系統實際的根目錄下,使用命令chroot /mnt/sysimage,然后我們可以通過使用遠程拷貝命令:scp remote:/boot/* /boot/ 將受損的文件替換掉,但要注意,我們遠程鏈接的主機的操作系統應該和我們當前主機的操作系統一致。
SITUATION FOUR
預想一個更嚴重的情況,當我們刪除了/boot分區,破壞扇區,然后將/etc/fstab文件也刪除了,這種情況下,我們的系統根本就不可能起的來了
此時,我們進去救援模式,此時系統提示已經找不到任何分區,無法識別分區
進入bash,使用df查看到沒有系統的分區,可以使用fdisk查看到硬盤分區情況
創建目錄,然后將進行掛載,然后切換根,創建/etc/fstab文件,將最根本的兩個分區掛載信息寫入該文件中/boot和/ ,然后重啟系統
重啟系統后,可以自動掛載分區,這時我們需要安裝kernel包,因為之前我們刪了/boot目錄,掛載光盤,安裝kernel包,然后重啟
再次進入救援模式,使用grub-install –root-directory=/mnt/sysimage /dev/sda3 ,如果使用了chroot切換了根目錄,那么可以不指定root-directory,因為,我們現在已經位于boot的父目錄上,root-directory指定的是boot的父目錄,然后編寫boot/grub/grub.conf文件,如下:
重啟系統:
SITUATION FIVE
當然有些情況下,我們系統的使用的并不是常規的磁盤分區,而是采用的邏輯卷進行分區,安裝操作系統,這時,如果上述的某個stage過程出現問題,導致系統無法正常啟動,我們也可以通過如下的操作,來修復我們的系統
當系統不能正常啟動時,我們應先掛載光盤,然后進入rescue救援模式,這邊我們以最壞的情況做演示,如圖所示,
現在系統已經無法正確識別分區,使用df命令,我們也無法看到系統中的邏輯卷,也無從得知卷組,邏輯卷名稱,這時我們需要先對磁盤進行掃描lvscan,來獲取具體有哪些邏輯卷,然后我們可以使用vgchange -ay來激活這些邏輯卷,然后再使用lvscan掃描,這時我們可以看到這些邏輯卷的狀態由inactive變為active
然后我們需要創建對應的目錄進行掛載,然后將邏輯卷掛載到創建的目錄上
,然后“切換”根,不是cd,進入到系統上的根目錄下,我們創建/etc/fstab文件,將最重要的兩個分區寫入文件中,/boot 和 / ,然后重啟系統,重啟之后,系統就能夠識別到掛載的分區,然后我們就可以對照上述的情況,采取對應的操作來使系統恢復正常。
使用rpm命令修復受損的內核
使用grub-install 命令修復受損的grub,然后創建grub.conf文件,將相應的配置信息寫進文件中
重啟,系統就可以正常運作了
在原有系統的基礎上,做一個微型linux
1.先準備一塊新硬盤
2.使用echo ‘- – -’ > /sys/class/scsi_host/host0/scan
3.對硬盤進行分區,進行格式化,然后分別掛載到對應目錄下
4.安裝grub grub-install –root-directory=/mnt /dev/sdd
5.編輯grub.conf文件
vim /mnt/boot/grub/grub.conf
6.復制內核及initramfs文件
7.配置fstab文件
8.復制相關命令
9.重開個虛擬機,以該硬盤作為啟動盤,開啟系統
Linux:單內核設計,但充分借鑒了微內核體系的設計的優點,為內核引入了模塊化機制
內核的組成部分:
kernel:內核核心,一般為bzimage,通常位于/boot目錄。名稱為vmlinuz-version-release
kernel object:內核對象,即內核模塊,一般放置于/lib/modules/version-release/
內核核心與內核模塊版本一定要嚴格匹配;
[]:N
[M]:modules
[*]:Y,直接編譯至內核核心
內核:動態裝載和卸載
ramdisk:輔助性文件,并非必須,取決于內核是否能直接驅動rootfs所在的設備
目標設備驅動,例如SCSI設備的驅動
邏輯設備驅動,例如LVM設備的驅動
文件系統,例如xfs文件系統
ramdisk:是一個簡裝的根文件系統;
內核信息查看:
uname命令:print system information
-r:內核的發行好
-n:顯示主機名
模塊信息獲取
lsmod:顯示的內核來自于/proc/modules
modinfo命令:顯示單個內核模塊文件的信息
modinfo [-F field] [-k kernel] [modulename|filename…]
-F field 僅顯示指定字段信息
-n 顯示文件路徑
modprode : add and remove modules from the linux kernel
格式:modprobe [-r] module_name
模塊的動態裝載 modprobe module_name
動態卸載 modprobe –r module_name
depmod命令:Generate modules.dep and mod files
內核模塊依賴關系文件及系統信息的生成工具
模塊的裝載和卸載的另一組命令
insmod:
insmod [filename] [module options…]
Filename 模塊文件的文件路徑
rmmod:
rmmod [module_name]
ramdisk文件管理
(1)mkinitrd命令
為當前使用中的內核重新制作ramdisk文件
mkinitrd [option] [<initrd-image>] <kernel-version>
–with=<module> 除了默認的模塊之外需要裝載至initramfs中的模塊
–preload=<module> initramfs所提供的模塊需要預先裝載的模塊
實例:mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2)dracut命令
low level tool generating an initramfs image
dracut [option…] [<image>] [<kernel version>]
dracut /boot/initramfs-$(uname -r).img $(uname -r)
內核信息輸出的偽文件系統
/proc 內核狀態和統計信息的輸出接口;同時,還提供一個配置接口/proc/sys
參數:
只讀:信息輸出 例如/proc/#/*
可寫:可接受用戶指定一個“新值”來實現對內合謀功能或特性的配置 /proc/sys
/proc/sys:
net/ipv4/ip_forward 相當于net.ipv4.ip_forward
(1)sysctl命令:專用于查看或設置/proc/sys目錄下的參數的值
sysctl [options] [variable[=value]]
查看:
#sysctl –a
#sysctl variable
#cat /proc/sys/path/to/some_kernel_file
修改:
#sysctl –w variable=value
(2)文件系統命令(cat echo)
查看
# cat /proc/sys/path/to/some_kernel_file
設定
#echo “value” > /proc/sys/path/to/some_kernel_file
注意:上述兩種方式的設定僅當前運行內核有效
(3)配置文件 /etc/sysctl.conf /etc/sysctl.d/*.conf
sysctl –p [/path/to/config_file]立即生效
內核參數
net.ipv4.ip_forward 報文核心轉發功能
vm.drop_caches 回收內存 /proc/sys/vm/drop_caches丟棄caches
kernel.hostname
net.ipv4.Icmp_echo_ignore_all 禁止其他主機ping
/sys目錄
sysfs:輸出內核識別的各硬件設備的相關屬性,也有內核對硬件特性的可設置參數,對此寫參數的修改,即可定制這些硬件的工作特性
udev:通過讀取/sys目錄下的硬件設備信息按需為各硬件設備創建設備文件
udev:是用戶空間程序 專用工具devadmin hotplug
udev:為設備創建設備文件時,會讀取事先定義好的的規則文件,一般在/etc/udev/rules.d/目錄下,以及在/usr/lib/udev/rules.d/目錄下
編譯內核-定制個人LINUX
step1: 從官網上選擇一個內核版本下載至本地系統中
step2: 對下載到的包進行解壓縮,指定解壓的路徑至:/usr/src下,tar xvf linux-*.gz -C /usr/src
step3: 拷貝一個配置文件的模板至解壓縮的目錄下,以.config命名
step4: 使用make menuconfig命令進行個人定制,選擇自己所需要的功能組件,對于那些不需要的功能,我們可以選擇不加載到模塊或者內存中,使用空格鍵進行選擇,M表示加載到模塊中,*表示加載到內存中,我們也可以自己設定kernel的名稱
step5:make -j #
#:指明處理器核心總數,推薦使用并行編譯,加快編譯速度
lscup可以查看cpu數量:
step6:編譯完成后,模塊安裝
make modules_install
安裝之后,我們可以看到/lib/modules文件下,多了一個模塊,這就是我們剛剛編譯安裝的模塊
進入到目錄中,我們可以找到自己個人定制的一些功能模塊
step7:安裝內核對應文件
安裝完成后,在/boot目錄下,就多了一個剛編譯的內核核心
查看/boot/grub2/grub.cfg,可以看到新的內核信息已經寫入到該文件中,之后重啟系統就可以看到增加了一個新的內核
選擇新編譯的內核,啟動
系統正常啟動
至此,個人定制linux系統制作完成
原創文章,作者:Stupid_L,如若轉載,請注明出處:http://www.www58058.com/45867