第十周-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.178linux.com/87812

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

相关推荐

  • Flex Ant自动构建

    1.  Flex SDK Ant        Flex开发者会遇到很多,比如自动构建,在一个有着N多模块,N处源码,构建过程复杂的Flex项目开发中,依赖人力手工构建项目非常不现实(机械重复且枯燥无味的过程,相信哪位开发人员都会避之唯恐不及,而且对于人力是非常大的浪费),而通过使用Ant,我们可以将这些工作…

    Linux干货 2016-03-22
  • sed命令解析

    处理文件的工具sed Stream EDitor, 行编辑器 一次只读一行,只处理一行,不对源文件做处理,至输出到屏幕上模式空间 sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space), 接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往…

    Linux干货 2016-08-11
  • 【26期】Linux第五周学习小总结

        第五周的学习内容很丰富, 从查找到压缩打包,到软件包的管理,其中尤其是以压缩的内容最为丰富,而且庞大的选项让人绝望,那我今天就总结了一下压缩的一些东西,和大家一起分享。     为什么会产生压缩工具呢?因为我们的现在的很多文件会利用到的东西很多,电脑的读存速度也越来越快,一些大的文件在传输和使用上就会很麻烦,虽…

    2017-08-12
  • linux iptables替代工具nftables

    1 使用 FirewallD 构建动态防火墙 1.1 “守护进程” 1.2 静态防火墙(system-config-firewall/lokkit) 1.3 使用 iptables 和 ip6tables 的静态防火墙规则 1.4 什么是区域? 1.4.1 预定义的服务 1.4.2 端口和…

    Linux干货 2015-03-11
  • Linux中的分区管理

    1. 磁盘分区类型 磁盘分区主要分为两种类型: MBR  MBR是一个比较古老的分区类型了,不支持2TB的大硬盘。在磁盘的0磁道0扇区的512字节存放的就是MBR的信息。前446字节为bootloader,后面64字节存放的是分区表,后面2字节存放的是55aa的分区标识符。MBR分区类型最多只能支持4个主分区和扩展分区,其余的分区只能是逻辑分区。 …

    2017-04-22
  • sed基础

    sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed 主要用来自动编辑一个或多个文件, 简化对文件的反复操…

    Linux干货 2017-05-01