Linux Sysadmin–part4

一、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)

A.POST加電自檢

主板在接通電源后,系統首先由POST程序來對內部各個設備進行檢查,自檢中如發現有錯誤,將按兩種情況處理:對于嚴重故障(致命性故障)則停機,此時由于各種初始化操作還沒完成,不能給出任何提示或信號;對于非嚴重故障則給出提示或聲音報警信號,等待用戶處理。

B.BIOS Sequence啟動引導階段

自檢通過之后,按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用到的設備。一般電腦是按”F2″或”Del”鍵等等進入BIOS,在里面我們可以調整硬盤的啟動順序。找到第一個有引導程序的設備后,BIOS會找到設備中的MBR,讀取其中的Bootloader。

C.GRUP引導階段

這時候就可以看到我們的Centos系統了,但是一般都不需要操作,會自動啟動系統。其實我們也可以自己手動啟動系統的。

1).手動在grub命令行接口啟動系統:

grub> root (hd#,#)

grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE

grub> initrd /initramfs-VERSION-RELEASE.img

grub> boot

2).grub的命令行接口:

e: 編輯模式,用于編輯菜單;

c: 命令模式,交互式接口;

help: 獲取幫助列表

help KEYWORD: 詳細幫助信息

find (hd#,#)/PATH/TO/SOMEFILE:

root (hd#,#) 設定grup的根設備

kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的cmdline參數;

例如:init=/path/to/init, selinux=0

initrd /PATH/TO/INITRAMFS_FILE: 設定為選定的內核提供額外文件的ramdisk;

boot: 引導啟動選定的內核;

3).配置文件:/boot/grub/grub.conf

配置項:

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: 啟動選定的內核或操作系統時進行認證

D.kernel加載內核階段內核會自身初始化

探測可識別到的所有硬件設備;加載硬件驅動程序;(有可能會借助于ramdisk加載驅動)以只讀方式掛載根文件系統;運行用戶空間的第一個應用程序:/sbin/init5.init初始化階段內核加載完畢,會運行init程序,init進程起來后,系統啟動的控制權移交給init進程/sbin/init進程是所有進程的父進程,當init起來之后,它首先會讀取配置文件/etc/inittab,進行以下工作:

1).執行系統初始化腳本(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根文件系統及其它文件系統,到此系統基本算運行起來了,后面需要進行運行級別的確定及相應服務的啟動;

2).確定啟動后進入的運行級別;

3).執行/etc/rc.d/rc,該文件定義了服務啟動的順序是先K后S,而具體的每個運行級別的服務狀態是放在/etc/rc.d/rcn.d(n=0~6)目錄下,所有的文件均鏈接至/etc/init.d下的相應文件。

4).有關key sequence的設置

5).有關UPS的腳本定義

6).啟動虛擬終端/sbin/mingetty

7).在運行級別5上運行X配置文件:/etc/inittab每行定義一種action以及與之對應的processid:runlevels:action:processid:一個任務的標識符;runlevels:在哪些級別啟動此任務;#,###,可以為空,表示所有級別;action:在什么條件下啟動此任務;process:任務;(腳本或程序)action:wait:等待切換至此任務所在的級別時執行一次;respawn:一旦此任務終止,就自動重新啟動之;initdefault:設定默認運行級別;此時,process省略;sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本;K*:要停止的服務;K##*,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而后關閉被依賴的;S*:要啟動的服務;S##*,優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務后啟動;chkconfig命令:管控/etc/init.d/每個服務腳本在各級別下的啟動或關閉狀態;查看:chkconfig –list [name]添加:chkconfig –add name刪除:chkconfig –del name修改指定的鏈接類型:chkconfig [–level LEVELS] name–level LEVELS:指定要控制的級別;默認為2345;

init命令:

級別切換:init #

級別查看:who -r

注:正常級別下,最后啟動的一個服務S99local沒有鏈接至/etc/init.d下的某腳本,而是鏈接至了/etc/rc.d/rc.local (/etc/rc.local)腳本;因此,不便或不需寫為服務腳本的程序期望能開機自動運行時,直接放置于此腳本文件中即可。

