第十周

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

1.POST 开机加电自检,对计算机的cpu,硬盘,内存等进行检测。
   2.BIOS 对引导程序进行探测,并把控制权交给引导程序。
   3.MBR  Master bootloader record主引导程序.通常位于硬盘第一扇区/dev/hda(0,0)或/dev/sda(0,0).
     此阶段分三阶段
     a.启动bootloader 
     b.1.5 stage 识别 grub所在磁盘分区
     c.加载grub
   4.grub 加载 kernel,而后把控制权交给kernel.
   5.kernel自身初始化,加载驱动程序,此过程有可能会借助与ramdisk临时根文件系统加载硬件驱动程序,进而
     加载真正的根文件系统,然后进行根系统的切换,以只读方式挂在根文件系统。
   6.执行/sbin/init脚本,设定默认系统运行级别,运行系统初始化脚本,关闭或运行相关服务,启动终端。
   7.进入用户空间

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

(1)建立分区:
     fdisk /dev/sdb
     挂在硬盘
     mount /dev/sdb1 /mnt/boot
     安装grub:
     grub-install --root-directory=/mnt  /dev/sdb
  (2) cp /boot/vmlinuz-2.6.32-431.el6.x86_64  /mnt/boot/
     cp /boot/initramfs-2.6.32-431.el6.x86_64.img  /mnt/boot/
      mount /dev/sdb2 /mnt/sysroot/
      mkdir -pv /mnt/sysroot/{bin,sbin,etc,lib,lib64,var,home,usr,mnt,media}
  (3) cp /bin/{bash,ls,cat} /mnt/sysroot/bin/
      [root@www ~]# ldd /bin/{bash,ls,cat}
        /bin/bash:
            linux-vdso.so.1 =>  (0x00007fff95fff000)
            libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003bab200000)
            libdl.so.2 => /lib64/libdl.so.2 (0x0000003ba1600000)
            libc.so.6 => /lib64/libc.so.6 (0x0000003ba0e00000)
            /lib64/ld-linux-x86-64.so.2 (0x0000003ba0a00000)
        /bin/ls:
            linux-vdso.so.1 =>  (0x00007fffad7ff000)
            libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003ba2a00000)
            librt.so.1 => /lib64/librt.so.1 (0x0000003ba1a00000)
            libcap.so.2 => /lib64/libcap.so.2 (0x0000003ba5600000)
            libacl.so.1 => /lib64/libacl.so.1 (0x0000003bae200000)
            libc.so.6 => /lib64/libc.so.6 (0x0000003ba0e00000)
            libdl.so.2 => /lib64/libdl.so.2 (0x0000003ba1600000)
            /lib64/ld-linux-x86-64.so.2 (0x0000003ba0a00000)
            libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003ba1200000)
            libattr.so.1 => /lib64/libattr.so.1 (0x0000003bada00000)
        /bin/cat:
            linux-vdso.so.1 =>  (0x00007fffbc59e000)
            libc.so.6 => /lib64/libc.so.6 (0x0000003ba0e00000)
            /lib64/ld-linux-x86-64.so.2 (0x0000003ba0a00000)

        cp /lib64/libtinfo.so.5  /mnt/sysroot/lib64/
   (4)配置grub
       default=0
        timeout=5
        hiddenmenu
        password --md5 $1$TVpnE/$3jasVZKWFHAqhIaqdAcgD1 
        title CentOS (simple express)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro selinux=0 root=/dev/sda2 init=/bin/bash 
        initrd /initramfs-2.6.32-431.el6.x86_64.img
        password --md5  $1$TVpnE/$3jasVZKWFHAqhIaqdAcgD1    
   (5)![](http://i.imgur.com/pKvYf9Z.png)
       ![](http://i.imgur.com/0TMUSU3.png)

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

(1) kickstart是内核安装程序anaconda的一个配置文件,采用此文  件可以使安装能自动完成配置而无需人为干预.kickstart文件主要分三段,命令段,程序包段已经脚本段;命令段的内容主要包括安装的方式,安装源的介质,安装过程使用的语言,键盘的类型,网络的配置,登陆用户的设置,以及认证的方式,防火墙以及selinux的配置,时区的设置,引导程序的安装,安装仓库的设置,硬盘分区的设置。程序包段主要包括所选择要安装的程序包,以%packages开头,以%end结束。脚本段分为安装前执行的脚本和安装完成后执行的脚本。

命令段:

#version=DEVEL
install
cdrom
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp
rootpw  --iscrypted $1$WoADsfda$jd47Pzu7bqMsqYuu2vszw1
# Reboot after installation
reboot
firewall --service=ssh
authconfig --useshadow --enablemd5
selinux --enforcing
timezone --utc America/Los_Angeles
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
# The following is the partition information you requested
reboot
firewall --service=ssh
authconfig --useshadow --enablemd5
selinux --enforcing
timezone --utc America/Los_Angeles
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
#clearpart --all --initlabel

#part /boot --fstype=ext4 --size=300
#part / --fstype=ext4 --grow --size=3000
#part swap --grow --maxsize=1984 --size=1984



repo --name="CentOS"  --baseurl=cdrom:sr1 --cost=100


程序包段:

%packages
@Printing client
@X Window System
binutils
gcc
kernel-devel
python
@Fonts
@Printing client
@X Window System
binutils
gcc
kernel-devel
python

%end

脚本段:
%post
if [ -f /boot/grub/menu.lst -a ! -h /boot/grub/menu.lst ]; then cp /boot/grub/menu.lst /boot/grub/menu.lst.bak && sed -i 's/ rhgb//' /boot/grub/menu.lst; fi
if [ -f /boot/grub/grub.conf -a ! -h /boot/grub/grub.conf ]; then cp /boot/grub/grub.conf /boot/grub/grub.conf.bak && sed -i 's/ rhgb//' /boot/grub/grub.conf; fi
if [ -f /boot/grub2/grub.conf -a ! -h /boot/grub2/grub.conf ]; then cp /boot/grub2/grub.conf /boot/grub2/grub.conf.bak && sed -i 's/ rhgb//' /boot/grub2/grub.conf; fi
if [ -f /etc/rc.d/rc.local ]; then cp /etc/rc.d/rc.local /etc/rc.d/rc.local.backup; fi
cat >>/etc/rc.d/rc.local <<EOF
#!/bin/bash
echo
echo "Installing VMware Tools, please wait..."
if [ -x /usr/sbin/getenforce ]; then oldenforce=\$(/usr/sbin/getenforce); /usr/sbin/setenforce permissive || true; fi
mkdir -p /tmp/vmware-toolsmnt0
for i in hda sr0 scd0; do mount -t iso9660 /dev/\$i /tmp/vmware-toolsmnt0 && break; done
cp -a /tmp/vmware-toolsmnt0 /opt/vmware-tools-installer
chmod 755 /opt/vmware-tools-installer
cd /opt/vmware-tools-installer
mv upgra32 vmware-tools-upgrader-32
mv upgra64 vmware-tools-upgrader-64
mv upgrade.sh run_upgrader.sh
chmod +x /opt/vmware-tools-installer/*upgr*
umount /tmp/vmware-toolsmnt0
rmdir /tmp/vmware-toolsmnt0
if [ -x /usr/bin/rhgb-client ]; then /usr/bin/rhgb-client --quit; fi
cd /opt/vmware-tools-installer
for s in sr0 sr1; do eject -s /dev/\$s; done
./run_upgrader.sh
if [ -f /etc/rc.d/rc.local.backup ]; then mv /etc/rc.d/rc.local.backup /etc/rc.d/rc.local; else rm -f /etc/rc.d/rc.local; fi
rm -rf /opt/vmware-tools-installer
sed -i 's/3:initdefault/5:initdefault/' /etc/inittab
if [ -f /boot/grub/menu.lst.bak ]; then mv /boot/grub/menu.lst.bak /boot/grub/menu.lst; fi
if [ -f /boot/grub/grub.conf.bak ]; then mv /boot/grub/grub.conf.bak /boot/grub/grub.conf; fi
if [ -f /boot/grub2/grub.conf.bak ]; then mv /boot/grub2/grub.conf.bak /boot/grub2/grub.conf; fi
if [ -x /usr/sbin/getenforce ]; then /usr/sbin/setenforce \$oldenforce || true; fi
if [ -x /bin/systemd ]; then systemctl restart prefdm.service; else telinit 5; fi
EOF
chmod 755 /etc/rc.d/rc.local
if [ -x /bin/systemd ]; then systemctl enable rc-local.service; fi
/usr/sbin/adduser admin
/usr/sbin/usermod -p '$1$WoADsfda$jd47Pzu7bqMsqYuu2vszw1' admin
/usr/bin/chfn -f "Linux 6.5-2" admin
/bin/echo done
%end

除了直接对配置文件进行修改,可以安装程序system-config-kickstart,使用图形界面来配置kickstart文件:
![](http://i.imgur.com/WbdimYA.png)


 生成引导镜像

 复制安装光盘内的isolinux文件夹(cp -r)以及kickstart配置文件至指定目录,使用命令 mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "centos 6" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/no8.iso  myroot/
 生成iso镜像,载入即可进行自动安装,需要注意的是,由于kickstart有多种方式提供,需要指明具体的路径,可以是http,ftp,cdrom等,且有可能需要配置ip,netmask,gateway,dns等。

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

#!/bin/bash

if [ "$1" = "start" ]; then
   echo "starting $0 finished"
elif [ "$1" = "stop" ]; then
   echo "stop $0 finished"
elif [ "$1" = "restart" ]; then
   echo "restart $0 finished"
elif [ "$1" = "status" ]; then
    echo " status $0 finished"
else
    echo ' error,please input one of them "start, stop,restart,status"'
fi


[root@www tmp]# bash ss.sh start
starting ss.sh finished
[root@www tmp]# bash ss.sh stop
stop ss.sh finished
[root@www tmp]# bash ss.sh sd
 error,please input one of them "start, stop,restart,status"
[root@www tmp]# bash ss.sh restart
restart ss.sh finished

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

#!/bin/bash

while true; do
  if $( who | grep "^$1" &> /dev/null); then
      echo "$1 already loged in "
      break
  fi
      sleep 3
  done

 [root@www tmp]# bash -x logtest.sh tt
    + true
    ++ grep '^tt'
    ++ who
    + sleep 3
    + true
    ++ grep '^tt'
    ++ who
    + sleep 3
    + true
    ++ grep '^tt'
    ++ who
    + sleep 3
    + true
    ++ grep '^tt'
    ++ who
    + echo 'tt already loged in '
    tt already loged in 
    + break

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

#!/bin/bash cat << EOF cpu) display cpu info mem) display memory info disk) display disk info quit) quit — ————————– EOF while true;do

read -p " please choose the item you want to know:" item

  while [ "$item" != "cpu" -a  "$item" != "mem" -a "$item" != "disk" -a  "$item" != "quit" ]; do
       echo ' please input one of above option" cpu,mem,disk,quit" '
       read -p" cpu,mem,disk,quit:" item
       done

  if [ "$item" = "quit" ];then
        break
  fi

  case $item in
  cpu)
      lscpu
     ;;
  mem)
      free
     ;;
  disk)
     fdisk -l
     ;;
  quit)
     exit
     ;;
  esac

done

~

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

#!/bin/bash
userinfo() {
   if  id $username &> /dev/null; then
       grep "$username" /etc/passwd | awk -F: '{print $3,$7}'
   else
        echo " $username doesn't exist "        
   fi
}

while true;do
read -p " please input username or quit: " option
     if [ "$option" = "quit" ]; then
            break
     else
        username=$option
        userinfo
     fi

[root@www tmp]# vim function.sh
[root@www tmp]# bash function.sh
 please input username or quit: tt
 501 /bin/bash
 please input username or quit: admin
 500 /bin/bash
 please input username or quit: quit

8、写一个脚本,完成如下功能(使用函数) (1) 提示用户输入一个可执行命令的名字;获取此命令依赖的所有库文件; (2) 复制命令文件至/mnt/sysroot目录下的对应的rootfs的路径上,例如,如果复制的文件原路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中; (3) 复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs的路径上;规则同上面命令相关的要求;”

#!/bin/bash
df() {
      [ -d /mnt/sysroot$p ] || mkdir -pv /mnt/sysroot$p
}
read -p "please input a excutable command:" comm
p=$(dirname $(which $comm))
df
cp -r  $(which $comm) /mnt/sysroot$p
for i in $(ldd $(which $comm ) | grep -o "/.*[^[:space:]]$" |awk -F' ' '{print $1}')
    do
    p=$(dirname $i)
    df
    cp $i /mnt/sysroot$p
    done

   [root@www tmp]# bash -x copyter.sh ls
    + read -p 'please input a excutable command:' comm
    please input a excutable command:ls
    +++ which ls
    ++ dirname /bin/ls
    + path1=/bin
    + p=/bin
    + df
    + '[' -d /mnt/sysroot/bin ']'
    ++ which ls
    + cp -r /bin/ls /mnt/sysroot/bin
    ++ awk '-F ' '{print $1}'
    ++ grep -o '/.*[^[:space:]]$'
    +++ which ls
    ++ ldd /bin/ls
    + for i in '$(ldd $(which $comm ) | grep -o "/.*[^[:space:]]$" |awk -F'\'' '\'' '\''{print $1}'\'')'
    ++ dirname /lib64/libselinux.so.1
    + path2=/lib64
    + p=/lib64
    + df
    + '[' -d /mnt/sysroot/lib64 ']'
    + cp /lib64/libselinux.so.1 /mnt/sysroot/lib64
    + for i in '$(ldd $(which $comm ) | grep -o "/.*[^[:space:]]$" |awk -F'\'' '\'' '\''{print $1}'\'')'
    ++ dirname /lib64/librt.so.1
    + path2=/lib64
    + p=/lib64
    + df
    + '[' -d /mnt/sysroot/lib64 ']'
    + cp /lib64/librt.so.1 /mnt/sysroot/lib64
    + for i in '$(ldd $(which $comm ) | grep -o "/.*[^[:space:]]$" |awk -F'\'' '\'' '\''{print $1}'\'')'
    ++ dirname /lib64/libcap.so.2
    + path2=/lib64
    + p=/lib64
    + df
    + '[' -d /mnt/sysroot/lib64 ']'
    + cp /lib64/libcap.so.2 /mnt/sysroot/lib64
    + for i in '$(ldd $(which $comm ) | grep -o "/.*[^[:space:]]$" |awk -F'\'' '\'' '\''{print $1}'\'')'
    ++ dirname /lib64/libacl.so.1
    + path2=/lib64
    + p=/lib64
    + df
    + '[' -d /mnt/sysroot/lib64 ']'
    + cp /lib64/libacl.so.1 /mnt/sysroot/lib64
    + for i in '$(ldd $(which $comm ) | grep -o "/.*[^[:space:]]$" |awk -F'\'' '\'' '\''{print $1}'\'')'
    ++ dirname /lib64/libc.so.6
    + path2=/lib64
    + p=/lib64
    + df
    + '[' -d /mnt/sysroot/lib64 ']'
    + cp /lib64/libc.so.6 /mnt/sysroot/lib64
    + for i in '$(ldd $(which $comm ) | grep -o "/.*[^[:space:]]$" |awk -F'\'' '\'' '\''{print $1}'\'')'
    ++ dirname /lib64/libdl.so.2
    + path2=/lib64
    + p=/lib64
    + df
    + '[' -d /mnt/sysroot/lib64 ']'
    + cp /lib64/libdl.so.2 /mnt/sysroot/lib64
    + for i in '$(ldd $(which $comm ) | grep -o "/.*[^[:space:]]$" |awk -F'\'' '\'' '\''{print $1}'\'')'
    ++ dirname /lib64/ld-linux-x86-64.so.2
    + path2=/lib64
    + p=/lib64
    + df
    + '[' -d /mnt/sysroot/lib64 ']'
    + cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64
    + for i in '$(ldd $(which $comm ) | grep -o "/.*[^[:space:]]$" |awk -F'\'' '\'' '\''{print $1}'\'')'
    ++ dirname /lib64/libpthread.so.0
    + path2=/lib64
    + p=/lib64
    + df
    + '[' -d /mnt/sysroot/lib64 ']'
    + cp /lib64/libpthread.so.0 /mnt/sysroot/lib64
    + for i in '$(ldd $(which $comm ) | grep -o "/.*[^[:space:]]$" |awk -F'\'' '\'' '\''{print $1}'\'')'
    ++ dirname /lib64/libattr.so.1
    + path2=/lib64
    + p=/lib64
    + df
    + '[' -d /mnt/sysroot/lib64 ']'
    + cp /lib64/libattr.so.1 /mnt/sysroot/lib64

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

(0)
上一篇 2017-03-30 12:53
下一篇 2017-03-30 14:07

相关推荐

  • N22-第3周作业-冥界之王

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@CentOS6 ~]# who  | cut -d " " -f1 | uniq 2、取出最后登录到当前系统的用户的相关信息。…

    Linux干货 2016-09-19
  • CentOS下获取帮助

    CentOS中获取帮助 在使用和学习CentOS系统时,我们可能会遇上不熟悉的命令,需要获取帮助。在很多情况下,我们无法通过网络获取帮助,这个时候我们就需要自己通过查看系统帮助文档来解决问题。下面就来介绍获取帮助的方法: 1、 获取简单的帮助信息:whatis COMMAND   2、获取比较详细的命令帮助信息:help COMMAND;COMMA…

    2017-07-15
  • 马哥教育网络班20期+第3周课程练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。  who | cut -d' ' -f1 | sort -u 2、取出最后登录到当前系统的用户的相关信息。 last | head …

    Linux干货 2016-06-26
  • 人志建,则无敌—if、case练习

    马哥21期网络班-9周博客作业 1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash for i in `cut -d: -f7 /etc/passwd`;&…

    Linux干货 2016-09-05
  • Linux运维之进程管理

    一、进程概念 进程是内核的一个功能,在Linux中,运行一个程序或命令可以出发一个事件而驱动一个PID,在linux系统中,系统只识别二进制程序文件,我们可以通过执行系统上的二进制程序来运行程序,进而产生进程。在linux系统中第一个进程是init程序,它是系统开机第一个加载的程序,用来支撑系统的正常运行的一个程序,内核启动的一个用户级进程。   …

    Linux干货 2016-09-09
  • 正则表达式以及Linux文本搜索工具grep

    一正则表达式 regual Expression  简称REGEXP 定义:由一类特殊字符以及文本字所编写的模式,其中有些字符不表示其字面意义,而用于统配和统配功能 分类:     基本正则表达式:BRE 贪婪模式(尽可能长地去匹配符合模式的内容     扩展表达式:E…

    Linux干货 2016-08-07