第十周作业

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

    CentOS系统启动流程:

    1.加电自检:由bios去检测各硬件是否存在且是否正常运行,然后进行硬件初始化

    2.选择启动顺序,加载mbr:根据bios设置的设备启动顺序,找到第一个安装有bootloader的设备进行启动,bootloader去识别加载操作系统中的核心文件,并提交到内存中运行,进而来启动相对应的操作系统

        由于bootloader处于mbr中,而mbr只有446bytes用来存储bootloader,而446bytes无法容纳下bootloader,因此linux将bootloader运行和加载分成三个阶段:

        stage1:运行bootloader主程序,这个程序必须要被安装在启动区,即MBR中。因为mbr空间有限,因此在mbr当中仅安装bootloader的最小主程序,并没有安装bootloader的相关配置文件

        stage1.5:在mbr随后的扇区中存放,主要用于与stage2所在的分区的文件系统进行交互。

        stage2:通过bootloader加载所有配置文件及相关的环境参数信息,这些配置文件及相关的环境参数都存放于磁盘分区上的/boot目录下。

    3.加载系统内核,执行系统初始化信息:bootloader加载内核和initrd,然后在内存中让initrd解压缩成根目录,然后内核可以在这个虚拟的根文件系统之上加载合适的驱动程序,来加载硬盘等设备,之后释放虚拟的根文件系统,并以只读的方式挂载磁盘上的真实的根文件系统,之后就开始正常的启动过程

    4.启动用户空间第一个执行程序/sbin/init:init主要功能是准备软件运行环境,包括系统的主机名称,网络配置、文件系统格式等其他服务的启动管理

        init是通过自上而下读取inittab文件来依次执行的,因此init的处理流程是:

        1、读取默认的runlevel,

        2、使用/etc/rc/d/rc.sysinit进行系统初始化。

            (1)根据配置文件中的设定来设定主机名(读取/etc/sysconfig/network文件中的HOSTNAME进行)

            (2)打印文本欢迎信息;

            (3)激活SELinux和udev;

            (4)挂在所有定义在/etc/fstab文件中的文件系统

            (5)激活swap设备

            (6)检测根文件系统,并实现以读写方式重新挂载;

            (7)设置系统时钟

            (8)更具/etc/sysctl.conf文件设定内核参数的值

            (9)激活LVM和RAID设备

            (10)加载额外的设备启动

            (11)清理操作

        3、由于采用的的是3级别,因此只进行l3:3:wait:/etc/rc.d/rc 3,其他的则忽略

        4、配置好ctrl+alt+del组合件的功能

        5、配置不断电系统pf、pr两种机制

        6、启动mingetty 6个终端

        7、如果是5级别,则会以/etc/X11/prefdm-nodaemon启动图形化界面

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

首先为虚拟机添加一块硬盘。

[root@localhost ~]# fdisk -l                             #查看硬盘设备

Disk /dev/sda: 128.8 GB, 128849018880 bytes
255 heads, 63 sectors/track, 15665 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000eb0a4

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        2637    20971520   83  Linux
/dev/sda3            2637        5248    20971520   83  Linux
/dev/sda4            5248       15666    83680256    5  Extended
/dev/sda5            5248        5509     2097152   82  Linux swap / Solaris

Disk /dev/sdb: 42.9 GB, 42949672960 bytes                    #/dev/sdb为新添加的设备
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x272777ca

   Device Boot      Start         End      Blocks   Id  System
[root@localhost ~]# fdisk /dev/sdb                            #对/dev/sdb进行分区  sdb1 200M sdb2 5G sdb3 2G

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-5221, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-5221, default 5221): +200M             

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (27-5221, default 27): 
Using default value 27
Last cylinder, +cylinders or +size{K,M,G} (27-5221, default 5221): +5G

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (681-5221, default 681): +2G
Value out of range.
First cylinder (681-5221, default 681): 
Using default value 681
Last cylinder, +cylinders or +size{K,M,G} (681-5221, default 5221): +2G

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partx -a /dev/sdb
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
BLKPG: Device or resource busy
error adding partition 3
[root@localhost ~]# mke2fs -t ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
52208 inodes, 208812 blocks
10440 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=67371008
26 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks: 
    8193, 24577, 40961, 57345, 73729, 204801

正在写入inode表: 完成                            
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@localhost ~]# mke2fs -t ext4 /dev/sdb2
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
328656 inodes, 1313313 blocks
65665 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1346371584
41 block groups
32768 blocks per group, 32768 fragments per group
8016 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736

