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 15:02
下一篇 2017-02-14 16:04

相关推荐

  • vim文本编辑器和sed用法汇总

    1. Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进 和增加了很多特性。 VIM是纯粹的自由软件。 2. vim的三种工作模式: (1) 编辑模式:也叫命令模式,可以执行个各种快捷键的命令 (2) 插入模式:在文本文件中可以直接输入内容。 (3) 末行模式:红帽官方叫扩展命令行模式vim内置命令行接口  注:vi…

    Linux干货 2016-08-12
  • PHP中引用的详解(引用计数、写时拷贝)

    《PHP5中文手册》内容中"引用的解释"一文的摘要: 1. PHP中引用的特性 PHP中引用意味着用不同的名字访问同一个变量内容,引用不是C的指针(C语言中的指针里面存储的是变量的内容,在内存中存放的地址),是变量的另外一个别名或者映射。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Uni…

    Linux干货 2015-04-10
  • N25期–第七周作业

    1、创建一个10G分区,并格式为ext4文件系统; fdisk /dev/sda n p 2 enter +10G w partx -a /dev/sda (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl; mke2fs -t ext4 -…

    Linux干货 2017-02-20
  • Linux上glob用于实现文件名的通配、IO重定向及管道

    Linux中所谓的通配是指,显示以指定条件为条件的文件;即通配的含义是指搜寻以已知条件为前提的目标文件。 常用文件通配符有: 文件通配符 含义 例子 * 任意长度的任意字符 如a*,搜寻所有以a为首的文件名的文件 ? 任意的单一字符 如a?,搜索所有的以a开头的两个字符的文件名的文件 [] 匹配指定范围内的任意的单个字符 如[a-z],匹配任意单个字母(不区…

    Linux干货 2017-04-04
  • 马哥教育网络班21期+第8周课程练习

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 集线器的主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。它工作于OSI(开放系统互联参考模型)参考模型第一层,即“物理层”。 网桥将两个相似的网络连接起来,并对网络数据的流通进行管理。它工作于数据链路层,不但能扩展网络的距离…

    Linux干货 2016-09-19
  • 如何在微软Azure云机上添加新磁盘

    大家好: 最近在项目实践中,分享下如何在微软Azure云机上添加新磁盘。 首先需要查看下是否有未用上的磁盘,先fdisk -l查(看下图)并和Azure技术确认该磁盘是否可永久保存数据: 然后找到未分区的磁盘号,如上图中的/dev/sdc,再 fdisk /dev/sdc后开始在该新磁盘上进行分区创建: 为方便管理,我们一般就创建一个分区,然后进行格式化: …

    Linux干货 2016-11-27

评论列表(1条)

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

    非常非常详细,很棒。