二、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;?

(1) 為硬盤新建兩個主分區;并為其安裝grub;?

(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;

?(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;?

(4) 為grub提供配置文件;?

(5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;

~]# cat /proc/partitions

major minor? #blocks? name

8? ? ? 16? 83886080 sdb

8? ? ? 17? 10485760 sdb1

8? ? ? 18? ? ? ? ? 1 sdb2

8? ? ? 21? ? 5242880 sdb5

8? ? ? 22? ? 5242880 sdb6

8? ? ? 23? ? 5242880 sdb7

8? ? ? 24? ? 5242880 sdb8

8? ? ? 25? ? 5242880 sdb9

8? ? ? ? 0? 125829120 sda

8? ? ? ? 1? ? 1048576 sda1

8? ? ? ? 2? 124779520 sda2

8? ? ? 32? ? 5242880 sdc

8? ? ? 33? ? 2097152 sdc1

8? ? ? 34? ? 2097152 sdc2

8? ? ? 48? ? 5242880 sdd

8? ? ? 49? ? 5241856 sdd1

8? ? ? 64? ? 5242880 sde

8? ? ? 65? ? 5241856 sde1

11? ? ? ? 0? ? 8086528 sr0

253? ? ? ? 0? 52428800 dm-0

253? ? ? ? 1? ? 2097152 dm-1

253? ? ? ? 2? 70246400 dm-2

[root@ronny1 ~]# mke2fs -t ext4 /dev/sdc1

[root@ronny1 ~]# mke2fs -t ext4 /dev/sdc2

###準備boot目錄###

[root@ronny1 ~]# mkdir /mydata/boot

[root@ronny1 ~]# mount /dev/sdc1 /mydata/boot

[root@ronny1 ~]# ls /mydata/boot

lost+found

###安裝grub###

[root@ronny1 ~]# grub-install –root-directory=/mnt /dev/sdc

Probing devices to guess BIOS drives. This may take a long time.

Installation finished. No error reported.

[root@ronny1 ~]# ls /mydata/boot

grub? lost+found

###復制內核文件和initramfs###

[root@ronny1 ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mydata/boot/vmlinuz

[root@ronny1 ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mydata/boot/initramfs.img

###添加grub配置文件###

[root@ronny1 ~]# vim /mydata/boot/grub/grub.conf

default=0

timeout=5

title CentOS-HAN

root(hd0,0)

kernel /vmlinuz ro root=/dev/sdc2

initrd /initramfs.img

###此處: root配置rootfs根分區###

###準備根目錄結構和程序###

[root@ronny1 ~]# mkdir /mydata/sysroot

[root@ronny1 ~]# mount /dev/sdc2 /mydata/sysroot

[root@ronny1~]# cd /mydata/sysroot

[root@ronny1 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media

mkdir: created directory `etc’

mkdir: created directory `bin’

mkdir: created directory `sbin’

mkdir: created directory `lib’

mkdir: created directory `lib64′

mkdir: created directory `dev’

mkdir: created directory `proc’

mkdir: created directory `sys’

mkdir: created directory `tmp’

mkdir: created directory `var’

mkdir: created directory `usr’

mkdir: created directory `home’

mkdir: created directory `root’

mkdir: created directory `mnt’

mkdir: created directory `media’

[root@ronny1 sysroot]# cp /bin/bash /mydata/sysroot/bin/

[root@ronny1 sysroot]# ldd /bin/bash

linux-vdso.so.1 =>? (0x00007ffdb9371000)

libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003787200000)

libdl.so.2 => /lib64/libdl.so.2 (0x000000377f600000)

libc.so.6 => /lib64/libc.so.6 (0x000000377fa00000)

/lib64/ld-linux-x86-64.so.2 (0x000000377f200000)

[root@ronny1 sysroot]# cp /lib64/libtinfo.so.5 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/libdl.so.2 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/libc.so.6 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /bin/ls /mydata/sysroot/bin/

[root@ronny1 ~]# ls /mydata/sysroot/bin

bash ?ls

[root@ronny1 sysroot]# cp /lib64/libselinux.so.1 /mydata/sysroot/lib64/? [root@ronny1 sysroot]# cp /lib64/libacl.so.1 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/libattr.so.1 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/libpcre.so.1 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/libpthread.so.0 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# ls /mydata/sysroot/lib64

ld-linux-x86-64.so.2? libc.so.6? ? libpthread.so.0

libacl.so.1? ? ? ? ? libdl.so.2? ? libselinux.so.1

libattr.so.1? ? ? ? ? libpcre.so.1? libtinfo.so.5

###測試命令###

[root@ronny1 sysroot]# chroot /mydata/sysroot

bash-4.1# ls

bin? etc? lib? ? lost+found? mnt? root? sys? usr

dev? home? lib64? media? ? ? proc? sbin? tmp? var

bash-4.1# exit

exit

[root@ronny1 sysroot]# sync

[root@ronny1 sysroot]# sync

[root@ronny1 sysroot]# sync

###修改init程序,指定init程序(bash)###

default=0

timeout=5

title CentOS-HAN

root(hd0,0)

kernel /vmlinuz ro root=/dev/sdc2 selinux=0 init=/bin/bash

initrd /initramfs.img

[root@ronny1 sysroot]# sync

三、制作一個kickstart文件以及一個引導鏡像。描述其過程

1. 準備系統iso鏡像目錄(centos7.2)

[root@ronny1 ~]# mkdir /mnt/cdrom

[root@ronny1 ~]# mount /dev/sr0 /mnt/cdrom

mount: /dev/sr0 is write-protected, mounting read-only

[root@ronny1 ~]# mkdir /mnt/iso

[root@ronny1 ~]# cd /mnt/cdrom

[root@ronny1 cdrom]# cp -frav * /mnt/iso

[root@ronny1 cdrom]# cp .discinfo /mnt/iso

2. 定制kickstart

[root@ronny1 ~]# yum -y install system-config-kickstart

[root@ronny1 ~]# system-config-kickstart

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

Linux Sysadmin--part4

[root@ronny1 ~]# ksvalidator ks.cfg

3. 整合鏡像文件和ks文件,并修改相關配置

[root@ronny1 ~]# cd /mnt/iso

[root@ronny1 iso]# vim isolinux/isolinux.cfg

定制啟動標簽 ,指定ks位置

label custom

menu label ^Install CentOS 7

menu default

kernel vmlinuz

append initrd=initrd.img inst.ks=cdrom:/isolinux/ks.cfg inst.stage2=hd:LABEL=CENTOS7 quiet

其中,需要把其它啟動項中的menu default去掉,加在上面的自定義啟動項中,這樣當你從光盤啟動時,才會默認選擇該項,并且有倒計時,由于默認的光盤倒計時時間太久了,為600秒,我們把timeout 600改成timeout 100,這樣默認就是10秒倒計時了。

拷貝ks文件到光盤根目錄

[root@ronny1 iso]# cp /root/ks.cfg isolinux/

[root@ronny1 iso]# ls isolinux/

boot.cat? grub.conf? isolinux.bin? ks.cfg? splash.png? upgrade.img? vmlinuz

boot.msg? initrd.img? isolinux.cfg? memtest? TRANS.TBL? vesamenu.c32

4. 重新打包ISO

[root@ronny1 iso]mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V “CentOS 7 x86_64 boot” -c isolinux/boot.cat -b isolinux/isolinux.bin -o? /root/boot.iso ?iso/

5. 加載新生成的鏡像,并啟動

使用Xshell 將生成的boot.iso ?copy到windows系統下,就可以用虛擬機引導啟動了。

四、寫一個腳本

(1) 能接受四個參數:start, stop, restart, status start: 輸出“starting 腳本名 finished.” …

(2) 其它任意參數,均報錯退出;

#!/bin/bash

#description:

case $1 in

start)

echo “staring $0 finished”

;;

stop)

echo “stop $0 finished”

;;

restart)

echo “restart $0 finished”

;;

status)

echo “status? $0 finished”

;;

*)

echo “error”

exit 1

;;

esac

五、寫一個腳本,判斷給定的用戶是否登錄了當前系統;

(1) 如果登錄了,則顯示用戶登錄,腳本終止;

(2) 每3秒鐘,查看一次用戶是否登錄;

#!/bin/bash

#description:

while true; do

if who |grep $1 &> /dev/null;then

echo “$1 is login”

exit 0

fi

sleep 3

done

6、寫一個腳本,顯示用戶選定要查看的信息;

cpu) display cpu info

mem) display memory info

disk) display disk info

quit) quit

非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;

#!/bin/bash

#description:display cpu,memory,disk info

cat << EOF

cpu)display cpu info

mem)display memory info

disk)display disk info

quit)quit

EOF

read -p “please input your choice ” choice

while true;do

case $choice in

cpu)

lscpu

exit 0

;;

mem)

free -m

exit 0

;;

disk)

fdisk -l

exit 0

;;

quit)

echo “quit”

exit 0

;;

*)

echo “Error please input cpu,mem,disk,quit”

read -p “please input your choice ” choice

;;

esac

done

7、寫一個腳本

(1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;

(2) 提示用戶輸入一個用戶名或輸入“quit”退出;

當輸入的是用戶名,則調用函數顯示用戶信息;

當用戶輸入quit,則退出腳本;

進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:

userinfo() {

if id “$username” &> /dev/null; then

grep “^$username\>” /etc/passwd | cut -d: -f3,7

else

echo “No such user.”

fi

}

read -p “please input one username or quit: ” username

while true;do

if [ $username == “quit” ];then

exit

else

userinfo

read -p “please input one username or quit: ” username

fi

done

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87723

(0)
N27_ronnyN27_ronny
上一篇 2017-10-10 09:56
下一篇 2017-10-10 15:02

相關推薦

  • 實驗:系統啟動和內核管理

    實驗:bootloader 破壞stage1: 備份:dd if=/dev/sda of=/app/mbr bs=1 count=512 破壞:dd if=/dev/zero of=/dev/sda bs=1 count=446;此時/boot/grub/下的文件沒有任何改動; 表現:stage1破壞后系統會直接進行光盤引導 修復1:救援模式–&…

    Linux干貨 2017-05-14
  • shell腳本編程 4

    Shell腳本編程4 一、雜項知識整理 1、數組賦值方法: declare -a files files=(/var/log/*.log)通配所有文件也可 2、創建臨時文件: mktemp命令:創建的臨時文件可避免沖突 mktemp  NAME.XXXX(x至少要出現三個) -d 創建臨時目錄 –tmpdir=/DIR 指明臨時文件所存…

    Linux干貨 2016-08-24
  • 步入LINUX

    初次融入LINUX的環境。。。

    Linux干貨 2018-03-26
  • keepalived+nginx 模型示例

    原理為: 調度器 利用 keepalived 保持高可用性,實現對系統的監控和VIP 的floating NGINX 利用upstream模塊進行調度 關鍵點: keepalived 對NGINX 狀態的監控: //利用配置文件中設定的腳本對調度器的nginx 進程的監控 實驗步驟: 基于上一篇LVS-DR架構來做,具體LVS-DR架構請參考上一篇 先設置主…

    2017-05-13
  • Linux設備驅動Hello World程序介紹

    by Valerie Henson07/05/2007 (譯者注:本文的例子是只能在linux的2.6內核下使用的,2.6以上的內核,譯者沒有做過實驗,2.4是要修改make文件才能運行。) 本文的出處:這里 自古以來,學習一門新編程語言的第一步就是寫一個打印“hello world”的程序(可以看《hello world 集中營》這個帖子供羅列了300個“…

    Linux干貨 2015-04-01
  • lvs的四種調度類型和調度算法介紹

    lvs是linux內核級的負載均衡解決方案,作為netfilter的補充套件,其工作在INPUT hook上。 相比nginx等負載均衡解決方案的差異如下: lvs工作于內核空間,不受用戶空間套接字和端口數量的限制,而且所有調度工作在內核空間完成,效率更高; nginx為七層負載均衡器,雖然通過stream模塊也可以做到四層負載均衡,但是受到套接字數量限制,…

    Linux干貨 2017-06-25
欧美性久久久久