Linux系統(tǒng)啟動(dòng)流程、grub修復(fù)磅氨、模塊管理及內(nèi)核參數(shù)設(shè)定
runlevel, who -r , chkconfig ,grub ,grub-install , mkinitrd , dracut ,sysctl ,lsmod ,modinfo , modprobe , depmod , insmod ,rmmod
Linux系統(tǒng)的組成部分
-
kernel
- /boot/vmlinuz-VERSION-RELEASE
-
initrd
- Centos 5 : /boot/initrd-VERSION-RELEASE.img
- Centos 6/7 : /boot/initramfs-VERSION-RELEASE.img
-
filesystem
-
模塊文件
- 一般存放于/lib/modules/$(uname -r)/目錄下
內(nèi)核的設(shè)計(jì)流派
- 單內(nèi)核設(shè)計(jì)
- 把所有功能集成于同一個(gè)程序中尺栖,其中l(wèi)inux就是以單內(nèi)核設(shè)計(jì)
- 微內(nèi)核設(shè)計(jì)
- 每個(gè)功能使用一個(gè)單獨(dú)的子系統(tǒng)實(shí)現(xiàn),每個(gè)子系統(tǒng)通信需有特殊的機(jī)制來(lái)實(shí)現(xiàn)烦租,其中winodows叉橱、solaris的內(nèi)核設(shè)計(jì)方式就為微內(nèi)核屡贺。
Linux內(nèi)核的特點(diǎn)
- 單內(nèi)核設(shè)計(jì)
- 支持模塊化(.ko的文件,[]kernel object])
- 支持模塊運(yùn)行時(shí)動(dòng)態(tài)裝載或卸載
- 內(nèi)核可以將驅(qū)動(dòng)模塊或者功能模塊編譯進(jìn)內(nèi)核,由內(nèi)核初始化直接加載完成
linux啟動(dòng)流程示意(內(nèi)核空間---用戶空間)
-
內(nèi)核空間
- POST—>BootSequence(BIOS)—>bootloader(MBR)—>kernel(ramdisk) —>rootfs(只讀方式掛載)—> /sbin/init
-
用戶空間:
- /sbin/init(/etc/inittab) --> { id:#:initdefault: --> si::sysinit:/etc/rc.d/rc.sysinit --> l#:#:wait:/etc/rc.d/rc # --> /etc/rc.d/rc#.d/[1突想、開(kāi)始S開(kāi)頭的服務(wù)猾担;2、結(jié)束K開(kāi)頭的服務(wù)]}-->/etc/rc.d/rc.local
- 注意:以上{}中工腋,表示在/etc/inittab文件中完成的步驟。
- /sbin/init(/etc/inittab) --> { id:#:initdefault: --> si::sysinit:/etc/rc.d/rc.sysinit --> l#:#:wait:/etc/rc.d/rc # --> /etc/rc.d/rc#.d/[1突想、開(kāi)始S開(kāi)頭的服務(wù)猾担;2、結(jié)束K開(kāi)頭的服務(wù)]}-->/etc/rc.d/rc.local
內(nèi)核空間啟動(dòng)步驟
1趁冈、POST加電自檢
- 當(dāng)按主機(jī)電源鍵渗勘,計(jì)算機(jī)主板通電洒沦,并完成已下操作:
- 加載Bios中的ROM中的程序申眼,來(lái)檢測(cè)各種硬件設(shè)備
Bios : Baisc input and output system
2、BootSequence
- 按bootsequence的啟動(dòng)列表濒翻,查找MBR或UEFI的活動(dòng)設(shè)備有送。
3、Bootloader
- 找到MBR后查找引導(dǎo)加載器(bootloader程序),讀取mbr中的bootloader,加載boootloader中的grub程序
Grub的工作原理
- stage1: 加載mbr中的所有分區(qū)信息
- stage1.5: mbr之后的扇區(qū)阵赠,讓stage1中的bootloader能識(shí)別stage2所在的文件分區(qū)上的文件系統(tǒng)
- stage2: 磁盤(pán)分區(qū)之上(/boot/grub/)
注意:MBR能識(shí)別基本的硬盤(pán)設(shè)備,但不能識(shí)別高級(jí)的文件系統(tǒng)枷邪,如lvm , raid等
Bootloader的類型及使用場(chǎng)景
- ntloader
- windows
- LILO(linux loader)
- 早期的Linux系統(tǒng)
- 安卓手機(jī)設(shè)備
- grub(Grand Uniform bootloader)
- Centos 5/6 (grub 0.X)
- Centos 7 (grub 1.X)
4齿风、加載虛根文件系統(tǒng)(ramfs)
- 完成虛根ramfs的初始化,以此來(lái)識(shí)別硬盤(pán)上的文件系統(tǒng)脸候。
5泵额、掛載rootfs
- 以只讀方式掛載根文件系統(tǒng)
6嫁盲、初始化init進(jìn)程
- 運(yùn)行進(jìn)程ID為1的Init進(jìn)程,利用init啟動(dòng)流程完成用戶空間的啟動(dòng)步驟
用戶空間啟動(dòng)步驟
SysVinit進(jìn)程的初始化
-
讀取/etc/inittab瘾蛋,需完成如下加載步驟:
- 系統(tǒng)運(yùn)行級(jí)別加載:id:#initdefault:
- si::sysinit:/etc/rc.d/rc.sysinit : 加載運(yùn)行/etc/rc.d/rc.sysinit文件,完成如下動(dòng)作:
- 激動(dòng)Udev和selinux
- 根據(jù)/etc/sysctl.conf文件取董,來(lái)設(shè)置內(nèi)核參數(shù)
- 設(shè)定系統(tǒng)時(shí)鐘
- 裝載鍵映射
- 啟用交換分區(qū)
- 設(shè)置主機(jī)名
- 要文件系統(tǒng)檢測(cè),并以讀寫(xiě)方式重新掛載
- 激活raid和lvm設(shè)備
- 啟用磁盤(pán)配額
- 根據(jù)/etc/fstab檢測(cè)并掛載所有文件系統(tǒng)
- 清理過(guò)期的鎖和PID文件
- l0:0:wait:/etc/rc.d/rc 0 ---> /etc/rc.d/rcX.d/* 對(duì)應(yīng)系統(tǒng)運(yùn)行級(jí)別坡垫,開(kāi)啟或關(guān)閉系統(tǒng)各服務(wù)堡妒,如下:
- 停止K*的服務(wù)
- 啟動(dòng)S*開(kāi)頭的服務(wù)
- 以上服務(wù)都由chkconfig命令管理,并由service命令調(diào)用執(zhí)行停止或關(guān)閉操作伏尼。
- tty6:2345:respawn:/usr/sbin/mingetty tty6爆阶,啟動(dòng)登錄窗口,并打印歡迎界面
- 其是mingetty調(diào)用login程序吱韭,完成密碼驗(yàn)證過(guò)程
- 加載/etc/rc.d/rc.local文件
- 此文件是系統(tǒng)最后啟動(dòng)的一個(gè)文件,可以將不需要寫(xiě)在服務(wù)維護(hù)腳本的命令放置在這里熏挎,它將會(huì)隨系統(tǒng)一起啟動(dòng)完成坎拐。
注意:
- Centos7的init程序?yàn)閟ystemd,其配置文件存放于:/usr/lib/systemd/system/* ; /etc/systemd/system/*
- Centos6的init為upstart,但為了兼容SysV風(fēng)格积担,名稱也為Init,其配置文件放置于/etc/init/*.conf
upstart的初始化流程
/etc/inittab
(定義了默認(rèn)的運(yùn)行級(jí)別)-->/etc/init/rc.conf
(其中定義了相應(yīng)的運(yùn)行級(jí)別所要執(zhí)行對(duì)應(yīng)級(jí)別下的服務(wù)/etc/rc.d/rcX.d/* ,根據(jù)命令exec /etc/rc.d/rc $RUNLEVEL
來(lái)調(diào)用/etc/rc.d/rcX.d/*
)-->/etc/rc.d/rc.local
================
/etc/inittab文件格式說(shuō)明
- id:runlevel:action:process
- id: 一個(gè)任務(wù)的標(biāo)識(shí)
- runlevel: 在哪些級(jí)別下啟動(dòng)此任務(wù),可以為空,即表示所有級(jí)別
- action:在什么條件下啟動(dòng)此任務(wù)
- wait : 等待切換至此任務(wù)所在的級(jí)別時(shí)執(zhí)行一次
- respawn : 設(shè)定默認(rèn)運(yùn)行給別渴庆,此時(shí)process省略
- sysinit: 設(shè)定系統(tǒng)初始化方式耸弄,此處一般為指定/etc/rc.d/rc.sysinit腳本
- process:任務(wù)
示例
0:0:wait:/etc/rc.d/rc 0 : 意味著去啟動(dòng)或者關(guān)閉/etc/rc.d/rc3.d/目錄下的服務(wù)腳本所控制的服務(wù),所有K開(kāi)頭的要停止的服務(wù)胧砰,所有S開(kāi)頭的啟動(dòng)击罪。 其中表示優(yōu)先級(jí),K中數(shù)值越小囱怕,表示越先關(guān)閉岛宦,S中數(shù)據(jù)越小表示越先開(kāi)啟。一般依賴的服務(wù)先關(guān)閉,然后再關(guān)閉被依賴的荣德。或者一般被依賴的服務(wù)先啟動(dòng)生音,依賴的服務(wù)后啟動(dòng)
============
運(yùn)行級(jí)別:
- 0:關(guān)機(jī),shutdown
- 1: 單用戶模式饱须,(single user) root用戶,無(wú)須認(rèn)證登陸
- 2:多用戶模式(multi user),會(huì)啟動(dòng)網(wǎng)絡(luò)功能,但不會(huì)啟動(dòng)NFS;維護(hù)模式
- 3:多用戶模式(multi user),完全功能模式屉凯,文本界面
- 4:預(yù)留級(jí)別:目前無(wú)特別使用目的灌旧。但習(xí)慣與同3級(jí)別功能使用
- 5: 多用戶模式:(multi user),完全功能模式铝噩,圖形界面。
- 6: 重啟,reboot
查看系統(tǒng)運(yùn)行級(jí)別
- runlevel
- who -r
- systemctl get-default(Centos 7)
=========
系統(tǒng)服務(wù)類腳本的添加和管理
添加一個(gè)腳本格式
#!/bin/bash
#
#chkconfig: 2345 50 60 #表示2345開(kāi)啟跃惫,其他關(guān)閉
#description XXXXX
下面是腳本正文终蒂,需要接受至少如下四個(gè)參數(shù):
{start|stop|restart|status}
使用chkconfig命令添加服務(wù)及管理
- 首先需要將腳本復(fù)制至/etc/init.d/中。
- 再使用chkocnfig --add 腳本名稱(服務(wù)名稱)
- 再使用service 腳本服務(wù) start
=============
chkconfig命令
- chkconfig --add service_name
- 添加一個(gè)服務(wù)腳本
- chkconfig --del service_name
- 刪除一個(gè)服務(wù)腳本
- chkconfig --list
- 查看所有服務(wù)的啟動(dòng)狀態(tài)
- chkconfig 2345 service_name on
- 在2345運(yùn)行級(jí)別啟用此服務(wù)
- chkconfig 2345 service_name off
- 在2345運(yùn)行級(jí)別下關(guān)閉此服務(wù)
grub如何識(shí)別設(shè)備
- 1债朵、Boot需單獨(dú)分區(qū)
- grub的位置應(yīng)該為/grub/vmlinz
- 2谚中、識(shí)別磁盤(pán)都為hd
- (hd#,#) : 第一個(gè)表示磁盤(pán)分區(qū)囊拜,第二個(gè)#表示分區(qū),都用數(shù)字表示,從零開(kāi)始編號(hào)
grub的命令行接口
help:獲取幫助列表
help KEYWORD : 詳細(xì)幫助信息
find (hd#,#)/PATH/TOSOMFILE
find (hd0,0)/vmlinuz-2.6.32
root(hd0,0) :把那個(gè)設(shè)備設(shè)置為根設(shè)備
-
kernel /path/to/kernel_file: 設(shè)定本次啟動(dòng)時(shí)用到的內(nèi)核文件仪糖,額外還可以添加許多內(nèi)核使用的command參數(shù)
例如:init=/path/to/init, selinux=0,quiet
initrd /path/to/initramfs_file | initrd_file : 設(shè)定為選定的內(nèi)核提供額外文件的ramfs(必須與內(nèi)核版本號(hào)完全匹配)
boot:引導(dǎo)啟動(dòng)選定的內(nèi)核
手動(dòng)在grub命令行接口啟動(dòng)系統(tǒng):
grub> root(hd0,0)
grub> kernel /vmlinuz-version-release ro root=/dev/DEVICE
grub> initrd /initramfs-version-release.img
grub> boot
注意:ro : 表示以只讀方式掛載根文件系統(tǒng)
root=/dev/DEVICE : 應(yīng)該寫(xiě)根文件系統(tǒng)所在的磁盤(pán)分區(qū)
grub的文件的配置格式
/etc/grub/grub.conf
default=0 # 設(shè)置默認(rèn)啟動(dòng)的tile,0表示第一個(gè)tile
timeout=5 # 在啟動(dòng)時(shí)選擇tile時(shí)的超時(shí)時(shí)間
hiddenmenu #是否隱藏啟動(dòng)界面
password --md5 密碼串(使用grub-md5-crypt工具加密的密碼串)#如果加密玻粪,編輯grub時(shí)會(huì)要求輸入密碼
title (Centos 6.6) #啟動(dòng)時(shí)的菜單名稱
root (hd0,0) # 表示kernel的存放位置结窘,hd統(tǒng)一表示為所有硬盤(pán),第一個(gè)0表示第一塊硬盤(pán),第二個(gè)0表示一個(gè)分區(qū)
kernel /vmlinuz.VERSION.release #kerenl文件的存放路徑
initrd /initramfs.VERSION.release.img #initramfs的存放路徑
password --md5 密碼串 #這個(gè)密碼加密后,啟動(dòng)相應(yīng)的內(nèi)核時(shí),會(huì)要求輸入密碼
#注意:title中的每一行都必須要縮進(jìn)一個(gè)空白字符,當(dāng)grub損壞時(shí),可以使用"find (h0,0)/"查找目錄下的文件,使用TAB鍵補(bǔ)全,如果有就會(huì)列出所有的文件责静,如果沒(méi)有揩徊,表示(hd0,0)指定有錯(cuò)誤,需再查找其他的分區(qū)中是否有。
進(jìn)入單用戶模式:
- 1、編輯grub菜單(選定要編輯的title ,e命令)
- 2、在選定的kernel后附加1,S,s 或者single都可以
- 3、在kernel所在行,鍵入b命令
手動(dòng)安裝grub的方法
-
1、grub-install --root-directory=/mnt /dev/sdb
注意:--root-directory=/mnt : 這個(gè)位置必須指定為boot目錄所在的父目錄,grub會(huì)自行在父目錄中找到boot目錄膘融,然后把grub程序安裝到對(duì)應(yīng)的目錄中,一般情況在掛載新預(yù)備安裝gurb的硬盤(pán)時(shí),需要在文件系統(tǒng)上建立一個(gè)boot目錄,再把對(duì)應(yīng)的磁盤(pán)掛到boot目錄中,這樣grub才會(huì)找到boot目錄,在下面建立所需的文件,如果掛載時(shí)不創(chuàng)建boot目錄,那和以grub會(huì)在目錄下創(chuàng)建boot目錄,啟動(dòng)時(shí)需要將kernel和initrd的位置就應(yīng)該為/boot/vmliunz格式
-
2、分步驟安裝
grub grub> root (hd0,0) grub> setup (h0,0)
手動(dòng)修復(fù)grub引導(dǎo)程序
模擬損壞mbr
- dd if=/dev/zero of=/dev/sda bs=200 count=1
- 需要先備份好mbr,使用
dd if=/dev/sda of=/root/sda bs=512 count=1
- 需要先備份好mbr,使用
修復(fù)過(guò)程
- 1悠菜、掛載安裝光盤(pán),執(zhí)行
linux rescue
進(jìn)行急救模式 - 2、chroot /mnt/sysimage
- 3姻僧、執(zhí)行
grub-install --root-directory=/ /dev/sda
/dev/sda : 這是對(duì)磁盤(pán)的mbr修復(fù)指定位置松嘶,必須是磁盤(pán)尽超,不能是分區(qū)棘脐,就是mbr所存放的位置
新加硬盤(pán)屈梁,提供直接單獨(dú)運(yùn)行bash系統(tǒng)
####創(chuàng)建文件系統(tǒng)并掛載
mke2fs -t ext4 /dev/sdb1
mke2fs -t ext4 /dev/sdb2
mkdir /media/boot
mount /dev/sdb1 /media/boot/
grub-install --root-directory=/media /dev/sdb
cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /media/boot/vmlinuz
cp /boot/initramfs-2.6.32-573.el6.x86_64.img /media/boot/initramfs.img
####grub配置文件信息
vim /media/boot/grub/grub.conf
default=0
timeout=5
hiddenmenu
title (Centos6.6)
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs.img
####給根文件系統(tǒng)提供bash和相應(yīng)的庫(kù)文件
mount /dev/sdb2 /mnt/
cd /mnt/
mkdir $(ls /) -pv
cp /bin/bash /mnt/bin/bash
ldd /bin/bash
cp /lib64/libtinfo.so.5 /mnt/lib64/
cp /lib64/libdl.so.2 /mnt/lib64/
cp /lib64/libc.so.6 /mnt/lib64/
cp /lib64/ld-linux-x86-64.so.2 /mnt/lib64/
chroot /mnt/
ramfs文件的管理
1战坤、mkinitfs 命令(Centos5)
- synopsis: mkinitrd [OPTION...] [<initrd-image>] <kernel-version>
示例:
- mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
2、dracut 命令(Centos 6\7)
示例:
- dracut /boot/initramfs-$(uname -r).img $(uname -r)
內(nèi)核信息輸出的偽文件系統(tǒng):
-
1、/proc目錄
內(nèi)核狀態(tài)及統(tǒng)計(jì)信息的輸出接口登疗,同時(shí)還提供了一個(gè)配置接口:
/proc/sys
,可以使用sysctl
命令修改其內(nèi)核參數(shù)智政,其此目錄下的大部分文件都可接受用戶指定的一個(gè)"新值
",來(lái)實(shí)現(xiàn)對(duì)內(nèi)核某功能或特性的配置-
2、/sys目錄
輸出內(nèi)核識(shí)別出的各種配置設(shè)備的相關(guān)信息,也有內(nèi)核對(duì)硬件特性的可設(shè)置參數(shù),可定制硬件的特性
udev功能
通過(guò)讀取sys目錄下的硬件設(shè)備信息,按需為各硬件設(shè)備創(chuàng)建設(shè)備文件。當(dāng)系統(tǒng)初始化的過(guò)程中,會(huì)探測(cè)計(jì)算機(jī)各種硬件設(shè)備信息毕籽,此記錄會(huì)保存至/sys目錄下睡榆,當(dāng)系統(tǒng)啟動(dòng)完成后宿崭,udev會(huì)按照/sys目錄下的各設(shè)備文件铁孵,創(chuàng)建相應(yīng)的硬件信息蜕劝。udev為設(shè)備創(chuàng)建設(shè)備文件時(shí),會(huì)讀取其事先定義好的規(guī)則文件牙肝,一般在其工作目錄下。
-
udev的工作目錄
- /etc/udev/rules.d : 自定義的規(guī)則目錄
- /lib/udev/rules.d/ : 默認(rèn)的規(guī)則目錄
- /dev/.udev/rules.d : 臨時(shí)規(guī)則目錄存放位置(Centos 7才有)
-
udev目錄下的文件
root@zhenping rules.d]# ls /lib/udev/rules.d/ 01-log-block.rules 60-persistent-storage-tape.rules 75-cd-aliases-generator.rules 81-kvm-rhel.rules 10-console.rules 60-persistent-v4l.rules 75-net-description.rules 88-clock.rules 10-dm.rules 60-wacom.rules 75-persistent-net-generator.rules 90-pulseaudio.rules 11-dm-lvm.rules 61-mobile-action.rules 75-tty-description.rules 91-drm-modeset.rules 13-dm-disk.rules 61-option-modem-modeswitch.rules 77-mm-ericsson-mbm.rules 95-devkit-power-battery-recall-dell.rules
內(nèi)核參數(shù)調(diào)整方法
1衡楞、配置文件修改(永久有效迷守,但需重新啟動(dòng)后)
-
修改
/etc/sysctl.conf
或者/etc/sysctl.d/*.conf
net.ipv4.ip_forward = 0
注意:如果需要修改后的參數(shù)立即有效急膀,需使用sysctl -p
命令重讀其配置信息加載到內(nèi)核中卓嫂。
2、使用命令進(jìn)行修改(臨時(shí)有效,下次重啟后丟失)
sysctl命令
sysctl -sysctl - configure kernel parameters at runtime
synopsis : sysctl [options] [variable[=value]] [...]
-
[options]
-
-a
: 顯示當(dāng)前可配置的所有參數(shù) -
-w VAR=VLUE
: 更改參數(shù)值 -
-p
: 從/etc/sysctl.conf文件中重新加載內(nèi)核設(shè)定值
-
示例
- sysctl net.ipv4.ip_forward : 查看其值
- sysctl -w kernel.hostname=zhenping.mac : 設(shè)置其計(jì)算機(jī)名為zhenping.mac
- sysctl -a : 查看所有可配置的內(nèi)核參數(shù)
使用文件系統(tǒng)命令cat
和echo
設(shè)置和查看
- cat /proc/sys/kernetl/hostname
- echo "VALUE" > /proc/sys/kernel/hostname
常見(jiàn)內(nèi)核參數(shù)
- net.ipv4.ip_forward : 核心轉(zhuǎn)發(fā)功能
- vm.drop_caches : 釋放buff/cache空間误墓,值有0\1\2
- kernel.hostname : 主機(jī)名
- net.ipv4.icmp_echo_ignore_all : 忽略所有發(fā)往自己的ping操作
模塊管理
lsmod命令
lsmod
- 查看所有系統(tǒng)被裝載的模塊
-
lsmod
- 顯示系統(tǒng)被裝載的所有模塊
注意:其是提取/proc/modules文件信息
=========
modinfo命令
modinfo
- Show information about a Linux Kernel module
其通過(guò)/lib/modules/[KERNEL-VERSION]/modules/下的所有文件進(jìn)行分析并顯示的,默認(rèn)情況下在內(nèi)核modules編譯安裝的時(shí)候益缎,會(huì)在其目錄下生成所有modules的依賴關(guān)系等谜慌,建立對(duì)應(yīng)的索引信息
synopsis : modinfo [-0] [-F field] [-k kernel] [modulename|filename...]
-
[options]
-
-k MODULE
: 查看指定的模塊信息 -
-F FIELD
: 只顯示指定字段的信息 -
-n MODULE
顯示指定模塊的存放路徑
-
=====
modprobe命令:
modprobe
- Add and remove modules from the Linux Kernel
- synopsis: modprobe [-r] module_name
示例:
- modprobe MODULE : 裝載指定的模塊文件
- modprobe -r MODULE : 卸載指定的模塊文件
modprobe可以自行解決模塊與模塊的依賴關(guān)系,并將依賴的模塊也一并啟用
====
depmod命令
內(nèi)核模塊依賴關(guān)系文件的生成工具链峭,系統(tǒng)模塊的生成文件路徑為:/lib/modules/KERNEL-VERSION/
下
======
模塊裝載和卸載的另一組命令:
insmod命令
- insmod /lib/modules/3.10.0-229.el7.x86_64/kernel/fs/btrfs/btrfs.ko (模塊一定要為完整路徑)
rmmod命令
- rmmod MODULE : 卸載指定的模塊