N25_第十周作业

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

POST –> BootSequence(BIOS) –>Bootloader(MBR) –>Kernel(ramdisk)–>rootfs(readonly)–>switchroot–>/sbin/init(设置默认运行级别–>运行系统初始化脚本,完成系统初始化–>关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务–>设置登陆终端[启动图形界面])

1)加电自检(POST),BIOS启动引导阶段;

     在该过程中实现硬件的初始化以及查找启动介质;

     从MBR中装载启动引导管理器(GRUB)并运行该启动引导管理;

     MBR才512bytes,所以现在很多都用UEFI,GPT方式咯

2)GRUB(Grand Uniform Bootloader)启动引导阶段;

   功能:提供一个菜单,允许用户要选择启动的不同系统或内核版本,把其内核加载到RAM中的特定空间,解压、展开,让后控制权移交给kernel

     装载stage1

     装载stage1.5

     装载stage2(因为MBR很小,所以这里没有限制哦)

     读取/boot/grub.conf文件并显示启动菜单;

     装载所选的kernel和initrd文件到内存中

  PS:LILO:支持柱面1024,现在基本都用在android手机,不用再PC机了

3)内核阶段:

    探测可识别到所有硬件设备

    加载各种硬件驱动程序;(有可能会借助于randisk加载驱动)

    以只读方式挂载根文件系统

    运行用户空间的第一个应用程序:/sbin/init

 ps: ramdisk:Linux 内核特性之一:使用缓冲和缓存来加速对磁盘上的文件访问:

ramdisk –> ramfs

initramfs — dracut,mkinitrd (CenetOS6,7

4)init用户空间初始化阶段:

     启动/sbin/init程序;

     运行rc.sysinit脚本,设置系统环境,启动swap分区,检查和挂载文件系统;

     读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本;

     打开字符终端1-6号控制台/打开图形显示管理,设置登录

   

  init程序:

CentOS 5 : /ect/inittab

