N25-第十周博客作业

1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)

内核空间的启动流程

一. POST 加电自检

  1. 在加电之后,智能设备所运行的内部存储的一系列检测程序集合。缩写为POST。这些检测程序在软件加载到硬件上运行之前对硬件的基本完整性加以验证。
  2. 用于实现POST的代码在主板上ROM(CMOS)芯片上。

二. Boot Sequence(BIOS)
按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备;
三. Boot Loader

  1. 第1阶段
  • 读取磁盘设备的第一个扇区中的MBR
  • 用来加载第二阶段, 只存放了bootloader的部分代码
  1. 第1.5阶段
    提供文件系统驱动,让第一阶段的代码能够找到第二阶段
  2. 第2阶段
    找到grub的配置文件(/boot/grub2/grub.cfg),并根据其中的设定给用户提供一个可选择的菜单,用于选择想要启动的系统或内核版本。同时stage2即/boot/目录下还提供了Linux系统内核文件(vmlinuz文件)和虚拟文件系统文件(initramfs)等其它核心文件。
    待用户选择了相应的系统或等待超时后,系统启动进入下一个阶段。

四. 加载内核
在用户选择了要启动的系统后,这时bootloader程序会将/boot下的内核文件、虚拟文件系统文件加载至内存中解压并运行,至此bootloader的工作已圆满完成。接下来的工作将由Linux内核来完成。
内核初始化:

  • 探测可识别到的所有硬件设备;
  • 加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
  • 以只读方式挂载根文件系统;
  • 运行用户空间的第一个应用程序:/sbin/init
    自此内核初始化完成, 后续任务交给用户空间程序,只在模式切换或系统发生中断时,内核才会参与