正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@localhost ~]# mkswap /dev/sdb3
Setting up swapspace version 1, size = 2104508 KiB
no label, UUID=7c8961cc-2b83-4b2c-9774-89cf4145d2f9

[root@localhost ~]# mkdir /mnt/{boot,rootfs}                  #在mnt下创建 boot 和 rootfs 目录
[root@localhost ~]# mount /dev/sdb1 /mnt/boot                 #将sdb1挂载到 boot 目录下
[root@localhost ~]# mount /dev/sdb2 /mnt/rootfs               #将sdb2挂载到 rootfs 目录下
[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb       #安装grub到/mnt,grub会自动寻找/mnt目录并安装grub。
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@localhost ~]# cp /boot/vmlinuz-2.6.32-696.el6.x86_64 /mnt/boot/vmlinuz              #grub安装完成但boot目录下没有内核以及initrd文件需手动复制当前主机的内核及initrd至boot目录
[root@localhost ~]# cp /boot/initramfs-2.6.32-696.el6.x86_64.img /mnt/boot/initramfs.img
[root@localhost ~]# vim /mnt/boot/grub/grub.conf             #新安装的grub没有配置文件需要手动创建grub.conf的配置文件

default=0
timeout=5
title centos6
        root (hd0,0)
        kernel /vmlinuz selinux=0 ro root=/dev/sda2 init=/bin/bash    #由于启动时第一个程序是bash,所以需要指定init为/bin/bash
        initrd /initramfs.img


[root@localhost ~]# mkdir -p /mnt/rootfs/{root,bin,sbin,lib,lib64,var,proc,sys,tmp,media,home,etc,dev}   #为根目录创建各子目录
[root@localhost ~]# ldd /bin/bash                                         #查找bash,ls,cat的依赖关系,并复制各依赖的文件至相对应的目录下
  linux-vdso.so.1 =>  (0x00007ffe711e9000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003cf4a00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003cec600000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003ceca00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003cec200000)
[root@localhost ~]# cd /mnt/rootfs/lib64
[root@localhost lib64]# cp /lib64/libtinfo.so.5 .
[root@localhost lib64]# cp /lib64/libdl.so.2 .
[root@localhost lib64]# cp /lib64/libc.so.6 .
[root@localhost lib64]# cp /lib64/ld-linux-x86-64.so.2 .
[root@localhost lib64]# ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff5d726000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003cee200000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003ced200000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003cf9e00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x0000003cf7a00000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003ceca00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003cec600000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003cec200000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003cece00000)
    libattr.so.1 => /lib64/libattr.so.1 (0x0000003cfc200000)
[root@localhost lib64]# cp /lib64/libse
libselinux.so.1   libsemanage.so.1  libsepol.so.1     
[root@localhost lib64]# cp /lib64/libselinux.so.1 .
[root@localhost lib64]# cp /lib64/librt.so.1 .
[root@localhost lib64]# cp /lib64/libcap.so.2 .
[root@localhost lib64]# cp /lib64/libacl.so.1 .
[root@localhost lib64]# cp /lib64/libpthread.so.0 .
[root@localhost lib64]# cp /lib64/libattr.so.1 .
[root@localhost lib64]# ldd /bin/cat
    linux-vdso.so.1 =>  (0x00007fffbcd6c000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003ceca00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003cec200000)
[root@localhost ~]# cp /bin/bash /mnt/rootfs/bin
[root@localhost ~]# cp /bin/cat /mnt/rootfs/bin
[root@localhost ~]# cp /bin/ls /mnt/rootfs/bin

[root@localhost ~]# chroot /mnt/rootfs                   #切换根进行测试
bash-4.1# ls
bin  dev  etc  home  lib  lib64  lost+found  media  proc  root  sbin  sys  tmp  var

以上步骤结束后就可以将新添加的硬盘装到新的虚拟机上进行运行。

第十周作业第十周作业


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

kickstart文件可以管理员根目录下的anaconda-ks.cfg文件为模板进行修改,也可以使用system-config-kickstart工具进行制作

以下为使用system-config-kickstart工具制作kickstart文件:

    1.配置默认语言、键盘、时区以及root密码

第十周作业

    2、配置安装方法,可以使用网络镜像的方法进行安装

第十周作业

    3、配置grub相关的设置

第十周作业

    4、分区的设置,此处注意布局分区大小时所有分区的总和一定不要超过硬盘总大小,否则自动引导会失败