CentOS 6 :Upstart

  /etc/inittab:这个文件已废

  /etc/init/*.conf,

CentOS 7 : systemd

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


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

  (1) 为硬盘新建两个主分区;并为其安装grub;

  (2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;

  (3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;

  (4) 为grub提供配置文件;

  (5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

    功能:在其他系统上制作一个完整的grub引导系统,并且能跑起来!!

    在虚拟机中另外添加磁盘,fdisk /dev/sdb  # 创建三个分区,boot,/,swap

    ~]#partx -a /dev/sdb

    ~]#mke2fs -t ext4 /dev/sdb1

    ~]#mke2fs -t ext4 /dev/sdb3

    ~]#mkswap /dev/sdb2

    注意:这个在centos7没有做成功,centos6可以的

    注意:安装grub引导时,必须要指定boot的,不能用当前系统

    ~]#mkdir /mnt/boot

    ~]#mount /dev/sdb1  /mnt/boot/

    安装grub

    ~]#grub-install –root-directory=/mnt  /dev/sdb   ;指定根在什么地方,不能写到/mnt/boot

    ~]#cd /mnt/boot ;有了第一阶段和第二阶段的文件,还差,配置文件、内核和rootfs

    ~]#cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz

    ~]#cp /boot/initramfs-2.6.32-431.el6.x86_64.img   /mnt/boot/initramfs.img

    ~]#vim /mnt/boot/grub/grub.conf ; 注意,下列信息 是配置后单独分系统使用的,所以,sda,不是sdb

    default=0

    timeout=5

    title CentOS (smile)

            root (hd0,0)

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

            initrd /initramfs.img

    mkdir /mnt/sysroot

    mount /dev/sdb3 /mnt/sysroot

    cd /mnt/sysroot

    mkdir -pv  etc bin sbin lib lib64 usr home tmp mnt var proc root

    cp /bin/bash  /mnt/sysroot/bin

    ldd /bin/bash | grep "/lib[^[:space:]]*"  ;获取这个命令依赖的库文件

    注意:这里调用我写的一个脚本,复制命令以及相关的依赖库文件

    

    #!/bin/bash

    #

    #Athor:smile

    #Date:2017-1-22

    #Filename: copy_Command_Lib.sh

    #Pragram:

    #

    #  Copy enter "command" and "libraries" file

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    export PATH

     

    #指定的根路径

    dir_path=/mnt/sysroot/  

     

    # 传递给函数可执行命令,复制命令程序和依赖库文件到指定目录 ,并且取掉绝对路径

    f_copy_com_lib() {

     command_path=$(which  –skip-alias "$1" ) #命令取绝对路径

     temp_dir=${command_path#*/} # 取掉绝对路径/

     temp_dir=${temp_dir%/*} # 取掉后面的文件文件名

     mkdir -p $dir_path$temp_dir # 创建/mnt/sysroot下对应的的目录

     cp -rf $command_path  $dir_path$temp_dir

     

    #获取命令路径要注意两个问题:第一个要避开which查出结果有alias别名问题, which COM | grep -v "alias" 除去别名

     #第一步,查出命令路径,第二步,去掉alias,第三步,查出命令所以来的库,第四步,获取库的准确路径

     for lib_file in $( ldd $(which –skip-alias  "$1"  ) | grep -o "/lib[^[:space:]]*") ; do

     temp_dir=${lib_file#*/} #取掉绝对路径 ${string#*word}

     temp_dir=${temp_dir%/*} #去掉基名

     mkdir -p $dir_path$temp_dir #创建一个库文件的路径

     cp -rf $lib_file   $dir_path$temp_dir  #复制库文件到指定的目录中

     #echo "${a_library[$i]}" #let i++

     echo "$lib_file"

     echo

     done

    }

     

    while true ; do

     

    cat << EOF

    +++++++++++++++++++++++++++++++++++++++++++++++++

    command)Please enter the system existing  command

    quit) quit script

    +++++++++++++++++++++++++++++++++++++++++++++++++

    EOF

     

     read -p "Please enter existing command:" v_command

     if [ $v_command == "quit" ] ; then

     break

     fi

     #如果输入的不存在的命令,处理

     if ! ( which $v_command &>/dev/null ) ; then

     echo "ERROR:command not found!"

     continue # 进行下一次循环

     fi

     f_copy_com_lib  $v_command

     

    done

    cp ….

    chroot  /mnt/sysroot   ;切换根命令 ,进行测试

    exit

    sync   ;同步到磁盘

    第二步:

    创建新的虚拟机,加载配置好的分区

blob.png

如果需要啊添加虚拟机的话,就能就在grub中添加引导记录
mount /dev/sdb1   /mnt/boot

blob.png

blob.png

blob.png

blob.png


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

制作kickstart文件,我目前我喜欢去安装一个文件系统,等系统安装好了,在/root/anaconda-ks.cfg下获取,再来针对改一改(自己能力弱吧,也可以在网上获取的,CentOS6和CentOS7产生的kickstart文件还是有点不一样,不过CentOS应该可以兼容的)

kickstart文件的模板

命令段

指定各种安装前配置选项,如键盘类型

必备命令

可选命令

程序段

指明要安装程序包,以及包组,也包括不安装的包

%packages ;程序包开始了

@group_name

package

-package  ;指定不要的程序包

程序包

%end

脚本段

%pre:安装前脚本

运行环境:运行安装介质微型linux系统环境

%end

%post:安装后脚本

运行环境:安装后的运行环境

%end

有多种方式自动话实现安装,引导光盘中,http和ftp网络上,

用光盘下的最小引导系统单独做成关盘镜像:

~]# cp -rf  /media/isolinux   /mnt/myiso

~]# cp   myks.cfg  /mnt/myiso

mnt]# mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V "CentOS 6.5 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/

#创建时,把制作好的myks.cfg文件 放在myiso目录下,并且和isolinux目录同一个

怎加载ks.cfg文件

boot:linux ip=192.168.10.19  netmask=255.255.255.0  ks=http://192.168.10.100/ks.cfg  ;前面的ip地址是配置当前主机的地址

boot: linux ks=cdrom:/path/to/ks_file


kickstart文件中各个字段的解读:

authconfig:认证方式配置

authconfig –enableshadow –passalgo=sha512

bootloader:定义bootloader的安装位置及相关配置

bootloader –location=mbr –driveorder=sda –append="crashkernel=auto rhgb quiet"

keyboard us 

lang:语言类型

part:分区

part /boot –fstype=ext4 –size=500

part pv.008002  –size=51200

clearpart:清除分区

   clearpart –none –drives=sda;清空磁盘分区

 volgroup:创建卷组

    volgroup myvg  –pesize=4096 pv.008002

 

 logvol:创建逻辑卷

  logvol /home –fstype=ext4 –name=lv_home –vgname=myvg –size=4122


rootpw:管理员密码

rootpw –iscrypted $llll

生成密码的方式:

~]#openssl passwd -1 -salt `openssl rand -hex4` 

timezone:时区

timezone Asia/Shanghai

可选命令

install OR upgrade:安装或升级

text:安装界面类型,text为tui,默认是gui

network:配置网络接口

network –noboot yes –device eth0 –bootproto dhcp  –noipv6 

防火墙:firewall  –server=ssh 

firewall –disabled

selinux :SELinux(内核安全机制

selinux  disabled

  halt,poweroff 或者reboot,安装后的行为

  repo:指明安装时使用的repository

  repo –name="CentOS" –baseurl=cdrom:sr0  –cost=100 ;cost是开销,默认是1000,这里比较优先 

  url:指明安装时使用的 repository ,但为url格式

  url –url=http://192.168.10.102/cobbler/ks_mirror/CentOS-7.0-x86_64/


4、写一个脚本

  (1) 能接受四个参数:start, stop, restart, status

   start: 输出“starting 脚本名 finished.”

   …

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

blob.png

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

  (1) 如果登录了,则显示用户登录,脚本终止;

  (2) 每3秒钟,查看一次用户是否登录;

blob.png

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

   cpu) display cpu info

   mem) display memory info

   disk) display disk info

   quit) quit

   非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;

blob.png

blob.png

7、写一个脚本

  (1) 用函数实现返回一个用户的和SHELL;用户名通过参数传递而来;

  (2) 提示用户输入一个用户名或输入“quit”退出;

    当输入的是用户名,则调用函数显示用户信息;

    当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit: 

blob.png

blob.png

原创文章,作者:不忘初衷,如若转载,请注明出处:http://www.178linux.com/67426

(0)
不忘初衷不忘初衷
上一篇 2017-02-14
下一篇 2017-02-14

相关推荐

  • 9.脚本练习

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现;  declare -a shell     declare sum_login=0     declare sum_nologin=0     shell=($(cat /etc/pass…

    2017-09-20
  • 2016-10-17作业

    1 生产环境发现一台服务器系统时间产生偏差,造成服务异常,请帮忙校正。 答:hwclock -s 2 生产有一个数据同步脚本需要执行很长时间,怎样做到无人值守,在管理工具退出的情况下,脚本依然能正常运行。 答:screen -S work  进去后开始做工作,暂时离开时可使用 ctrl+a,d 剥离当前会话。 3 Linux系统中命令共分为内建命令…

    Linux干货 2016-10-18
  • linux基础操作-week6

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; # cp /etc/rc.d/rc.sysinit /tmp #vim /tmp/rc.sysinit 末行模式: :%s@^[[:space:]]\{1,\}@#&@g 匹配分析:  &nbs…

    Linux干货 2016-11-28
  • Linxu系统的启动过程

    Linxu系统的启动过程 启动流程 1、引导Linux启动是从BIOS中的地址0xFFFF0处开始的,BIOS由两部分组成:POST代码和运行时服务,运行时服务是为操作系统提供一些接口,如温度检测等。 BIOS的第一个步骤是加电自检(POST),完成对硬件的的检测,如某些硬件出现错误无法通过检测就导致系统无法启动,POST完成之后将被清出内存; BIOS的第…

    Linux干货 2016-09-13
  • 基于heartbeat v1+ldirectord实现LVS集群高可用

    前言 高可用集群,High Availability Cluster,简称HA Cluster,是指以减少服务中断时间为目的的服务器集群技术。通过上文可以看出,LVS集群本身并不能实现高可用,比如Director Server不能检测Real Server的健康度,一旦其中一台或全部Real Server宕机,Director Server还会继续转发请求,…

    Linux干货 2015-06-08
  • Linux作业管理和并发执行

    概述 本章将为大家介绍一些进程管理的补充部分作业管理和任务的并发执行,同时也将介绍一下Linux系统上计划任务的相关内容,具体分为:1、Linux作业管理2、任务的并发执行 第一章 Linxu作业管理 1、前台作业和后台作业    前台作业:通过中断启动,且启动后一直占据终端    后台作业:可通过终端启动,但启动后即…

    Linux干货 2016-09-28

评论列表(1条)

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

    非常非常详细,很棒。