馬哥教育網絡班22期+第10周課程練習

1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)

    系統啟動流程:
      POST --> BootSequence(BIOS) --> BootLoader (MBR) --> Kernel (ramdisk) --> rootfs (readonly) --> /sbin/init ()
      1. POST: 加電自檢
      2. BootSequence:按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用的設備
      3. BootLoader:加載設備的引導程序
      4. Kernel:探測可識別到的所有硬件設備,加載硬件驅動程序(有可能借助于ramdisk加載驅動)
      5. rootfs:以只讀方式掛載根文件系統
      6. init:運行用戶空間的第一個應用程序:/sbin/init 進行初始化操作

2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
  (1) 為硬盤新建兩個主分區;并為其安裝grub;
  (2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
  (3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
  (4) 為grub提供配置文件;
  (5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;

    為硬盤新建兩個主分區
      [root@localhost ~]# fdisk /dev/sdg
      Command (m for help): n
      Command action
         e   extended
         p   primary partition (1-4)
      p
      Partition number (1-4): 1
      First cylinder (1-3916, default 1): 1
      Last cylinder, +cylinders or +size{K,M,G} (1-3916, default 3916): +200M

      Command (m for help): n
      Command action
         e   extended
         p   primary partition (1-4)
      p
      Partition number (1-4): 2
      First cylinder (27-3916, default 27): 
      Using default value 27
      Last cylinder, +cylinders or +size{K,M,G} (27-3916, default 3916): +10G
      [root@localhost ~]# partx -a /dev/sdg
      [root@localhost ~]# mke2fs -t ext4 /dev/sdg1
      [root@localhost ~]# mke2fs -t ext4 /dev/sdg2

    掛載第一個分區,并安裝grub
      [root@localhost mnt]# mkdir /mnt/boot
      [root@localhost mnt]# mount /dev/sdg1 /mnt/boot
      [root@localhost mnt]# grub-install --root-directory=/mnt /dev/sdg

    復制內核和ramdisk文件到第一個分區
      [root@localhost mnt]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz
      [root@localhost mnt]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img

    配置grub.conf文件
      [root@localhost mnt]# vim /mnt/boot/grub/grub.conf 
      default=0
      timeout=5
      title CentOS (Express)
              root (hd0,0)
              kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
              initrd /initramfs.img

    為第二個分區提供rootfs
      [root@localhost mnt]# mkdir /mnt/sysroot
      [root@localhost mnt]# mount /dev/sdg2 /mnt/sysroot
      [root@localhost sysroot]# mkdir -pv /mnt/sysroot/{etc,bin,sbin,lib,lib64,dev,proc,sys,tmp,var,usr,home,root,mnt,media}

    復制命令及其庫文件
      [root@localhost mnt]# vim /tmp/cpcmd2.sh
      #!/bin/bash

      dst="/mnt/sysroot"
      [ ! -d $dst ] && mkdir $dst

      copycmd(){
              if `which $1 &>/dev/null`;then
                      cmddir=`which --skip-alias $1`
                      dir=`dirname $cmddir`
                      mkdir -pv ${dst}${dir}
                      cp $cmddir ${dst}${dir}/
              else
                      echo "command not found"
                      return 0
              fi
      }

      copylib(){
              liblist=$(ldd `which --skip-alias $1`|grep -Eo "/[^[:space:]]+")
              for libfile in $liblist;do
                      libdir=`dirname $libfile`
                      [ ! -d ${dst}${libdir} ] && mkdir ${dst}${libdir}
                      cp $libfile ${dst}${libdir}
              done
      }


      read -p "please input a command:" cmd

      while [ "$cmd" != "quit" ];do
              copycmd $cmd
              copylib $cmd
              echo "files copied"
              read -p "please input a command:" cmd

      done

      [root@localhost mnt]# bash /tmp/cpcmd2.sh
      [root@test tmp]# bash cpcmd.sh
      please input a command:bash      
      files copied
      please input a command:ls
      files copied
      please input a command:cat
      files copied
      please input a command:quit
 
    新建虛擬機,將新的硬盤設置為第一啟動項,啟動bash并測試ls,cat命令

3、制作一個kickstart文件以及一個引導鏡像。描述其過程。

    安裝kickstart程序
      [root@localhost ~]# yum install system-config-kickstart

    制作ks.cfg文件
      [root@localhost ~]# system-config-kickstart &  #將ks.cfg保存在root 目錄下
      [root@localhost ~]# cat ks.cfg    
      #platform=x86, AMD64, or Intel EM64T
      #version=DEVEL
      # Firewall configuration
      firewall --enabled --service=ssh
      # Install OS instead of upgrade
      install
      # Use CDROM installation media
      cdrom
      # Root password
      rootpw --iscrypted $1$7e5bbhUU$5ikWQctYMuPQc3O9Wko9d/
      # System authorization information
      auth  --useshadow  --passalgo=sha512
      # Use graphical install
      graphical
      firstboot --disable
      # System keyboard
      keyboard us
      # System language
      lang en_US
      # SELinux configuration
      selinux --enforcing
      # Installation logging level
      logging --level=info

      # System timezone
      timezone  Asia/Shanghai
      # System bootloader configuration
      bootloader --append="crashkernel=auto rhgb quiet" --location=mbr --driveorder="sda"
      # Partition clearing information
      clearpart --all --initlabel 
      # Disk partitioning information
      part /boot --fstype="ext4" --size=200
      part / --fstype="ext4" --size=10000
      part swap --fstype="swap" --size=1024

    掛載安裝光盤
      [root@localhost ~]# mount /dev/cdrom /media/cdrom/
      [root@localhost ~]# mkdir -p /root/auto_install
      [root@localhost ~]# cp -arf /media/cdrom /root/auto_install/

    定位ks.cfg文件
      [root@localhost ~]# cp /root/ks.cfg /root/auto_install/cdrom/ks.cfg
      [root@localhost ~]# chmod +w /root/auto_install/cdrom/isolinux/isolinux.cfg
      [root@localhost ~]# vim /root/auto_install/cdrom/isolinux/isolinux.cfg
      label linux
        menu label ^Install or upgrade an existing system
        menu default
        kernel vmlinuz
        append initrd=initrd.img ks=cdrom:/ks.cfg  # 在這里添加ks文件路徑參數
       
    制作自動安裝光盤
      [root@localhost ~]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 \
      --boot-info-table -V "CentOS 6  Auto install" \
      -b isolinux/isolinux.bin -c isolinux/boot.cat \
      -o /root/centos6_auto_install.iso \
      /root/auto_install/cdrom/

4、寫一個腳本
  (1) 能接受四個參數:start, stop, restart, status
   start: 輸出“starting 腳本名 finished.”
   ...
  (2) 其它任意參數,均報錯退出;

      [root@mail tmp]# vim start.sh

      #!/bin/bash

      case $1 in
              start)
                      echo "starting $0 finished."
                      ;;
              stop)
                      echo "stop $0 finished"
                      ;;
              restart)
                      echo "restart $0 finished"
                      ;;
              status)
                      echo "$0 status"
                      ;;
              *)
                      echo "error,please input {start|stop|restart|status}"
                      exit 1
      esac
      [root@mail tmp]# bash /tmp/start.sh start

