linux-系統啟動和內核管理

一、Linux 組成及啟動過程

Linux: kernel+rootfs
   kernel:進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能  
   IPC:Inter Process Communication
       消息隊列、semperphor、shm
       socket
   運行中的系統環境可以分為兩層:內核空間、用戶空間
  用戶空間:應用程序(進程或線程)
  內核空間:內核代碼(系統調用)
   
   rootfs: 程序和glibc
   庫:函數集合, function,  調用接口(頭文件負責描述)
      過程調用:procedure ,無返回值
       函數調用:function
   程序:二進制執行文件
內核設計流派:
單內核(monolithic kernel):Linux
    把所有功能集成于同一個程序
微內核(micro kernel) :Windows, Solaris
    每種功能使用一個單獨子系統實現

內核

Linux 內核特點:
支持模塊化:.ko (內核對象)
    如:文件系統,硬件驅動,網絡協議等
支持內核模塊的動態裝載和卸載
組成部分:
核心文件:/boot/vmlinuz- VERSION -release
ramdisk :輔助的偽根系統    CentOS 5: /boot/initrd- VERSION -release.img    CentOS6,7: /boot/initramfs- VERSION -release.img
模塊文件:/lib/modules/ VERSION -release

Centos6 啟動流程

image

1. 加載BIOS的硬件信息,獲取第一個啟動設備。2. 讀取第一個啟動設備MBR 的引導加載程序(grub) 的啟動信息3.加載核心操作系統的核心信息,核心開始解壓縮,并嘗試驅動所有的硬件設備。4. 核型執行init程序并獲取運行信息。5.Init 執行/etc/rc.d/rc.sysinit 文件。6. 啟動核心的外掛模塊(/etc/modprobe.conf)。 
7.Init執行運行的各個批處理文件(scripts).8.Init 執行/etc/rc.d/rc.local.9. 執行/bin/login程序,等待用戶登錄。10. 登錄之后開始以Shell控制主機。

(一)啟動流程

1、 POST :Power-On-Self-Test,加電自檢
BIOS功能的一個主要部分。負責 完成對CPU 、主板、內存 、硬盤 子系統、顯示子系統、串并行接口、鍵盤、CD-ROM 光驅等硬件情況的檢測 。ROM :BIOS ,Basic Input and Output System保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啟動自舉程序等。RAM :CMOS互補金屬氧化物半導體,保存各項參數的設定按次序查找引導設備,第一個有引導程序的設備為本次啟動設備
2、bootloader:引導加載器引導程序
windows: ntloader ,僅是啟動OS
Linux:功能豐富,提供菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核
         
LILO :LInux LOaderGRUB: GRand Unified Bootloader
      GRUB 0.X: GRUB Legacy,
      GRUB 1.X: GRUB2
功能:提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本;把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而后吧系統控制權移交給內核;
MBR:
446:  bootloader, 
64 :  分區表, 
2  :  55AA
GRUB:
primary bootloader  : 1st stage
   filesystem driver: 1.5 stage
secondary bootloader :2nd stage ,分區文件
3、kernel:
自身初始化:
    探測可識別到的所有硬件設備
    加載硬件驅動程序(可能借助于ramdisk加載驅動)
    以只讀方式掛載根文件系統
    運行用戶空間的第一個應用程序:/sbin/init
ramdisk:
內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問
    ramdisk --> ramfs  提高速度
    CentOS 5: initrd, 工具程序:mkinitrd
    CentOS 6: initramfs, 工具程序:mkinitrd, dracut
系統初始化:
POST --> BootSeq uence (BIOS) -->Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只讀) --> init (systemd)
4、啟動用戶空間的第一個執行程序init
/sbin/init CentOS6 之前
init 程序配置文件的類型:
SysV: init, CentOS 5 之前
    配置文件:/etc/inittab    
