第十周-Centos啟動流程及Shell腳本編程

一、CentOS啟動流程

POST –> Boot Sequence(BIOS) –> Boot Loader (MBR) –> Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init –>(/etc/inittab, /etc/init/*.conf) –> 設定運行級別 –> 系統初始化腳本 –> 關閉或啟動對應級別下的服務 –> 啟動終端

1.POST:加電自檢,檢查硬件設備是否存在

用于實現POST的代碼在主板上ROM(CMOS)芯片上

BIOS:Basic Input and Output System 基本上輸入輸出系統,固化在ROM芯片上

2.Boot Sequence:

按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用到的設備;

bootloader:引導加載器,程序;

提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本; 把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而后把系統控制權移交給內核;

(1)Windows上引導加載器:ntloader

(2)Linux上引導加載器:

LILO:短小精悍的linux加載器,1024柱面之后無法加載,現在多用于安卓手機啟動

GRUB:Grand Uniform Bootloader統一引導加載器

GRUB 0.X(CentOS 5/6):Grub Legacy

GRUB 1.X(CentOS 7):Grub2,完全重寫,設計理念上很大改變

3.Kernel實現功能

kernel自身初始化,實現功能

—> 探測可識別到的所有硬件設備;

—> 加載硬件驅動程序;(有可能會借助于ramdisk加載驅動)

—> 以只讀方式掛載根文件系統;

—> 運行用戶空間的第一個應用程序:/sbin/init

4./sbin/init管理用戶空間服務進程

init程序的在不同CentOS版本上類型:

CentOS 5及以前:SysV init 配置文件:/etc/inittab

CentOS 6:Ubantu研發的Upstart 配置文件:/etc/inittab /etc/init/*.conf

CentOS 7:Systemd 配置文件:/usr/lib/systemd/system/, /etc/systemd/system/

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

1.為硬盤新建兩個主分區;并為其安裝Grub

echo “- - -” > /sys/class/scsi_host/hos0/scan                                    #掃描新添加的硬盤
fdisk /dev/sdb                                                                   #將新硬盤分區
mkfs.ext4 /dev/sdb1                                                              #格式化分區
mkfs.ext4 /dev/sdb2
mount /dev/sdb2 /mnt/minilinux/                                                  #第二個分區為rootfs
mkdir -v /mnt/minilinux/{etc,bin,sbin,lib,lib64,var,proc,usr,sys,boot,dev,tmp}   #創建rootfs所需目錄
mount /dev/sdb1 /mnt/minilinux/boot/                                             #掛載第一分區為啟動分區
grub-install --root-directory=/mnt/minilinux /dev/sdb                            #安裝grub
[root@N5 桌面]# ls /mnt/minilinux/boot/grub/                                     #查看grub是否安裝成功
device.map     iso9660_stage1_5   stage1           xfs_stage1_5
e2fs_stage1_5  jfs_stage1_5       stage2
fat_stage1_5   minix_stage1_5     ufs2_stage1_5
ffs_stage1_5   reiserfs_stage1_5  vstafs_stage1_5

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

cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/minilinux/boot/initramfs.img   #復制ramdisk文件
cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/minilinux/boot/vmlinuz               #復制kernel文件

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

cp /bin/{bash,ls,cat} /mnt/minilinux/bin/                                        #復制程序主文件
cp $(ldd /bin/{bash,ls,cat} |grep -o "/.*\.[0-9]") /mnt/minilinux/lib64/         #復制程序依賴庫文件
[root@N5 桌面]# chroot /mnt/minilinux/                                           #chroot測試
bash-4.1# ls
bin  boot  dev  etc  lib  lib64  lost+found  proc  sbin  sys  tmp  usr  var
bash-4.1# exit

4.為grub提供配置文件

vi /mnt/minilinux/boot/grub/grub.conf           #創建grub配置文件,并寫入如下配置;
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Minilinux
        root (hd0,0)
        kernel /vmlinuz root=/dev/sda2 selinux=0 init=/bin/bash quiet
        initrd /initramfs.img

注:如不在內核啟動參數里寫入selinux=0,可能會導致無法開機

5.將新的硬盤設為第一啟動項并能正常啟動目標主機

新建一個虛擬機并設置硬盤為現有硬盤 第十周-Centos啟動流程及Shell腳本編程

啟動后Grub正常 第十周-Centos啟動流程及Shell腳本編程

正常開機 第十周-Centos啟動流程及Shell腳本編程

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

1.制作Ks文件

yum -y install system-config-kickstart #安裝Kickstart程序
[root@N4 桌面]# system-config-kickstart #使用Kickstart圖形化工具
設置為http方式安裝系統

第十周-Centos啟動流程及Shell腳本編程

2.創建引導鏡像

[root@N4 桌面]# mkdir /root/miniboot
[root@N4 桌面]# cp -r /media/CentOS_6.5_Final/isolinux/ /root/miniboot/
[root@N4 桌面]# cp /root/ks.cfg /root/miniboot/
[root@N4 桌面]# vi /root/miniboot/isolinux/isolinux.cfg 
#將第一個label修改為如下配置
label linux
  menu label ^Auto Ks Network Install
  menu default
  kernel vmlinuz
  append initrd=initrd.img ks=cdrom:/ks.cfg
#創建iso鏡像文件
[root@N4 桌面]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6 miniboot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o  /root/boot.iso   /root/miniboot/

3.新建一個虛擬機進行測試

可以看到第一項已經被改為Auto Ks Network Install,回車進入

第十周-Centos啟動流程及Shell腳本編程

已經開始自動安裝了

第十周-Centos啟動流程及Shell腳本編程

四、寫一個腳本

(1) 能接受四個參數:start, stop, restart, status

start: 輸出“starting 腳本名 finished.” …

(2) 其它任意參數,均報錯退出; #!/bin/bash

case $1 in
  start)
 echo "starting $0 finished"
  ;;
  stop)
 echo "stop $0 finished"
  ;;
  restart)
 echo "restart $0 finished"
  ;;
  status)
 echo "status"
  ;;
  *)
 echo "error"
 exit 1
  ;;
esac

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

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

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

#!/bin/bash

if [ $# -lt 1 ];then
echo "please input '$0 username'"
exit 1
fi
while true;do
  if who | grep $1 &>/dev/null ;then
     echo "user $1 is loggin"
     exit 0
  fi
 sleep 3
done

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

cpu) display cpu info

mem) display memory info

disk) display disk info

quit) quit

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

#!/bin/bash
cat <<EOF
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
EOF
echo
read -p "please input your choice: " input

while true;do

        case $input in
        cpu)
           lscpu
           exit 0
            ;;
        mem)
           free -m
           exit 0
            ;;
        disk)
           fdisk -l
           exit 0
            ;;
        quit)
           exit 0
            ;;
        *)
           echo "argument error"
           read -p "please input your choice: " input
            ;;
        esac
done

七、寫一個腳本

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

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

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

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

#!/bin/bash

userinfo () {
   echo
   grep $user /etc/passwd | awk -F: '{print "Uid is "$3" Shell is "$7}'
   echo
}

while true;do
 read -p "Please input username or quit: " user
   if [ $user == "quit" ];then
      exit 0
   elif id $user &>/dev/null;then
      userinfo
   else
      echo "user not exist,input agin"
   fi
done

 

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

(0)
N27_whatN27_what
上一篇 2017-10-14 17:51
下一篇 2017-10-15 16:07

相關推薦

  • 到處都是Unix的胎記

    一說起Unix編程,不必多說,最著名的系統調用就是fork,pipe,exec,kill或是socket了(fork(2),execve(2), pipe(2), socketpair(2), select(2), kill(2), sigaction(2))這些系統調用都像是Unix編程的胎記或簽名一樣,表…

    Linux干貨 2015-04-03
  • Linux系統啟動流程與內管管理(上)

    在講linux系統啟動流程之前,來講講linux的組成,這樣能能幫助我們深入了解系統的啟動流程,廢話不多說直接上系統啟動流程圖 linux組成 linux:kernel+rootfs kenrel的作用:進程管理、內存管理、網絡管理、驅動程序、文件系統、安全管理等   rootfs:程序和glibc 庫:函數結合,function,調用接口(頭文件…

    系統運維 2016-09-14
  • 進程管理

    linux進程管理     內核的功能:進程管理、文件系統、網絡管理、驅動程序、安全功能等     Pcrocess:運行中的程序的一個副本,是被載入內存中的一個指令集和         PID:進程…

    Linux干貨 2016-09-12
  • 淺談正則表達式

    1.       什么是正則表達式 基本說來,正則表達式是一種用來描述一定數量文本的模式。Regex代表Regular Express。本文將用<<regex>>來表示一段具體的正則表達式。 一段文本就是最基本的模式,簡單的匹配相同的文本。   2. &n…

    Linux干貨 2016-08-12
  • 第八周作業

    1、寫一個腳本,使用ping命令探測172.16.250.1-172.16.250.254之間的所有主機的在線狀態;     在線的主機使用綠色顯示;     不在線的主使用紅色顯示; #!/bin/bash for i in {1..254};do if ping -c 1 -w 1 192.16…

    2017-07-03
  • Nginx相關實戰案例

    Nginx相關實戰案例: Nginx在實際生產中極為重要,先來看一下Nginx配置文件nginx.conf中文詳解 #定義Nginx運行的用戶和用戶組 user www www; #nginx進程數,建議設置為等于CPU總核心數。 worker_processes 8; #全局錯誤日志定義類型,[ debug | info | notice | warn |…

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