5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
  (1) 如果登錄了,則顯示用戶登錄,腳本終止;
  (2) 每3秒鐘,查看一次用戶是否登錄;

      [root@mail tmp]# vim login.sh
      #!/bin/bash

      read -p "Please input a user:" user
      id $user &> /dev/null
      if [ $? -eq 0 ];then
              while true;do
                      if who |grep "^$user" &> /dev/null;then
                              break
                      fi
                      sleep 3
              done
              echo "$user is login"
      else
              echo "$user is not exist"
      fi
      [root@mail tmp]# bash login.sh

6、寫一個腳本,顯示用戶選定要查看的信息;
   cpu) display cpu info
   mem) display memory info
   disk) display disk info
   quit) quit
   非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;
   
      [root@mail tmp]# vim info.sh
      #!/bin/bash

      read -p "input cpu|mem|disk|quit :" option
      while [ "$option" != "cpu" -a "$option" != "mem" -a "$option" != "disk" -a "$option" != "quit" ];do
              read -p "input cpu|mem|disk|quit :" option
      done

      if [ "$option" == "cpu" ];then
              lscpu
      elif [ "$option" == "mem" ];then
              free -m
      elif [ "$option" == "disk" ];then
              fdisk -l /dev/[hs]d[a-z]
      else
              echo "quit"
              exit 0
      fi
      [root@mail tmp]# bash info.sh