Upstart: init,CentOS 6
    配置文件:/etc/inittab, /etc/init/*.conf
    
Systemd :systemd, CentOS 7
    配置文件:/usr/lib/systemd/system
             /etc/systemd/system
運行級別:為系統運行或維護等目的而設定;0-6 :7 個級別
0 :關機1 :單用戶模式(root 自動登錄), single,  維護模式2:  多用戶模式,啟動網絡功能,但不會啟動NFS ;維護模式3 :多用戶模式,正常模式;文本界面4 :預留級別;可同3 級別5 :多用戶模式,正常模式;圖形界面6 :重啟
   
/etc/inittab 修改默認啟動級別
vim /etc/inittabid:5:initdefault:
默認級別: 3, 5切換級別:init #查看級別:runlevel ; 
            who -r
[root@lvasu cron.d]# runlevelN 5[root@lvasu cron.d]# who -r
         運行級別 5 2016-09-11 09:34
init 初始化
init 讀取其初始化文件:/etc/inittab1、初始運行級別(RUN LEVEL)2、系統初始化腳本3、對應運行級別的腳本目錄4、捕獲某個關鍵字順序5、定義UPS 電源終端/ 恢復腳本6、在虛擬控制臺生成getty7在運行級別5 初始化X
CentOS 5 的inittab 文件
配置文件:/etc/inittab
每一行定義一種action 以及與之對應的processid:一個任務的標識符runlevel:在哪些級別啟動此任務;#,###,也可以為空,表示所有級別;action:在什么條件下啟動此任務process:任務      
action:
        wait: 切換至此級別運行 一次
        respawn:此process 終止,就重新啟動之
        initdefault :設定默認運行級別;process 省略
        sysinit :設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit        ca::ctrlaltdel:/sbin/shutdown -t3 -r nowEXAMPLE:           id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinit    
l0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1...l6:6:wait:/etc/rc.d/rc 6
CentOS 6 /etc/inittab和相關文件
/etc/inittab
    設置系統默認的運行級別
    id:3:initdefault:
/etc/init/control-alt-delete.conf/etc/init/tty.conf/etc/init/start-ttys.conf/etc/init/rc.conf/etc/init/prefdm.conf
CentOS 7 systmd
init程序:systemd
配置文件:/usr/lib/systemd/system
           /etc/systemd/system     完全兼容SysV腳本機制;因此,service命令依然可用,建議使用systemctl命令控制服務# systemctl {start|stop|restart|status} name [service]

啟動流程

/etc/rc.d/rc.sysinit:  系統初始化腳本
    (1)  設置主機名
    (2)  設置歡迎信息
    (3)  激活udev 和selinux
    (4)  掛載/etc/fstab 文件中定義的文件系統
    (5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統
    (6)  設置系統時鐘
    (7)  激活swap設備
    (8)  根據/etc/sysctl.conf 文件設置內核參數
    (9)  激活lvm 及software raid 設備
    (10)  加載額外設備的驅動程序
    (11)  清理操作
說明:rc N –> 意味著讀取/etc/rc.d/rcN.d/
K*: K##*:##運行次序;數字越小,越先運行;數字越小的服務,通常為依賴到別的服務
S*: S##*:##運行次序;數字越小,越先運行;數字越小的服務,通常為被依賴到的服務
腳本框架
for srv in /etc/rc.d/rcN.d/K*; do$srv stop
donefor srv in /etc/rc.d/rcN.d/S*; do$srv startdone

chkconfig命令

chkconfig 命令
查看服務在所有級別的啟動或關閉設定情形:
chkconfig [--list] [name]
添加:
首先需要添加腳本,服務腳本位置
    
SysV的服務腳本放置于/etc/rc.d/init.d (/etc/init.d)
  
chkconfig --add name
chkconfig --add testsrv
腳本    
#!/bin/bash#LLLL表示初始在哪個級別下啟動,- 表示都不啟動# chkconfig: LLLL SS KK 
    1st  SS:表示啟動的次序  88
    2rd  KK:表示關閉的次序  22#descrition:test service   
 EXAMPLE:         
#!/bin/bash#chkconfig:35 88 22#description:test service
刪除:
chkconfig --del name
chkconfig --del testsrv
修改指定的鏈接類型(下次開機生效)
chkconfig [--level levels] name <on|off|reset>
    --level LLLL:  指定要設置的級別;省略時表示2345
chkconfig --level 35 testsrv
ntsysv 命令
GUI服務管理
ntsysv --level=3

xinetd 管理的服務(超級守護進程)

service  命令:手動管理服務
service 服務 start|stop|restart
service --status-all
瞬態(Transient )服務被xinetd 進程所管理
進入的請求首先被xinetd 代理
配置文件:/etc/xinetd.conf 、/etc/xinetd.d/<service>
與libwrap.so 文件鏈接
用chkconfig 控制的服務:
     chkconfig tftp on

啟動流程(注意)

注意:正常級別下(2-5),最后啟動一個服務S99local 沒有鏈接至/etc/rc.d/init.d 一個服務腳本,而是指向了/etc/rc.d/rc.local 腳本,
不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local 文件中
? /etc/rc.d/rc.local 在指定運行級別腳本后運行
? 可以根據情況,進行自定義修改1:2345:respawn:/usr/sbin/mingetty tty12:2345:respawn:/usr/sbin/mingetty tty2
...6:2345:respawn:/usr/sbin/mingetty tty6
mingetty 會自動調用login 程序x:5:respawn:/etc/X11/prefdm -nodaemon
總結:
/sbin/init --> (/etc/inittab) -->  設置默認運行級別-->運行系統初始腳本、完成系統初始化-->(關閉對應下需要關閉的服務啟動需要啟動服務 -->  設置登錄終端
    
CentOS 6 init 程序為: upstart,  其配置文件: /etc/inittab, /etc/init/*.conf法 ,配置文件的語法  遵循upstart 配置文件語法格式,和CentOS5 不同

(二)grub legacy

CentOS 6 啟動流程:
POST --> Boot Sequence(BIOS) --> Boot Loader -->Kernel(ramdisk) --> rootfs --> switchroot -->/sbin/init -->(/etc/inittab, /etc/init/*.conf) -->設定默認運行級別 -->  系統初始化腳本 rc.sysinit -->  關閉或啟動對應級別的服務 -->  啟動終端
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/)
配置文件:/boot/grub/grub.conf <– /etc/grub.conf
stage2及內核等通常放置于一個基本磁盤分區
功用:
(1)  提供啟動菜單、并提供交互式接口
    a:內核參數
    e: 編輯模式,用于編輯菜單
    c: 命令模式,交互式接口
(2)  加載用戶選擇的內核或操作系統允許傳遞參數給內核可隱藏啟動菜單
(3)  為菜單提供了保護機制
為編輯啟動菜單進行認證
為啟用內核或操作系統進行認證
grub 的命令行接口
help:  獲取幫助列表help KEYWORD:  詳細幫助信息
find (hd#,#)/PATH/TO/SOMEFILE: :
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的
內核文件;額外還可添加許多內核支持使用的cmdline 參數
例如:max_loop=100 selinux=0 init=/path/to/init
initrd /PATH/TO/INITRAMFS_FILE:  設定為選定的內核
提供額外文件的ramdisk; 
boot:  引導啟動選定的內核
cat /proc/cmdline 內核參數
內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt
rpm -ql kernel-doc
識別硬盤設備 :
(hd#,#)hd#:  磁盤編號,用數字表示;從0 開始編號#:  分區編號,用數字表示;  從0 開始編號(hd0,0)  第一塊硬盤,第一個分區
手動在grub 命令行接口啟動系統:
grub> root (hd#,#)grub> kernel /vmlinuz-VERSION-RELEASE roroot=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot

image

grub legacy 配置文件

配置文件:/boot/grub/grub.conf   
default=#:  設定默認啟動的菜單項;落單項(title) 編號從0 開始timeout=# :指定菜單項等待選項選擇的時長splashimage=(hd#,#)/PATH/TO/XPM_FILE :菜單背景圖片文件路徑hiddenmenu :隱藏菜單
password [--md5] STRING:  啟動菜單編輯認證
title TITLE :定義菜單項“標題”,  可出現多次
root (hd#,#) :grub 查找stage2 及kernel 文件所在設備分區;為grub “根”kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] :啟動的內核
initrd /PATH/TO/INITRAMFS_FILE:  內核匹配的ramfs 文件
password [--md5] STRING:  啟動選定的內核或操作系統時進行認證

grub 加密

加密命令
grub-md5-crypt 
    
openssl passwd -l -salt "abcd"
破解root 口令:
啟動系統時,設置其運行級別1進入單用戶模式 :
    (1)  編輯grub 菜單( 選定要編輯的title ,而后使用e 命令);
    (2)  在選定的kernel 后附加    1, s, S 或single 都可以;
    (3)  在kernel 所在行,鍵入“b” 命令

grub 安裝

安裝grub:
(1) grub-install (all)
安裝grub stage1 和stage1_5 到/dev/DISK 磁盤上,并復制GRUB到 相關文件到 DIR/boot 目錄下
   
grub-install --root-directory=DIR /dev/DISK
(2) grub   (stage1)
grub> root (hd#,#)grub> setup (hd#)***grub 命令安裝需要依賴于**1_5文件,當刪除/boot/grub文件夾時,無法安裝

image

(三)救援環境

在根文件系統無法使用時需要,如/bin/mount 刪除
對系統沒有特殊要求
從光盤引導(boot.iso 或者安裝光盤#1) )
從USB 盤(由boot.iso 制作)引導
文件系統重組
Anaconda 將會詢問是否應該掛載文件系統
/mnt/sysimage/*
/mnt/stage2$PATH 包括硬盤的目錄
文件系統節點
提供系統特定的設備文件
mknod 了解major/minor #’s

系統配置文件丟失修復

系統在引導期間,很重要的一個過程就是init進程讀取其配置文件/etc/inittab ,啟動系統基本服務程序及默認運行級別的服務程序完成系統引導,如果/etc/inittab誤刪除或修改錯誤,Linux將無法正常啟動。此時,只有通過救援模式才可以解決此類問題。
有備份文件的恢復辦法:
進入救援模式,執行chroot 命令后,如果有此文件的備份(強烈建議系統中的重要數據目錄,如/etc、/boot等要進行備份),直接將備份文件拷貝回去,退出重啟即可。如果是配置文件修改錯誤,如比較典型的/boot/grub/grub.conf 及/etc/passwd的文件修改錯誤,也可以直接修正恢復。假設有備份文件/etc/inittab.bak ,則在救援模式下執行:    
sh-3.1# chroot /mnt/sysimagesh-3.1# cp /etc/inittab.bak /etc/inittab
沒有備份文件的恢復辦法
如果一些配置文件丟失或軟件誤刪除,且無備份,可以通過重新安裝軟件包來恢復,首先查找到/etc/inittab 屬于哪一個RPM包 
# chroot /mnt/sysimage# rpm -qf /etc/inittabinitscripts-9.03.49-1.el6.centos.x86_64
退出chroot 模式 :# exit掛載存放RPM包的安裝光盤(在救援模式下,光盤通常掛載在 /mnt/source 目錄下):
# mount /dev/sr0 /mnt/source
CentOS6 系統的RPM 包存放在光盤Package目錄下,另外,因為要修復的硬盤系統的根目錄在/mnt/sysimage 下,需要使用--root選項指定其位置。覆蓋安裝/etc/inittab文件所在的RPM包:
# rpm -ivh –replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
其中的rpm命令選項“--replacepkgs”表示覆蓋安裝,執行完成后,即已經恢復了此文件。
如果想只提取RPM 包中的/etc/inittab文件進行恢復,可以在進入救援模式后,執行命令:
# rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm|
cpio -idv ./etc/inittab
# cp etc/inittab /mnt/sysimage/etc
    
注意此命令執行時不能將文件直接恢復至/etc目錄,只能提取到當前目錄下,且恢復的文件名稱所在路徑要寫完整 的路徑。提取文件成功后,將其復制到根分區所在的/mnt/sysimage 目錄下相應位置即可

二、自制linux 系統

分區并創建文件系統
fdisk /dev/sdb
分兩個必要的分區/dev/sdb1 對應 /boot 
/dev/sdb2 對應根 /
mkfs.ext4 /dev/sdb1
掛載boot
mkdir /mnt/boot
mount /dev/sdb1 /mnt/boot
安裝grub
grub-install --root-directory=/mnt /dev/sdb
恢復內核和initramfs 文件
cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot
建立grub.conf 文件
Vim /mnt/boot/grub.confkernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash
chroot /mnt/sysroot
創建一級目錄
mkdir /mnt/sysroot
mount /dev/sdb2 /mnt/sysroot
mkdir –pv
/mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
復制bash和相關庫文件

三、內核編譯

單內核體系設計、但充分借鑒了微內核設計體系的優點,為內核引入模塊化機制。

(一)、內核組成部分:

kernel:內核核心,一般為bzImage ,通常在/boot目錄下,名稱為vmlinuz-VERSION-RELEASE; ;
kernel object: 內核對象,一般放置于/lib/modules/VERSION-RELEASE/
[ ]: N[M]: M[*]: Y輔助文件:ramdisk
initrd
initramfs
模板文件:config-2.6.32-642.el6.x86_64

內核版本

運行中的內核:
uname 命令:
    uname - print system information
    uname [OPTION]...
        -n:  顯示節點名稱;        -r:  顯示VERSION-RELEASE;        -a:  顯示所有信息

(二)、內核模塊命令

lsmod 命令:
顯示由核心已經裝載的內核模塊
顯示的內容來自于: /proc/modules 文件
modinfo 命令:
顯示模塊的詳細描述信息
modinfo [ -k kernel ] [ modulename|filename... ]
    -n:  只顯示模塊文件路徑    -p:  顯示模塊參數    -a: author    -d: description    -l: licenselsmod |grep xfs;modinfo xfs

內核模塊管理

modprobe 命令:
裝載或卸載內核模塊
modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ]配置文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf
modprobe [ -r ] modulename...
depmod 命令:
內核模塊依賴關系文件及系統信息映射文件的生成工具
   
裝載或卸載內核模塊:insmod 命令:指定模塊文件,不自動解決依賴模塊    insmod [ filename ] [ module options... ]    insmod `modinfo –n exportfs`
    lnsmod `modinfo –n xfs`rmmod
    rmmod [ modulename ]    rmmod xfs
    rmmod exportfs

/proc 目錄

/proc 目錄:
內核把自己內部狀態信息及統計信息,以及可配置參數通過proc偽文件系統加以輸出
參數:只讀:輸出信息
     可寫:可接受用戶指定“新值”來實現對內核某功能或特性的配置
/proc/sys
(1) sysctl 命令用于查看或設定此目錄中諸多參數
sysctl -w path.to.parameter=VALUEsysctl -w kernel.hostname=mail.magedu.com
(2) echo命令通過重定向方式也可以修改大多數參數的值
echo "VALUE" > /proc/sys/path/to/parameter
echo “websrv” > /proc/sys/kernel/hostname

sysctl 命令

默認配置文件:/etc/sysctl.conf(1)  設置某參數
sysctl -w parameter=VALUE
(2)  通過讀取配置文件設置參數
sysctl -p [/path/to/conf_file]
內核中的路由轉發:
/proc/sys/net/ipv4/ip_forward
常用的幾個參數:
net.ipv4.ip_forward=1  開啟路由轉發功能  (linux路由或者vpn服務)
net.ipv4.icmp_echo_ignore_all=1  禁止ping
vm.drop_caches  清除緩存
vm.drop_caches詳細文檔To free pagecache:
* echo 1 > /proc/sys/vm/drop_cachesTo free dentries and inodes:
* echo 2 > /proc/sys/vm/drop_cachesTo free pagecache, dentries and inodes:
* echo 3 > /proc/sys/vm/drop_caches

/sys 目錄

sysfs:為用戶使用的偽文件系統,輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的設定信息;有些參數是可以修改的,用于調整硬件工作特性。
udev通過此路徑下輸出的信息動態為各設備創建所需要設備文件,udev 是運行用戶空間程序
專用工具:udevadmin, hotplug
udev為設備創建設備文件時,會讀取其事先定義好的規則文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目錄下

ramdisk 管理

ramdisk 文件的制作:
(1) mkinitrd 命令
為當前正在使用的內核重新制作ramdisk 文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2) dracut 命令
為當前正在使用的內核重新制作ramdisk 文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)

(三)、編譯內核

前提:
(1)  準備好開發環境
(2)  獲取目標主機上硬件設備的相關信息
(3)  獲取目標主機系統功能的相關信息
例如: 需要啟用相應的文件系統
(4)  獲取內核源代碼包
www.kernel.org

開發環境準備

包組(CentOS 6): :
    Server Platform Development
    Development Tools
目標主機硬件設備相關信息:
 CPU:    #cat /proc/cpuinfo    #x86info -a
    #lscpu

硬件設備

PCI 設備:
    lspci
        -v        -vv    lsusb
        -v        -vv    lsblk 塊設備
了解全部硬件設備信息
    hal-device

內核編譯安裝系統

安裝開發包組
下載源碼文件
.config :準備文本配置文件make menuconfig :配置內核選項make [-j #]make modules_install :安裝模塊make install  :安裝內核相關文件
    安裝bzImage 為/boot/vmlinuz-VERSION-RELEASE
    生成initramfs 文件
    編輯grub 的配置文件

編譯安裝內核實例

tar xf linux-3.10.67.tar.xz -C /usr/srccd /usr/srcln -sv linux-3.10.67 linuxcd /usr/src/linuxcp /boot/config-$(uname -r) ./.configmake menuconfigmake -j 2make modules_installmake install
reboot

編譯內核

(1) 配置內核選項
支持“更新”模式進行配置:make help
(a) make config:基于命令行以遍歷的方式去配置內核
中可配置的每個選項
(b) make menuconfig :基于curses 的文本窗口界面
(c) make gconfig :基于GTK (GNOME )環境窗口界面
(d) make xconfig :基于QT(KDE) 環境的窗口界面
支持“全新配置”模式進行配置
(a) make defconfig:基于內核為目標平臺提供的“默認
”配置進行配置
(b) make allyesconfig:  所有選項均回答為“yes“
(c) make allnoconfig:  所有選項均回答為"no“
(2) 編譯
全編譯:make [-j #]編譯內核的一部分功能:
    (a)  只編譯某子目錄中的相關代碼:    # cd /usr/src/linux
    # make dir/
    (b)  只編譯一個特定的模塊:    # cd /usr/src/linux
    # make dir/file.ko
    例如:只為e1000 編譯驅動:    #make drivers/net/ethernet/intel/e1000/e1000.ko

編譯內核

如何交叉編譯內核:
編譯的目標平臺與當前平臺不相同;# make ARCH=arch_name
要獲取特定目標平臺的使用幫助
# make ARCH=arch_name help# make ARCH=arm help

內核編譯

在已經執行過編譯操作的內核源碼樹做重新編譯:
需要事先清理操作:
# make clean:清理大多數編譯生成的文件,但會保留config 文件等# make mrproper:  清理所有編譯生成的文件、config及某些備份文件# make distclean :mrproper 、patches 以及編輯器份文件

實驗

一、破壞或刪除/boot引導的相關文件及修復
1、刪除stage1文件,恢復系統(癥狀:計算機會認為無OS)
1、刪除stage1文件# dd if=/dev/zero of=/dev/sda bs=1 count=446 # hexdump -C -n 512 /dev/sda

image

2、恢復   ***重啟進入boot菜單選擇,選擇CDrom驅動器

imageimage

***進入救援模式rescue,選擇非網絡模式

imageimage

***我們所使用的磁盤被掛載在/mnt/sysimage目錄下

image

***切換根目錄 
    # chroot /mnt/sysimage
   ***grub修復命令    # grub-install /dev/sda

image

***修復完成,執行兩次exit,reboot重啟計算機    # exit
    # exit

image

2、刪除stage1.5,恢復系統(癥狀:開機BIOS直接黑屏)
1、刪除stage1.5文件# dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1# hexdump -C -n 2048 /dev/sda

image

2、恢復
光盤啟動,進入rescue模式   ***切換根目錄 
    # chroot /mnt/sysimage
   ***grub修復命令    # grub-install /dev/sda
   ***修復完成,執行兩次exit,reboot重啟計算機

image

3、刪除grub文件夾
1、刪除/boot/grub文件
# rm -rf /boot/grub
# ls /boot

image

2、恢復
光盤啟動,進入rescue模式   ***切換根目錄 
    # chroot /mnt/sysimage
   ***grub修復命令    # grub-install /dev/sda

image

***首次啟動,需要填寫grub配置信息

image

4、刪除vmlinuz、initramfs (通過安裝光盤直接修復)
1、刪除/boot/vmlinuz、initramsfs文件# rm -f /boot/{vmlinuz、initrams}# ls /boot
   2、恢復
光盤啟動,進入rescue模式   ***切換根目錄 
    # chroot /mnt/sysimage
   ***掛載CDrom    # mkdir /mnt/cdrom
    # mount /dev/cdrom /mnt/cdrom
    *** 復制文件    # cp /mnt/cdrom/isolinux/vmlinuz /boot/vmlinuz-`uname -r` 
    # mkinitrd /boot/initramfs-`uname -r`.img   `uname -r`
   ***修復完成,執行兩次exit,reboot
刪除vmlinuz、initramfs (通過救援光盤網絡修復)
2、恢復
光盤啟動,進入rescue模式   ***切換根目錄 
    # chroot /mnt/sysimage
   ***掛載CDrom    # mkdir /mnt/cdrom
    # mount /dev/cdrom /mnt/cdrom
    *** 復制文件    # cp /mnt/cdrom/isolinux/vmlinuz /boot/vmlinuz-`uname -r` 
    # mkinitrd /boot/initramfs-`uname -r`.img   `uname -r`
   ***修復完成,執行兩次exit,reboot
5、刪除/boot
1、刪除/boot文件# rm -fr /boot/
    2、恢復
光盤啟動,進入rescue模式 ***安裝kernel包# mkdir /mnt/cdrom# mount /dev/cdrom /mnt/cdrom# rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm --root=/mnt/sysimage --replacepkgs|force ***  切換根目錄
chroot /mnt/sysimage***   修復
grub-install /dev/sda*** 編輯grub.conf
vim /boot/grub/grub.conf
6、普通磁盤分區刪除刪除/boot 和/etc/fstab
1、刪除/boot、/etc/fstab文件# rm -fr /boot/# rm -r /etc/fstab
   2、恢復
光盤啟動,進入rescue模式***檢查/ 
    blkid;fdisk -l
    mkdir /mnt/sda2
    mount /dev/sda2 /mnt/sda2***編輯fstab文件,重啟讓系統自動掛載
    vi /mnt/sda2/etc/fstab
    /dev/sda1 /boot ext4 defaults 1 1 
    /dev/sda2  /  	ext4 defaults 1 2
    reboot***光盤啟動,進入rescue模式,掛載/mnt/sysimage
    mkdir /mnt/cdrom
    mount /dev/cdrom /mnt/cdrom
    chroot /mnt/sysimage*** 安裝kernel包
    rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm  --replacepkgs|force 
***修復grub 
    grub-install /dev/sda
***編輯grub.conf文件
    vim /boot/grub/grub.conf
    default=0
    timeout=3
    title wanglinux
    root (hd0,0)
    kernel /vmlinuz.... root=/dev/sda2
    initrd /initramfs .

image

7、邏輯卷情況下,刪除/boot 和/etc/fstab
1、刪除/boot、/etc/fstab文件# rm -fr /boot/# rm -r /etc/fstab
   2、恢復
光盤啟動,進入rescue模式***檢查邏輯卷,并激活
    lvscan
    vgchange -ay 
    mount /dev/vg0/root /mnt/sysimage***編輯fstab文件,重啟讓系統自動掛載
    vi /mnt/sysimage/etc/fstab
    /dev/sda1 /boot ext4 defaults 1 1 
    /dev/vg0/root  /  	ext4 defaults 1 2
    /dev/vg0/usr /usr 
    /dev/vg0/var /var   
    reboot***光盤啟動,進入rescue模式,掛載/mnt/sysimage
    mkdir /mnt/cdrom
    mount /dev/cdrom /mnt/cdrom
    chroot /mnt/sysimage***安裝kernel包
    rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm  --replacepkgs|force 
***修復grub
    grub-install /dev/sda
***編輯grub.conf配置文件
    vim /boot/grub/grub.conf
    default=0
    timeout=3
    title wanglinux
    root (hd0,0)
    kernel /vmlinuz.... root=/dev/vg0/root
    initrd /initramfs .
8、恢復文件/boot/initramfs
# chroot /mnt/sysimage# mkinitrd /boot/initramfs-`uname -r`.img `uname -r` # exit;exit;reboot   退出救援模式并重啟計算機

image

9、root密碼丟失破解
1. centos怎么讓進入GRUB 菜單界面
 Linux開機引導的時候,按鍵盤上的e 就可以進入進入GRUB菜單界面。           
2.在出現GRUB引導畫面時(CentOS(2.6.18-274**)),按字母e鍵,進入GRUB編輯狀態。

image

3.把光標移動到kernel那一行,再敲入“e”進入命令行編輯,在kernel 一行的最后加上空格single,回車敲入“b”,啟動系統,即進入單用戶模式,

image

4、修改密碼

image

二、通過grub.conf配置文件,改變引導菜單屬性
1、給引導菜單更換背景圖片
yum install ImageMagick
win.jgpconvert -resize 640x480 -colors 14 win.jpg win.xpm

image

gzip win.xpm

image

vim /boot/grub/grub.confsplashimage=(hd0,0)/boot/grub/back.xpm.gz

image
image

2、給單用戶模式和系統引導添加密碼
單用戶模式密碼   title之上
 password --md5
 系統引導密碼    title之下
 password --md5

image

生成密碼
 grub-md5-crypt 
 openssl passwd -l -salt "abcd"
單用戶模式密碼

image

系統引導密碼

image

3、kernel內核參數更改
添加loop設備
    max_loop=20    增加
關閉啟動中的圖形界面
    rhgb quiet    刪除
禁用selinux    selinux=0     增加

image

image

4、開機啟動grub界面,可編輯kernel菜單
三、自制linux系統
1、分區并創建文件系統
fdisk/dev/sdb
分兩個必要的分區/dev/sdb1對應/boot /dev/sdb2對應根/
     # mkfs.ext4 /dev/sdb1
# mkfs.ext4 /dev/sdb2

image

2、掛載boot
# mkdir /media/boot
# mount /dev/sdb1 /media/boot 
3、安裝grub
grub-install --root-directory=/media/  /dev/sdb

image

4、建立grub.conf:
vim /media/boot/grub/grub.confdefault=0timeout=0title lvasu
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-642.el6.x86_64.img

image

5、恢復內核和initramfs文件
cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /media/boot/
cp /boot/initramfs-2.6.32-642.el6.x86_64.img /media/boot

image

6、創建一級目錄
mkdir /media/sysroot
mount /dev/sdb2 /media/sysroot
mkdir –pv /media/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}

image

7、vim /media/sysroot/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1/dev/sda2  /    ext4 defaults 1 2
  8、復制bash和相關庫文件     
9、復制相關命令及相關庫文件
如:ls,cat,vim,df,mount,umount,rpm,reboot,hostname,halt,poweroff,quit

image

完成

image

四、內核編譯
1、tar xf linux-3.2.82.tar.xz -C /usr/src2、cd /usr/src3、ln -sv linux-3.2.82 linux4、cd /usr/src/linux

image

5、cp /boot/config-$(uname -r) ./.config6、make menuconfig

image

7、make -j 28、make modules_install9、make install

image

10、reboot

imageimage

原創文章,作者:lvasu,如若轉載,請注明出處:http://www.www58058.com/49152

(0)
lvasulvasu
上一篇 2016-09-26
下一篇 2016-09-26

相關推薦

  • bind-9.9.5編譯安裝

    bind-9.9.5編譯安裝 §·bind-9.9.5編譯安裝大概步驟 步驟一 :下載源碼包bind-9.9.5 ; 步驟二 :按需求選擇模塊或功能 ./configure ;  # ./configure  –prefix=/usr/local/bind9  –sysconfdir=…

    Linux干貨 2016-10-09
  • 淺談正則表達式

    1.       什么是正則表達式 基本說來,正則表達式是一種用來描述一定數量文本的模式。Regex代表Regular Express。本文將用<<regex>>來表示一段具體的正則表達式。 一段文本就是最基本的模式,簡單的匹配相同的文本。   2. &n…

    Linux干貨 2016-08-12
  • linux軟鏈接與硬鏈接的區別

    硬鏈接:相于當給文件增加了一個新名 在添加鏈接時會增加鏈接數,其inode結點數不會增加 支持絕對路徑與相對路徑 硬鏈接不能對目錄來創建 不能跨分區來創建鏈接 硬鏈接鏈接到文件被刪除時,依舊可以通過鏈接文件來訪問被刪文件的數據 軟鏈接:可以支持對目錄來創建鏈接 (注,當你用rm -rf 刪除目錄的時候,目錄不會刪除,但目錄中的內容會被刪除,并且會刪除源文件)…

    Linux干貨 2013-07-15
  • MySQL入門命令知識

    簡單介紹下吧,MySQL應用的場景大多數互聯網公司第一次賣身是賣個了sun好像是10億,第二次是連同sun自己,以74億美元被賣給了Orecle~后面MySQL原作者站出來說,MySQL會存在閉源風險,整了個MariaDB~我也是醉了,也不考慮下我們的痛苦!下面簡要介紹下MySQL的入門知識。    一、MySQL有三種定義語言 &nbs…

    2016-12-05
  • CentOS程序包管理

    對于Linux系統而言,其能執行的程序為二進制格式,而對于程序開發者而言,直接利用二進制開發程序是不太現實的,所以一般都是利用高級語言來進行軟件開發,其程序也即稱為源代碼;那么我們在對一個程序進行安裝、升級、卸載、 查詢、校驗等操作時,需要對每個源代碼進行編譯成為二進制程序,那么顯然是不太現實的。所以在各Linux發行版中一般都帶有程序包管理器。 所謂程序包…

    Linux干貨 2016-08-25
  • Linux文件系統

    1、Linux文件系統層級標準 為什么Linux的不同發行版中的目錄結構基本上都一樣? Linux有一個組織叫LSB定義的Linux發行版基礎目錄名稱命名法則及功用規定,這種標準叫做 FHS(Filesystem Hierarchy Standard),文件系統層級標準。 /boot:系統引導啟動時要加載的靜態文件:kernel, initramfs(ini…

    Linux干貨 2016-10-29

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-09-26 10:14

    知識點分類的很好,但是圖片是從別的網站上來的,我們網站是會屏蔽掉的,所以需要你重新上傳

欧美性久久久久