第十周作业

    5、由于使用的是网络镜像的安装方法,此处网络的配置是必须的。

第十周作业

    6、验证相关、

第十周作业

    7、防火墙相关的配置,此处可根据情况使用激活或者禁用

第十周作业

    8、图形界面配置、可安装也可不安装

第十周作业

    9、选择软件包的安装

第十周作业

    10、此处可以配置安装前的脚本

第十周作业

    11、在此处可以进行安装后脚本的配置

第十周作业

以上设置全部完成后进行保存。

手动编辑ks文件,将repo这行的baseurl改为阿里云

repo --name="CentOS" --baseurl="http://mirrors.aliyun.com/centos/6.9/os/x86_64/" --cost=100

现在ks文件有了,可以进行制作引导镜像了

首先将CenOS光盘镜像挂载上将其中的的ioslinux目录及目录下的文件复制出一份至/tmp/myboot目录内

[root@localhost ~]# mount /dev/sr0 /mnt
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# mkdir /tmp/myboot
[root@localhost ~]# cp -a /mnt/isolinux/ /tmp/myboot/

将制作好的ks文件放到myboot目录中

[root@localhost ~]# cp ks.cfg /tmp/myboot/
[root@localhost ~]# cd /tmp/myboot/
[root@localhost myboot]# ls
isolinux  ks.cfg

现在需要修改isolinux中的isolinux.conf这个配置文件。

[root@localhost isolinux]# chmod +w isolinux.cfg 
[root@localhost isolinux]# vim isolinux.cfg


timeout 600

display boot.msg

menu background splash.jpg
menu title Welcome to CentOS 6.9!
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
menu color scrollbar 0 #ffffffff #00000000

label linux
  menu label ^Install or upgrade an existing system
  menu default
  kernel vmlinuz
  append initrd=initrd.img ks=cdrom:/ks.cfg    #在此处添加ks=cdrom:/ks.cfg  由于ks文件已经配置网卡以及网络此处只需要给出ks文件路径就可以,如果没有dhcp服务,此处需要手动指定,指定方法ip=xxx.xxx.xxx.xxx netmast=xxx.xxx.xxx.xxx gateway=xxx.xxx.xxx.xxx

以上全部完成后需要用mkisofs命令进行制作 iso文件,使用mkisofs命令制作iso文件时,工作目录必须要在myboot目录之外

[root@localhost tmp]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "centos 6 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /tmp/boot.iso myboot/
I: -input-charset not specified, using utf-8 (detected in locale settings)
genisoimage 1.1.9 (Linux)
Scanning myboot/
Scanning myboot/isolinux
Excluded: myboot/isolinux/TRANS.TBL
Excluded by match: myboot/isolinux/boot.cat
Writing:   Initial Padblock                        Start Block 0
Done with: Initial Padblock                        Block(s)    16
Writing:   Primary Volume Descriptor               Start Block 16
Done with: Primary Volume Descriptor               Block(s)    1
Writing:   Eltorito Volume Descriptor              Start Block 17
Size of boot image is 4 sectors -> No emulation
Done with: Eltorito Volume Descriptor              Block(s)    1
Writing:   Joliet Volume Descriptor                Start Block 18
Done with: Joliet Volume Descriptor                Block(s)    1
Writing:   End Volume Descriptor                   Start Block 19
Done with: End Volume Descriptor                   Block(s)    1
Writing:   Version block                           Start Block 20
Done with: Version block                           Block(s)    1
Writing:   Path table                              Start Block 21
Done with: Path table                              Block(s)    4
Writing:   Joliet path table                       Start Block 25
Done with: Joliet path table                       Block(s)    4
Writing:   Directory tree                          Start Block 29
Done with: Directory tree                          Block(s)    2
Writing:   Joliet directory tree                   Start Block 31
Done with: Joliet directory tree                   Block(s)    2
Writing:   Directory tree cleanup                  Start Block 33
Done with: Directory tree cleanup                  Block(s)    0
Writing:   Extension record                        Start Block 33
Done with: Extension record                        Block(s)    1
Writing:   The File(s)                             Start Block 34
 21.94% done, estimate finish Tue Aug  8 13:10:21 2017
 43.79% done, estimate finish Tue Aug  8 13:10:21 2017
 65.71% done, estimate finish Tue Aug  8 13:10:21 2017
 87.57% done, estimate finish Tue Aug  8 13:10:21 2017