7、寫一個腳本
  (1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
  (2) 提示用戶輸入一個用戶名或輸入“quit”退出;
    當輸入的是用戶名,則調用函數顯示用戶信息;
    當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit: 

      [root@test tmp]# vim userinfo.sh   
      #!/bin/bash

      userinfor(){
              uid=`id -u $username`
              ushell=`grep "^$username\>" /etc/passwd |cut -d: -f7`
              echo "USERNAME:$username UID:$uid SHELL:$ushell"
      }

      read -p "Please input a username|quit :" username

      while [ "$username" != "quit" ];do
              id $username &>/dev/null
              if [ $? -eq 0 ] ;then

                      userinfor $username
                      read -p "Please input a username|quit :" username
              else
                      echo "user not exist"
                      read -p "Please input a username|quit :" username

              fi

      done
      [root@test tmp]# bash userinfo.sh

8、寫一個腳本,完成如下功能(使用函數)
   (1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件;
   (2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中;
   (3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求;

      [root@localhost mnt]# vim /tmp/cpcmd2.sh
      #!/bin/bash

      dst="/mnt/sysroot"
      [ ! -d $dst ] && mkdir $dst

      copycmd(){
              if `which $1 &>/dev/null`;then
                      cmddir=`which --skip-alias $1`
                      dir=`dirname $cmddir`
                      mkdir -pv ${dst}${dir}
                      cp $cmddir ${dst}${dir}/
              else
                      echo "command not found"
                      return 0
              fi
      }

      copylib(){
              liblist=$(ldd `which --skip-alias $1`|grep -Eo "/[^[:space:]]+")
              for libfile in $liblist;do
                      libdir=`dirname $libfile`
                      [ ! -d ${dst}${libdir} ] && mkdir ${dst}${libdir}
                      cp $libfile ${dst}${libdir}
              done
      }


      read -p "please input a command:" cmd

      while [ "$cmd" != "quit" ];do
              copycmd $cmd
              copylib $cmd
              echo "files copied"
              read -p "please input a command:" cmd

      done
      [root@localhost mnt]# bash /tmp/cpcmd2.sh

原創文章,作者:N22_上海_長清,如若轉載,請注明出處:http://www.www58058.com/54836

(0)
N22_上海_長清N22_上海_長清
上一篇 2016-10-27 09:41
下一篇 2016-10-27 10:29

相關推薦

  • redis/twemproxy 客戶端連接異常

    對于一個DBA,客戶端連接異常問題可以說是家常便飯的事情,處理多了都想吐。 root cause無疑發生在三個地方,先找自身的原因,依次排查下去: 1)服務器端db的負載,如果負載太高,創建socket太慢引起超時。另外服務器端socket的個數太多,也可以導致創建連接需要很長的時間或者創建連接不成功。 2)網絡是夠有抖動,包括lvs/twemproxy重啟…

    Linux干貨 2015-04-03
  • lvm基本應用,擴展及縮減實現

    一、    LVM的創建     LVM因為他的可擴展和可伸縮的特性,被廣泛的應用于磁盤管理中,創建LVM則必須先創建pv然后創建vg最后才能創建lv,他們之間的關系如下:呈金字塔結構     1、創建查看pv     …

    Linux干貨 2016-03-09
  • Linux三劍客之sed

    sed 簡介 sed 工作原理 命令格式 常用選項: 地址定界: 編輯命令: 替換標記: sed元字符集(正則表達式) 高級編輯命令: sed用法實例 作業: 選定行的范圍:,(逗號) 刪除操作:d命令 顯示模式空間內容 追加(行下):a\命令 插入(行上):i\命令 退出:q命令 多點編輯:e命令 從文件讀入:r命令 寫入文件:w命令 替換操作:s命令 替…

    Linux干貨 2016-08-11
  • Linux系統上的文件處理工具

    Linux系統上的文件處理工具 我們都知道在計算機中,存在大量的文件,這些文件中包含大量的信息。可是有些時候,為了工作的效率,我們在茫茫信息中提取出我們所需要的信息,這樣的技能就顯得尤為重要。Linux系統上為我我們提供了多種多樣的文本處理工具,下面我們來簡單說一下。 查看文件內容我們可以使用less命令,cat命令,more命令等等 cat cat [OP…

    Linux干貨 2016-08-05
  • 馬哥教育網絡班21期-第三周課程練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 who|cut -d" " -f1|uniq -c|awk '{print $2}' 2、取出最后登錄到當前系統的用戶的相關信息。 last |awk 'NR==1{print $0}' last |sed -n &…

    Linux干貨 2016-07-29
  • 說明Linux系統上命令的使用格式

    命令使用格式: COMMAND [OPTIONS…] [ARGUMENTS…]         選項:用于啟用或關閉命令的某些功能                  短選項:-c(一個字符 ),例如:-l,…

    Linux干貨 2016-10-31
欧美性久久久久