Linux組成
-
Linux:kernel+rootfs
- kernel:進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
-
rootfs:程序和glibc
-
庫:函數集合,function,調用接口(頭文件負責描述)
- 過程調用:procedure,無返回值;
- 函數調用:function;有返回值,可以賦值于變量中;
- 程序:二進制執行文件
-
庫:函數集合,function,調用接口(頭文件負責描述)
包括根目錄以及包含/ boot,/ dev,/ etc,/ bin,/ sbin和some / tmp(用于臨時文件)的最小的子目錄和文件集。
-
內核設計流派
-
單內核(monoli kernel):Linux
把所有功能集成于同一個程序 -
微內核:(micro kernel):Windows,Solaris
每種功能使用一個單獨的子系統實現
-
單內核(monoli kernel):Linux
-
Linux內核特點:
-
支持模塊化:.ko(內核對象)
如:文件系統,硬件驅動,網絡協議等 - 支持內核模塊的動態裝載和卸載
-
組成部分:
-
核心文件:/boot/vmlinuz-VERSION-release
-
ramdisk:輔助的臨時根系統;并非是必須的;
CentOS 5: /boot/initrd-VERSION-release.img
CentOS 6,7: /boot/initramfs-VERSION-release.img
-
ramdisk:輔助的臨時根系統;并非是必須的;
- 模塊文件:/lib/modules/VERSION-release
-
核心文件:/boot/vmlinuz-VERSION-release
-
支持模塊化:.ko(內核對象)
CentOS 5和6的啟動流程
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;當時針對于的硬盤較小,故現在PC機上大多不適用,手機上使用較多;
-
GRUB: GRand Unified Bootloader
- GRUB 0.X: GRUB Legacy;
- GRUB 1.X:GRUB2;
bootloader代碼量很小,為了簡化;使得其無法驅動軟設備,也就無法訪問設備上的文件;
故內核文件不能放在邏輯卷上,只能放在基本的磁盤分區
-
-
MBR
512bytes-
446: bootloader;
64: 分區表;
2: 55AA;
查看二進制文件:hexdump -C /dev/sda -n 512
-
446: bootloader;
-
GRUB:
- stage 1:mbr
-
stage 1.5:mbr之后的扇區,
讓stage 1中的bootloader能識別stage2所在的分區上的文件系統 -
stage 2:磁盤分區(/etc/grub/)
配置文件:/boot/grub/grub.conf <– /etc/grub.conf
-
kernel:
自身初始化:
- 探測可識別到的所有硬件設備;
- 加載硬件驅動程序(借助于ramdisk加載真正的根文件系統);
-
以只讀方式掛載根文件系統(rootfs);
避免內核和操作系統有bug,故采用只讀模式;
當完成掛載后根所在的設備的bin、sbin、boot…;就是/bin、/sbin、/boot… - 運行用戶空間的第一個應用程序:/sbin/init
-
ramdisk:加載真正的根文件設備驅動程序
內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問,并加載相應的硬件驅動- ramdisk –> ramfs 一種提速機制
-
CentOS 5: initrd
工具程序:mkinitrd
CentOS 6,7: initramfs
工具程序:mkinitrd, dracut -
ramdisk文件的制作:
-
mkinitrd命令;為當前正在使用的內核重新制作ramdisk文件
- –with=:除了默認的模塊之外需要裝載至initramfs中的模塊;
- –preload=:initramfs所提供的的模塊需要預先裝載的模塊;
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
-
dracut命令;為當前正在使用的內核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
-
-
init程序的類型:運行的第一個應用程序
-
SysV: init, CentOS 5之前
配置文件:/etc/inittab -
Upstart: init,CentOS 6
配置文件:/etc/inittab;為了兼容centos5
/etc/init/*.conf -
Systemd:systemd, CentOS 7
配置文件:/usr/lib/systemd/system
/etc/systemd/system
-
系統初始化(內核級別):
- POST –> 讀取BIOS中的BootSequence,確定引導加載設備–>讀取此設備的Bootloader(MBR中) –> kernel(ramdisk) –> rootfs(只讀) –> /sbin/init(systemd)
CentOS 5:SysV init
-
運行級別:為系統運行或維護等目的而設定;0-6:7個級別
0:關機;init 0;不能設置為默認級別
1:單用戶模式(root自動登錄), single, 維護模式
2: 多用戶模式,啟動網絡功能,但不會啟動NFS(網絡文件系統);維護模式
3:多用戶模式,完全功能模式;文本界面;
4:預留級別;目前無特別使用目的,可同3級別
5:多用戶模式,完全功能模式;圖形界面
6:重啟;init 6;不能設置為默認級別-
默認級別: 3, 5
切換級別:init #
查看級別:runlevel ; who -r
-
默認級別: 3, 5
-
配置文件:/etc/inittab
每一行定義一種action以及與之對應的process
id : runlevel : action : process- id:一個任務的標識符
- runlevels:在哪些級別啟動此任務;#,###,也可以為空,表示所有級別;
-
action:在什么條件下啟動此任務
-
wait: 等待切換至此任務所在的級別時運行一次;
respawn:一旦此process終止,就重新啟動之;
initdefault:設定默認運行級別;process省略
sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit(centos 7 沒有此腳本);
-
wait: 等待切換至此任務所在的級別時運行一次;
- process:任務
init啟動流程
-
設定默認級別:/etc/inittab
id:3:initdefault:
-
設定系統初始化腳本:CentOS 5中是在/etc/inittab,CentOS 6中沒有此信息,但腳本依舊在/etc/rc.d/rc.sysinit;
si::sysinit:/etc/rc.d/rc.sysinit
-
設置主機名;
[root@centos6 rc.d]# grep network /etc/rc.d/rc.sysinit if [ -f /etc/sysconfig/network ]; then . /etc/sysconfig/network # In theory there should be no more than one network interface active # Use the network address to set the hostname of the client. This if [ -x /usr/sbin/system-config-network-tui ]; then /usr/sbin/system-config-network-tui # Reread in network configuration data. if [ -f /etc/sysconfig/network ]; then . /etc/sysconfig/network if [ -x /usr/sbin/system-config-network-cmd ]; then /usr/sbin/system-config-network-cmd --profile ${arg##netprofile=} [root@centos6 rc.d]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=centos6.8
- 設置歡迎信息;
- 激活udev和selinux;
-
掛載/etc/fstab文件中定義的所有文件系統;
[root@centos6 rc.d]# grep /etc/fstab /etc/rc.d/rc.sysinit # First try to mount scratch storage from /etc/fstab, then any # First try to mount persistent data from /etc/fstab, then any restorecon $(awk '!/^#/ && $4 !~ /noauto/ && $2 ~ /^\// { print $2 }' /etc/fstab) >/dev/null 2>&1 action $"Enabling /etc/fstab swaps: " swapon -a -e
-
檢測根文件系統,并以讀寫方式重新掛載根文件系統
[root@centos6 rc.d]# grep rw /etc/rc.d/rc.sysinit rw_mount_dev=$(blkid -t LABEL="$RW_LABEL" -l -o device) elif [ x$rw_mount_dev != x ] && mount $rw_mount_dev $mountopts "$RW_MOUNT" > /dev/null 2>&1; then for file in /etc/rwtab /etc/rwtab.d/* /dev/.initramfs/rwtab ; do mount -t nfs $CLIENTSTATE/$HOSTNAME $STATE_MOUNT -o rw,nolock if [ "$opt" = "rw" ]; then action $"Remounting root filesystem in read-write mode: " mount -n -o remount,rw / 其中:mount -n -o remount,rw
- 設置時鐘;
- 根據/etc/sysctl.conf文件來設置內核參數;
-
激活lvm及軟raid設備;
[root@centos6 rc.d]# grep change /etc/rc.d/rc.sysinit action $"Setting up Logical Volume Management:" /sbin/lvm vgchange -a ay --sysinit --ignoreskippedcluster
- 激活swap設備;
- 加載額外設備的驅動程序;
- 清理操作;
-
-
啟動對應級別的服務:
在CentOS 5中的/etc/inittab文件中 l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 ... ... l6:6:wait:/etc/rc.d/rc 6 rc N -->意味著讀取/etc/rc.d/rcN.d
-
/etc/rc.d/rcN.d/目錄下的服務腳本控制服務(守護進程);
這些目錄下的K*或S*是/etc/rc.d/init.d/下對應的腳本的鏈接;CentOS 5或6:都在/etc/rc.d/rc 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
運行時:先執行K,再執行S; K*:要停止的服務; K##*:##運行次序;數字越小,越先關閉;數字越小的服務,通常為依賴別的服務的服務; S*:要啟動的服務; S##*:##運行次序;數字越小,越先啟動;數字越小的服務,通常為被依賴的服務
-
/etc/rc.d/init.d/*(/etc/init.d/*)服務腳本
-
/etc/rc.d/init.d/*(/etc/init.d/*)服務腳本編寫
最好學習/etc/rc.d/init.d/*(/etc/init.d/*)系統腳本
示例:#!/bin/bash # #chkconfig:35 98 01 #description:test service case $1 in start) echo testsrv is stsrting touch /root/testsrv ;; stop) echo testsrv is stop rm -f /root/testsrv ;; status) [ -f /root/testsrv ] && echo testsrv is starting || echo testsrv is stoped ;; *) echo "testsrv usage:start|stop|status" esac
-
/etc/rc.d/init.d/*(/etc/init.d/*)服務腳本執行方式
/etc/init.d/SRV_SCRIPT{start|stop|restart|status} or service SRV_SCRIPT{start|stop|restart|status} [root@centos6 rc.d]# ll /etc/init.d /etc/rc.d/init.d -d lrwxrwxrwx. 1 root root 11 May 10 22:57 /etc/init.d -> rc.d/init.d drwxr-xr-x. 2 root root 4096 May 11 07:36 /etc/rc.d/init.d 直接運行/etc/init.d下的腳本 == service 例如:/etc/init.d/httpd status == service httpd status
-
/etc/rc.d/init.d/*(/etc/init.d/*)服務腳本的刪除
chkconfig –del name
rm -rf name
chkconfig –list:查看是否刪除
-
/etc/rc.d/init.d/*(/etc/init.d/*)服務腳本編寫
-
chkconfig命令:管控/etc/rc.d/init.d(/etc/init.d/)每個服務腳本在各級別下的啟動或關閉狀態;
-
查看服務在所有級別的啟動或關閉設定情形:
chkconfig [–list] [name] -
添加:
SysV的服務腳本放置于/etc/rc.d/init.d (/etc/init.d)
chkconfig –add name-
能被添加的服務的腳本定義格式之一:
#!/bin/bash #LLLL 表示初始在哪個級別下啟動,-表示都不啟動 # chkconfig: LLLL nn nn # description:
-
能被添加的服務的腳本定義格式之二:
查看/etc/init.d/crond
-
能被添加的服務的腳本定義格式之一:
-
刪除:
chkconfig –del name -
修改指定的鏈接類型
chkconfig [–level levels] name <on|off|reset>
–level LLLL: 指定要設置的級別;省略時默認為2345
僅下次開機時改變,目前不改變;
-
查看服務在所有級別的啟動或關閉設定情形:
- ntsysv命令:圖形界面管理服務
-
service命令:手動管理服務
- service 服務 start|stoprestart
- service –status-all 查看當前所有服務狀態
-
瞬態(Transient)服務被xinetd進程所管理
-
進入的請求首先被xinetd代理
配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
與libwrap.so文件鏈接
用chkconfig控制的服務:chkconfig tftp on
-
進入的請求首先被xinetd代理
-
注意:
- 正常級別下,最后啟動一個服務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在指定運行級別腳本后運行
- 可以根據情況,進行自定義修改
-
當某個服務無法啟動,導致系統無法啟動,進入單用戶模式下進行修改模,進行修復;
但是,當單用戶模式也無法啟動時,進入菜單(a);- 可將啟動模式修改:init=/bin/bash;進入命令行操作
- 因為當第一次掛載根文件系統時是只讀模式,修改為讀寫模式;mount -o remount,rm /
- 進行修復
-
-
打印各啟動終端:
tty1:2345:respawn:/usr/sbin/mingetty tty1 tty2:2345:respawn:/usr/sbin/mingetty tty2 ... tty6:2345:respawn:/usr/sbin/mingetty tty6
- mingetty會自動調用login程序
- 打開虛擬終端的程序除了mingetty之外,還有諸如getty等
-
如果默認級別是5級別的話會運行圖形界面的啟動:
x:5:respawn:/etc/X11/prefdm -nodaemon
啟動流程(用戶空間):/sbin/init(/etc/inittab)
- 設置默認運行級別 –> 運行系統初始化腳本,完成系統初始化 –> 關閉對應級別下需要關閉的服務,啟動對應級別下需要啟動服務 –> 設置登錄終端 [–>啟動圖形終端]
啟動流程(內核空間+用戶空間):
- POST –> Boot Sequence(BIOS) –> Boot Loader –>Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init –>(/etc/inittab, /etc/init/*.conf) –> 設定默認運行級別 –> 系統初始化腳本rc.sysinit –> 關閉或啟動對應級別的服務 –> 啟動終端(先是啟動字符終端;如果運行級別是5,則啟動圖形界面)
CentOS 6
-
init程序:upstart,但依然為/sbin/init,其配置文件:
-
/etc/inittab(僅用于定義默認運行級別)
-
/etc/init/*.conf (其他的在這些文件中)
*.conf遵循upstart風格的配置文件;
-
CentOS 7
-
init程序:systemd,配置文件:
-
/usr/lib/systemd/system/*
/etc/systemd/system/*
-
/usr/lib/systemd/system/*
-
完全兼容SysV腳本機制;因此,service命令依然可用;不過,建議使用systemctl命令來控制服務;
- systmctl {start|stop|restart|status} name[.service]
Grub
-
grub:GRand Unified Bootloader
- grub 0.x:grub legacy
- grub 1.x:grub2
-
grub legacy:
- stage 1:mbr;不屬于任何分區,是硬盤的mbr的前446字節;
- stage 1.5:mbr之后的扇區,讓stage 1中的bootloader能識別stage2所在的分區上的文件系統;
-
stage 2:磁盤分區(/etc/grub/)
配置文件:/boot/grub/grub.conf <– /etc/grub.conf
/boot/grub/中的 -
stage2及內核等通常放置于一個基本磁盤分區;
-
功用:
-
提供菜單、并提供交互式接口
- a:內核參數;
- e:編輯模式,用于編輯菜單;
- c:命令模式,交互式接口
-
加載用戶選擇的內核或操作系統
允許傳遞參數給內核
可隱藏此菜單 -
為菜單提供了保護機制
為編輯菜單進行認證
為啟用內核或操作系統進行認證
-
提供菜單、并提供交互式接口
-
功用:
-
如何識別設備:
(hd#,#)- hd#:磁盤編號,用數字表示;從0開始編號
- #:分區編號boot分區所在,用數字表示;從0開始編號
-
cat /proc/cmdline 內核參數
內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt -
grub的命令行接口
-
help:獲取幫助信息
help KEYWORD:詳細幫助信息 - find (hd#,#)/PATH/TO/SOMEFILE;
- root (hd#,#)
-
kernel /PATH/TO/KERNEL_FILE:設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的命令行參數;
如:init=/path/to/init , selinux=0 - initrd /PATH/TO/KERNEL_FILE:設定為選定的內核提供額外文件的ramdisk;
-
boot:引導啟動的內核;
-
手動在grub命令行接口啟動系統:
- grub> root (hd#,#)
- grub> ketnel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
- grub> initrd /initramfs-VERSION-RELEASE.img
- grub> boot
-
help:獲取幫助信息
-
配置文件:/boot/grub/grub.conf
-
配置項:
- default=#:設定默認啟動的菜單項;菜單項(title)編號從0開始;
- timeout=#:指定菜單項等待選項選擇的時長;
-
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:Z指明菜單背景圖片文件路徑;
- yum searrch ImageMagick
- 生成.xpm:convert -resize 640×480 -colors 14 win.png win.xpm
- more win.xpm
- gzip win.xpm
- 修改grub.conf中splashimage選項
- hiddenmenu:隱藏菜單;
- password [–md5|–encrypted] STRING:菜單編輯認證;
-
title TITLE:定義菜單項“標題”
- root (hd#,#):boot所在分區;grub查找stage2及ketnel文件所在設備分區;為grub的“根”;
-
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=472a74aa-d91e-4b79-844b-90415bdfb7c8 rhgb(啟動時的圖標) quiet(靜默,不顯示啟動過程)
- initrd /PATH/TO/INITRAMFS_FILE:與內核匹配的ramfs文件;
- password [–md5|–encrypted] STRING:啟動選定的內核或操作系統時進行認證;
-
配置項:
-
生成grub口令
- grub-md5-crypt :生成md5口令
- grub-crypt :生成sha512口令
-
破解root口令:
啟動系統時,設置其運行級別1;進入單用戶模式 -
進入單用戶模式:
(1) 編輯grub菜單(選定要編輯的title,而后使用e命令)
(2) 在選定的kernel后附加
1, s, S或single都可以
(3) 在kernel所在行,鍵入“b”命令 -
安裝grub:
-
grub-install:二進制類的文件可以恢復,圖片、grub.conf的文件不會恢復。
安裝grub stage1和stage1_5到/dev/DISK磁盤上,并復制GRUB相關文件到 DIR/boot目錄下
grub-install –root-directory=DIR /dev/DISK -
grub:依賴于/boot/grub/中的除grub.conf之外的文件;
grub> root (hd#,#)
grub> setup (hd#) - sync:強制寫入硬盤
-
grub-install:二進制類的文件可以恢復,圖片、grub.conf的文件不會恢復。
-
在/boot/grub/目錄下除grub.conf之外的其他文件都是備份文件,(/boot/grub/stage1內沒有分區表):
- 初始狀態下grub使用的文件在硬盤的一個位置,而并非使用grub下的文件;系統啟動使用的是grub.conf文件;
- 但是在后期如果做過修復工作后,grub使用的是grub目錄下的文件,所以此時grub不可使用
實驗:
-
破壞stage1:
- 備份:dd if=/dev/sda of=/app/mbr bs=1 count=512
- 破壞:dd if=/dev/zero of=/dev/sda bs=1 count=446;;
- 表現:stage1破壞后系統會直接進行光盤引導
- 修復1:使用grub-install –root-directory=/ /dev/DISK
-
修復2:不啟動且此時/boot/grub/下的文件沒有任何改動,可以使用grub修復;
- grub(hd0,0)
- setup(hd0)
-
破壞stage1.5:
- 破壞:dd if=/dev/zero of=/dev/sda bs=1 count=2048 skip=512 seek=512
- 表現:跳過光盤引導,菜單不顯示,說明破壞成功;
-
修復:使用grub依賴于配置文件stage1、stage1.5、stage2
- grub>root (hd0,0)
- grub>setup (hd0)
-
破壞stage2:
- 破壞:把/boot/grub/下的所有文件都移除;
-
修復:使用grub-install /dev/sda
- 修復完成后/boot/grub/中的文件會恢復,grub.conf不會恢復;要么copy、要么手寫一份;
自制Linux
-
分區并創建文件系統
fdisk /dev/sdb
分兩個必要的分區
/dev/sdb1對應/boot /dev/sdb2對應根 /
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2 -
掛載boot
mkdir /mnt/boot 子目錄必須為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.conftitle newlinux 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和相關庫文件
- ldd查看程序所使用的的庫文件
-
復制相關命令及相關庫文件
如:ls,cat,vim,reboot,hostname等
救援模式
-
在根文件系統無法使用時需要,如/bin/mount刪除
對系統沒有特殊要求
從光盤引導(boot.iso或者安裝光盤#1)
從USB盤(由boot.iso制作)引導 -
文件系統重組
Anaconda將會詢問是否應該掛載文件系統
/mnt/sysimage/*
/mnt/stage2
$PATH包括硬盤的目錄 -
文件系統節點
提供系統特定的設備文件
mknod了解major/minor
系統配置文件丟失修復
-
系統在引導期間,很重要的一個過程就是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
-
sh-3.1# chroot /mnt/sysimage
-
進入救援模式,執行chroot命令后,如果有此文件的備份(強烈建議系統中的重要數據目錄,如/etc、/boot等要進行備份),直接將備份文件拷貝回去,退出重啟即可。如果是配置文件修改錯誤,如比較典型的/boot/grub/grub.conf及/etc/passwd的文件修改錯誤,也可以直接修正恢復。假設有備份文件/etc/inittab.bak,則在救援模式下執行:
-
沒有備份文件的恢復辦法
-
如果一些配置文件丟失或軟件誤刪除,且無備份,可以通過重新安裝軟件包來恢復,首先查找到/etc/inittab屬于哪一個RPM包
-
~]# chroot /mnt/sysimage
~]# rpm -qf /etc/inittab
initscripts-9.03.49-1.el6.centos.x86_64
~]# exit 退出chroot模式
-
~]# chroot /mnt/sysimage
-
掛載存放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目錄下相應位置即可
-
/proc目錄
-
/proc目錄:
內核把自己內部狀態信息及統計信息,以及可配置參數通過proc偽文件系統加以輸出,還提供了一個配置接口,/proc/sys;-
參數:
- 只讀:輸出信息
-
可寫:可接受用戶指定“新值”來實現對內核某功能或特性的配置;/proc/sys,大多數只有root可寫;
/proc/sys:net/ipv4/ip_forward 相當于 net.ipv4.ip_forward-
sysctl命令:專用于查看或設定/proc/sys目錄下參數的值;
-
設置某參數
sysctl -w parameter=VALUE
sysctl -w path.to.parameter=VALUE
sysctl -w kernel.hostname=mail.magedu.com -
查看所有生效參數
sysctl -a
-
設置某參數
-
文件系統命令(cat、echo):命令通過重定向方式也可以修改大多數參數的值
-
查看:cat /proc/sys/PATH/TO/SOME_KERNEL_FILE
-
設定:echo “VALUE” > /proc/sys/PATH/TO/SOME_KERNEL_FILE
echo “VALUE” > /proc/sys/path/to/parameter
echo “websrv” > /proc/sys/kernel/hostname
-
-
配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf
通過重讀取配置文件設置參數
sysctl -p [/path/to/conf_file]
注:上述兩種方式的設定僅當前運行內核有效; -
常用的幾個參數:
net.ipv4.ip_forward:核心轉發功能;
net.ipv4.icmp_echo_ignore_all
vm.drop_caches :強制系統釋放緩存
kernel.hoestname:主機名
net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;
-
-
/sys目錄
-
/sys目錄:
-
sysfs:為用戶使用的偽文件系統,輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的設定信息;有些參數是可以修改的,用于調整硬件工作特性。
-
udev:通過此路徑下輸出的信息動態為各設備創建所需要設備文件,udev是運行用戶空間程序,不能直接跟硬件打交道;專用工具:udevadmin, hotplug
-
udev為設備創建設備文件時,會讀取其事先定義好的規則文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目錄下
-
編譯安裝內核
-
Linux:單內核體系設計,但充分借鑒了微內核設計體系的優點,為內核引入模塊化機制
-
內核組成部分:
-
kernel: 內核核心,一般為bzImage,通常在/boot目錄下,名稱為vmlinuz-VERSION-RELEASE;
-
kernel object: 內核對象,一般放置于/lib/modules/VERSION-RELEASE/
-
cat config-2.6.32-642.el6.x86_64內核模塊與內核核心版本一定要嚴格匹配;
[ ]: N,不設計成內核模塊;
[M]: M,Module;編譯為內核模塊
[*]: Y,編譯進內核核心
-
cat config-2.6.32-642.el6.x86_64內核模塊與內核核心版本一定要嚴格匹配;
-
ramdisk:輔助性文件,并非必須,者取決于內核是否能直接驅動rootfs所在的設備;
ranmdisk:是一個簡裝版的根文件系統;如果不需要進行根文件系統切換的話ramdisk也可使用;但是只能臨時保存;-
借助ramdisk能夠加載的內容:
- 目標設備驅動,如;SCSI設備的驅動;
- 邏輯設備驅動,如LVM設備的驅動;
- 文件系統,如xfs文件系統;
-
借助ramdisk能夠加載的內容:
-
-
內核信息獲取
uname命令:
uname – print system information
uname [OPTION]…-
-n: 顯示節點名稱,主機名;
-r: 顯示VERSION-RELEASE;
-a:顯示所有信息
-v:顯示版本號,編譯版本;
文件:/boot/vmlinuz-VERSION-RELEASE
-
-n: 顯示節點名稱,主機名;
-
模塊信息獲取
-
lsmod命令:
顯示由核心已經裝載的內核模塊
顯示的內容來自于: /proc/modules文件- 顯示模塊名稱
- 顯示模塊大小
- 模塊被引用次數
- 被什么模塊所引用
-
modinfo命令:
顯示模塊文件的詳細描述信息;
讀取/lib/modules文件;
不指明顯示當前已安裝的內核中的模塊信息;
modinfo [ -k kernel ] [ modulename|filename… ]-
-n: 只顯示模塊文件路徑
-p: 顯示模塊參數
-a: author
-d: description
-l: license
-F field: 僅顯示指定字段的信息
-
-n: 只顯示模塊文件路徑
-
lsmod命令:
-
內核模塊管理
-
modprobe命令:動態裝載或卸載內核模塊
- modprobe [ -C config-file ] [ modulename ] [ moduleparame-ters… ]
-
配置文件:
- -C:指明配置文件
- 默認是此文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf
- modprobe [ -r ] modulename…
-
depmod命令:
內核模塊依賴關系文件及系統信息映射文件的生成工具 -
裝載或卸載內核模塊:
-
insmod命令:指定模塊文件,不自動解決依賴模塊
insmod [ filename ] [ module options… ]
filename:模塊文件的文件路徑insmod modinfo –n exportfs
lnsmod modinfo –n xfs -
rmmod命令:卸載模塊
rmmod [ module_name ]rmmod xfs
rmmod exportfsinsmod、rmmod組合使用
-
insmod命令:指定模塊文件,不自動解決依賴模塊
-
-
編譯內核
-
前提:
- 準備好開發環境
- 獲取目標主機上硬件設備的相關信息
- 獲取目標主機系統功能的相關信息,例如:需要啟用相應的文件系統
- 獲取內核源代碼包,www.kernel.org
-
開發環境準備
-
包組(CentOS 6):
開發庫:Server Platform Development
開發工具:Development Tools -
目標主機硬件設備相關信息:
CPU:
#cat /proc/cpuinfo
#x86info -a
#lscpu
-
包組(CentOS 6):
-
硬件設備
-
PCI設備:
-
lspci
-v
-vv -
lsusb
-v
-vv - lsblk 塊設備
-
lspci
-
了解全部硬件設備信息
hal-device:CentOS6
-
PCI設備:
-
內核編譯安裝系統
-
安裝開發包組
下載源碼文件
.config:準備文本配置文件
make menuconfig:配置內核選項
make [-j #]
make modules_install:安裝模塊
make install :安裝內核相關文件-
安裝bzImage為/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
編輯grub的配置文件
-
安裝bzImage為/boot/vmlinuz-VERSION-RELEASE
編譯安裝內核示例:
tar xf linux-3.10.67.tar.xz -C /usr/src
cd /usr/src
ln -sv linux-3.10.67 linux
cd /usr/src/linux
cp /boot/config-$(uname -r) ./.config
make help
make menuconfig
make -j 2
make modules_install
make install
reboot -
安裝開發包組
-
前提:
-
編譯內核
-
配置內核選項
-
支持“更新”模式進行配置: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“
-
-
編譯
全編譯: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 ARCH=arch_name help
-
在已經執行過編譯操作的內核源碼樹做重新編譯需要事先清理操作:
make clean:清理大多數編譯生成的文件,但會保留config文件等
make mrproper: 清理所有編譯生成的文件、config及某些備份文件
make distclean:mrproper、patches以及編輯器備份文件 -
卸載內核
-
刪除/lib/modules/目錄下不需要的內核庫文件
刪除/usr/src/linux/目錄下不需要的內核源碼
刪除/boot目錄下啟動的內核和內核映像文件
更改grub的配置文件,刪除不需要的內核啟動列表
-
刪除/lib/modules/目錄下不需要的內核庫文件
-
原創文章,作者:s,如若轉載,請注明出處:http://www.www58058.com/75506