CentOS啟動流程
1. 加電自檢
通電后主板CMOS中的BIOS(基本輸入輸出系統)將進行硬件自檢并簡單設置,根據硬盤等相關設備情況進入下一步
2. 引導加載次序:BOOT Sequence
按次序查找各引導設備,第一個有引導程序的設備即為本次啟動用到設備
3. bootloader:
引導加載器,用來引導系統加載的程序
-
windows: ntloader
-
Linux:
-
LILO:LInux LOader
-
GRUB: GRand Uniform Bootloader
-
GRUB 0.X: GRUB Legacy
-
GRUB 1.x: GRUB2
功能:提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核。
4. GRUB引導加載器
GRUB 是bootloader階段的引導程序,CentOS主要通過GRUB(GRand Unified Bootloader)引導。
GRUB引導步驟:grub legacy
-
stage1: mbr(磁盤分區表)
-
stage1_5: mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統;
-
stage2:磁盤分區(/boot/grub/)
配置文件:/boot/grub/grub.conf <– /etc/grub.conf
stage2及內核等通常放置于一個基本磁盤分區;
GRUB的功用
1. 提供菜單、并提供交互式接口 e: 編輯模式,用于編輯菜單; c: 命令模式,交互式接口; 2. 加載用戶選擇的內核或操作系統 允許傳遞參數給內核 可隱藏此菜單 3. 為菜單提供了保護機制 為編輯菜單進行認證 為啟用內核或操作系統進行認證
常用命令:
#help: 獲取幫助列表 #help KEYWORD: 詳細幫助信息 #find (hd#,#)/PATH/TO/SOMEFILE: #root (hd#,#)設定grub的根設備 #kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的cmdline參數; #例如:init=/path/to/init, selinux=0 #initrd /PATH/TO/INITRAMFS_FILE: 設定為選定的內核提供額外文件的ramdisk; #boot: 引導啟動選定的內核;
配置文件:
[root@node1 ~]# cat /boot/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 have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/mapper/vg_node1-lv_root # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-642.1.1.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-642.1.1.el6.x86_64 ro root=/dev/mapper/vg_node1-lv_root rd_NO_LUKS rd_LVM_LV=vg_node1/lv_swap rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=vg_node1/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-642.1.1.el6.x86_64.img
常用配置項
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: 啟動選定的內核或操作系統時進行認證;
5. 進入Kernel
在GRUB中選擇對應的kernel后,kernel會對自身進行初始化
自身初始化
-
探測可識別到的所有硬件設備;
-
加載硬件驅動程序;(有可能會借助于ramdisk加載驅動)
ramdisk:內核中的特性之一:使用緩沖和緩存來實現對磁盤上的文件訪問
-
以只讀方式掛載根文件系統;
-
運行用戶空間的第一個應用程序:/sbin/init
init程序的類型:
-
SysV: init, CentOS 5
配置文件:/etc/inittab -
Upstart: init, CentOS 6
配置文件:/etc/inittab, /etc/init/*.conf -
Systemd:systemd, CentOS 7
配置文件:/usr/lib/systemd/system, /etc/systemd/system
至此,可以總結為:
POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只讀) --> init
6. 運行init
CentOS6的init位置為/sbin/init,共分7個級別
運行級別:為了系統的運行或維護等應用目的而設定
0:關機 1:單用戶模式(root, 無須登錄), single, 維護模式; 2: 多用戶模式,會啟動網絡功能,但不會啟動NFS;維護模式; 3:多用戶模式,正常模式;文本界面; 4:預留級別;可同3級別; 5:多用戶模式,正常模式;圖形界面; 6:重啟
默認級別:3, 5
切換級別:init ?
例如 init 0 表示關機
[root@node1 ~]# init 0
查看級別:
runlevel
who -r
[root@node1 ~]# runlevel N 3 [root@node1 ~]# who -r 運行級別 3 2016-06-20 13:12
配置文件:/etc/inittab,CenOS 6的upstart程序配置文件還包括/etc/init/*.conf
配置文件格式為:id:runlevel:action:process
每行定義一個級別
id:指入口標識符,它是一個字符串,對于getty或mingetty等其他login程序項,要求id與tty的編號相同,否則getty程序將不能正常工作。 runlevel:init的系統運行級別 action:是用來定義后面process的運行方式,常用的有下面幾種 wait: 切換至此級別運行一次; respawn:此process終止,就重新啟動之; initdefault:設定默認運行級別;process省略; sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit process:為具體的執行程序
下例中,我的配置文件顯示為id:3:initdefault:
,表示默認運行級別3,即多用戶模式的文本界面
[root@node1 ~]# 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 (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:3:initdefault:
設定系統初始化方式時,例如 l3:3:wait:/etc/rc.d/rc 3
表示讀取 意味著讀取/etc/rc.d/rc3.d/下的配置文件
ls /etc/rc.d/rc3.d/ K10saslauthd S02lvm2-monitor S12rsyslog S26udev-post S99local K15svnserve S08ip6tables S22messagebus S55sshd K50netconsole S08iptables S25blk-availability S80postfix K87restorecond S10network S25netfs S90crond K89rdisc S11auditd S26haldaemon S99libvirt-guests
說明:
K開頭的文件,##運行次序;數字越小,越先運行;數字越小的服務,通常為依賴到別的服務; S開頭的文件,##運行次序;數字越小,越先運行;數字越小的服務,通常為被依賴到的服務;
7. 運行初始化腳本
系統初始化腳本對應的文件是/etc/rc.d/rc.sysinit,會在系統啟動時運行一次
[root@node1 ~]# cat /etc/rc.d/rc.sysinit #!/bin/bash # # /etc/rc.d/rc.sysinit - run once at boot time # # Taken in part from Miquel van Smoorenburg's bcheckrc. # HOSTNAME=$(/bin/hostname) set -m if [ -f /etc/sysconfig/network ]; then . /etc/sysconfig/network fi if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then HOSTNAME=localhost fi #后面省略
主要作用
-
設置主機名;
-
設置歡迎信息;
-
激活udev和selinux;
-
掛載/etc/fstab文件中定義的文件系統;
-
檢測根文件系統,并以讀寫方式重新掛載根文件系統;
-
設置系統時鐘;
-
激活swap設備;
-
根據/etc/sysctl.conf文件設置內核參數;
-
激活lvm及software raid設備;
-
加載額外設備的驅動程序;
-
清理操作;
8.啟動系統服務
centos6下的系統服務腳本都放在/etc/rc.d/init.d或者/etc/init.d中,因為建立了鏈接,所以內容是一樣的
[root@node1 ~]ll /etc/init.d lrwxrwxrwx 1 root root 11 6月 11 22:34 /etc/init.d -> rc.d/init.d [root@node1 ~]# ls /etc/init.d/ auditd halt lvm2-lvmetad network sandbox udev-post blk-availability ip6tables lvm2-monitor postfix saslauthd crond iptables messagebus rdisc single functions killall netconsole restorecond sshd haldaemon libvirt-guests netfs rsyslog svnserve
chkconfig命令可以用來查看服務在所有級別的啟動或關閉設定情形:chkconfig [--list] [name]
查看chkconfig –list
[root@node1 ~]# chkconfig --list auditd 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉 blk-availability 0:關閉 1:啟用 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉 crond 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉 haldaemon 0:關閉 1:關閉 2:關閉 3:啟用 4:啟用 5:啟用 6:關閉 ip6tables 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉 iptables 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
9. 設置登陸終端
根據終端配置打印登陸提示符
初始化階段總結為:
/sbin/init --> (/etc/inittab) --> 設置默認運行級別 --> 運行系統初始腳本、完成系統初始化 --> 關閉對應下需要關閉的服務,啟動需要啟動服務 --> 設置登錄終端
整體總結
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別 --> 系統初始化腳本 --> 關閉或啟動對應級別下的服務 --> 啟動終端
習題
習題1
為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
(1) 為硬盤新建兩個主分區;并為其安裝grub;
(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
(4) 為grub提供配置文件;
(5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;
查詢磁盤情況
[root@node1 ~]# fdisk -l /dev/sd[a-z] Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
磁盤分區并格式化
[root@node1 ~]# fdisk /dev/sdb [root@node1 ~]# partx -a /dev/sdb BLKPG: Device or resource busy error adding partition 1 BLKPG: Device or resource busy error adding partition 2 [root@node1 ~]# cat /proc/partitions major minor #blocks name 8 0 20971520 sda 8 1 512000 sda1 8 2 20458496 sda2 8 16 20971520 sdb 8 17 112423 sdb1 8 18 5253255 sdb2 253 0 6144000 dm-0 253 1 2031616 dm-1 253 2 4087808 dm-2 253 3 8192000 dm-3 [root@node1 ~]# mke2fs -t ext4 /dev/sdb1 [root@node1 ~]# mke2fs -t ext4 /dev/sdb2
創建目錄并掛載分區
[root@node1 ~]# mkdir /mnt/boot /mnt/sysroot [root@node1 ~]# ls /mnt boot sysroot [root@node1 ~]# mount /dev/sdb1 /mnt/boot/ [root@node1 ~]# mount /dev/sdb2 /mnt/sysroot/ [root@node1 ~]# ls /mnt/boot lost+found [root@node1 ~]# ls /mnt/sysroot/ lost+found
拷貝kernel和ramfs文件
[root@node1 ~]# cp /boot/initramfs-2.6.32-642.1.1.el6.x86_64.img /mnt/boot/initramfs.img [root@node1 ~]# cp /boot/vmlinuz-2.6.32-642.1.1.el6.x86_64 /mnt/boot/vmlinuz [root@node1 ~]# ls /mnt/boot/ initramfs.img lost+found vmlinuz
安裝grub
[root@node1 boot]# grub-install --root-directory=/mnt /dev/sdb Probing devices to guess BIOS drives. This may take a long time. Installation finished. No error reported. This is the contents of the device map /mnt/boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (fd0) /dev/fd0 (hd0) /dev/sda (hd1) /dev/sdb
創建根目錄并拷貝指定程序
[root@node1 ~]# cd /mnt/sysroot/ [root@node1 sysroot]# mkdir -pv bin sbin boot root home usr etc var tmp lib lib64 proc dev mnt media [root@node1 sysroot]# ls bin dev home lib64 media proc sbin usr boot etc lib lost+found mnt root tmp var [root@node1 sysroot]# cp /bin/bash /bin/ls /bin/cat /mnt/sysroot/bin/
拷貝庫文件
[root@node1 bin]# ldd /bin/bash [root@node1 bin]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/ [root@node1 bin]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/ [root@node1 bin]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/ [root@node1 bin]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/ [root@node1 bin]# ldd /bin/ls [root@node1 bin]# cp /lib64/libselinux.so.1 /mnt/sysroot/lib64/ [root@node1 ~]# cp /lib64/librt.so.1 /mnt/sysroot/lib64/ [root@node1 bin]# cp /lib64/libcap.so.2 /mnt/sysroot/lib64/ [root@node1 bin]# cp /lib64/libacl.so.1 /mnt/sysroot/lib64/ [root@node1 bin]# cp /lib64/libpthread.so.0 /mnt/sysroot/lib64/ [root@node1 bin]# cp /lib64/libattr.so.1 /mnt/sysroot/lib64/ [root@node1 bin]# ldd /bin/cat
修改grub配置文件
[root@node1 ~]# vim /mnt/boot/grub/grub.conf default=0 timeout=5 title CentOS (Express) root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img
關閉用來設置的虛擬機,將硬盤加載到新虛擬機后,正常啟動bash,并能執行ls和cat命令
習題2
制作一個kickstart文件以及一個引導鏡像。描述其過程。
anaconda的配置方式:
(1) 交互式配置方式;
(2) 通過讀取事先給定的配置文件自動完成配置;
按特定語法給出的配置選項;
kickstart文件;
安裝引導選項:
text: 文本安裝方式
method: 手動指定使用的安裝方法
與網絡相關的引導選項:
ip=IPADDR netmask=MASK gateway=GW dns=DNS_SERVER_IP ifname=NAME:MAC_ADDR
與遠程訪問功能相關的引導選項:
vnc vncpassword='PASSWORD'
指明kickstart文件的位置
ks= DVD drive: ks=cdrom:/PATH/TO/KICKSTART_FILE Hard drive: ks=hd:/device/drectory/KICKSTART_FILE HTTP server: ks=http://host:port/path/to/KICKSTART_FILE FTP server: ks=ftp://host:port/path/to/KICKSTART_FILE HTTPS server: ks=https://host:port/path/to/KICKSTART_FILE
啟動緊急救援模式:
rescue
kickstart文件的格式:
命令段:指明各種安裝前配置,如鍵盤類型等;
程序包段:指明要安裝的程序包組或程序包,不安裝的程序包等;
%packages @group_name package -package %end
腳本段:
%pre: 安裝前腳本 運行環境:運行于安裝介質上的微型Linux環境 %post: 安裝后腳本 運行環境:安裝完成的系統;
命令段中的命令:
必備命令
authconfig: 認證方式配置 authconfig --useshadow --passalgo=sha512 bootloader:bootloader的安裝位置及相關配置 bootloader --location=mbr --driveorder=sda --append="crashkernel=auto crashkernel=auto rhgb rhgb quiet quiet" keyboard: 設定鍵盤類型 lang: 語言類型 part: 創建分區 rootpw: 指明root的密碼 timezone: 時區
可選命令
install OR upgrade text: 文本安裝界面 network firewall selinux halt poweroff reboot repo user:安裝完成后為系統創建新用戶 url: 指明安裝源
創建kickstart文件的方式:
(1) 直接手動編輯;
依據某模板修改;
(2) 可使用創建工具:system-config-kickstart (CentOS 6)
依據某模板修改并生成新配置;
檢查ks文件的語法錯誤:ksvalidator
# ksvalidator /PATH/TO/KICKSTART_FILE
創建引導光盤:
# mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V “CentOS 6.8 x86_64 boot” -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/
習題3
寫一個腳本
(1) 能接受四個參數:start, stop, restart, status
start: 輸出“starting 腳本名 finished.”
…
(2) 其它任意參數,均報錯退出;
#!/bin/bash # # chkconfig: - 88 12 # description: test service script # prog=$(basename $0) lockfile=/var/lock/subsys/$prog start() { if [ -e $lockfile ]; then echo "$prog is aleady running." return 0 else touch $lockfile [ $? -eq 0 ] && echo "Starting $prog finished." fi } stop() { if [ -e $lockfile ]; then rm -f $lockfile && echo "Stop $prog ok." else echo "$prog is stopped yet." fi } status() { if [ -e $lockfile ]; then echo "$prog is running." else echo "$prog is stopped." fi } usage() { echo "Usage: $prog {start|stop|restart|status}" } if [ $# -lt 1 ]; then usage exit 1 fi if [ $1 != 'start' -a $1 !='stop' -a $1 != 'restart' -a $1 != 'status' ];then usage exit 2 fi case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) usage esac
習題4
寫一個腳本,判斷給定的用戶是否登錄了當前系統;
(1) 如果登錄了,則顯示用戶登錄,腳本終止;
(2) 每3秒鐘,查看一次用戶是否登錄;
#!/bin/bash # read -p "Enter a user name: " username while true; do if who | grep "^$username" &> /dev/null; then break fi sleep 3 done echo "$username logged on."
習題5
寫一個腳本,顯示用戶選定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;
#!/bin/bash # cat << EOF cpu) show cpu information; mem) show memory information; disk) show disk information; quit) quit ============================ EOF read -p "Enter a option: " option while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do read -p "Wrong option, Enter again: " option done case "$option" in cpu) lscpu ;; mem) cat /proc/meminfo ;; disk) fdisk -l ;; *) echo "Quit..." exit 0 ;; esac
習題6
寫一個腳本
(1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
(2) 提示用戶輸入一個用戶名或輸入“quit”退出;
當輸入的是用戶名,則調用函數顯示用戶信息;
當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:
#!/bin/bash # function getinfo { if id $op &> /dev/null;then grep -E '^('$op')\>' /etc/passwd | cut -d: -f1,3,7;read -p "Enter a username or quit:" op else read -p "wrong argument,plsease enter a username or quit:" op fi } read -p "Enter a username or quit:" op while [[ $op != "quit" ]];do getinfo $op done
練習7
寫一個腳本,完成如下功能(使用函數)
(1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件;
(2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中;
(3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求;
#!/bin/bash read -p "Enter a exeable commond:" cmd path() { whereis $cmd | cut -d' ' -f2 } ldd $(path $1)| sed '1d'| grep -Eo "/.*[0-9] " > path.txt cp $(path $1) /mnt/sysroot$(path $1) while read line;do cp $line /mnt/sysroot$line done < ./path.txt
原創文章,作者:sthwrong,如若轉載,請注明出處:http://www.www58058.com/19012
寫的很棒,但是有的腳本應該有點小瑕疵,有的還可以在完善一下