init程序的类型:

                CentOS 5-:SysV init
                    配置文件:/etc/inittab 

                CentOS 6:Upstart
                    配置文件:/etc/inittab
                        /etc/init/*.conf

                CentOS 7:Systemd
                    配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
用户空间的启动流程 (SysV init)

一. 设置默认运行级别
读取/etc/inittab, 设定系统启动的运行级别

0:关机, shutdown
                    1:单用户模式(single user),root用户,无须认证;维护模式;
                    2、多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;
                    3、多用户模式(mutli user),完全功能模式;文本界面;
                    4、预留级别:目前无特别使用目的,但习惯以同3级别功能使用;
                    5、多用户模式(multi user), 完全功能模式,图形界面;
                    6、重启,reboot

二. 运行系统初始化脚本,完成系统初始化

系统初始化脚本:/etc/rc.d/rc.sysinit
                        (1) 设置主机名;
                        (2) 设置欢迎信息;
                        (3) 激活udev和selinux;
                        (4) 挂载/etc/fstab文件中定义的所有文件系统; 
                        (5) 检测根文件系统,并以读写方式重新挂载根文件系统; 
                        (6) 设置系统时钟; 
                        (7) 根据/etc/sysctl.conf文件来设置内核参数;
                        (8) 激活lvm及软raid设备;
                        (9) 激活swap设备;
                        (10) 加载额外设备的驱动程序;
                        (11) 清理操作;

三. 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务
根据运行级别的不同,系统会运行rc0.d到rc6.d中的响应的脚本程序,来完成相应的初始化工作和启动相应的服务。
执行/etc/rc.d/rc.local
四. 启动终端

2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;

(1) 为硬盘新建两个主分区;并为其安装grub;
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

分区:
  [root@han ~]# cat /proc/partitions
major minor  #blocks  name

   8        0   41943040 sda
   8        1     204800 sda1
   8        2   30720000 sda2
   8        3     204800 sda3
   8       16   20971520 sdb
   8       17    1060258 sdb1
   8       18    1060290 sdb2    
[root@han ~]# mke2fs -t ext4 /dev/sdb1
[root@han ~]# mke2fs -t ext4 /dev/sdb2
准备boot目录:
[root@han ~]# mkdir /mnt/boot
[root@han ~]# mount /dev/sdb1 /mnt/boot
[root@han ~]# ls /mnt/boot
lost+found

安装grub: 
[root@han ~]# 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@han ~]# ls /mnt/boot
grub  lost+found

复制内核文件和initramfs:
[root@han ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz
[root@han ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img

添加grub配置文件
[root@han ~]# vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title CentOS-HAN
        root(hd0,0)
        kernel /vmlinuz ro root=/dev/sdb2
        initrd /initramfs.img

此处: root配置rootfs根分区

准备根目录结构和程序:
[root@han ~]# mkdir /mnt/sysroot
[root@han ~]# mount /dev/sdb2 /mnt/sysroot
[root@han ~]# cd /mnt/sysroot
[root@han 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@han sysroot]# cp /bin/bash /mnt/sysroot/bin/
[root@han 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@han sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
[root@han sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[root@han sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[root@han sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
以下使用脚本复制命令和库文件
[root@han ~]# chmod +x cmdcp.sh
[root@han ~]# ./cmdcp.sh
please input other command: ls
please input other command: cat
please input other command: quit
检查
[root@han ~]# ls /mnt/sysroot/bin
bash  cat  ls
[root@han ~]# ls /mnt/sysroot/lib64
ld-linux-x86-64.so.2  libcap.so.2  libpthread.so.0  libtinfo.so.5
libacl.so.1           libc.so.6    librt.so.1
libattr.so.1          libdl.so.2   libselinux.so.1
测试命令:
[root@han sysroot]# chroot /mnt/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@han sysroot]# sync
[root@han sysroot]# sync
[root@han sysroot]# sync

修改init程序,指定init程序(bash)
default=0
timeout=5
title CentOS-HAN
        root(hd0,0)
        kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
        initrd /initramfs.img

[root@han sysroot]# sync

挂载新的硬盘,并启动:
(1) 找到挂载的硬盘
N25-第十周博客作业

(2) 新建虚拟机,挂载刚才的硬盘
N25-第十周博客作业

N25-第十周博客作业

(3) 启动虚拟机
先关闭原虚拟机,否则提示文件被锁定
N25-第十周博客作业

N25-第十周博客作业

模拟运行成功.

3、制作一个kickstart文件以及一个引导镜像。描述其过程。

一. 准备系统iso镜像目录(centos7.2)

[root@lab3 ~]# mkdir /mnt/cdrom
[root@lab3 ~]# mount /dev/sr0 /mnt/cdrom
mount: /dev/sr0 is write-protected, mounting read-only
[root@lab3 ~]# mkdir /mnt/iso
[root@lab3 ~]# cd /mnt/cdrom
[root@lab3 cdrom]# cp -frav * /mnt/iso
[root@lab3 cdrom]# cp .discinfo /mnt/iso

二. 定制kickstart:

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

定制kickstart文件

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

N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业
N25-第十周博客作业

[root@lab3 ~]# ksvalidator ks.cfg
三. 整合镜像文件和ks文件,并修改相关配置
[root@lab3 ~]# cd /mnt/iso
[root@lab3 iso]# vim isolinux/isolinux.cfg
定制启动标签 ,指定ks位置
label custom
menu label ^Install CentOS 7 By han
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@lab3 iso]# cp /root/ks.cfg isolinux/
[root@lab3 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

四. 重新打包ISO

[root@lab3 centos7]# genisoimage -R -J -T -v -cache-inodes -joliet-long  -V CENTOS7 -o /root/CentOS-7.2-x86_64-By-han.iso    -c isolinux/boot.cat    -b isolinux/isolinux.bin      -no-emul-boot -boot-load-size 4 -boot-info-table    -eltorito-alt-boot     -b images/efiboot.img       -no-emul-boot .

五. 加载新生成的镜像,并启动
N25-第十周博客作业
N25-第十周博客作业

启动成功,至此centos7的自动化安装光盘制作完成
补充: 经测试分区格式为xfs也是可以的

[root@localhost ~]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda3      xfs        92G  847M   91G   1% /
devtmpfs       devtmpfs  480M     0  480M   0% /dev
tmpfs          tmpfs     489M     0  489M   0% /dev/shm
tmpfs          tmpfs     489M  6.7M  483M   2% /run
tmpfs          tmpfs     489M     0  489M   0% /sys/fs/cgroup
/dev/sda1      xfs       997M  126M  872M  13% /boot
tmpfs          tmpfs      98M     0   98M   0% /run/user/0

4、写一个脚本

(1) 能接受四个参数:start, stop, restart, status
start: 输出“starting 脚本名 finished.”

(2) 其它任意参数,均报错退出;

#!/bin/bash
# description : testservice

case $1 in
start)
        echo "start $0 finished."
        ;;
stop)
        echo "stop $0 finished."
        ;;
restart)
        echo "restart $0 restarted."
        ;;
status)
        echo "$0 status."
        ;;
*)
        echo "参数错误"
        exit 1
esac

5、写一个脚本,判断给定的用户是否登录了当前系统;

(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;

#!/bin/bash
#description: 判断给定用户是否登录了系统
#author: han

while true;do
        if who | grep $1 &> /dev/null;then
                echo "$1 is logging."
                exit 0
        fi
        sleep 3
done

6、写一个脚本,显示用户选定要查看的信息;

cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;

#!/bin/bash
#descripton:查看系统信息
#author: han

cat <<EOF
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
EOF
echo
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)
                exit 1
                ;;
        *)
                echo "argument error, please input your choice"
                read -p "please input your choice: " choice
                ;;
        esac

done
测试: 
[root@lab3 scripts]# bash info.sh
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit

please input your choice: ddd
argument error, please input your choice
please input your choice: mem
              total        used        free      shared  buff/cache   available
Mem:            977         168          67          11         742         625
Swap:           999           2         997

7、写一个脚本

(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
(2) 提示用户输入一个用户名或输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;
进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:

#!/bin/bash
#description: 持续显示用户信息

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

测试: 
[root@node1 scripts]# bash user.sh
please input one username or quit: root
0:/bin/bash
please input one username or quit: nginx
987:/bin/bash
please input one username or quit: ddd
No such user.
please input one username or quit: quit

原创文章,作者:hansj,如若转载,请注明出处:http://www.178linux.com/71681

(0)
hansjhansj
上一篇 2017-03-25
下一篇 2017-03-26

相关推荐

  • LVM基础

    逻辑卷的原理 逻辑卷的组成上包括物理卷,逻辑组,逻辑卷 物理卷即是磁盘分区或者块设备经过转换以后形成的抽象的逻辑设备 逻辑组即是将物理卷进行统一打包,合成一个更大的逻辑上的分区 逻辑卷是在逻辑组的基础上细分的课动态调节的虚拟磁盘分 其工作原理是通过某种机制将物理上的块设备或者分区抽象的进行封装,然后以逻辑卷的方式统一呈现给 上层的应用 逻辑卷的操作 一:创建…

    2017-05-01
  • CentOS7下的网络配置管理

    一、让配置永久有效的办法:修改配置文件 与网卡相关(课配置网卡的IP,掩码,网关,DNS)     /etc/sysconfig/network-scripts/ifcfg-INTERFACE 字段解释: TYPE        &nbsp…

    Linux干货 2016-03-28
  • 第五周作业

    1、显示当前系统上root、fedora或user1用户的默认shell; [root@localhost ~]# awk -F: '/^(root|user1|fedora)/{print $1,"shell is",$NF}' /etc/pass…

    Linux干货 2016-09-15
  • 系统启动和内核管理

    Linux组成 Linux:kernel+rootfs kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能 rootfs:程序和glibc 库:函数集合,function,调用接口(头文件负责描述) 过程调用:procedure,无返回值; 函数调用:function;有返回值,可以赋值于变量中; 程序:二进制执行文件 包括根目录以及包…

    Linux干货 2017-05-14
  • 系统时间与硬件时间

    1. “系统时间”与“硬件时间”    系统时间: 一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。    硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根…

    Linux干货 2016-08-05
  • LAMP的编译安装

    一、编译安装amp: (1)系统环境:centos6,7 httpd依赖于apr和apr-util appache protable runtime (2)开发环境: Development Tools,Server Platform Development (3)各程序的版本: httpd:2.2,2.4 php:5.x mysql:5.1,5.5,5.6…

    Linux干货 2016-10-17

评论列表(1条)

  • 马哥教育
    马哥教育 2017-03-30 14:01

    写的非常非常好,思路和行文清晰流畅,继续加油,看好你。