在這篇隨筆里面將對Linux系統的啟動進行一個詳細的解釋!我的實驗機器是CentOS6.4,當然對於現有的Linux發行版本,其系統的啟動基本上都是一樣的!
首先我們來看下Linux系統啟動的幾個步驟:
對於Linux系統來說,系統的整個啟動過程就是分為這6個部分。下面將對每一個部分的啟動時所完成的功能進行詳細解釋。
一、BIOS
對於BIOS我想大家應該都不陌生,只要是PC機,當電腦啟動時第一個運行的就是BIOS。BIOS(Basic Input Output System)我們稱之為基本輸入輸出系統,一般都是保存在主板上的BIOS芯片中。
計算機啟動時第一個運行的就是BIOS,BIOS主要是負責對硬件進行檢查,比如檢查接在主板上的各種PCI硬件設備,當電腦的硬件檢測不通過時,電腦就會發出滴滴的聲音,這時我們就要對硬件進行檢查了。如果BIOS對硬件檢測通過的話,它就繼續進行下一個操作,也就是查找可啟動設備。
對於可啟動設備在BIOS設置中進行定義,常見的可啟動設備包括USB、CDROM、HD。
二、MBR
MBR在之前的硬盤分區時有講過其功能,MBR(Master Boot Recorder),我們稱之為主引導記錄。BIOS是怎樣尋找可啟動設備的呢?我們知道在分區時,硬盤的第一塊扇區512個字節就是存放的MBR,如果該設備是可啟動設備,那么該扇區的最后兩個字節肯定是55/AA,所以此時在尋找可啟動設備時,如果發現該設備的最后兩個字節是這個,那么該設備就是可啟動設備。
BIOS在找到可啟動設備以后就會執行其引導代碼,因為MBR占據了第一塊扇區的512字節,分區表占用了 16*4 =64字節,再加上最后兩個標志字節,所以MBR的引導代碼就是MBR的前446個字節,當然這446個字節太小了,並不能完成整個操作系統的引導程序,所以這446個字節里面可能存放的就是啟動引導程序的一些代碼。
三、GRUB
GRUB是GRand Unified Bootloader的縮寫,它是一個多重操作系統啟動管理器。
GRUB是現在Linux使用的主流的引導程序,當然現在的GRUB不僅僅是能引導Linux系統,對於Winodows、Mac OS、BSD等幾乎所有系統它都能引導。
GRUB的一些相關配置文件都是保存在了 /boot/grub 這個目錄下。我們可以進去看下其里面的內容
[root@xiaoluo ~]# cd /boot/grub/ [root@xiaoluo grub]# ls -l total 280
-rw-r--r--. 1 root root 63 May 14 01:30 device.map -rw-r--r--. 1 root root 13380 May 14 01:30 e2fs_stage1_5 -rw-r--r--. 1 root root 12620 May 14 01:30 fat_stage1_5 -rw-r--r--. 1 root root 11748 May 14 01:30 ffs_stage1_5 -rw-------. 1 root root 796 May 14 01:30 grub.conf -rw-r--r--. 1 root root 11756 May 14 01:30 iso9660_stage1_5 -rw-r--r--. 1 root root 13268 May 14 01:30 jfs_stage1_5 lrwxrwxrwx. 1 root root 11 May 14 01:30 menu.lst -> ./grub.conf -rw-r--r--. 1 root root 11956 May 14 01:30 minix_stage1_5 -rw-r--r--. 1 root root 14412 May 14 01:30 reiserfs_stage1_5 -rw-r--r--. 1 root root 1341 Nov 15 2010 splash.xpm.gz -rw-r--r--. 1 root root 512 May 14 01:30 stage1 -rw-r--r--. 1 root root 125992 May 14 01:30 stage2 -rw-r--r--. 1 root root 12024 May 14 01:30 ufs2_stage1_5 -rw-r--r--. 1 root root 11364 May 14 01:30 vstafs_stage1_5 -rw-r--r--. 1 root root 13964 May 14 01:30 xfs_stage1_5
我們看到在grub目錄下存放了許多的文件,我們大致先了解一下這些文件所代表的含義。
對於stage1文件,我們可以看到其大小為512個字節,這個文件其實就是上面所說的MBR的一個備份,如果之前的MBR出問題了,我們可以使用這個stage1來恢復過來。對於另外一些例如e2fs_stage1_5、fat_stage1_5等這些文件,這些文件是在stage1執行完才執行的。這些文件前面的單詞都是一些文件系統的名字,那么為什么要加載這么多的文件系統呢?因為當我們GRUB引導程序運行完就要去加載文件系統中的操作系統內核了(kernel),而對於不同的操作系統可能文件系統不相同,所以這里在執行完stage1以后加載這么多的文件系統就是為了去找到操作系統的內核以及驅動信息。在這些執行完以后就是執行stage2這個文件了,這個文件我們看到它有 125992 字節,整個操作系統的引導程序代碼就是在這里了。
對於GRUB,其主配置文件是存放在grub.conf這個文件里面的,我們可以看下這個文件里面的內容:
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,1) # kernel /boot/vmlinuz-version ro root=/dev/sda2 # initrd /boot/initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,1)/boot/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-358.el6.x86_64) root (hd0,1) kernel /boot/vmlinuz-2.6.32-358.el6.x86_64 ro root=UUID=6e24ec7a-2d19-466e-bacc-92750b1f4bef 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 initrd /boot/initramfs-2.6.32-358.el6.x86_64.img
我們對其每行配置文件代表的信息來分析一下。
default=0代表的是選擇第幾個配置,下面的每一個titile 代表一個操作系統的配置信息,如果有多個操作系統信息,則下面就會有多個titile,這里default=0,表示默認使用第一個操作系統的配置,也就是使用第一個title。
timeout=5,表示剛進入系統時默認等待的時間,這個我們可以修改,如果將其修改成0,則系統直接進入引導。
splashimage=(hd0,1)/boot/grub/splash.xpm.gz表示的是倒計時界面下,頁面顯示的背景圖片
hiddenmenu表示隱藏菜單
title表示每一個操作系統的配置,后面跟的CentOS (2.6.32-358.el6.x86_64)就是操作系統的名字,這個可以自己隨便取名
下面的
①root (hd0,1)
表示操作系統的 /boot 分區所在硬盤的分區,hd0,1表示第一塊硬盤的第二個分區,我們當前操作系統的/boot分區就是在這個分區下。
②kernel /boot/vmlinuz-2.6.32-358.el6.x86_64 ro root=UUID=6e24ec7a-2d19-466e-bacc-92750b1f4bef 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
這個表示的是操作系統的內核存放位置,當前的CentOS操作系統的內核就是存放着 /boot 目錄下的vmlinuz-2.6.32-358.el6.x86_64, 后面跟的是內核的參數,ro表示只讀的,每一個參數都用空格隔開
③initrd /boot/initramfs-2.6.32-358.el6.x86_64.img
Linux為什么啟動的速度那么快,是因為其操作系統的內核非常的精簡,為了讓Linux的內核保持精簡,我們就將其不常用的驅動、功能編譯為模塊,在需要的時候對其進行動態加載。所以這個initrd就是存放的是我們的那些不常用的驅動、功能所編譯成的模塊。之前的Linux版本里面使用的是initrd文件,initramfs是initrd的一個替代優化版本,比initrd更加節省空間、更加靈活。所以現在的Linux版本都是用的是initramfs。
我們如果有多個操作系統的配置信息的話,就要在下面再定義一個title,然后按照上面的格式,定義好/boot分區的目錄以及內核的目錄等
四、Kernel
MBR引導代碼就是為了啟動GRUB去加載操作系統的內核,Linux系統的內核都是存放在/boot目錄下
[root@xiaoluo boot]# ls -l vmlinuz-2.6.32-358.el6.x86_64 -rwxr-xr-x. 1 root root 4043888 Feb 22 08:56 vmlinuz-2.6.32-358.el6.x86_64
操作系統在加載內核時的時候通常還會去加載內核模塊打包文件:/boot/initramfs-2.6.32-358.el6.x86_64.img
我們在系統啟動完后通過 dmesg 命令可以查看本次啟動時操作系統的內核輸出信息,這樣可以操作系統內核出現問題時對其進行錯誤排查
[root@xiaoluo boot]# dmesg Initializing cgroup subsys cpuset Initializing cgroup subsys cpu Linux version 2.6.32-358.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Fri Feb 22 00:31:26 UTC 2013 Command line: ro root=UUID=6e24ec7a-2d19-466e-bacc-92750b1f4bef 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 KERNEL supported cpus: Intel GenuineIntel AMD AuthenticAMD Centaur CentaurHauls BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 000000000009fc00 (usable) BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved) BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved) BIOS-e820: 0000000000100000 - 00000000207f0000 (usable) BIOS-e820: 00000000207f0000 - 0000000020800000 (ACPI data) BIOS-e820: 00000000fffc0000 - 0000000100000000 (reserved) DMI 2.5 present. SMBIOS version 2.5 @ 0xFFF60 DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 e820 update range: 0000000000000000 - 0000000000001000 (usable) ==> (reserved) e820 remove range: 00000000000a0000 - 0000000000100000 (usable) last_pfn = 0x207f0 max_arch_pfn = 0x400000000 MTRR default type: uncachable MTRR variable ranges disabled: x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106 CPU MTRRs all blank - virtualized system.
***************************省略N個字***********************************************************
我們看到其輸出了非常多的信息,都是操作系統啟動時,內核的輸出信息。當然我們可以在 /var/log 目錄下發現也有一個 dmesg 文件,這個文件存放的內容和通過 dmesg 命令輸出的內容是一模一樣的
[root@xiaoluo ~]# ls -l /var/log/dmesg -rw-r--r--. 1 root root 21190 May 19 13:06 /var/log/dmesg
五、init
在操作系統加載完內核以后,這時就會運行操作系統上的第一個進程 init,我們可以通過 ps -aux | more 命令來看一下
[root@xiaoluo ~]# ps -aux | more Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 19348 1464 ? Ss 13:05 0:01 /sbin/init
我們看到操作系統運行的第一個進程就是 init 進程,這個進程在啟動以后就會一直運行,直到系統退出關機。
init進程會調用 /etc/rc.d/rc.sysinit 這個腳本對系統進行初始化,掛載文件系統,並且根據運行基本啟動相應的服務。
Linux系統的運行級別:
-0 關機 -1 單用戶模式 -2 不帶網絡的多用戶模式 -3 多用戶模式 -4 未使用 -5 X11圖形化模式 -6 重新啟動
我們通常將其設置成3或者5,運行級別3和5的唯一不同,就是是否啟動時擁有圖形界面。在生產環境下我們通常將其設置成3,直接進入到命令行終端模式
我們可以通過修改 /etc/inittab 這個文件來修改系統默認的運行級別:
[root@xiaoluo ~]# cat /etc/inittab # inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/rcS.conf # # Individual runlevels are started by /etc/init/rc.conf # # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf # # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf, # with configuration in /etc/sysconfig/init. # # For information on how to write upstart event handlers, or how # upstart works, see init(5), init(8), and initctl(8). # # Default runlevel. The runlevels used 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:
我們看到當前的運行基本默認是5,也就是擁有圖形界面。
其實在/etc目錄下還有一個init目錄,里面存放的是init的其它一些配置文件
[root@xiaoluo ~]# cd /etc/init [root@xiaoluo init]# ll total 68 -rw-r--r--. 1 root root 260 Jan 9 19:13 control-alt-delete.conf -rw-r--r--. 1 root root 130 Jun 22 2012 init-system-dbus.conf -rw-r--r--. 1 root root 316 Jan 9 19:13 kexec-disable.conf -rw-r--r--. 1 root root 409 Jan 9 19:13 plymouth-shutdown.conf -rw-r--r--. 1 root root 217 Jan 9 19:13 prefdm.conf -rw-r--r--. 1 root root 358 Jan 9 19:13 quit-plymouth.conf -rw-r--r--. 1 root root 281 Jan 9 19:13 rc.conf -rw-r--r--. 1 root root 909 Jan 9 19:13 rcS.conf -rw-r--r--. 1 root root 283 Jan 9 19:13 rcS-emergency.conf -rw-r--r--. 1 root root 580 Jan 9 19:13 rcS-sulogin.conf -rw-r--r--. 1 root root 2915 Aug 23 2010 readahead-collector.conf -rw-r--r--. 1 root root 1559 Aug 23 2010 readahead.conf -rw-r--r--. 1 root root 726 Aug 23 2010 readahead-disable-services.conf -rw-r--r--. 1 root root 1162 Jan 9 19:13 serial.conf -rw-r--r--. 1 root root 643 Jan 9 19:13 splash-manager.conf -rw-r--r--. 1 root root 329 Jan 9 19:13 start-ttys.conf -rw-r--r--. 1 root root 198 Jan 9 19:13 tty.conf
我們可以看到,這里面有許多的配置文件,我們可以根據自己的需要修改其里面的內容,這樣init進程啟動時就會去執行里面的功能。
我們通過 runlevel 命令可以查看我們當前的以及上一次的啟動級別:
[root@xiaoluo init]# runlevel N 5
N表示沒有上一個啟動級別,5表示當前的啟動級別
通過init命令我們可以修改當前的系統運行級別,例如輸入 init 3,此時操作系統就會進入到命令行模式
通過statx命令 或者init 5 命令就可以回到運行級別5的模式
每個運行級別啟動時的對應啟動服務都是保存在了 /etc/rc.d/rc[0123456].d中,例如我們當前的運行級別是5,則操作系統的啟動服務就是在 /etc/rc.d/rc5.d這個目錄下,里面都是運行級別5所需啟動的服務
[root@xiaoluo rc.d]# ls init.d rc0.d rc2.d rc4.d rc6.d rc.sysinit rc rc1.d rc3.d rc5.d rc.local
至此,整個Linux操作系統就已經全部的啟動起來了。
本篇隨筆對Linux系統的啟動進行了詳細的解釋,在下一篇隨筆里面將會講解如何在單用戶下修改root用戶的密碼以及如何同 MD5 加密算法對用戶進入引導界面進行加密等知識!!!
您可以通過點擊 右下角 的按鈕 來對文章內容作出評價, 也可以通過左下方的 關注按鈕 來關注我的博客的最新動態。
如果文章內容對您有幫助, 不要忘記點擊右下角的 推薦按鈕 來支持一下哦
如果您對文章內容有任何疑問, 可以通過評論或發郵件的方式聯系我: 501395377@qq.com / lzp501395377@gmail.com