Total translation table size: 4701
Total rockridge attributes bytes: 1438
Total directory bytes: 2654
Path table size(bytes): 26
Done with: The File(s)                             Block(s)    22659
Writing:   Ending Padblock                         Start Block 22693
Done with: Ending Padblock                         Block(s)    150
Max brk space used 0
22843 extents written (44 MB)

至此引导镜像文件制作完成。

测试:

第十周作业第十周作业

引导光盘可以正常使用

4、写一个脚本
  (1) 能接受四个参数:start, stop, restart, status
   start: 输出“starting 脚本名 finished.”
   …
  (2) 其它任意参数,均报错退出;

#!/bin/bash
# testsrv       service testing script
#
# chkconfig:    2345 50 60
# discrption: test
#
#
prog=$(basename $0)

if [ $# -lt 1 ];then
        echo "usage:$prog {start|stop|restart|status}"
        exit 1
fi

if [ $1 == start ];then
        echo "starting $prog finished"
elif [ $1 == stop ];then
        echo "stopping $prog finished"
elif [ $1 == restart ];then
        echo "restart $prog finished"
elif [ $1 == status ];then
        if pidof $prog &> /dev/null;then
                echo "$prog is running"
        else
                echo "$prog is stopped"
        fi
else
        echo "usage:$prog {start|stop|restart|status}"
        exit 2
fi

把次脚本复制到/etc/rc.d/init.d 下

然后执行 chkconfig –add SCRIPTNAME

服务就开启了。

5、写一个脚本,判断给定的用户是否登录了当前系统;
  (1) 如果登录了,则显示用户登录,脚本终止;
  (2) 每3秒钟,查看一次用户是否登录;

#!/bin/bash
read -p "send a username:" UNAME
while true ;do
        if who | grep "$UNAME" > /dev/null ;then
                break
        fi
        sleep 3
done

6、写一个脚本,显示用户选定要查看的信息;
   cpu) display cpu info
   mem) display memory info
   disk) display disk info
   quit) quit
   非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;

cat << eof
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
eof

while true; do
        read PARA
        if [ $PARA == cpu ];then
                lscpu
                break
        elif [ $PARA == mem ];then
                free
                break
        elif [ $PARA == disk ];then
                fdisk -l
                break
        elif [ $PARA == quit ];then
                break
        else
                echo "need a right choose"
        fi
done

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

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

(0)
M36-MasuriM36-Masuri
上一篇 2017-07-03
下一篇 2017-07-03

相关推荐

  • 编译安装httpd

    编译安装httpd   1 去官网下载源码包                                      为避免非法软件,一定要去官网下载http…

    2017-04-24
  • Tomcat基于MSM+Memcached实现Session共享

    前言 在Tomcat集群中,当一个节点出现故障,其他节点该如何接管故障节点的Session信息呢?本文带来的解决方案是基于MSM+Memcached实现Session共享。 相关介绍 MSM MSM–Memcached Session Manager是一个高可用的Tomcat Session共享解决方案,除了可以从本机内存快速读取Session信…

    Linux干货 2015-07-03
  • python 常用记录

    all() >>> a = [11,22,33] >>> all(a) >>> ture 对序列进行判断,如果全为真,则返回Ture >>> a = [11,22,0] >>> a…

    Linux干货 2016-09-19
  • 运行级别

    运行级别(Runlevel)指的是Unix或者Linux等类Unix操作系统下不同的运行模式。运行级别通常分为7等,分别是从0到6,但如果必要的话也可以更多。 例如在大多数Linux操作系统下一共有如下7个典型的运行级别: 0 停机,关机 1 单用户,无网络连接,不运行守护进程,不允许非超级用户登录 2 多用户,无网络连接,不运行守护进程 3 多用户,正常启…

    Linux干货 2017-07-10
  • 日志收集工具EFK之fluent部署手稿

    Edit EFK fluent部署安装 1. 环境介绍 Centos 6.5 64bit 2. 安装 td-agent介绍 fluent 考虑到灵活可扩展性,使用Ruby编写,部分功能考虑性能使用C语言编写。普通用户安装操作Ruby daemon还是有一定难度的。考虑到flunt的上手难度, fluent专门发布了稳定发布包,就也是所谓的td-agent. …

    Linux干货 2016-03-24
  • 简述计算机网络中的物理层

          简要说明物理层在网络传输中做了哪些工作解决的问题      物理层是计算机网络OSI模型中最低的一层。物理层规定:为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,功能的和规范的特性。简单的说,物理层确保原始的数据比特流可在各种物理媒体上传输。使得…

    Linux干货 2017-05-08