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

相关推荐

  • RAID概述

    1、引言 RAID全称Redundant Arrays of Inexpensive Disks / Redundant Arrays of Independent Disks,即独立冗余磁盘阵列。RAID可以通过相关技术(软件/硬件),将多个较小的磁盘整合成为一个较大的磁盘整体,而且能从某些方面提高数据的读写及数据保护。RAID分为不同…

    Linux干货 2016-12-24
  • Linux Service and Security(Part 2)

    接PART 1 4、SSH端口转发:SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据。但是,SSH还能够将其它TCP端口的网络数据通过SSH链接来转发,并且自动提供了相应的加密及解密服务,这一过程也被叫做“隧道(tunneling)”。telnet,SMTP,LDAP这些TCP应用均能够从中得益,避免了用户名、密码以及隐私信息的明文传输。同时,如…

    Linux干货 2016-10-09
  • Mogilefs使用Nginx实现代理访问

    MogileFS介绍:  MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的DangaInteracitve公司研发。可支持文件自动备非的功能,提供高可用性和高可扩展性。 MogileFS组件:  trackers:   MoglieFS的调度器,是mogileFS的核心,访问入口。  功能…

    Linux干货 2015-08-06
  • Linux中的分区管理

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

    2017-04-22
  • 德摩根定律

     德摩根定律: 非(P且Q) = (非P) 或 (非Q) 非(P或Q) = (非P) 且 (非Q) 德·摩根定律在数理逻辑的定理推演中,在计算机的逻辑设计中以及数学的集合运算中都起着重要的作用。他的发现影响了乔治·布尔从事的逻辑问题代数解法的研究。这巩固了德摩根作为该规律的发现者的地位,尽管亚里士多德也曾注意到类似现象,且这也为古希腊与中世纪的逻辑…

    Linux干货 2016-08-15
  • 第15天:脚本关键字,函数

    http://note.youdao.com/noteshare?id=2ea9bcdf745a47bf65f0cef6e706ccaf

    Linux干货 2016-09-06

评论列表(1条)

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

    非常非常详细,很棒。