Linux基礎教程之Linux系統高階知識詳探
Linux系統啟動流程、內核及模塊管理
Linux系統的組成部分組成:內核+根文件系統(kernel+rootfs)
內核(kernel): 進程管理(創建、調度、銷毀等)、內存管理、網絡管理(網絡協議棧)、驅動程序、文件系統、安全功能
IPC:Inter Process Communication機制
本地進程間通信機制:消息隊列、semerphor、shm(共享內存)
跨主機進程間通信機制:socket等
運行中的系統環境可分為兩層:內核空間、用戶空間
內核空間(模式):內核代碼(特權級操作–>系統調用)
用戶空間(模式):應用程序(進程或線程)
rootfs:程序和glibc
庫:函數集合, function, 調用接口(頭文件負責描述)
過程調用: procedure,無返回值
函數調用: function
程序:二進制執行文件
內核設計流派:
單內核(monolithic kernel):把所有功能集成于同一個程序
例如:Linux
微內核(micro kernel):每種功能使用一個單獨子系統實現
例如:Windows, Solaris
Linux內核特點:
1、支持模塊化: .ko(kernel object 內核對象)如:文件系統,硬件驅動,網絡協議等
2、支持內核模塊的動態裝載和卸載
內核組成部分:
核心文件: /boot/vmlinuz-VERSION-release(本地版本號)
ramdisk(基于內存的磁盤設備(將內存當磁盤用)):輔助的偽根系統
CentOS 5: /boot/initrd-VERSION-release.img
基于ramdisk磁盤
CentOS6,7: /boot/initramfs-VERSION-release.img
基于ramddisk文件系統
img:磁盤鏡像文件
模塊文件:/lib/modules/VERSION-release
例如:/lib/modules/3.10.0-327.el7.x86_64/
centos6啟動流程
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控制主機。
CentOS系統啟動流程:
POST: Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、 串并行接口、鍵盤、 CD-ROM光驅等硬件情況的檢測。
ROM: BIOS, Basic Input and Output System,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、 開機加電自檢程序和系統啟動自舉程序等。
RAM: CMOS互補金屬氧化物半導體,保存各項參數的設定
Boot Sequence:按次序查找引導設備,第一個有引導程序的設備為本次啟動設備
bootloader: 引導加載器,引導程序
windows: ntloader,僅是啟動OS
Linux:功能豐富,提供菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核
LILO: LInux LOader
GRUB: GRand Unified Bootloader
GRUB 0.X: GRUB Legacy
GRUB 1.X:GRUB2
功能:提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本;把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而后把系統控制權移交給內核;
MBR:Master Boot Record (512bytes)
446bytes: bootloader(引導加載程序)
64bytes:fat 分區表(文件系統分配表)
2bytes: 55AA(魔數)非55AA為無效
GRUB:
primary boot loader : 1st stage, 1.5 stage
secondary boot loader : 2nd stage,分區文件
kernel:自身初始化
1、探測可識別到的所有硬件設備
2、加載硬件驅動程序(可能借助于ramdisk加載驅動)
3、以只讀方式掛載根文件系統
4、運行用戶空間的第一個應用程序:/sbin/init
init程序的類型:
CentOS 5之前:SysV init,
配置文件: /etc/inittab
CentOS 6:Upstart init
配置文件: /etc/inittab(基本沒用了),
/etc/init/*.conf–>決定系統運行級別
CentOS 7:Systemd systemd
配置文件: /usr/lib/systemd/system/
/etc/systemd/system/
ramdisk:
Linux內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問
ramdisk –> ramfs 提高速度
CentOS 5: initrd, 工具程序: mkinitrd
CentOS 6: initramfs, 工具程序: mkinitrd, dracut
系統初始化流程(內核級別):
POST –> BootSequence (BIOS) –>Bootloader(MBR) –> kernel(ramdisk) –> rootfs(只讀) –> init(systemd)
/sbin/init CentOS6之前
運行級別:為系統運行或維護等目的而設定; 0-6: 7個級別
0:關機(shutdown)
1:單用戶模式(無須認證,root自動登錄),(single user), 維護模式
2: 多用戶模式(multi user),啟動網絡功能,但不會啟動NFS(網絡文件系統);維護模式
3:多用戶模式(multi user),正常完全功能模式;文本界面
4:預留級別;目前無特別使用目的,但可同3級別
5:多用戶模式(multi user),正常完全功能模式;圖形界面
6:重啟
默認級別: 3, 5
切換級別: init #
查看級別: runlevel ; who -r
runlevel
第一位:前一個級別
第二位:后一個級別
init初始化
init讀取其初始化文件/etc/inittab決定init程序系統初始化過程中做什么?
初始運行級別(RUN LEVEL)
系統初始化腳本
對應運行級別的腳本目錄
捕獲某個關鍵字順序
定義UPS電源終端/恢復腳本
在虛擬控制臺生成getty
在運行級別5初始化X
CentOS 5的inittab文件
配置文件: /etc/inittab
每一行定義一種action以及與之對應的process
[root@station1?~]#?vim?/etc/inittab?
#
#?inittab???This?file?describes?how?the?INIT?process?should?set?up
#???the?system?in?a?certain?run-level.
#
#?Author:???Miquel?van?Smoorenburg,?<miquels@drinkel.nl.mugnet.org>
#???Modified?for?RHS?Linux?by?Marc?Ewing?and?Donnie?Barnes
#
#?Default?runlevel.?The?runlevels?used?by?RHS?are:
#???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)
#?
id:5:initdefault:
#?System?initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc?0
l1:1:wait:/etc/rc.d/rc?1
l2:2:wait:/etc/rc.d/rc?2
l3:3:wait:/etc/rc.d/rc?3
l4:4:wait:/etc/rc.d/rc?4
l5:5:wait:/etc/rc.d/rc?5
l6:6:wait:/etc/rc.d/rc?6
#?Trap?CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown?-t3?-r?now
#?When?our?UPS?tells?us?power?has?failed,?assume?we?have?a?few?minutes
#?of?power?left.??Schedule?a?shutdown?for?2?minutes?from?now.
#?This?does,?of?course,?assume?you?have?powerd?installed?and?your
#?UPS?connected?and?working?correctly.??
pf::powerfail:/sbin/shutdown?-f?-h?+2?"Power?Failure;?System?Shutting?Down"
#?If?power?was?restored?before?the?shutdown?kicked?in,?cancel?it.
pr:12345:powerokwait:/sbin/shutdown?-c?"Power?Restored;?Shutdown?Cancelled"
#?Run?gettys?in?standard?runlevels
1:2345:respawn:/sbin/mingetty?tty1
2:2345:respawn:/sbin/mingetty?tty2
3:2345:respawn:/sbin/mingetty?tty3
4:2345:respawn:/sbin/mingetty?tty4
5:2345:respawn:/sbin/mingetty?tty5
6:2345:respawn:/sbin/mingetty?tty6
#?Run?xdm?in?runlevel?5
x:5:respawn:/etc/X11/prefdm?-nodaemon
格式:
id:runlevel :action :process
字段含義:
id:一個任務的標識符
runlevel:在那些級別啟動此任務;#,###,也可以為空,表示所有級別;
action:在什么條件下啟動此任務;
process:任務;
action類型:
wait: 等待切換至此任務所在的級別時運行一次
respawn:此process終止時,就自動重新啟動之
initdefault:設定默認運行級別;此時process省略(0,6不可以)
sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本;
例如:
設置系統默認運行級別
id:3 : initdefault:
設置系統初始化
si:: sysinit:/etc/rc.d/rc.sysinit
l0wait:/etc/rc.d/rc 0
…
l6wait:/etc/rc.d/rc 6
/etc/rc.d/rc腳本:接受一個運行級別數字為參數
說明: rc N –> 意味著讀取/etc/rc.d/rcN.d/
K:要停止的服務;
K##:##運行次序優先級;數字越小,越先關閉對應服務,關閉服務通常為依賴到別的服務的服務先關閉,后關閉被依賴的服務
S:要啟動的服務;
S##: ##運行次優先級序;數字越小,越先運行對應服務,運行服務通常為被依賴到的服務先運行,依賴到別的服務的服務后運行
腳本框架:
for srv in /etc/rc.d/rcN.d/K; do
$srv stop
done
for srv in /etc/rc.d/rcN.d/S; do
$srv start
done
示例:手動編寫服務腳本框架
[root@CentOS6?~]#?vim?/etc/init.d/testsrv
#/bin/bash
#testsrv??service?testing?script
#
#chkconfig:?2345?50?60
#description:testing?service
#
prog=$(basename?$0)
if?[?$#?-lt?1?];then
echo?"Usage:$prog?{start|stop|status|restart}"
exit?1
fi
if?[?"$1"?==?"start"?];then
??echo?"start?$prog?finished."
elif?[?"$1"?==?"stop"?];then
??echo?"Stop?$prog?finished."
elif?[?"$1"?==?"restart"?];then
??echo?"Restart?$prog?finished."
elif?[?"$1"?==?"status"?];then
??if?pidof?$prog?&>?/dev/null;then
?echo?"$prog?is?running."
??else
?echo?"$prog?is?stopped."
??fi
else
?echo?"Usage:$prog?{start|stop|status|restart}"
?exit?2
fi
其中
#chkconfig: 2345 50 60
存在此行chkconfig命令才能管理此服務腳本,并且第一組數字:2345為對應運行級別下運行此腳本服務;第二組數字50為開啟運行服務腳本的優先級;第三組數字60為關閉停止服務腳本的優先級;
#description:testing service
注釋解釋必須存在
注意:以上兩行必須存在;
chkconfig命令
chkconfig命令管控/etc/init.d/每個服務腳本在各個級別下的啟動或關閉狀態
查看服務在所有級別的啟動或關閉設定情形:
chkconfig [–list] [name]
示例:
[root@CentOS6?~]#?chkconfig?--list?httpd
httpd??????0:off????1:off????2:off????3:off????4:off????5:off????6:off
添加:
SysV的服務腳本放置于/etc/rc.d/init.d (/etc/init.d)
chkconfig –add name
能被添加的服務的腳本定義格式之一
#!/bin/bash
# chkconfig: LLLL NN NN
注意:LLLL 表示初始在哪個級別下啟動, -表示都不啟動 前NN表示啟動優先級;后NN表示關閉優先級
#description:
刪除:
chkconfig –del name
修改指定的鏈接類型
chkconfig [–level LEVELS] name
–level LEVELS: 指定要設置的級別;省略時表示2345
注意:正常級別下,最后啟動的一個服務s99local沒有鏈接至/etc/init.d下的某腳本,而是鏈接至了/etc/rc.d/rc.local (/etc/rc.local)腳本;因此,不便或不需寫為服務腳本的程序期望能開機自動運行時,直接放置于此腳本文件中即可。
xinetd管理的服務
service 命令:手動管理服務
service 服務 start|stop|restart|status
顯示所服務的狀態
service –status-all
瞬態( Transient)服務被xinetd進程所管理
進入的請求首先被xinetd代理
配置文件: /etc/xinetd.conf、 /etc/xinetd.d/
控制/etc/init.d目錄下的腳本文件
與libwrap.so文件鏈接
用chkconfig控制的服務:
例如:chkconfig tftp on
1respawn:/sbin/mingetty tty1
…
6respawn:/sbin/mingetty tty6
這里是定義了6個虛擬終端
- mingetty會調用login程序;
- 打開虛擬終端的程序除了mingetty之外,還有諸如getty等;
ntsysv命令
ntsysv命令提供了一個基于文本界面的菜單操作方式,集中管理系統不同的運行等級下的系統服務啟動狀態。在RedHat各個發行版,CentOS各個版本,都自帶這個工具。它具有互動式操作界面,您可以輕易地利用方向鍵和空格鍵等,開啟,關閉操作系統在每個執行等級中,所要執行的系統服務
語法:
ntsysv [–back][–level <等級代號>]
參數:
–back 在互動式界面里,顯示Back鈕,而非Cancel鈕。
–level <等級代號> 在指定的執行等級中,決定要開啟或關閉哪些系統服務。
實例
輸入ntsysv命令后,出現一個交互式的管理菜單,如下:
使用空格鍵選擇或者取消選項!
系統初始化腳本:/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) 清理操作
總結(用戶空間的啟動流程):/sbin/init(/etc/inittab)
設置默認運行級別–>運行系統初始化腳本,完成系統初始化–>關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務–>設置登陸終端[–>啟動圖形終端]
CentOS 6 /etc/inittab和相關文件
init程序為upstart風格,但依然為/sbin/init
其配置文件:/etc/init/.conf,/etc/inittab(僅用于定義默認運行級別)
注意:.conf為upstart風格的配置文件;
其中/etc/inittab僅包含一下內容
設置系統默認的運行級別
idinitdefault:
之后執行以下配置文件
/etc/init/rcS.conf
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf
總結:
CentOS6啟動流程
POST–>Boot Sequence(BIOS)–>Boot Loader(MBR)–>Kernel(ramdisk)–>rootfs–>switchroot–>/sbin/init–>(/etc/inittab,/etc/init/*.conf)–>設置默認運行級別–>運行系統初始化腳本,完成系統初始化–>關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務–>設置登陸終端[–>啟動圖形終端]
CentOS7
init程序:systemd,配置文件:/usr/lib/systemd/system/,/etc/systemd/system/
注意:systemd沒有級別概念
完全兼容SysV腳本機制;因此,service命令依然可用;不過,建議使用systemctl命令來控制服務;
#systemctl {start|stop|restart|status} name[.service]
grub legacy
grub: GRand Unified Bootloader
grub 0.97: grub legacy
grub 2.x: grub2
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)
為菜單提供了保護機制
為編輯啟動菜單進行認證
為啟用內核或操作系統進行認證
識別硬盤設備:
(hd#,#)
hd#: 磁盤編號,用數字表示;從0開始編號
#: 分區編號,用數字表示; 從0開始編號
(hd0,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
注意:initrd的版本號必須和內核完全匹配
boot:引導啟動選定的內核
手動在grub命令行接口啟動系統:
c: 命令模式,交互式接口
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
例如: 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
grub legacy配置文件
配置文件: /boot/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]:啟動的內核
initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件
password [–md5] STRING: 啟動選定的內核或操作系統時進行認證
grub加密
grub-md5-crypt命令
破解root口令:
啟動系統時,設置其運行級別1
進入單用戶模式:
(1) 編輯grub菜單(選定要編輯的title,而后使用e命令);
(2) 在選定的kernel后附加1, s, S或single都可以;
(3) 在kernel所在行,鍵入“ b”命令
grub安裝
安裝grub:
(1) grub-install
安裝grub stage1和stage1_5到/dev/DISK磁盤上,并復制GRUB相關文件到 ROOT/boot目錄下
grub-install –root-directory=ROOT /dev/DISK
例如:
當/dev/sdb1掛載到/mnt/boot的情況下安裝grub
grub-install –root-directory=/mnt /dev/sdb
(2) grub(注意:hd#,#必須存在grub目錄及其文件)
grub > root (hd#,#)
grub > setup (hd#)
自制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.conf
title wangLinux
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
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和相關庫文件
復制相關命令及相關庫文件
如: ls,cat, vim,reboot,hostname等
救援環境
在根文件系統無法使用時需要,如/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/sysimage
sh-3.1# cp /etc/inittab.bak /etc/inittab
沒有備份文件的恢復辦法
如果一些配置文件丟失或軟件誤刪除,且無備份,可以通過重新
安裝軟件包來恢復,首先查找到/etc/inittab屬于哪一個RPM包
# chroot /mnt/sysimage
# rpm -qf /etc/inittab
initscripts-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目錄下相
應位置即可
內核編譯
單內核體系設計、但充分借鑒了微內核設計體系的優點,為內核引入模塊化機制。
內核組成部分:
1)、kernel: 內核核心,一般為bzImage,通常在/boot目錄下,名稱為vmlinuz-VERSION-RELEASE;
2)、kernel object: 內核對象,即內核模塊,一般放置于/lib/modules/VERSION-RELEASE/
注意:內核模塊與內核核心版本一定要嚴格匹配;
編譯內核模塊時按一下方式定義
注意:有些功能要不編譯進內核,要不不編譯
3)、輔助性文件,并非必須,這取決于內核是否能直接驅動roofs所在的設備;
ramdisk:是一個簡裝版的根文件系統系統;
initrd
initramfs
目標設備驅動,例如SCSI設備的驅動;
邏輯設備驅動,例如LVM設備的驅動;
文件系統,例如xfs文件系統
內核版本
運行中的內核:
uname命令:
uname – print system information
uname [OPTION]…
-n: 顯示主機名稱;
-r: 顯示VERSION-RELEASE;
-a: 顯示所有信息
-v:顯示編譯版本
[root@station1?~]#?uname?-n
station1.example.com
[root@station1?~]#?hostname
station1.example.com
[root@station1?~]#?uname?-r
2.6.18-164.el5
[root@station1?~]#?uname?-v
#1?SMP?Tue?Aug?18?15:51:54?EDT?2009
[root@station1?~]#?uname?-a
Linux?station1.example.com?2.6.18-164.el5?#1?SMP?Tue?Aug?18?15:51:54?EDT?2009?i686?i686?i386?GNU/Linux
內核模塊命令
lsmod命令:
顯示由核心已經裝載的內核模塊
顯示的內容來自于: /proc/modules文件
modinfo命令:
顯示模塊的詳細描述信息
modinfo [ -k kernel ] [ modulename|filename… ]
-n: 只顯示模塊文件路徑
-p: 顯示模塊參數
-a: author
-d: description
-l: license
-k: 顯示指定的內核版本模塊
-F: 只顯示指定字段(filename、depengds)的信息
[root@station1?~]#?modinfo?ext4
filename:???/lib/modules/2.6.18-164.el5/kernel/fs/ext4/ext4.ko
license:GPL
description:Fourth?Extended?Filesystem
author:?Remy?Card,?Stephen?Tweedie,?Andrew?Morton,?Andreas?Dilger,?Theodore?Ts'o?and?others
alias:??ext4dev
srcversion:?5F3DBC78955B31FC1E07EB1
depends:jbd2,crc16
vermagic:???2.6.18-164.el5?SMP?mod_unload?686?REGPARM?4KSTACKS?gcc-4.1
module_sig:????883f3504a8b7a0d18758d6145e112de9009c98197d6c75e9511e0f4cdd64f9c1cefe6d41e6209f5e596869bc565ba9a6edbb27a294e906936c4a
[root@station1?~]#?modinfo?-F?alias?ext4
ext4dev
[root@station1?~]#?modinfo?-n?ext4
/lib/modules/2.6.18-164.el5/kernel/fs/ext4/ext4.ko
lsmod |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?
1
|
modinfo –n exportfs
|
lnsmod?
1
|
modinfo –n xfs
|
rmmod命令
rmmod [ modulename ]
rmmod xfs
rmmod exportfs
ramdisk管理
ramdisk文件的制作:
(1) mkinitrd命令
為當前正在使用的內核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
–with=:除了默認的模塊之外需啊喲裝載至initramfs
–preload=:initramfs所提供的模塊需要預先裝載的模塊;
(2) dracut命令
為當前正在使用的內核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
內核信息輸出的偽文件系統:/proc、/sys
/proc目錄
內核把自己內部狀態信息及統計信息,以及可配置參數通過proc偽文件系統加以輸出;同時,還提供一個配置接口,proc/sys;
參數:
只讀:輸出信息;例如/proc/#/
可寫:可接受用戶指定“新值”來實現對內核某功能或特性的配置:/proc/sys/(僅管理員有寫權限)
查看:
cat /proc/sys/PATH/TO/SOME_KERNEL_FLIE
修改設定/proc/sys目錄下的
(1) sysctl命令用于查看或設定此目錄中諸多參數
*sysctl -w PATH.TO.SOME_KERNEL_FLIE=VALUE
例如:
sysctl -w kernel.hostname=mail.magedu.com
示例:
[root@localhost?~]#?sysctl?net.ipv4.ip_forward
net.ipv4.ip_forward?=?0
[root@localhost?~]#?sysctl?-w?net.ipv4.ip_forward=1
net.ipv4.ip_forward?=?1
[root@localhost?~]#?sysctl?net.ipv4.ip_forward
net.ipv4.ip_forward?=?1
(2) echo命令通過重定向方式也可以修改大多數參數的值
echo “VALUE” > /proc/sys/PATH/TO/SOME_KERNEL_FLIE
例如:
echo “websrv” > /proc/sys/kernel/hostname
注意:上述兩種方式的設定僅當前運行內核有效;
配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf
并使用
sysctl -p [/path/to/conf_file]
重新加載內核參數設置即可永久有效
sysctl命令
sysctl命令被用于在內核運行時動態地修改內核的運行參數,可用的內核參數在目錄/proc/sys中。它包含一些TCP/ip堆棧和虛擬內存系統的高級選項, 這可以讓有經驗的管理員提高引人注目的系統性能。用sysctl可以讀取設置超過五百個系統變量。
語法
sysctl [options] [variable[=value]] […]
sysctl -p [file or regexp] […]
選項
-n:打印值時不打印關鍵字;
-e:忽略未知關鍵字錯誤;
-N:僅打印名稱;
-w:當改變sysctl設置時使用此項;
-p:從配置文件“/etc/sysctl.conf”加載內核參數設置;
-a:打印當前所有可用的內核參數變量和值;
-A:以表格方式打印當前所有可用的內核參數變量和值。
參數
變量=值:設置內核參數對應的變量值
注意:可以使用sysctl修改系統變量,也可以通過編輯sysctl.conf文件來修改系統變量。sysctl.conf看起來很像rc.conf。它用variable=value的形式來設定值。指定的值在系統進入多用戶模式之后被設定。并不是所有的變量都可以在這個模式下設定。 sysctl變量的設置通常是字符串、數字或者布爾型。(布爾型用 1 來表示’yes’,用 0 來表示’no’)。
默認配置文件: /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:核心轉發功能
net.ipv4.icmp_echo_ignore_all:忽略所有ping本機操作
vm.drop_caches:手動回收內存功能(值為:0、1、2)
kernel.hostname:當前生效的主機名
示例:
[root@localhost?~]#?sysctl?-a
abi.vsyscall32?=?1
crypto.fips_enabled?=?0
debug.exception-trace?=?1
debug.kprobes-optimization?=?1
dev.cdrom.autoclose?=?1
dev.cdrom.autoeject?=?0
dev.cdrom.check_media?=?0
dev.cdrom.debug?=?0
...
[root@localhost?~]#?sysctl?net.ipv4.ip_forward
net.ipv4.ip_forward?=?1
[root@localhost?~]#?cat?/proc/sys/net/ipv4/ip_forward
1
注意:sysctl命令處理的是/proc/sys目錄下配置文件值,因此/proc/sys目錄下的 net/ipv4/ip_forward相當于net.ipv4.ip_forward
/sys目錄
sysfs:為用戶使用的偽文件系統,輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的設定信息;有些參數是可以修改的,用于調整硬件工作特性。
udev通過讀取/sys此路徑下的硬件設備信息(輸出的信息動態)為各硬件設備創建文件
udev是運行在用戶空間的程序
專用工具: udevadmin, hotplug
udev為設備創建設備文件時,會讀取其事先定義好的規則文件,一般在/etc/udev/rules.d/及/usr/lib/udev/rules.d/目錄下
編譯內核
程序包的編譯安裝:
./configure:檢查編譯環境的依賴關系,并設定編譯參數
make:執行編譯過程(調用工具不是編譯工具)
make install:安裝
編譯內核前提:
(1) 準備好開發環境(開發工具編譯器、開發編譯庫)頭文件:/usr/include
(2) 獲取目標主機上硬件設備的相關信息
(3) 獲取目標主機系統功能的相關信息,例如要啟用的文件系統
例如:需要啟用相應的文件系統
(4) 獲取內核源代碼包:www.kernel.org
開發環境準備
包組(CentOS 6):
Server Platform Development(服務器平臺開發)
Development Tools(開發工具)
注意:還要有ncurses.x86_64包
yum groupinstall Server Platform Development
yum groupinstall Development Tools
yum -y install ncurses…
目標主機硬件設備相關信息
CPU:
#cat /proc/cpuinfo
#lscpu
主要查看信息為vendor_id、model name
#x86info -a
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的配置文件
編譯安裝內核實例
1、解壓縮內核源碼包到/usr/src目錄
tar xf Linux-4.4.21.tar.xz -C /usr/src
cd /usr/src(跳轉到/usr/src目錄下)
2、生成Linux-4.4.21的符號鏈接Linux
ln -sv Linux-Linux-4.4.21 Linux(注意:編譯內核時和涉及到驅動問題,而驅動查找文件時默認查找/usr/src/Linux,所有做鏈接處理,即標準化又可以支持回滾)
cd /usr/src/Linux(運行make命令需要此目錄為當前目錄)
3、復制當前內核配置模板文件
cp /boot/config-$(uname -r) ./.config
注意:在紅帽發行版中存在/boot/config-
1
|
uanme -r
|
文件,而有些發行版存在/proc/config.gz文件,這些文件為當前使用內核配置文件的模板文件
make help(查看make幫助文檔主要是挑選相應的命令工具)
為了保證編譯安裝過程中(比如遠程連接中斷而導致編譯安裝失敗)穩定,可以使用screen命令開啟屏幕會話的方式運行一下命令
screen命令
打開screen:~]#screen
拆除screen:Ctrl+a,d
列出screen:~]#screen -ls
連接至screen:~]#screen -r SCREEN_ID
關閉screen(在screen內部):~]#exit
4、配置編譯內核自定義的選項
方法一:
make menuconfig(打開文本菜點界面需要ncurses包以及ncurses-devel包支持,同時顯示空間有一定要求注意最大化顯示框體就好
注意:*號代表編譯進內核;M代表編輯成模塊;[]代表不編譯
也可以使用
方法二:(圖像化界面需要系統安裝圖形界面并且安裝桌面平臺開發包租Desktop Platform Development)
GONE桌面配合GKT開發環境使用make gconfig
KDE桌面配合QT開發環境使用make xconfig
5、編譯(-j #表示啟動多個線程編譯)默認一個
make -j 2
6、安裝內核模塊
make modules_install
7、安裝內核核心(自動生成grub選項)
make install
8、重啟選擇新內核
reboot
示例:
[root@CentOS6?~]#?tar?-xf?Linux-4.4.21.tar.xz?-C?/usr/src/
[root@CentOS6?~]#?cd?/usr/src/
[root@CentOS6?src]#?ls
debug??kernels??Linux-4.4.21
[root@CentOS6?src]#?ln?-sv?Linux-4.4.21?Linux
`Linux'?->?`Linux-4.4.21'
[root@CentOS6?src]#?ls
debug??kernels??Linux??Linux-4.4.21
[root@CentOS6?src]#?cd?/usr/src/Linux
[root@CentOS6?Linux]#?cp?/boot/config-2.6.32-642.el6.x86_64??./.config?
cp:?overwrite?`./.config'??Y
[root@CentOS6?Linux]#?make?menuconfig??
[root@CentOS6?Linux]#?make
...(等吧!)
[root@CentOS6?Linux]#?make?modules_install
...(繼續等吧!)
[root@CentOS6?Linux]#?make?install
...
[root@CentOS6?Linux]#?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
(c)如何交叉編譯內核:
編譯的目標平臺與當前平臺不相同;
# make ARCH=arch_name
要獲取特定目標平臺的使用幫助
# make ARCH=arch_name help
# make ARCH=arm help
(3)在已經執行過編譯操作的內核源碼樹做重新編譯:
需要事先清理操作:
# make clean:清理大多數編譯生成的文件,但會保留config文件等
# make mrproper: 清理所有編譯生成的文件、config及某些備份文件;
# make distclean:相當于mrproper,額外清理各種patches以及編輯器備份文件;
卸載內核
首先我們需要查看一下當前使用的是哪個內核:
uname -r
該命令會告訴你當前使用的內核版本,在登錄時候,不能卸載當前的內核,以免造成無法啟動的悲劇~~
接下來,如果你是自己動手編譯的內核的話,請刪除以下文件和文件夾
一、卸載自己編譯的內核:
- 刪除掉/lib/modules/目錄下過時的內核庫文件
- 刪除掉/usr/src/kernels/目錄下過時的內核源代碼
- 刪除掉/boot目錄下啟動的核心檔案以及內核映像
- 更改/boot/grub/menu.lst,刪除掉不用的啟動列表
KERNEL-VERSION代表你想卸載的內核的版本號二、卸載發行版自帶的內核。
1、查找內核文件 :dpkg –get-selections|grep Linux 。帶有image的就是內核文件。
如:Linux-image-3.16-amd64 install
2、卸載:sudo apt-get remove Linux-image-(接內核版本)
最后必須更新grub :update-grub
練習:
1、破解root口令,并為grub設置保護功能
生成加密密碼
[root@CentOS6?~]#?grub-md5-crypt
Password:?
Retype?password:?
$1$YS0sz$S214NTNpQKGanvodNDegK/
或者
[root@CentOS6?~]#?openssl?passwd?-1?-salt?"YS0sz"
Password:?
$1$YS0sz$S214NTNpQKGanvodNDegK/
注意:此命令可以自定義“鹽”
重啟后
注意:啟動對應內核密碼可以選擇c(grub命令行模式)
繞開菜單內核啟動項,而自己設定一個啟動
但是設置內核參數的密碼繞不開,只能用救援模式刪掉上面加密行才可
2、編寫centos5,6的服務腳本
#!/bin/bash
#chkconfig:35 88 22
#description:test service
chkconfig –add testsrv
chkconfig –list testsrv
chkconfig –del testsrv
[root@CentOS6?rc.d]#?vim?/etc/rc.d/init.d/testsrv
#!/bin/bash
#chkconfig:35?80?20
#description:test?service
case?$1?in
start)
??echo?testsrv?starting
;;
stop)
??echo?testsrv?stop
;;
status)
??echo?testsrv?status
;;
*)
??echo?"testsrv?start|stop|status"
;;
esac
[root@CentOS6?rc.d]#?cd?./init.d
[root@CentOS6?init.d]#?chkconfig?--add?testsrv
[root@CentOS6?init.d]#?chkconfig?--list?testsrv
testsrv????0:off????1:off????2:off????3:on????4:off????5:on????6:off
[root@CentOS6?init.d]#?ll?/etc/rc.d/rc*.d/*testsrv*
lrwxrwxrwx.?1?root?root?17?Sep?25?15:16?/etc/rc.d/rc0.d/K20testsrv?->?../init.d/testsrv
lrwxrwxrwx.?1?root?root?17?Sep?25?15:16?/etc/rc.d/rc1.d/K20testsrv?->?../init.d/testsrv
lrwxrwxrwx.?1?root?root?17?Sep?25?15:16?/etc/rc.d/rc2.d/K20testsrv?->?../init.d/testsrv
lrwxrwxrwx.?1?root?root?17?Sep?25?15:16?/etc/rc.d/rc3.d/S80testsrv?->?../init.d/testsrv
lrwxrwxrwx.?1?root?root?17?Sep?25?15:16?/etc/rc.d/rc4.d/K20testsrv?->?../init.d/testsrv
lrwxrwxrwx.?1?root?root?17?Sep?25?15:16?/etc/rc.d/rc5.d/S80testsrv?->?../init.d/testsrv
lrwxrwxrwx.?1?root?root?17?Sep?25?15:16?/etc/rc.d/rc6.d/K20testsrv?->?../init.d/testsrv
刪除服務
[root@CentOS6?init.d]#?chkconfig?--del?testsrv??
[root@CentOS6?init.d]#?ll?/etc/rc.d/rc*.d/*testsrv*
ls:?cannot?access?/etc/rc.d/rc*.d/*testsrv*:?No?such?file?or?directory
或者
[root@CentOS6 init.d]# ntsysv –level=3 #去掉testsrv前的*號
3、破壞本機grub stage1,而后在救援模式下修復之
模擬損壞:dd if=/dev/zero of=/dev/sda bs=1 count=446
重啟自動修復
方法二:
4、破壞本機grub stage1_5,而后在救援模式下修復之
模擬損壞:dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1
方法二:
注意:方法二修復需要依賴/boot/grub目錄下的stage相關文件,如果這些文件有問題則修復無效,所以建議用grub-install修復,若損壞后沒重啟機器可以直接運行相關命令修復,而不用救援模式
如果grub目錄不存在的情況下,grub-install修復,但是需要手動編輯grub.conf(修復之后再輸入一次),完全重啟重新編輯grub.conf
5、破環本機initrm文件,而后在救援模式下修復之
- 救援模式
- chroot /mnt/sysimage
- mkinitrd /boot/initramfs-
1uname -r
.img?
1uname -r - exit;exit;reboot
6、修復內核啟動參數
然后按b啟動
7、grub.conf文件丟失損壞
啟動后在直接進入grub命令行模式(grub stage1 stage1_5完好的情況下)
b鍵啟動等待修復并自動重啟
再輸入一遍上圖操作,進入系統后重新建立如下grub.conf文件
5、刪除vmlinuz和initramfs文件后無法啟動,兩種方法恢復之
方法一(有光盤進救援模式):
注意:新生成的vmlinuz、initramfs的文件名稱要與grub.conf中的文件名一直!!!本人在生成initramfs文件時少一個“-”即:initramfs-
1
|
uanme -r
|
而失誤打成initramfs
1
|
uanme -r
|
與grub文件中原initramfs行名稱不符
重啟等待修復完成
方法二(無光盤,利用網絡模式或者其它介質如U盤的進入救援模式也可):
網絡中要做好有網絡引導啟動的服務,ftp服務或http服務等(在之后的課程我們可以學到)此次為用光盤救援模式模擬
在本次試驗中我的環境有dhcp服務所以無需手動配置ip,而沒有則需要我們收到配置
完成后依然進入一路默認ok,進shell
6、增加新硬盤,在其上制作能單獨運行kernel和bash的系統
7、(1)實驗:刪除/boot,恢復
rm -rf /boot
光盤啟動,進入rescue模式
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
vim /boot/grub/grub.conf
8、分區情況下,刪除/boot 和/etc/fstab,恢復之
rm -rf /boot /etc/fstab
光盤啟動,進入rescue模式
檢查/
blkid;fdisk -l
mkdir /mnt/sda2
mount /dev/sda2 /mnt/sda2
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
rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm –replacepkgs|force
grub-install /dev/sda
vim /boot/grub/grub.conf
default=0
timeout=3
title wangLinux
root (hd0,0)
kernel /vmlinuz…. root=/dev/sda2
initrd /initramfs
重啟系統等待修復,進入系統后重新編輯fstab
9、邏輯卷情況下,刪除/boot 和/etc/fstab,恢復之
rm -rf /boot /etc/fstab
光盤啟動,進入rescue模式
檢查
lvscan
vgchange -ay
mount /dev/vg0/root /mnt/sysimage
vi /mnt/sysimage/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/vg0/root / ext4 defaults 1 2
/dev/vg0/usr /usr ext4 defaults 0 0
/dev/vg0/var /var ext4 defaults 0 0
reboot
光盤啟動,進入rescue模式,掛載/mnt/sysimage
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
chroot /mnt/sysimage
rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm –replacepkgs|force
grub-install /dev/sda
vim /boot/grub/grub.conf
default=0
timeout=3
title CentOS6
root (hd0,0)
kernel /vmlinuz…. root=/dev/vg0/root
initrd /initramfs
10、自制Linux系統:
添加硬盤(虛擬機需要掃描)
echo ‘- – -‘ > /sys/class/scsi_host/host2/scan
1)、分區并創建文件系統
fdisk/dev/sdb
分兩個必要的分區
/dev/sdb1對應/boot /dev/sdb2對應根/
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
2)、掛載boot
mkdir/mnt/boot
mount /dev/sdb1 /mnt/boot
3)、安裝grub
grub-install –root-directory=/mnt/ dev/sdb
4)、建立grub.conf:
vim /mnt/boot/grub/grub.conf
title wangLinux
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
5)、恢復內核和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
6)、創建一級目錄
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}
7)、vim /mnt/sysroot/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
8)、復制bash和相關庫文件
9)、復制相關命令及相關庫文件
如:ls,cat,vim,reboot,hostname等
[root@CentOS6?sysroot]#?vim?/root/bin/copycmd.sh
#!/bin/bash
ch_root="/mnt/sysroot"
[?!?-d?$ch_root?]?&&?mkdir?$ch_root
bincopy()?{
if?which?$1?&>/dev/null;?then
local?cmd_path=`which?--skip-alias?$1`
local?bin_dir=`dirname?$cmd_path`
[?-d?${ch_root}${bin_dir}?]?||?mkdir?-p?${ch_root}${bin_dir}
[?-f?${ch_root}${cmd_path}?]?||?cp?$cmd_path?${ch_root}${bin_dir}
return?0
else
echo?"Command?not?found."
return?1
fi
}
libcopy()?{
local?lib_list=$(ldd?`which?--skip-alias?$1`?|?grep?-Eo?'/[^[:space:]]+')
for?loop?in?$lib_list;do
local?lib_dir=`dirname?$loop`
[?-d?${ch_root}${lib_dir}?]?||?mkdir?-p??${ch_root}${lib_dir}
[?-f?${ch_root}${loop}?]?||?cp?$loop?${ch_root}${lib_dir}
done
}
read?-p?"Please?input?a?command:?"?command
while?[?"$command"?!=?"quit"?];do
if?bincopy?$command?;then
libcopy?$command
fi
read?-p?"Please?input?a?command?or?quit:?"?command
done
關機,新建一個虛擬機并把剛才的新添加的磁盤文件拷到其目錄下指定為自:我又失誤了,內核參數不對,需要手動去掉/mnt/boot/;同時添加fstab當中的一個default少些一個字母,修改后即可進入系統,但是此系統只是一個流程如果需要正常使用需要使用手工編譯安裝需要的軟件
11、在U盤上定制Linux,使其可啟動系統和swap分區
與10類似,只是一般需要FAT32格式U盤然后
新建虛擬機識別u盤直接重啟即可
12、編譯安裝kernel,啟用支持ntfs文件系統功能
[root@CentOS6 ~]# tar -xf Linux-4.4.21.tar.xz -C /usr/src/
[root@CentOS6 ~]# cd /usr/src/
[root@CentOS6 src]# ls
debug kernels Linux-4.4.21
[root@CentOS6 src]# ln -sv Linux-4.4.21 Linux
1
|
Linux' ->
|
Linux-4.4.21′
[root@CentOS6 src]# ls
debug kernels Linux Linux-4.4.21
[root@CentOS6 src]# cd /usr/src/Linux
[root@CentOS6 Linux]# cp /boot/config-2.6.32-642.el6.x86_64 ./.config
cp: overwrite `./.config’? Y
[root@CentOS6 Linux]# make menuconfig
選擇ntfs功能
[root@CentOS6 Linux]# make
…
[root@CentOS6 Linux]# make modules_install
…
[root@CentOS6 Linux]# make install
…
[root@CentOS6 Linux]# reboot
若/sbin/init損壞則修復方法
臨時應急啟動
進入啟動菜單,a編輯內核參數kernel par后添加init=/sbin/bash以bash進程暫時代替init進程作為第一個啟動的進程(可以進行操作,否者操作不了)
注意:以上操作是會涉及一些服務的seLinux的變更所以需要
如:
[root@CentOS6?~]#?ll?-Z?/sbin/init
-rwxr-xr-x.?root?root?system_u:object_r:admin_home_t:s0?/sbin/init
[root@CentOS6?~]#?chcon?-t?init_exec_t?/sbin/init
[root@CentOS6?~]#?ll?-Z?/sbin/init
-rwxr-xr-x.?root?root?system_u:object_r:init_exec_t:s0?/sbin/init
有光盤,則可以進入救援模式
分別安裝對應版本的init程序包
CentOS5:SysVinit-2.86-15.el5
CentOS6:upstart-0.6.5-16.el6.x86_64
CentOS7:systemd-219-19.el7.x86_64