Linux組成
Linux: kernel+rootfs
kernel: 進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
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
CentOS 6,7: /boot/initramfs- VERSION -release.img
模塊文件:/lib/modules/ VERSION -release
CentOS6 啟動流程
1.加載BIOS 的硬件信息,獲取第一個啟動設備
2.讀取第一個啟動設備MBR 的引導加載程序(grub) 的啟動信息
3.加載核心操作系統的核心信息,核心開始解壓縮,并嘗試驅動所有的硬件設備
4.核心執行init 程序,并獲取默認的運行信息
5.init 程序執行/etc/rc.d/rc.sysinit 文件
6.啟動核心的外掛模塊
7.init 執行運行的各個批處理文件(scripts)
8.init 執行/etc/rc.d/rc.local
9.執行/bin/login 程序,等待用戶登錄
10. 登錄之后開始以Shell
POST:Power-On-Self-Test ,加電自檢,是BIOS 功能的一個主要部分 。負責完成對CPU、主板、內存、硬盤系統、顯示子系統、串并行接口、鍵盤、CD-ROM 光驅等硬件情況的檢測 。
ROM:BIOS,Basic Input and Output System ,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啟動自舉程序等。
RAM:CMOS 互補金屬氧化物半導體,保存各項參數的設定按次序查找引導設備,第一個有引導程序的設備為本次啟動設備
bootloader: 引導加載器,引導程序
windows: ntloader ,僅是啟動OS
Linux:功能豐富,提供菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核
LILO:LInux LOader
GRUB: GRand Unified Bootloader
GRUB 0.X: GRUB Legacy,GRUB2
MBR:
446: bootloader, 64:分區表, 2: 55AA
GRUB:
primary boot loader : 1st stage ,1.5 stage
secondary boot loader:2nd stage ,分區文件
kernel:
自身初始化:
探測可識別到的所有硬件設備
加載硬件驅動程序(借助于ramdisk 加載驅動)
以只讀方式掛載根文件系統
運行用戶空間的第一個應用程序:/sbin/init
ramdisk:
內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問,并加載相應的硬件驅動
ramdisk –> ramfs 提高速度
CentOS 5: initrd
工具程序:mkinitrd
CentOS 6 ,7: initramfs
工具程序:mkinitrd, dracut
系統初始化:
POST –> BootSequence (BIOS) –>Bootloader(MBR) –> kernel(ramdisk) –> rootfs(只讀) –> init(systemd)
ramdisk 管理
ramdisk 文件的制作:
(1) mkinitrd 命令
為當前正在使用的內核重新制作ramdisk 文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2) dracut 命令
為當前正在使用的內核重新制作ramdisk 文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
系統啟動流程
init 程序的類型:
SysV: init, CentOS 5之前
配置文件:/etc/inittab
Upstart: init,CentOS 6
配置文件:/etc/inittab, /etc/init/*.conf
[root@localhost ~]# pstree init─┬─abrtd
Systemd :systemd, CentOS 7
配置文件:/usr/lib/systemd/system
/etc/systemd/system
[root@localhost ~]# pstree systemd─┬─ModemManager───2*[{ModemManager}]
/sbin/init CentOS6 之前
運行級別:為系統運行或維護等目的而設定;0-6 :7個級別
0:關機
1:單用戶模式(root自動登錄), single, 維護模式
2: 多用戶模式,啟動網絡功能,但不會啟動NFS;維護模式
3:多用戶模式,正常模式;文本界面
4:預留級別;可同3 級別
5:多用戶模式,正常模式;圖形界面
6:重啟
默認級別:3, 5
切換級別:init #
查看級別:runlevel ; who -r
[root@localhost ~]# cat /etc/inittab # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) id:5:initdefault: [root@localhost ~]# runlevel N 5
init 初始化
init讀取其初始化文件:/etc/inittab
初始運行級別(RUN LEVEL)
系統初始化腳本
對應運行級別的腳本目錄
捕獲某個關鍵字順序
定義UPS電源終端/恢復腳本
在虛擬控制臺生成getty
在運行級別5初始化X
CentOS 5的inittab
配置文件:/etc/inittab
每一行定義一種action 以及與之對應的process (過程)
id:runlevel:action:process
action:
wait: 切換至此級別運行 一次
respawn :此process 終止,就重新啟動之
initdefault :設定默認運行級別;process 省略
sysinit :設定系統初始化方式,此處一般為指定
/etc/rc.d/rc.sysinit
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1…
l6:6:wait:/etc/rc.d/rc 6
CentOS 6 /etc/inittab 和相關文件
/etc/inittab
設置系統默認的運行級別
id:3:initdefault:
示例:
破解CentOS5 和6 的root 口令
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf
啟動流程
/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
done
for srv in /etc/rc.d/rcN.d/S*; do
$srv start
done
chkconfig 命令
chkconfig 命令
查看服務在所有級別的啟動或關閉設定情形:
添加:
SysV 的服務腳本放置于/etc/rc.d/init.d (/etc/init.d)
chkconfig –add name
#!/bin/bash
#LLLL 表示初始在哪個級別下啟動,– 表示都不啟動
# chkconfig: LLLL nn nn
刪除:
chkconfig –del name
修改指定的鏈接類型
chkconfig [–level levels] name <on|off|reset>
–level LLLL: 指定要設置的級別;省略時表示2345
ntsysv命令
[root@localhost ~]# ntsysv
將*號換為空格,單擊tab鍵,選擇ok 相當于關閉該服務
[root@localhost ~]# ls /etc/rc.d/rc5.d K01smartd K69rpcsvcgssd K92pppoe-server S13cpuspeed S26udev-post K02oddjobd K73winbind K95firstboot S13irqbalance S28autofs K05wdaemon K74ntpd K95rdma S13rpcbind S50bluetooth K10psacct K75ntpdate K99rngd S15mdmonitor S55sshd K10saslauthd K75quota_nld S01sysstat S22messagebus S70spice-vdagentd K15htcacheclean K76ypbind S02lvm2-monitor S24nfslock S80postfix K15httpd K84NetworkManager S08ip6tables S24rpcgssd S82abrt-ccpp K50dnsmasq K84wpa_supplicant S08iptables S25blk-availability S82abrtd K50kdump K87restorecond S10network S25cups S90crond K50vsftpd K88sssd S11auditd S25netfs S95atd K60nfs K89netconsole S11portreserve S26acpid S99certmonger K61nfs-rdma K89rdisc S12rsyslog S26haldaemon S99local [root@localhost ~]# chkconfig --list httpd查看httpd服務在所有級別的啟動或關閉設定情形 httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@localhost ~]# chkconfig --level 5 httpd on 指定級別 [root@localhost ~]# chkconfig --list httpd httpd 0:off 1:off 2:off 3:off 4:off 5:on 6:off [root@localhost ~]# ls /etc/rc.d/rc5.d K01smartd K73winbind K95firstboot S13irqbalance S28autofs K02oddjobd K74ntpd K95rdma S13rpcbind S50bluetooth K05wdaemon K75ntpdate K99rngd S15mdmonitor S55sshd K10psacct K75quota_nld S01sysstat S22messagebus S70spice-vdagentd K10saslauthd K76ypbind S02lvm2-monitor S24nfslock S80postfix K15htcacheclean K84NetworkManager S08ip6tables S24rpcgssd S82abrt-ccpp K50dnsmasq K84wpa_supplicant S08iptables S25blk-availability S82abrtd K50kdump K87restorecond S10network S25cups S85httpd K50vsftpd K88sssd S11auditd S25netfs S90crond K60nfs K89netconsole S11portreserve S26acpid S95atd K61nfs-rdma K89rdisc S12rsyslog S26haldaemon S99certmonger K69rpcsvcgssd K92pppoe-server S13cpuspeed S26udev-post S99local
xinetd管理的服務
service命令:手動管理服務
service 服務 start|stop|restart
service –status-all
[root@localhost ~]# service atd start Starting atd: [ OK ] [root@localhost ~]# service atd stop Stopping atd: [ OK ] [root@localhost ~]# service --status-all 列出當前服務的狀態 abrt-ccpp hook is installed abrtd (pid 2031) is running... abrt-dump-oops is stopped …… wdaemon is stopped winbindd is stopped wpa_supplicant is stopped ypbind is stopped
瞬態(Transient)服務被xinetd 進程所管理
進入的請求首先被xinetd 代理
配置文件:/etc/xinetd.conf 、/etc/xinetd.d/<service>
與libwrap.so 文件鏈接
用chkconfig 控制的服務:
chkconfig tftp on
啟動流程
注意:正常級別下,最后啟動一個服務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 tty1
2: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.97: grub legacy
grub 2.x: grub2
grub legacy:
stage1: mbr
stage1_5: mbr之后的扇區,讓stage1中的bootloader能識別stage2 所在的分區上的文件系統
stage2 :磁盤分區(/boot/grub/)
實驗: [root@localhost ~]# cd /boot/grub/ [root@localhost grub]# ls device.map grub.conf minix_stage1_5 stage2 e2fs_stage1_5 iso9660_stage1_5 reiserfs_stage1_5 ufs2_stage1_5 fat_stage1_5 jfs_stage1_5 splash.xpm.gz vstafs_stage1_5 ffs_stage1_5 menu.lst stage1 xfs_stage1_5 [root@localhost grub]# mv * /app/ (所有移動到/app下) [root@localhost grub]# ls [root@localhost grub]# mv /app/grub.conf . (將/app中的grub.conf移動到當前目錄下) [root@localhost grub]# ls grub.conf [root@localhost grub]# ls /app device.map ffs_stage1_5 menu.lst splash.xpm.gz ufs2_stage1_5 e2fs_stage1_5 iso9660_stage1_5 minix_stage1_5 stage1 vstafs_stage1_5 fat_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2 xfs_stage1_5 [root@localhost grub]# reboot Broadcast message from root@localhost.localdomain (/dev/pts/1) at 4:21 ... The system is going down for reboot NOW! [root@localhost grub]# mv /app/* . (將/app中的文件移動到當前目錄下) [root@localhost grub]# ls device.map grub.conf minix_stage1_5 stage2 e2fs_stage1_5 iso9660_stage1_5 reiserfs_stage1_5 ufs2_stage1_5 fat_stage1_5 jfs_stage1_5 splash.xpm.gz vstafs_stage1_5 ffs_stage1_5 menu.lst stage1 xfs_stage1_5
執行此操作后系統依舊可以正常啟動,除grub.conf外的文件做備份用途
此操作僅適用于裝完系統后的初始狀態,后期如果做過修復工作,此操作會導致系統無法啟動
配置文件:/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
識別硬盤設備
(hd#,#)
hd#: 磁盤編號,用數字表示;從0 開始編號
#: 分區編號,用數字表示; 從0 開始編號
(hd0,0) 第一塊硬盤,第一個分區
手動在grub 命令行接口啟動系統
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro
root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
grub legacy 配置文件
配置文件:/boot/grub/grub.conf
default=#: 設定默認啟動的菜單項;落單項(title) 編號從0 開始
timeout=# :指定菜單項等待選項選擇的時長
splashimage=(hd#,#)/PATH/XPM_FILE :菜單背景圖片文件路徑
hiddenmenu :隱藏菜單
password [–md5] STRING: 啟動菜單編輯認證
title TITLE :定義菜單項“標題”, 可出現多次
root (hd#,#) :查找stage2 及kernel 文件所在設備分區;為grub 的根
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] :啟動的內核
initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs 文件
password [–md5|–encrypted ] STRING: 啟動選定的內核或操作系統時進行認證
[root@localhost ~]# vim /boot/grub/grub.conf #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-696.el6.x86_64) root (hd0,0) kernel /vmlinuz ro root=UUID=1fd1710f-ff1a-4eba-94f8-c57ecc05d6c6 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet crashkernel=auto initrd /initramfs-2.6.32-696.el6.x86_64.img
grub 加密
生成grub 口令
grub-md5-crypt
[root@localhost ~]# grub-md5-crypt $1$WhmGJ/$p4/QlAG/c4gDe5xHG5IAF1
grub-crypt (推薦使用)sha512算法
[root@localhost ~]# grub-crypt $6$5ZSxXQQ0572blxhO$lu2nUcZzGA4rqywNzqUMaBQzl4CFy9hpdwf2PcAnOHpyNotdZv3j.ysvnkP2f7x2AIC.wFzPzmcu8M75gTkyi/
破解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到相關文件到DIR/boot目錄下
grub-install –root-directory=DIR /dev/DISK
(2) grub
grub> root (hd#,#)
grub> setup (hd#)
救援環境
在根文件系統無法使用時需要,如/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 ,則在救援模式下執行:
chroot /mnt/sysimage
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
exit 退出chroot 模式
掛載存放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.rpm | cpio -idv ./etc/inittab
cp etc/inittab /mnt/sysimage/etc
注意此命令執行時不能將文件直接恢復至/etc 目錄,只能提取到當前目錄下,且恢復的文件名稱所在路徑要寫完整的路徑。提取文件成功后,將其復制到根分區所在的/mnt/sysimage 目錄下相應位置即可
關于以上所講grub的一些詳細操作請點擊:http://www.www58058.com/?p=75379&preview=true
自制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.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等
原創文章,作者:Linux.rookie,如若轉載,請注明出處:http://www.www58058.com/75717