因6和7倆個系列的啓動流程有區別,因此我把他們分開來寫linux
linux可看做是內核和根文件系統組成咱們把內核單獨拿出來總結一下shell
首先總結一下整體的流程,接下來展開來敘述:POST加電自檢 -- MBR(0扇區前446個字節爲GRUB第1階段) -- (在1扇區後存放GRUB第1.5階段)GRUB(第2階段)-- 加載內核(vmlinuz,initramfs)-- 啓動第一個進程(init ;/etc/ini/*.conf init 程序的配置文件)-- 讀取/etc/inittab文件來決定進入的系統級別 -- 執行/etc/rc.d/rc.sysinit腳原本初始化系統 -- 使用/etc/rc.d/rc腳原本根據當前所在的系統級別來讀取對應/etc/rc#.d/下的腳本 -- K開頭的腳本不啓動,S開頭的腳本啓動,啓動順序按後邊跟的數子大小來決定 -- 最後執行的腳本/etc/rc.d/rc.local -- 啓動/bin/login進程來啓動登陸程序 --- OK!apache
Power-On-Self-Test:加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統等硬件狀況的檢測。c#
BIOS:Basic Input and Output System,保存着有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啓動自舉程序等。安全
CMOS:保存主板的設置時間等參數,依靠主板上的CMOS鈕釦電池。bash
引導加載器,Windows使用的bootLoader是ntloader,只能夠引導Windows系統;Linux使用的bootloader早期有LILO(LInux LOader),如今6系列用的GRUB0.97版,7系列使用的是GRUB2。服務器
grub總共分爲三個階段:cookie
功用:網絡
grub的配置文件(/boot/grub/grub.cfg)框架
default=0 #默認title timeout=5 #grub菜單選擇超時時間 splashimage=(hd0,0)/grub/splash.xpm.gz #grub菜單背景圖片 hiddenmenu #隱藏grub選擇菜單 password --md5 | ----encrypted 口令 #加密方式和口令,爲grub加密防止進如單用戶模式修改密碼,口令使用下面的命令生成
# grub-md5-crypt 生成MD5的密碼 # grub-crypt 生成sha12的密碼
title Red Hat Enterprise Linux 6 (2.6.32-642.el6.x86_64) root (hd0,0) #指定的是/boot所在磁盤的分區"hd0,0"表示第一塊磁盤的第一個分區 kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=e1d36be7-5027-4847-9d80-135ac9fb798e rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet #向內核傳遞的cmdline參數 initrd /initramfs-2.6.32-642.el6.x86_64.img #指定initramfs文件的所在路徑,注意:(這裏的"/"相對的是/boot分區)
若是grub損壞咱們能夠用下面命令修復
grub-install --root-directory=DIR /dev/DISK --root-directory=DIR:根目錄
若是grub配置丟失了怎麼辦:
在開機的時候會進入grub的命令行接口,可是沒法找到內核和ramdisk,因此咱們手動指定參數和路徑就能夠啓動系統了。
help: 獲取幫助列表 help KEYWORD: 詳細幫助信息 find (hd#,#)/PATH/TO/SOMEFILE: root (hd#,#) kernel /PATH/TO/KERNEL_FILE: 設定本次啓動時用到的內核文件;額外還可添加許多內核支持使用的cmdline參數 initrd /PATH/TO/INITRAMFS_FILE: 設定爲選定的內核提供額外文件的ramdisk boot: 引導啓動選定的內核
分別指定root(指的是/boot分區),kernel指定內核,initrd指定ramdisk文件,而後boot就能夠啓動系統了,進入系統後從新編輯/boot/grub.cfg文件來修復問題
在grub第2階段的時候只能識別到/boot分區,這個時候內核開始初始化,探測完硬件後開始須要去找根,可是這時尚未驅動程序,因此這個時候須要藉助ramdisk來驅動硬件。在CentOS5系列中文件名爲/boot/inird,6和7已經改爲initramfs。
initramfs中也提供了一個根文件系統,其中包括了硬件必須的驅動,到了這步內核藉助這個虛根文件系統來掛載真正的根文件系統。
initramfs文件是在安裝系統時按當前的環境來生成的。
若是這個文件損壞了咱們也可使用工具來修復:
# mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 爲當前正在使用的內核從新制做ramdisk文件
init程序啓動系統的第一個進程init,它負責建立系統啓動後的全部服務進程
init程序的類型:
初始化的相關文件:
id:3:initdefault:
start on control-alt-delete exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
init #:切換至#級別
runlevel:查看當前的運行級別和上一運行級別
示例:進入單用戶模式
1)在啓動過程當中看到Booting 。。。的倒計時字樣按下esc鍵
2)按a鍵修改啓動參數,在quiet後加1(單用戶模式)
3)按回車鍵啓動,進入單用戶模式,能夠直接修改root的密碼,或者能夠修改一些其餘服務配置文件錯誤致使的系統沒法進入正常模式的操做。
由/etc/rc.d/rc腳本控制服務腳本啓動仍是非啓動
for i in /etc/rc$runlevel.d/S* ; do # Check if the subsystem is already up. subsys=${i#/etc/rc$runlevel.d/S??} [ -f /var/lock/subsys/$subsys ] && continue [ -f /var/lock/subsys/$subsys.init ] && continue check_runlevel "$i" || continue # If we're in confirmation mode, get user confirmation if [ "$do_confirm" = "yes" ]; then confirm $subsys rc=$? if [ "$rc" = "1" ]; then continue elif [ "$rc" = "2" ]; then do_confirm="no" fi fi update_boot_stage "$subsys" # Bring the subsystem up. [ -n "$UPSTART" ] && initctl emit --quiet starting JOB=$subsys if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then export LC_ALL=C exec $i start fi $i start [ -n "$UPSTART" ] && initctl emit --quiet started JOB=$subsys done
rc腳本讀取/etc/rc.d/rc#.d/下的全部腳本,以K開頭的服務腳本不啓動,以S開頭的服務腳本啓動。
/etc/rc.d/rc#.d/下的全部腳本都是/etc/rc.d/init.d/下的腳本的符號鏈接,連接名由chkconfig管理。
/etc/rc.d/rc.local:在全部啓動腳本執行完成後執行此腳本,能夠把不便或不需寫爲服務腳本放置於/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置於/etc/rc.d/rc.local文件中。
全部服務啓動完成後啓動登陸程序(/bin/login)。
CentOS 6 init程序爲: upstart, 其配置文件:/etc/inittab, /etc/init/*.conf,配置文件的語法 遵循 upstart配置文件語法格式,和CentOS5不一樣。
chkconfig
service 服務名 { start | stop | restart }
ntsysv:字符界面工具,用來設置開啓自啓的服務
CentOS7與6版本的不一樣之處:
主要介紹一下grub2和systemd吧,其餘的啓動流程幾乎同樣
一、/etc/default/grub :grub配置文件模板
GRUB_TIMEOUT=5 #grub菜單選項超時時間 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved #grub菜單默認選擇的title GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="rhgb quiet" #向內核傳遞的cmdline參數 GRUB_DISABLE_RECOVERY="true"
二、/boot/grub2/grub.cfg :grub配置文件,建議使用如下命令生成
# grub2-mkconfig -o /boot/grub2/grub.cfg
三、在救援模式下修復grub2
# chroot /mnt/sysimage # grub2-install /dev/sda # grub2-mkconfig -o /boot/grub2/grub.cfg
四、在grub命令行啓動系統(grub2配置文件損壞的狀況下)
> insmod xfs > set root=(hd0,1) > linux16 /vmlinux-... root=/dev/sda2 selinux=0 > initrd16 /initramfs-...
系統啓動和服務器守護進程管理器,負責在系統啓動或運行時,激活系統資源,服務器進程和其它進程。
Systemd新特性:
表示不一樣類型的systemd對象
/usr/lib/systemd/system:每一個服務最主要的啓動腳本設置,相似於6系列的/etc/init.d/目錄的功能
/run/systemd/system:系統執行過程當中所產生的服務腳本
/etc/systemd/system:管理員創建的執行腳本,功能相似於6系列中/etc/rc.d/rcN.d/Sxx目錄的功能
類型:
service unit文件格式
[Unit] #定義與Unit類型無關的通用選項 Description=The Apache HTTP Server #描述信息 After=network.target remote-fs.target nss-lookup.target #依賴服務,定義unit的啓動次序,表示當前unit應該晚於哪些unit啓動,其功能與Before相反 Documentation=man:httpd(8) Documentation=man:apachectl(8) #Requires:依賴到的其它units,強依賴,被依賴的units沒法激活時,當前unit也沒法激活 #Wants:依賴到的其它units,弱依賴 #Conflicts:定義units間的衝突關係 [Service] #與特定類型相關的專用選項;此處爲Service類型 Type=notify #定義影響ExecStart及相關參數的功能的unit進程啓動類型 EnvironmentFile=/etc/sysconfig/httpd #環境配置文件 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND #指明啓動unit要運行命令或腳本的絕對路徑 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful #指明重載unit要運行命令或腳本的絕對路徑 ExecStop=/bin/kill -WINCH ${MAINPID} #指明中止unit要運行的命令或腳本 KillSignal=SIGCONT PrivateTmp=true #simple:默認值,這個daemon主要由ExecStart接的指令串來啓動,啓動後常駐於內存中 #forking:由ExecStart啓動的程序透過spawns延伸出其餘子程序來做爲此daemon的主要服務。原生父程序在啓動結束後就會終止 #oneshot:與simple相似,不過這個程序在工做完畢後就結束了,不會常駐在內存中 #dbus:與simple相似,但這個daemon必需要在取得一個D-Bus的名稱後,纔會繼續運做.所以一般也要同時設定BusNname= 才行 #notify:在啓動完成後會發送一個通知消息。還須要配合 NotifyAccess 來讓 Systemd 接收消息 #idle:與simple相似,要執行這個daemon必需要全部的工做都順利執行完畢後纔會執行。這類的daemon一般是開機到最後才執行便可的服務 [Install] #定義由「systemctl enable」以及"systemctl disable「命令在實現服務啓用或禁用時用到的一些選項 WantedBy=multi-user.target #被哪些units所依賴,弱依賴 #Alias:別名,可以使用systemctl command Alias.service #RequiredBy:被哪些units所依賴,強依賴 #Also:安裝本服務的時候還要安裝別的相關服務
新建立unit文件後或者修改了unit文件須要使用如下命令來重載
# systemctl daemon-reload
用法:systemctl 子命令 name.service
子命令:
start | stop | restart |status | reload :啓動 | 中止 | 重啓 | 狀態 | 重讀配置文件
enable :設置開機自動啓動
disable :設置開機不自動啓動
try-restart:服務在啓動狀態纔會執行重啓,服務在中止狀態不會重啓
reload-or-restart :從新加載配置文件再啓動服務
reload-or-try-restart :重載或服務在啓動狀態纔會執行重啓
mask:禁止服務啓動
unmask:取消禁止服務啓動
is-active:查看服務是否在激活狀態
is-enabled :查看指定服務是否開機自啓
list-dependencies :查看服務的依賴關係
kill :殺掉指定服務的進程
查看類子命令:
list-units :顯示全部單元(unit)的狀態
list-unit-files -t service -a:查看全部服務的開機自啓狀態
--failed -t service:查看啓動失敗的服務
查看指定服務在哪些運行級別下啓用和禁用
ls /etc/systemd/system/*.wants/name.service
poweroff.target ==> 0 rescue.target ==> 1 multi-user.target ==> 2,3,4 graphical.target ==> 5 reboot.target ==> 6
切換運行級別:
# systemctl isolate multi-user.target
若是須要在啓動中進入rescue模式,須要在linux16後加如下cmdline命令
systemd.unit=rescue.target
破解root口令
方法一: 在grub菜單按e進入編輯模式 在linux16後加rd.break Ctrl + x啓動 # mount -o rw,remount /sysroot # chroot /sysroot # passwd # touch /.autorelabel 防止selinux打標籤失敗 # exit # reboot
方法二: 在linux16後加init=/sysroot/bin/sh # chroot /sysroot # passwd touch /.autorelabel
systemctl
相關子命令:
get-default :查看當前默認啓動模式
set-default :設置默認啓動模式
rescue :切換緊急救援模式
emergency:切換至emergency模式,比救援模式更底層一級
halt | poweroff :關機
reboot :重啓
suspend :掛起
hibernate :休眠
hybrid-sleep :休眠並掛起
進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
內核的設計流派分爲單內核和微內核:linux內核爲單內核流派,把全部的功能都集成於同一個程序;Windows,Solaris系統的內核是微內核設計,每種功能都使用一個單獨的子系統來實現,在一箇中心框架下協同工做,從理論上來講微內核的設計更爲先進。
linux內核的特色:
linux的內核組成:
查看內核當前運行的cmdline參數:
[root@rhel6 ~]# cat /proc/cmdline ro root=UUID=e1d36be7-5027-4847-9d80-135ac9fb798e 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
內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt,須要安裝如下包。
yum install kernel-doc-2.6.32-696.el6.noarch
一、準備:
(1) 準備好開發環境(yum groupinstall -y "Development Tools" ; yum install -y ncurses-devel elfutils-libelf-devel openssl-devel bc)
(2) 獲取目標主機上硬件設備的相關信息
(3) 獲取目標主機系統功能的相關信息
(4) 獲取內核源代碼包(www.kernel.org)
二、解壓內核包,進入linux-xxx目錄;調試配置文件(.config)
(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 #:全編譯,若是咱們只須要編譯單個模塊,那麼咱們能夠cd到子目錄或者make /path/MODULS.ko能夠實現只對單個模塊進行編譯
-j:支持並行編譯,#爲物理CPU核心數
四、安裝模塊
make modules_install
五、安裝內核文件,生成initramfs文件而且自動配置grub菜單
make install
六、reboot啓動選擇新內核進入系統就完成了
七、若是編譯失敗須要從新編譯咱們可使用如下命令來清理
# make clean:清理大多數編譯生成的文件,但會保留config文件等 # make mrproper: 清理全部編譯生成的文件、config及某些備份文件 # make distclean:mrproper、patches以及編輯器備份文件
八、若是新的內核有bug須要卸載內核
內核把本身內部狀態信息及統計信息,以及可配置參數經過proc僞文件系統加以輸出
常見重要參數
/proc/sys/net/ipv4/icmp_echo_ignore_all /proc/sys/net/ipv4/ip_forward /proc/sys/net/ipv4/ip_default_ttl /proc/sys/vm/drop_caches /proc/sys/net/ipv4/tcp_syn_retries /proc/sys/net/ipv4/tcp_fin_timeout /proc/sys/net/ipv4/tcp_syncookies /proc/sys/net/ipv4/tcp_max_tw_buckets /proc/sys/net/ipv4/tcp_max_syn_backlog /proc/sys/net/ipv4/ip_local_port_range
sysfs:爲用戶使用的僞文件系統,輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的設定信息;有些參數是能夠修改的,用於調整硬件工做特性。
sysctl:修改內核參數的工具
uname
lsmod:顯示已經裝載的模塊
modinfo:顯示模塊的詳細信息
modprobe:裝載模塊
depmod:內核模塊依賴關係文件及系統信息映射文件的生成工具
insmod:指定裝載模塊文件,但不自動解決依賴模塊
rmmod:卸載模塊
time cmd 檢測命令執行花的時間
lscpu:查看CPU信息
lspci:查看pci相關信息
lsusb:查看usb相關信息
lsblk:查看塊設備相關信息
hal-device:查看全部硬件信息(CentOS6.x)
爲了對linux系統有更多的認識,咱們能夠基於CentOS的環境本身來在新硬盤上安裝一個mini版的linux,只須要提供最基礎的程序來運行。
1)準備工做
#/bin/bash green_OK() { echo -e "[ \033[1;32mOK\033[0m ]"; } red_FAILED() { echo -e "[ \033[1;31mFAILED\033[0m ]"; } Screen=`stty -F /dev/tty size` Columus=${Screen#* } Spa_Col=$[Columus-16] success() { local i string="$1" Rt_Spa=$[$Spa_Col-${#string}] echo -n "$string" for i in `seq $Rt_Spa` ;do echo -n "." sleep 0.005 done green_OK } failed() { local i string="$1" Rt_Spa=$[$Spa_Col-${#string}] echo -n "$string" for i in `seq $Rt_Spa` ;do echo -n " " done red_FAILED } Ddir="/mnt/sysroot" [ ! -d "$Ddir" ] && mkdir "$Ddir" cpbin() { cmddir=`echo "$Cmd_path" |grep -o ".*/\b"` [ ! -d "${Ddir}${cmddir}" ] && mkdir -p "${Ddir}${cmddir}" cp -n "$Cmd_path" "${Ddir}${cmddir}" } libcp() { echo "$Lib_path" |while read line ;do libdir=`echo "$line" |grep -o ".*/\b"` [ ! -d "${Ddir}${libdir}" ] && mkdir -p "${Ddir}${libdir}" cp -n "$line" "${Ddir}${libdir}" 2>/dev/null done } while read -p "Input a cmd. (quit): " CMD ;do if [ "$CMD" == 'quit' ] ;then echo "Think you! Bye bye."; break; fi if ! which "$CMD" &>/dev/null ;then echo "not find $CMD or is a shell builtin, please input again!" failed "copy $CMD failed." continue fi Cmd_path=`which $CMD |grep -o "/.*"` Lib_path=`ldd $Cmd_path |sed -nr 's#.*[[:space:]]+(/.*) .*#\1#p'` cpbin libcp success "copy $CMD Complete." done
2)分區格式化新硬盤而且掛載
[root@rhel6 ~]# mkfs.ext4 /dev/sdb1 [root@rhel6 ~]# mkfs.ext4 /dev/sdb2 [root@rhel6 ~]# mkdir /mnt/sysroot # [root@rhel6 ~]# mount /dev/sdb2 /mnt/sysroot/ [root@rhel6 ~]# mkdir /mnt/sysroot/boot [root@rhel6 ~]# mount /dev/sdb1 /mnt/sysroot/boot
3)安裝grub,提供內核和ramdisk文件,而且編輯配置文件
[root@rhel6 ~]# grub-install --root-directory=/mnt/sysroot/ /dev/sdb [root@rhel6 ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/sysroot/boot/initramfs.img [root@rhel6 ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/sysroot/boot/vmlinuz [root@rhel6 ~]# cat >/mnt/sysroot/boot/grub/grub.conf <<EOF default=0 timeout=3 title mini_linux root(hd0,0) kernel /vmlinuz ro root=UUID=ce79412f-72b8-4313-8a55-5fb734ffacfe selinux=0 init=/bin/bash #這裏是/dev/sdb2(mini_linux的根)的UUID
initrd /initramfs.img
4)接下來咱們就能夠把經常使用的cmd和對應依賴的庫文件複製到咱們的/mnt/sysroot/下了
[root@rhel6 ~]# mkdir -pv /mnt/sysroot/{bin,dev,etc,home,lib,lib64,media,mnt,opt,proc,root,sbin,sys,usr/{bin,etc,include,lib,lib64,libexec,local,sbin,share,src,tmp},var,tmp} [root@rhel6 ~]# ./copycmd.sh Input a cmd. (quit): bash copy bash Complete................................................................[ OK ] Input a cmd. (quit): ifconfig copy ifconfig Complete............................................................[ OK ] Input a cmd. (quit): insmod copy insmod Complete..............................................................[ OK ] Input a cmd. (quit): ping copy ping Complete................................................................[ OK ] Input a cmd. (quit): mount copy mount Complete...............................................................[ OK ] Input a cmd. (quit): ls copy ls Complete..................................................................[ OK ] Input a cmd. (quit): cat copy cat Complete.................................................................[ OK ] Input a cmd. (quit): df copy df Complete..................................................................[ OK ] Input a cmd. (quit): lsblk copy lsblk Complete...............................................................[ OK ] Input a cmd. (quit): blkid copy blkid Complete...............................................................[ OK ] Input a cmd. (quit): vi copy vi Complete..................................................................[ OK ] Input a cmd. (quit): sed copy sed Complete.................................................................[ OK ] Input a cmd. (quit): grep copy grep Complete................................................................[ OK ] Input a cmd. (quit): awk copy awk Complete.................................................................[ OK ] Input a cmd. (quit): quit Think you! Bye bye.
5)接下來咱們去提供網卡驅動模塊
[root@rhel6 ~]# mkdir /mnt/sysroot/lib/modules [root@rhel6 ~]# cp /lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules
6)如今一切都完成了,咱們接下來關閉虛擬機,在關閉前執行幾回sync命令來保證數據同步到磁盤上,而後將咱們的mini_linux虛擬磁盤掛到新虛擬機上,調BIOS讓其成爲第一啓動項,啓動後將e1000.ko模塊裝載後就可使用網絡了
insmod /lib/modules/e1000.ko ifconfig eth0 192.168.222.222 up
我的學習筆記 2018.5.14 18:19